annotate view/View.h @ 1064:77564d4fff43 spectrogram-minor-refactor

Extend column logic to peak frequency display as well, and correct some scopes according to whether values are per source column or per target pixel
author Chris Cannam
date Mon, 20 Jun 2016 12:00:32 +0100
parents f535f6e5dbb0
children 5144d7185fb5
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@916 22 #include "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@904 147 double getFrequencyForY(int y, double minFreq, double maxFreq,
Chris@127 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@127 269 virtual void drawVisibleText(QPainter &p, int x, int y,
Chris@267 270 QString text, TextStyle style) const;
Chris@267 271
Chris@270 272 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@270 273 QRect rect, bool focus) const;
Chris@127 274
Chris@741 275 virtual bool shouldShowFeatureLabels() const {
Chris@741 276 return m_manager && m_manager->shouldShowFeatureLabels();
Chris@741 277 }
Chris@127 278 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const {
Chris@127 279 return false;
Chris@127 280 }
Chris@127 281 virtual bool shouldIlluminateLocalSelection(QPoint &, bool &, bool &) const {
Chris@127 282 return false;
Chris@127 283 }
Chris@127 284
Chris@127 285 virtual void setPlaybackFollow(PlaybackFollowMode m);
Chris@127 286 virtual PlaybackFollowMode getPlaybackFollow() const { return m_followPlay; }
Chris@127 287
Chris@127 288 typedef PropertyContainer::PropertyName PropertyName;
Chris@127 289
Chris@127 290 // We implement the PropertyContainer API, although we don't
Chris@127 291 // actually subclass PropertyContainer. We have our own
Chris@127 292 // PropertyContainer that we can return on request that just
Chris@127 293 // delegates back to us.
Chris@127 294 virtual PropertyContainer::PropertyList getProperties() const;
Chris@127 295 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@127 296 virtual PropertyContainer::PropertyType getPropertyType(const PropertyName &) const;
Chris@127 297 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 298 int *min, int *max, int *deflt) const;
Chris@127 299 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@127 300 int value) const;
Chris@127 301 virtual void setProperty(const PropertyName &, int value);
Chris@127 302 virtual QString getPropertyContainerName() const {
Chris@127 303 return objectName();
Chris@127 304 }
Chris@127 305 virtual QString getPropertyContainerIconName() const = 0;
Chris@127 306
Chris@806 307 virtual int getPropertyContainerCount() const;
Chris@127 308
Chris@837 309 // The 0th property container is the view's own; the rest are the
Chris@837 310 // layers in fixed-order series
Chris@806 311 virtual const PropertyContainer *getPropertyContainer(int i) const;
Chris@806 312 virtual PropertyContainer *getPropertyContainer(int i);
Chris@127 313
Chris@229 314 // Render the contents on a wide canvas
Chris@908 315 virtual QImage *toNewImage(sv_frame_t f0, sv_frame_t f1);
Chris@226 316 virtual QImage *toNewImage();
Chris@908 317 virtual QSize getImageSize(sv_frame_t f0, sv_frame_t f1);
Chris@229 318 virtual QSize getImageSize();
Chris@226 319
Chris@127 320 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const;
Chris@127 321
Chris@904 322 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@127 323 bool &log) const;
Chris@127 324
Chris@316 325 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 326 QString extraAttributes = "") const;
Chris@127 327
Chris@222 328 // First frame actually in model, to right of scale, if present
Chris@902 329 virtual sv_frame_t getFirstVisibleFrame() const;
Chris@902 330 virtual sv_frame_t getLastVisibleFrame() const;
Chris@222 331
Chris@902 332 sv_frame_t getModelsStartFrame() const;
Chris@902 333 sv_frame_t getModelsEndFrame() const;
Chris@127 334
Chris@915 335 /**
Chris@915 336 * To be called from a layer, to obtain the extent of the surface
Chris@915 337 * that the layer is currently painting to. This may be the extent
Chris@915 338 * of the view (if 1x display scaling is in effect) or of a larger
Chris@915 339 * cached pixmap (if greater display scaling is in effect).
Chris@915 340 */
Chris@915 341 QRect getPaintRect() const;
Chris@915 342
Chris@915 343 QSize getPaintSize() const { return getPaintRect().size(); }
Chris@915 344 int getPaintWidth() const { return getPaintRect().width(); }
Chris@915 345 int getPaintHeight() const { return getPaintRect().height(); }
Chris@915 346
Chris@315 347 typedef std::set<Model *> ModelSet;
Chris@315 348 ModelSet getModels();
Chris@315 349
Chris@301 350 //!!!
Chris@320 351 Model *getAligningModel() const;
Chris@902 352 sv_frame_t alignFromReference(sv_frame_t) const;
Chris@902 353 sv_frame_t alignToReference(sv_frame_t) const;
Chris@902 354 sv_frame_t getAlignedPlaybackFrame() const;
Chris@301 355
Chris@1030 356 void updatePaintRect(QRect r) { update(r); }
Chris@1030 357
Chris@918 358 View *getView() { return this; }
Chris@918 359 const View *getView() const { return this; }
Chris@918 360
Chris@127 361 signals:
Chris@127 362 void propertyContainerAdded(PropertyContainer *pc);
Chris@127 363 void propertyContainerRemoved(PropertyContainer *pc);
Chris@127 364 void propertyContainerPropertyChanged(PropertyContainer *pc);
Chris@197 365 void propertyContainerPropertyRangeChanged(PropertyContainer *pc);
Chris@127 366 void propertyContainerNameChanged(PropertyContainer *pc);
Chris@298 367 void propertyContainerSelected(PropertyContainer *pc);
Chris@127 368 void propertyChanged(PropertyContainer::PropertyName);
Chris@127 369
Chris@336 370 void layerModelChanged();
Chris@336 371
Chris@902 372 void centreFrameChanged(sv_frame_t frame,
Chris@211 373 bool globalScroll,
Chris@211 374 PlaybackFollowMode followMode);
Chris@211 375
Chris@867 376 void zoomLevelChanged(int level, bool locked);
Chris@127 377
Chris@189 378 void contextHelpChanged(const QString &);
Chris@189 379
Chris@127 380 public slots:
Chris@127 381 virtual void modelChanged();
Chris@902 382 virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame);
Chris@127 383 virtual void modelCompletionChanged();
Chris@320 384 virtual void modelAlignmentCompletionChanged();
Chris@127 385 virtual void modelReplaced();
Chris@127 386 virtual void layerParametersChanged();
Chris@197 387 virtual void layerParameterRangesChanged();
Chris@268 388 virtual void layerMeasurementRectsChanged();
Chris@127 389 virtual void layerNameChanged();
Chris@127 390
Chris@902 391 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@902 392 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@902 393 virtual void viewManagerPlaybackFrameChanged(sv_frame_t);
Chris@806 394 virtual void viewZoomLevelChanged(View *, int, bool);
Chris@127 395
Chris@127 396 virtual void propertyContainerSelected(View *, PropertyContainer *pc);
Chris@127 397
Chris@127 398 virtual void selectionChanged();
Chris@127 399 virtual void toolModeChanged();
Chris@133 400 virtual void overlayModeChanged();
Chris@133 401 virtual void zoomWheelsEnabledChanged();
Chris@127 402
Chris@797 403 virtual void cancelClicked();
Chris@797 404
Chris@555 405 virtual void progressCheckStalledTimerElapsed();
Chris@555 406
Chris@127 407 protected:
Chris@127 408 View(QWidget *, bool showProgress);
Chris@1030 409
Chris@1030 410 int m_id;
Chris@1030 411
Chris@127 412 virtual void paintEvent(QPaintEvent *e);
Chris@127 413 virtual void drawSelections(QPainter &);
Chris@127 414 virtual bool shouldLabelSelections() const { return true; }
Chris@908 415 virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1);
Chris@339 416 virtual void setPaintFont(QPainter &paint);
Chris@952 417
Chris@952 418 QSize scaledSize(const QSize &s, int factor) {
Chris@952 419 return QSize(s.width() * factor, s.height() * factor);
Chris@952 420 }
Chris@952 421 QRect scaledRect(const QRect &r, int factor) {
Chris@952 422 return QRect(r.x() * factor, r.y() * factor,
Chris@952 423 r.width() * factor, r.height() * factor);
Chris@952 424 }
Chris@339 425
Chris@127 426 typedef std::vector<Layer *> LayerList;
Chris@127 427
Chris@908 428 sv_samplerate_t getModelsSampleRate() const;
Chris@127 429 bool areLayersScrollable() const;
Chris@127 430 LayerList getScrollableBackLayers(bool testChanged, bool &changed) const;
Chris@127 431 LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const;
Chris@806 432 int getZoomConstraintBlockSize(int blockSize,
Chris@127 433 ZoomConstraint::RoundingDirection dir =
Chris@127 434 ZoomConstraint::RoundNearest) const;
Chris@127 435
Chris@183 436 // True if the top layer(s) use colours for meaningful things. If
Chris@183 437 // this is the case, selections will be shown using unfilled boxes
Chris@183 438 // rather than with a translucent fill.
Chris@183 439 bool areLayerColoursSignificant() const;
Chris@183 440
Chris@217 441 // True if the top layer has a time axis on the x coordinate (this
Chris@217 442 // is generally the case except for spectrum/slice layers). It
Chris@217 443 // will not be possible to make or display selections if this is
Chris@217 444 // false.
Chris@217 445 bool hasTopLayerTimeXAxis() const;
Chris@217 446
Chris@902 447 bool setCentreFrame(sv_frame_t f, bool doEmit);
Chris@127 448
Chris@902 449 void movePlayPointer(sv_frame_t f);
Chris@511 450
Chris@127 451 void checkProgress(void *object);
Chris@384 452 int getProgressBarWidth() const; // if visible
Chris@127 453
Chris@956 454 int effectiveDevicePixelRatio() const;
Chris@956 455
Chris@902 456 sv_frame_t m_centreFrame;
Chris@127 457 int m_zoomLevel;
Chris@127 458 bool m_followPan;
Chris@127 459 bool m_followZoom;
Chris@127 460 PlaybackFollowMode m_followPlay;
Chris@789 461 bool m_followPlayIsDetached;
Chris@902 462 sv_frame_t m_playPointerFrame;
Chris@127 463 bool m_lightBackground;
Chris@127 464 bool m_showProgress;
Chris@127 465
Chris@127 466 QPixmap *m_cache;
Chris@952 467 QPixmap *m_buffer;
Chris@902 468 sv_frame_t m_cacheCentreFrame;
Chris@127 469 int m_cacheZoomLevel;
Chris@127 470 bool m_selectionCached;
Chris@127 471
Chris@127 472 bool m_deleting;
Chris@127 473
Chris@835 474 LayerList m_layerStack; // I don't own these, but see dtor note above
Chris@835 475 LayerList m_fixedOrderLayers;
Chris@127 476 bool m_haveSelectedLayer;
Chris@127 477
Chris@583 478 QString m_lastError;
Chris@583 479
Chris@127 480 // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers
Chris@127 481 mutable LayerList m_lastScrollableBackLayers;
Chris@127 482 mutable LayerList m_lastNonScrollableBackLayers;
Chris@127 483
Chris@555 484 struct ProgressBarRec {
Chris@797 485 QPushButton *cancel;
Chris@555 486 QProgressBar *bar;
Chris@555 487 int lastCheck;
Chris@555 488 QTimer *checkTimer;
Chris@555 489 };
Chris@555 490 typedef std::map<Layer *, ProgressBarRec> ProgressMap;
Chris@127 491 ProgressMap m_progressBars; // I own the ProgressBars
Chris@127 492
Chris@127 493 ViewManager *m_manager; // I don't own this
Chris@127 494 ViewPropertyContainer *m_propertyContainer; // I own this
Chris@127 495 };
Chris@127 496
Chris@127 497
Chris@127 498 // Use this for delegation, because we can't subclass from
Chris@127 499 // PropertyContainer (which is a QObject) ourselves because of
Chris@127 500 // ambiguity with QFrame parent
Chris@127 501
Chris@127 502 class ViewPropertyContainer : public PropertyContainer
Chris@127 503 {
Chris@127 504 Q_OBJECT
Chris@127 505
Chris@127 506 public:
Chris@127 507 ViewPropertyContainer(View *v);
Chris@728 508 virtual ~ViewPropertyContainer();
Chris@728 509
Chris@127 510 PropertyList getProperties() const { return m_v->getProperties(); }
Chris@127 511 QString getPropertyLabel(const PropertyName &n) const {
Chris@127 512 return m_v->getPropertyLabel(n);
Chris@127 513 }
Chris@127 514 PropertyType getPropertyType(const PropertyName &n) const {
Chris@127 515 return m_v->getPropertyType(n);
Chris@127 516 }
Chris@216 517 int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max,
Chris@216 518 int *deflt) const {
Chris@216 519 return m_v->getPropertyRangeAndValue(n, min, max, deflt);
Chris@127 520 }
Chris@127 521 QString getPropertyValueLabel(const PropertyName &n, int value) const {
Chris@127 522 return m_v->getPropertyValueLabel(n, value);
Chris@127 523 }
Chris@127 524 QString getPropertyContainerName() const {
Chris@127 525 return m_v->getPropertyContainerName();
Chris@127 526 }
Chris@127 527 QString getPropertyContainerIconName() const {
Chris@127 528 return m_v->getPropertyContainerIconName();
Chris@127 529 }
Chris@127 530
Chris@127 531 public slots:
Chris@127 532 virtual void setProperty(const PropertyName &n, int value) {
Chris@127 533 m_v->setProperty(n, value);
Chris@127 534 }
Chris@127 535
Chris@127 536 protected:
Chris@127 537 View *m_v;
Chris@127 538 };
Chris@127 539
Chris@127 540 #endif
Chris@127 541