annotate view/View.h @ 1160:a429b2acb45d 3.0-integration

Make SVDEBUG always write to a log file -- formerly this was disabled in NDEBUG builds. I think there's little use to that, it just means that we keep adding more cerr debug output because we aren't getting the log we need. And SVDEBUG logging is not usually used in tight loops, I don't think the performance overhead is too serious. Also update the About box.
author Chris Cannam
date Thu, 03 Nov 2016 14:57:00 +0000
parents 179ea8a2f650
children 57d192e26331 6828735468c9
rev   line source
Chris@127 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@127 2
Chris@127 3 /*
Chris@127 4 Sonic Visualiser
Chris@127 5 An audio file viewer and annotation editor.
Chris@127 6 Centre for Digital Music, Queen Mary, University of London.
Chris@127 7 This file copyright 2006 Chris Cannam.
Chris@127 8
Chris@127 9 This program is free software; you can redistribute it and/or
Chris@127 10 modify it under the terms of the GNU General Public License as
Chris@127 11 published by the Free Software Foundation; either version 2 of the
Chris@127 12 License, or (at your option) any later version. See the file
Chris@127 13 COPYING included with this distribution for more information.
Chris@127 14 */
Chris@127 15
Chris@226 16 #ifndef _VIEW_H_
Chris@226 17 #define _VIEW_H_
Chris@127 18
Chris@127 19 #include <QFrame>
Chris@127 20 #include <QProgressBar>
Chris@127 21
Chris@1077 22 #include "layer/LayerGeometryProvider.h"
Chris@916 23
Chris@127 24 #include "base/ZoomConstraint.h"
Chris@127 25 #include "base/PropertyContainer.h"
Chris@128 26 #include "ViewManager.h"
Chris@127 27 #include "base/XmlExportable.h"
Chris@902 28 #include "base/BaseTypes.h"
Chris@127 29
Chris@127 30 // #define DEBUG_VIEW_WIDGET_PAINT 1
Chris@127 31
Chris@127 32 class Layer;
Chris@127 33 class ViewPropertyContainer;
Chris@127 34
Chris@797 35 class QPushButton;
Chris@797 36
Chris@127 37 #include <map>
Chris@315 38 #include <set>
Chris@127 39
Chris@127 40 /**
Chris@127 41 * View is the base class of widgets that display one or more
Chris@127 42 * overlaid views of data against a horizontal time scale.
Chris@127 43 *
Chris@127 44 * A View may have any number of attached Layers, each of which
Chris@127 45 * is expected to have one data Model (although multiple views may
Chris@127 46 * share the same model).
Chris@127 47 *
Chris@127 48 * A View may be panned in time and zoomed, although the
Chris@127 49 * mechanisms for doing so (as well as any other operations and
Chris@127 50 * properties available) depend on the subclass.
Chris@127 51 */
Chris@127 52
Chris@127 53 class View : public QFrame,
Chris@916 54 public XmlExportable,
Chris@916 55 public LayerGeometryProvider
Chris@127 56 {
Chris@127 57 Q_OBJECT
Chris@127 58
Chris@127 59 public:
Chris@127 60 /**
Chris@127 61 * Deleting a View does not delete any of its layers. They should
Chris@127 62 * be managed elsewhere (e.g. by the Document).
Chris@127 63 */
Chris@127 64 virtual ~View();
Chris@1044 65
Chris@1044 66 /**
Chris@1044 67 * Retrieve the id of this object. Views have their own unique
Chris@1044 68 * ids, but ViewProxy objects share the id of their View.
Chris@1044 69 */
Chris@1044 70 int getId() const { return m_id; }
Chris@1030 71
Chris@127 72 /**
Chris@127 73 * Retrieve the first visible sample frame on the widget.
Chris@127 74 * This is a calculated value based on the centre-frame, widget
Chris@127 75 * width and zoom level. The result may be negative.
Chris@127 76 */
Chris@902 77 sv_frame_t getStartFrame() const;
Chris@127 78
Chris@127 79 /**
Chris@127 80 * Set the widget pan based on the given first visible frame. The
Chris@127 81 * frame value may be negative.
Chris@127 82 */
Chris@902 83 void setStartFrame(sv_frame_t);
Chris@127 84
Chris@127 85 /**
Chris@127 86 * Return the centre frame of the visible widget. This is an
Chris@127 87 * exact value that does not depend on the zoom block size. Other
Chris@127 88 * frame values (start, end) are calculated from this based on the
Chris@127 89 * zoom and other factors.
Chris@127 90 */
Chris@902 91 sv_frame_t getCentreFrame() const { return m_centreFrame; }
Chris@127 92
Chris@127 93 /**
Chris@127 94 * Set the centre frame of the visible widget.
Chris@127 95 */
Chris@902 96 void setCentreFrame(sv_frame_t f) { setCentreFrame(f, true); }
Chris@127 97
Chris@127 98 /**
Chris@127 99 * Retrieve the last visible sample frame on the widget.
Chris@127 100 * This is a calculated value based on the centre-frame, widget
Chris@127 101 * width and zoom level.
Chris@127 102 */
Chris@902 103 sv_frame_t getEndFrame() const;
Chris@127 104
Chris@127 105 /**
Chris@127 106 * Return the pixel x-coordinate corresponding to a given sample
Chris@127 107 * frame (which may be negative).
Chris@127 108 */
Chris@902 109 int getXForFrame(sv_frame_t frame) const;
Chris@127 110
Chris@127 111 /**
Chris@127 112 * Return the closest frame to the given pixel x-coordinate.
Chris@127 113 */
Chris@902 114 sv_frame_t getFrameForX(int x) const;
Chris@127 115
Chris@127 116 /**
Chris@1030 117 * Return the closest pixel x-coordinate corresponding to a given
Chris@1030 118 * view x-coordinate. Default is no scaling, ViewProxy handles
Chris@1030 119 * scaling case.
Chris@1030 120 */
Chris@1030 121 int getXForViewX(int viewx) const { return viewx; }
Chris@1030 122
Chris@1030 123 /**
Chris@1030 124 * Return the closest view x-coordinate corresponding to a given
Chris@1030 125 * pixel x-coordinate. Default is no scaling, ViewProxy handles
Chris@1030 126 * scaling case.
Chris@1030 127 */
Chris@1030 128 int getViewXForX(int x) const { return x; }
Chris@1030 129
Chris@1030 130 /**
Chris@127 131 * Return the pixel y-coordinate corresponding to a given
Chris@127 132 * frequency, if the frequency range is as specified. This does
Chris@127 133 * not imply any policy about layer frequency ranges, but it might
Chris@127 134 * be useful for layers to match theirs up if desired.
Chris@127 135 *
Chris@127 136 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@127 137 */
Chris@904 138 double getYForFrequency(double frequency, double minFreq, double maxFreq,
Chris@127 139 bool logarithmic) const;
Chris@127 140
Chris@127 141 /**
Chris@127 142 * Return the closest frequency to the given pixel y-coordinate,
Chris@127 143 * if the frequency range is as specified.
Chris@127 144 *
Chris@127 145 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@127 146 */
Chris@1085 147 double getFrequencyForY(double y, double minFreq, double maxFreq,
Chris@1085 148 bool logarithmic) const;
Chris@127 149
Chris@127 150 /**
Chris@127 151 * Return the zoom level, i.e. the number of frames per pixel
Chris@127 152 */
Chris@127 153 int getZoomLevel() const;
Chris@127 154
Chris@127 155 /**
Chris@127 156 * Set the zoom level, i.e. the number of frames per pixel. The
Chris@127 157 * centre frame will be unchanged; the start and end frames will
Chris@127 158 * change.
Chris@127 159 */
Chris@806 160 virtual void setZoomLevel(int z);
Chris@127 161
Chris@127 162 /**
Chris@127 163 * Zoom in or out.
Chris@127 164 */
Chris@127 165 virtual void zoom(bool in);
Chris@127 166
Chris@127 167 /**
Chris@127 168 * Scroll left or right by a smallish or largish amount.
Chris@127 169 */
Chris@510 170 virtual void scroll(bool right, bool lots, bool doEmit = true);
Chris@127 171
Chris@834 172 /**
Chris@834 173 * Add a layer to the view. (Normally this should be handled
Chris@834 174 * through some command abstraction instead of using this function
Chris@834 175 * directly.)
Chris@834 176 */
Chris@127 177 virtual void addLayer(Layer *v);
Chris@834 178
Chris@834 179 /**
Chris@834 180 * Remove a layer from the view. Does not delete the
Chris@834 181 * layer. (Normally this should be handled through some command
Chris@834 182 * abstraction instead of using this function directly.)
Chris@834 183 */
Chris@834 184 virtual void removeLayer(Layer *v);
Chris@834 185
Chris@834 186 /**
Chris@834 187 * Return the number of layers, regardless of whether visible or
Chris@834 188 * dormant, i.e. invisible, in this view.
Chris@834 189 */
Chris@902 190 virtual int getLayerCount() const { return int(m_layerStack.size()); }
Chris@127 191
Chris@127 192 /**
Chris@834 193 * Return the nth layer, counted in stacking order. That is,
Chris@834 194 * layer 0 is the bottom layer and layer "getLayerCount()-1" is
Chris@834 195 * the top one. The returned layer may be visible or it may be
Chris@834 196 * dormant, i.e. invisible.
Chris@127 197 */
Chris@277 198 virtual Layer *getLayer(int n) {
Chris@902 199 if (in_range_for(m_layerStack, n)) return m_layerStack[n];
Chris@835 200 else return 0;
Chris@277 201 }
Chris@127 202
Chris@127 203 /**
Chris@835 204 * Return the nth layer, counted in the order they were
Chris@835 205 * added. Unlike the stacking order used in getLayer(), which
Chris@835 206 * changes each time a layer is selected, this ordering remains
Chris@835 207 * fixed. The returned layer may be visible or it may be dormant,
Chris@835 208 * i.e. invisible.
Chris@268 209 */
Chris@835 210 virtual Layer *getFixedOrderLayer(int n) {
Chris@835 211 if (n < int(m_fixedOrderLayers.size())) return m_fixedOrderLayers[n];
Chris@835 212 else return 0;
Chris@268 213 }
Chris@268 214
Chris@268 215 /**
Chris@834 216 * Return the layer currently active for tool interaction. This is
Chris@834 217 * the topmost non-dormant (i.e. visible) layer in the view. If
Chris@834 218 * there are no visible layers in the view, return 0.
Chris@834 219 */
Chris@834 220 virtual Layer *getInteractionLayer();
Chris@834 221
Chris@841 222 virtual const Layer *getInteractionLayer() const;
Chris@841 223
Chris@834 224 /**
Chris@835 225 * Return the layer most recently selected by the user. This is
Chris@835 226 * the layer that any non-tool-driven commands should operate on,
Chris@835 227 * in the case where this view is the "current" one.
Chris@835 228 *
Chris@835 229 * If the user has selected the view itself more recently than any
Chris@835 230 * of the layers on it, this function will return 0, and any
Chris@835 231 * non-tool-driven layer commands should be deactivated while this
Chris@835 232 * view is current. It will also return 0 if there are no layers
Chris@835 233 * in the view.
Chris@834 234 *
Chris@834 235 * Note that, unlike getInteractionLayer(), this could return an
Chris@834 236 * invisible (dormant) layer.
Chris@127 237 */
Chris@127 238 virtual Layer *getSelectedLayer();
Chris@834 239
Chris@127 240 virtual const Layer *getSelectedLayer() const;
Chris@127 241
Chris@835 242 /**
Chris@835 243 * Return the "top" layer in the view, whether visible or dormant.
Chris@835 244 * This is the same as getLayer(getLayerCount()-1) if there is at
Chris@835 245 * least one layer, and 0 otherwise.
Chris@835 246 *
Chris@835 247 * For most purposes involving interaction or commands, you
Chris@835 248 * probably want either getInteractionLayer() or
Chris@835 249 * getSelectedLayer() instead.
Chris@835 250 */
Chris@835 251 virtual Layer *getTopLayer() {
Chris@835 252 return m_layerStack.empty() ? 0 : m_layerStack[m_layerStack.size()-1];
Chris@835 253 }
Chris@835 254
Chris@127 255 virtual void setViewManager(ViewManager *m);
Chris@908 256 virtual void setViewManager(ViewManager *m, sv_frame_t initialFrame);
Chris@127 257 virtual ViewManager *getViewManager() const { return m_manager; }
Chris@127 258
Chris@127 259 virtual void setFollowGlobalPan(bool f);
Chris@127 260 virtual bool getFollowGlobalPan() const { return m_followPan; }
Chris@127 261
Chris@127 262 virtual void setFollowGlobalZoom(bool f);
Chris@127 263 virtual bool getFollowGlobalZoom() const { return m_followZoom; }
Chris@127 264
Chris@224 265 virtual bool hasLightBackground() const;
Chris@287 266 virtual QColor getForeground() const;
Chris@287 267 virtual QColor getBackground() const;
Chris@127 268
Chris@270 269 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@270 270 QRect rect, bool focus) const;
Chris@127 271
Chris@741 272 virtual bool shouldShowFeatureLabels() const {
Chris@741 273 return m_manager && m_manager->shouldShowFeatureLabels();
Chris@741 274 }
Chris@127 275 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const {
Chris@127 276 return false;
Chris@127 277 }
Chris@127 278 virtual bool shouldIlluminateLocalSelection(QPoint &, bool &, bool &) const {
Chris@127 279 return false;
Chris@127 280 }
Chris@127 281
Chris@127 282 virtual void setPlaybackFollow(PlaybackFollowMode m);
Chris@127 283 virtual PlaybackFollowMode getPlaybackFollow() const { return m_followPlay; }
Chris@127 284
Chris@127 285 typedef PropertyContainer::PropertyName PropertyName;
Chris@127 286
Chris@127 287 // We implement the PropertyContainer API, although we don't
Chris@127 288 // actually subclass PropertyContainer. We have our own
Chris@127 289 // PropertyContainer that we can return on request that just
Chris@127 290 // delegates back to us.
Chris@127 291 virtual PropertyContainer::PropertyList getProperties() const;
Chris@127 292 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@127 293 virtual PropertyContainer::PropertyType getPropertyType(const PropertyName &) const;
Chris@127 294 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 295 int *min, int *max, int *deflt) const;
Chris@127 296 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@127 297 int value) const;
Chris@127 298 virtual void setProperty(const PropertyName &, int value);
Chris@127 299 virtual QString getPropertyContainerName() const {
Chris@127 300 return objectName();
Chris@127 301 }
Chris@127 302 virtual QString getPropertyContainerIconName() const = 0;
Chris@127 303
Chris@806 304 virtual int getPropertyContainerCount() const;
Chris@127 305
Chris@837 306 // The 0th property container is the view's own; the rest are the
Chris@837 307 // layers in fixed-order series
Chris@806 308 virtual const PropertyContainer *getPropertyContainer(int i) const;
Chris@806 309 virtual PropertyContainer *getPropertyContainer(int i);
Chris@127 310
Chris@229 311 // Render the contents on a wide canvas
Chris@908 312 virtual QImage *toNewImage(sv_frame_t f0, sv_frame_t f1);
Chris@226 313 virtual QImage *toNewImage();
Chris@908 314 virtual QSize getImageSize(sv_frame_t f0, sv_frame_t f1);
Chris@229 315 virtual QSize getImageSize();
Chris@226 316
Chris@127 317 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const;
Chris@127 318
Chris@904 319 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@127 320 bool &log) const;
Chris@127 321
Chris@316 322 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 323 QString extraAttributes = "") const;
Chris@127 324
Chris@222 325 // First frame actually in model, to right of scale, if present
Chris@902 326 virtual sv_frame_t getFirstVisibleFrame() const;
Chris@902 327 virtual sv_frame_t getLastVisibleFrame() const;
Chris@222 328
Chris@902 329 sv_frame_t getModelsStartFrame() const;
Chris@902 330 sv_frame_t getModelsEndFrame() const;
Chris@127 331
Chris@915 332 /**
Chris@915 333 * To be called from a layer, to obtain the extent of the surface
Chris@915 334 * that the layer is currently painting to. This may be the extent
Chris@915 335 * of the view (if 1x display scaling is in effect) or of a larger
Chris@915 336 * cached pixmap (if greater display scaling is in effect).
Chris@915 337 */
Chris@915 338 QRect getPaintRect() const;
Chris@915 339
Chris@915 340 QSize getPaintSize() const { return getPaintRect().size(); }
Chris@915 341 int getPaintWidth() const { return getPaintRect().width(); }
Chris@915 342 int getPaintHeight() const { return getPaintRect().height(); }
Chris@915 343
Chris@315 344 typedef std::set<Model *> ModelSet;
Chris@315 345 ModelSet getModels();
Chris@315 346
Chris@301 347 //!!!
Chris@320 348 Model *getAligningModel() const;
Chris@902 349 sv_frame_t alignFromReference(sv_frame_t) const;
Chris@902 350 sv_frame_t alignToReference(sv_frame_t) const;
Chris@902 351 sv_frame_t getAlignedPlaybackFrame() const;
Chris@301 352
Chris@1030 353 void updatePaintRect(QRect r) { update(r); }
Chris@1030 354
Chris@918 355 View *getView() { return this; }
Chris@918 356 const View *getView() const { return this; }
Chris@918 357
Chris@127 358 signals:
Chris@127 359 void propertyContainerAdded(PropertyContainer *pc);
Chris@127 360 void propertyContainerRemoved(PropertyContainer *pc);
Chris@127 361 void propertyContainerPropertyChanged(PropertyContainer *pc);
Chris@197 362 void propertyContainerPropertyRangeChanged(PropertyContainer *pc);
Chris@127 363 void propertyContainerNameChanged(PropertyContainer *pc);
Chris@298 364 void propertyContainerSelected(PropertyContainer *pc);
Chris@127 365 void propertyChanged(PropertyContainer::PropertyName);
Chris@127 366
Chris@336 367 void layerModelChanged();
Chris@336 368
Chris@902 369 void centreFrameChanged(sv_frame_t frame,
Chris@211 370 bool globalScroll,
Chris@211 371 PlaybackFollowMode followMode);
Chris@211 372
Chris@867 373 void zoomLevelChanged(int level, bool locked);
Chris@127 374
Chris@189 375 void contextHelpChanged(const QString &);
Chris@189 376
Chris@127 377 public slots:
Chris@127 378 virtual void modelChanged();
Chris@902 379 virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame);
Chris@127 380 virtual void modelCompletionChanged();
Chris@320 381 virtual void modelAlignmentCompletionChanged();
Chris@127 382 virtual void modelReplaced();
Chris@127 383 virtual void layerParametersChanged();
Chris@197 384 virtual void layerParameterRangesChanged();
Chris@268 385 virtual void layerMeasurementRectsChanged();
Chris@127 386 virtual void layerNameChanged();
Chris@127 387
Chris@902 388 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@902 389 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@902 390 virtual void viewManagerPlaybackFrameChanged(sv_frame_t);
Chris@806 391 virtual void viewZoomLevelChanged(View *, int, bool);
Chris@127 392
Chris@127 393 virtual void propertyContainerSelected(View *, PropertyContainer *pc);
Chris@127 394
Chris@127 395 virtual void selectionChanged();
Chris@127 396 virtual void toolModeChanged();
Chris@133 397 virtual void overlayModeChanged();
Chris@133 398 virtual void zoomWheelsEnabledChanged();
Chris@127 399
Chris@797 400 virtual void cancelClicked();
Chris@797 401
Chris@555 402 virtual void progressCheckStalledTimerElapsed();
Chris@555 403
Chris@127 404 protected:
Chris@127 405 View(QWidget *, bool showProgress);
Chris@1030 406
Chris@1030 407 int m_id;
Chris@1030 408
Chris@127 409 virtual void paintEvent(QPaintEvent *e);
Chris@127 410 virtual void drawSelections(QPainter &);
Chris@127 411 virtual bool shouldLabelSelections() const { return true; }
Chris@908 412 virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1);
Chris@339 413 virtual void setPaintFont(QPainter &paint);
Chris@952 414
Chris@952 415 QSize scaledSize(const QSize &s, int factor) {
Chris@952 416 return QSize(s.width() * factor, s.height() * factor);
Chris@952 417 }
Chris@952 418 QRect scaledRect(const QRect &r, int factor) {
Chris@952 419 return QRect(r.x() * factor, r.y() * factor,
Chris@952 420 r.width() * factor, r.height() * factor);
Chris@952 421 }
Chris@339 422
Chris@127 423 typedef std::vector<Layer *> LayerList;
Chris@127 424
Chris@908 425 sv_samplerate_t getModelsSampleRate() const;
Chris@127 426 bool areLayersScrollable() const;
Chris@127 427 LayerList getScrollableBackLayers(bool testChanged, bool &changed) const;
Chris@127 428 LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const;
Chris@806 429 int getZoomConstraintBlockSize(int blockSize,
Chris@127 430 ZoomConstraint::RoundingDirection dir =
Chris@127 431 ZoomConstraint::RoundNearest) const;
Chris@127 432
Chris@183 433 // True if the top layer(s) use colours for meaningful things. If
Chris@183 434 // this is the case, selections will be shown using unfilled boxes
Chris@183 435 // rather than with a translucent fill.
Chris@183 436 bool areLayerColoursSignificant() const;
Chris@183 437
Chris@217 438 // True if the top layer has a time axis on the x coordinate (this
Chris@217 439 // is generally the case except for spectrum/slice layers). It
Chris@217 440 // will not be possible to make or display selections if this is
Chris@217 441 // false.
Chris@217 442 bool hasTopLayerTimeXAxis() const;
Chris@217 443
Chris@902 444 bool setCentreFrame(sv_frame_t f, bool doEmit);
Chris@127 445
Chris@902 446 void movePlayPointer(sv_frame_t f);
Chris@511 447
Chris@127 448 void checkProgress(void *object);
Chris@384 449 int getProgressBarWidth() const; // if visible
Chris@127 450
Chris@956 451 int effectiveDevicePixelRatio() const;
Chris@956 452
Chris@902 453 sv_frame_t m_centreFrame;
Chris@127 454 int m_zoomLevel;
Chris@127 455 bool m_followPan;
Chris@127 456 bool m_followZoom;
Chris@127 457 PlaybackFollowMode m_followPlay;
Chris@789 458 bool m_followPlayIsDetached;
Chris@902 459 sv_frame_t m_playPointerFrame;
Chris@127 460 bool m_lightBackground;
Chris@127 461 bool m_showProgress;
Chris@127 462
Chris@127 463 QPixmap *m_cache;
Chris@952 464 QPixmap *m_buffer;
Chris@902 465 sv_frame_t m_cacheCentreFrame;
Chris@127 466 int m_cacheZoomLevel;
Chris@127 467 bool m_selectionCached;
Chris@127 468
Chris@127 469 bool m_deleting;
Chris@127 470
Chris@835 471 LayerList m_layerStack; // I don't own these, but see dtor note above
Chris@835 472 LayerList m_fixedOrderLayers;
Chris@127 473 bool m_haveSelectedLayer;
Chris@127 474
Chris@583 475 QString m_lastError;
Chris@583 476
Chris@127 477 // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers
Chris@127 478 mutable LayerList m_lastScrollableBackLayers;
Chris@127 479 mutable LayerList m_lastNonScrollableBackLayers;
Chris@127 480
Chris@555 481 struct ProgressBarRec {
Chris@797 482 QPushButton *cancel;
Chris@555 483 QProgressBar *bar;
Chris@555 484 int lastCheck;
Chris@555 485 QTimer *checkTimer;
Chris@555 486 };
Chris@555 487 typedef std::map<Layer *, ProgressBarRec> ProgressMap;
Chris@127 488 ProgressMap m_progressBars; // I own the ProgressBars
Chris@127 489
Chris@127 490 ViewManager *m_manager; // I don't own this
Chris@127 491 ViewPropertyContainer *m_propertyContainer; // I own this
Chris@127 492 };
Chris@127 493
Chris@127 494
Chris@127 495 // Use this for delegation, because we can't subclass from
Chris@127 496 // PropertyContainer (which is a QObject) ourselves because of
Chris@127 497 // ambiguity with QFrame parent
Chris@127 498
Chris@127 499 class ViewPropertyContainer : public PropertyContainer
Chris@127 500 {
Chris@127 501 Q_OBJECT
Chris@127 502
Chris@127 503 public:
Chris@127 504 ViewPropertyContainer(View *v);
Chris@728 505 virtual ~ViewPropertyContainer();
Chris@728 506
Chris@127 507 PropertyList getProperties() const { return m_v->getProperties(); }
Chris@127 508 QString getPropertyLabel(const PropertyName &n) const {
Chris@127 509 return m_v->getPropertyLabel(n);
Chris@127 510 }
Chris@127 511 PropertyType getPropertyType(const PropertyName &n) const {
Chris@127 512 return m_v->getPropertyType(n);
Chris@127 513 }
Chris@216 514 int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max,
Chris@216 515 int *deflt) const {
Chris@216 516 return m_v->getPropertyRangeAndValue(n, min, max, deflt);
Chris@127 517 }
Chris@127 518 QString getPropertyValueLabel(const PropertyName &n, int value) const {
Chris@127 519 return m_v->getPropertyValueLabel(n, value);
Chris@127 520 }
Chris@127 521 QString getPropertyContainerName() const {
Chris@127 522 return m_v->getPropertyContainerName();
Chris@127 523 }
Chris@127 524 QString getPropertyContainerIconName() const {
Chris@127 525 return m_v->getPropertyContainerIconName();
Chris@127 526 }
Chris@127 527
Chris@127 528 public slots:
Chris@127 529 virtual void setProperty(const PropertyName &n, int value) {
Chris@127 530 m_v->setProperty(n, value);
Chris@127 531 }
Chris@127 532
Chris@127 533 protected:
Chris@127 534 View *m_v;
Chris@127 535 };
Chris@127 536
Chris@127 537 #endif
Chris@127 538