annotate view/View.h @ 1024:3bce4c45b681 spectrogram-minor-refactor

Rearrange cache update calculations so as to use the actual painted width returned by paint functions (though they only ever return the same width as requested, at this point)
author Chris Cannam
date Mon, 25 Jan 2016 15:52:26 +0000
parents 092de22db207
children 0be17aafa935
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@127 65
Chris@127 66 /**
Chris@127 67 * Retrieve the first visible sample frame on the widget.
Chris@127 68 * This is a calculated value based on the centre-frame, widget
Chris@127 69 * width and zoom level. The result may be negative.
Chris@127 70 */
Chris@902 71 sv_frame_t getStartFrame() const;
Chris@127 72
Chris@127 73 /**
Chris@127 74 * Set the widget pan based on the given first visible frame. The
Chris@127 75 * frame value may be negative.
Chris@127 76 */
Chris@902 77 void setStartFrame(sv_frame_t);
Chris@127 78
Chris@127 79 /**
Chris@127 80 * Return the centre frame of the visible widget. This is an
Chris@127 81 * exact value that does not depend on the zoom block size. Other
Chris@127 82 * frame values (start, end) are calculated from this based on the
Chris@127 83 * zoom and other factors.
Chris@127 84 */
Chris@902 85 sv_frame_t getCentreFrame() const { return m_centreFrame; }
Chris@127 86
Chris@127 87 /**
Chris@127 88 * Set the centre frame of the visible widget.
Chris@127 89 */
Chris@902 90 void setCentreFrame(sv_frame_t f) { setCentreFrame(f, true); }
Chris@127 91
Chris@127 92 /**
Chris@127 93 * Retrieve the last visible sample frame on the widget.
Chris@127 94 * This is a calculated value based on the centre-frame, widget
Chris@127 95 * width and zoom level.
Chris@127 96 */
Chris@902 97 sv_frame_t getEndFrame() const;
Chris@127 98
Chris@127 99 /**
Chris@127 100 * Return the pixel x-coordinate corresponding to a given sample
Chris@127 101 * frame (which may be negative).
Chris@127 102 */
Chris@902 103 int getXForFrame(sv_frame_t frame) const;
Chris@127 104
Chris@127 105 /**
Chris@127 106 * Return the closest frame to the given pixel x-coordinate.
Chris@127 107 */
Chris@902 108 sv_frame_t getFrameForX(int x) const;
Chris@127 109
Chris@127 110 /**
Chris@127 111 * Return the pixel y-coordinate corresponding to a given
Chris@127 112 * frequency, if the frequency range is as specified. This does
Chris@127 113 * not imply any policy about layer frequency ranges, but it might
Chris@127 114 * be useful for layers to match theirs up if desired.
Chris@127 115 *
Chris@127 116 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@127 117 */
Chris@904 118 double getYForFrequency(double frequency, double minFreq, double maxFreq,
Chris@127 119 bool logarithmic) const;
Chris@127 120
Chris@127 121 /**
Chris@127 122 * Return the closest frequency to the given pixel y-coordinate,
Chris@127 123 * if the frequency range is as specified.
Chris@127 124 *
Chris@127 125 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@127 126 */
Chris@904 127 double getFrequencyForY(int y, double minFreq, double maxFreq,
Chris@127 128 bool logarithmic) const;
Chris@127 129
Chris@127 130 /**
Chris@127 131 * Return the zoom level, i.e. the number of frames per pixel
Chris@127 132 */
Chris@127 133 int getZoomLevel() const;
Chris@127 134
Chris@127 135 /**
Chris@127 136 * Set the zoom level, i.e. the number of frames per pixel. The
Chris@127 137 * centre frame will be unchanged; the start and end frames will
Chris@127 138 * change.
Chris@127 139 */
Chris@806 140 virtual void setZoomLevel(int z);
Chris@127 141
Chris@127 142 /**
Chris@127 143 * Zoom in or out.
Chris@127 144 */
Chris@127 145 virtual void zoom(bool in);
Chris@127 146
Chris@127 147 /**
Chris@127 148 * Scroll left or right by a smallish or largish amount.
Chris@127 149 */
Chris@510 150 virtual void scroll(bool right, bool lots, bool doEmit = true);
Chris@127 151
Chris@834 152 /**
Chris@834 153 * Add a layer to the view. (Normally this should be handled
Chris@834 154 * through some command abstraction instead of using this function
Chris@834 155 * directly.)
Chris@834 156 */
Chris@127 157 virtual void addLayer(Layer *v);
Chris@834 158
Chris@834 159 /**
Chris@834 160 * Remove a layer from the view. Does not delete the
Chris@834 161 * layer. (Normally this should be handled through some command
Chris@834 162 * abstraction instead of using this function directly.)
Chris@834 163 */
Chris@834 164 virtual void removeLayer(Layer *v);
Chris@834 165
Chris@834 166 /**
Chris@834 167 * Return the number of layers, regardless of whether visible or
Chris@834 168 * dormant, i.e. invisible, in this view.
Chris@834 169 */
Chris@902 170 virtual int getLayerCount() const { return int(m_layerStack.size()); }
Chris@127 171
Chris@127 172 /**
Chris@834 173 * Return the nth layer, counted in stacking order. That is,
Chris@834 174 * layer 0 is the bottom layer and layer "getLayerCount()-1" is
Chris@834 175 * the top one. The returned layer may be visible or it may be
Chris@834 176 * dormant, i.e. invisible.
Chris@127 177 */
Chris@277 178 virtual Layer *getLayer(int n) {
Chris@902 179 if (in_range_for(m_layerStack, n)) return m_layerStack[n];
Chris@835 180 else return 0;
Chris@277 181 }
Chris@127 182
Chris@127 183 /**
Chris@835 184 * Return the nth layer, counted in the order they were
Chris@835 185 * added. Unlike the stacking order used in getLayer(), which
Chris@835 186 * changes each time a layer is selected, this ordering remains
Chris@835 187 * fixed. The returned layer may be visible or it may be dormant,
Chris@835 188 * i.e. invisible.
Chris@268 189 */
Chris@835 190 virtual Layer *getFixedOrderLayer(int n) {
Chris@835 191 if (n < int(m_fixedOrderLayers.size())) return m_fixedOrderLayers[n];
Chris@835 192 else return 0;
Chris@268 193 }
Chris@268 194
Chris@268 195 /**
Chris@834 196 * Return the layer currently active for tool interaction. This is
Chris@834 197 * the topmost non-dormant (i.e. visible) layer in the view. If
Chris@834 198 * there are no visible layers in the view, return 0.
Chris@834 199 */
Chris@834 200 virtual Layer *getInteractionLayer();
Chris@834 201
Chris@841 202 virtual const Layer *getInteractionLayer() const;
Chris@841 203
Chris@834 204 /**
Chris@835 205 * Return the layer most recently selected by the user. This is
Chris@835 206 * the layer that any non-tool-driven commands should operate on,
Chris@835 207 * in the case where this view is the "current" one.
Chris@835 208 *
Chris@835 209 * If the user has selected the view itself more recently than any
Chris@835 210 * of the layers on it, this function will return 0, and any
Chris@835 211 * non-tool-driven layer commands should be deactivated while this
Chris@835 212 * view is current. It will also return 0 if there are no layers
Chris@835 213 * in the view.
Chris@834 214 *
Chris@834 215 * Note that, unlike getInteractionLayer(), this could return an
Chris@834 216 * invisible (dormant) layer.
Chris@127 217 */
Chris@127 218 virtual Layer *getSelectedLayer();
Chris@834 219
Chris@127 220 virtual const Layer *getSelectedLayer() const;
Chris@127 221
Chris@835 222 /**
Chris@835 223 * Return the "top" layer in the view, whether visible or dormant.
Chris@835 224 * This is the same as getLayer(getLayerCount()-1) if there is at
Chris@835 225 * least one layer, and 0 otherwise.
Chris@835 226 *
Chris@835 227 * For most purposes involving interaction or commands, you
Chris@835 228 * probably want either getInteractionLayer() or
Chris@835 229 * getSelectedLayer() instead.
Chris@835 230 */
Chris@835 231 virtual Layer *getTopLayer() {
Chris@835 232 return m_layerStack.empty() ? 0 : m_layerStack[m_layerStack.size()-1];
Chris@835 233 }
Chris@835 234
Chris@127 235 virtual void setViewManager(ViewManager *m);
Chris@908 236 virtual void setViewManager(ViewManager *m, sv_frame_t initialFrame);
Chris@127 237 virtual ViewManager *getViewManager() const { return m_manager; }
Chris@127 238
Chris@127 239 virtual void setFollowGlobalPan(bool f);
Chris@127 240 virtual bool getFollowGlobalPan() const { return m_followPan; }
Chris@127 241
Chris@127 242 virtual void setFollowGlobalZoom(bool f);
Chris@127 243 virtual bool getFollowGlobalZoom() const { return m_followZoom; }
Chris@127 244
Chris@224 245 virtual bool hasLightBackground() const;
Chris@287 246 virtual QColor getForeground() const;
Chris@287 247 virtual QColor getBackground() const;
Chris@127 248
Chris@127 249 virtual void drawVisibleText(QPainter &p, int x, int y,
Chris@267 250 QString text, TextStyle style) const;
Chris@267 251
Chris@270 252 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@270 253 QRect rect, bool focus) const;
Chris@127 254
Chris@741 255 virtual bool shouldShowFeatureLabels() const {
Chris@741 256 return m_manager && m_manager->shouldShowFeatureLabels();
Chris@741 257 }
Chris@127 258 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const {
Chris@127 259 return false;
Chris@127 260 }
Chris@127 261 virtual bool shouldIlluminateLocalSelection(QPoint &, bool &, bool &) const {
Chris@127 262 return false;
Chris@127 263 }
Chris@127 264
Chris@127 265 virtual void setPlaybackFollow(PlaybackFollowMode m);
Chris@127 266 virtual PlaybackFollowMode getPlaybackFollow() const { return m_followPlay; }
Chris@127 267
Chris@127 268 typedef PropertyContainer::PropertyName PropertyName;
Chris@127 269
Chris@127 270 // We implement the PropertyContainer API, although we don't
Chris@127 271 // actually subclass PropertyContainer. We have our own
Chris@127 272 // PropertyContainer that we can return on request that just
Chris@127 273 // delegates back to us.
Chris@127 274 virtual PropertyContainer::PropertyList getProperties() const;
Chris@127 275 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@127 276 virtual PropertyContainer::PropertyType getPropertyType(const PropertyName &) const;
Chris@127 277 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 278 int *min, int *max, int *deflt) const;
Chris@127 279 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@127 280 int value) const;
Chris@127 281 virtual void setProperty(const PropertyName &, int value);
Chris@127 282 virtual QString getPropertyContainerName() const {
Chris@127 283 return objectName();
Chris@127 284 }
Chris@127 285 virtual QString getPropertyContainerIconName() const = 0;
Chris@127 286
Chris@806 287 virtual int getPropertyContainerCount() const;
Chris@127 288
Chris@837 289 // The 0th property container is the view's own; the rest are the
Chris@837 290 // layers in fixed-order series
Chris@806 291 virtual const PropertyContainer *getPropertyContainer(int i) const;
Chris@806 292 virtual PropertyContainer *getPropertyContainer(int i);
Chris@127 293
Chris@229 294 // Render the contents on a wide canvas
Chris@908 295 virtual QImage *toNewImage(sv_frame_t f0, sv_frame_t f1);
Chris@226 296 virtual QImage *toNewImage();
Chris@908 297 virtual QSize getImageSize(sv_frame_t f0, sv_frame_t f1);
Chris@229 298 virtual QSize getImageSize();
Chris@226 299
Chris@127 300 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const;
Chris@127 301
Chris@904 302 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@127 303 bool &log) const;
Chris@127 304
Chris@316 305 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 306 QString extraAttributes = "") const;
Chris@127 307
Chris@222 308 // First frame actually in model, to right of scale, if present
Chris@902 309 virtual sv_frame_t getFirstVisibleFrame() const;
Chris@902 310 virtual sv_frame_t getLastVisibleFrame() const;
Chris@222 311
Chris@902 312 sv_frame_t getModelsStartFrame() const;
Chris@902 313 sv_frame_t getModelsEndFrame() const;
Chris@127 314
Chris@915 315 /**
Chris@915 316 * To be called from a layer, to obtain the extent of the surface
Chris@915 317 * that the layer is currently painting to. This may be the extent
Chris@915 318 * of the view (if 1x display scaling is in effect) or of a larger
Chris@915 319 * cached pixmap (if greater display scaling is in effect).
Chris@915 320 */
Chris@915 321 QRect getPaintRect() const;
Chris@915 322
Chris@915 323 QSize getPaintSize() const { return getPaintRect().size(); }
Chris@915 324 int getPaintWidth() const { return getPaintRect().width(); }
Chris@915 325 int getPaintHeight() const { return getPaintRect().height(); }
Chris@915 326
Chris@315 327 typedef std::set<Model *> ModelSet;
Chris@315 328 ModelSet getModels();
Chris@315 329
Chris@301 330 //!!!
Chris@320 331 Model *getAligningModel() const;
Chris@902 332 sv_frame_t alignFromReference(sv_frame_t) const;
Chris@902 333 sv_frame_t alignToReference(sv_frame_t) const;
Chris@902 334 sv_frame_t getAlignedPlaybackFrame() const;
Chris@301 335
Chris@918 336 View *getView() { return this; }
Chris@918 337 const View *getView() const { return this; }
Chris@918 338
Chris@127 339 signals:
Chris@127 340 void propertyContainerAdded(PropertyContainer *pc);
Chris@127 341 void propertyContainerRemoved(PropertyContainer *pc);
Chris@127 342 void propertyContainerPropertyChanged(PropertyContainer *pc);
Chris@197 343 void propertyContainerPropertyRangeChanged(PropertyContainer *pc);
Chris@127 344 void propertyContainerNameChanged(PropertyContainer *pc);
Chris@298 345 void propertyContainerSelected(PropertyContainer *pc);
Chris@127 346 void propertyChanged(PropertyContainer::PropertyName);
Chris@127 347
Chris@336 348 void layerModelChanged();
Chris@336 349
Chris@902 350 void centreFrameChanged(sv_frame_t frame,
Chris@211 351 bool globalScroll,
Chris@211 352 PlaybackFollowMode followMode);
Chris@211 353
Chris@806 354 void zoomLevelChanged(int, bool);
Chris@127 355
Chris@189 356 void contextHelpChanged(const QString &);
Chris@189 357
Chris@127 358 public slots:
Chris@127 359 virtual void modelChanged();
Chris@902 360 virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame);
Chris@127 361 virtual void modelCompletionChanged();
Chris@320 362 virtual void modelAlignmentCompletionChanged();
Chris@127 363 virtual void modelReplaced();
Chris@127 364 virtual void layerParametersChanged();
Chris@197 365 virtual void layerParameterRangesChanged();
Chris@268 366 virtual void layerMeasurementRectsChanged();
Chris@127 367 virtual void layerNameChanged();
Chris@127 368
Chris@902 369 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@902 370 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@902 371 virtual void viewManagerPlaybackFrameChanged(sv_frame_t);
Chris@806 372 virtual void viewZoomLevelChanged(View *, int, bool);
Chris@127 373
Chris@127 374 virtual void propertyContainerSelected(View *, PropertyContainer *pc);
Chris@127 375
Chris@127 376 virtual void selectionChanged();
Chris@127 377 virtual void toolModeChanged();
Chris@133 378 virtual void overlayModeChanged();
Chris@133 379 virtual void zoomWheelsEnabledChanged();
Chris@127 380
Chris@797 381 virtual void cancelClicked();
Chris@797 382
Chris@555 383 virtual void progressCheckStalledTimerElapsed();
Chris@555 384
Chris@127 385 protected:
Chris@127 386 View(QWidget *, bool showProgress);
Chris@127 387 virtual void paintEvent(QPaintEvent *e);
Chris@127 388 virtual void drawSelections(QPainter &);
Chris@127 389 virtual bool shouldLabelSelections() const { return true; }
Chris@908 390 virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1);
Chris@339 391 virtual void setPaintFont(QPainter &paint);
Chris@952 392
Chris@952 393 QSize scaledSize(const QSize &s, int factor) {
Chris@952 394 return QSize(s.width() * factor, s.height() * factor);
Chris@952 395 }
Chris@952 396 QRect scaledRect(const QRect &r, int factor) {
Chris@952 397 return QRect(r.x() * factor, r.y() * factor,
Chris@952 398 r.width() * factor, r.height() * factor);
Chris@952 399 }
Chris@339 400
Chris@127 401 typedef std::vector<Layer *> LayerList;
Chris@127 402
Chris@908 403 sv_samplerate_t getModelsSampleRate() const;
Chris@127 404 bool areLayersScrollable() const;
Chris@127 405 LayerList getScrollableBackLayers(bool testChanged, bool &changed) const;
Chris@127 406 LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const;
Chris@806 407 int getZoomConstraintBlockSize(int blockSize,
Chris@127 408 ZoomConstraint::RoundingDirection dir =
Chris@127 409 ZoomConstraint::RoundNearest) const;
Chris@127 410
Chris@183 411 // True if the top layer(s) use colours for meaningful things. If
Chris@183 412 // this is the case, selections will be shown using unfilled boxes
Chris@183 413 // rather than with a translucent fill.
Chris@183 414 bool areLayerColoursSignificant() const;
Chris@183 415
Chris@217 416 // True if the top layer has a time axis on the x coordinate (this
Chris@217 417 // is generally the case except for spectrum/slice layers). It
Chris@217 418 // will not be possible to make or display selections if this is
Chris@217 419 // false.
Chris@217 420 bool hasTopLayerTimeXAxis() const;
Chris@217 421
Chris@902 422 bool setCentreFrame(sv_frame_t f, bool doEmit);
Chris@127 423
Chris@902 424 void movePlayPointer(sv_frame_t f);
Chris@511 425
Chris@127 426 void checkProgress(void *object);
Chris@384 427 int getProgressBarWidth() const; // if visible
Chris@127 428
Chris@956 429 int effectiveDevicePixelRatio() const;
Chris@956 430
Chris@902 431 sv_frame_t m_centreFrame;
Chris@127 432 int m_zoomLevel;
Chris@127 433 bool m_followPan;
Chris@127 434 bool m_followZoom;
Chris@127 435 PlaybackFollowMode m_followPlay;
Chris@789 436 bool m_followPlayIsDetached;
Chris@902 437 sv_frame_t m_playPointerFrame;
Chris@127 438 bool m_lightBackground;
Chris@127 439 bool m_showProgress;
Chris@127 440
Chris@127 441 QPixmap *m_cache;
Chris@952 442 QPixmap *m_buffer;
Chris@902 443 sv_frame_t m_cacheCentreFrame;
Chris@127 444 int m_cacheZoomLevel;
Chris@127 445 bool m_selectionCached;
Chris@127 446
Chris@127 447 bool m_deleting;
Chris@127 448
Chris@835 449 LayerList m_layerStack; // I don't own these, but see dtor note above
Chris@835 450 LayerList m_fixedOrderLayers;
Chris@127 451 bool m_haveSelectedLayer;
Chris@127 452
Chris@583 453 QString m_lastError;
Chris@583 454
Chris@127 455 // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers
Chris@127 456 mutable LayerList m_lastScrollableBackLayers;
Chris@127 457 mutable LayerList m_lastNonScrollableBackLayers;
Chris@127 458
Chris@555 459 struct ProgressBarRec {
Chris@797 460 QPushButton *cancel;
Chris@555 461 QProgressBar *bar;
Chris@555 462 int lastCheck;
Chris@555 463 QTimer *checkTimer;
Chris@555 464 };
Chris@555 465 typedef std::map<Layer *, ProgressBarRec> ProgressMap;
Chris@127 466 ProgressMap m_progressBars; // I own the ProgressBars
Chris@127 467
Chris@127 468 ViewManager *m_manager; // I don't own this
Chris@127 469 ViewPropertyContainer *m_propertyContainer; // I own this
Chris@127 470 };
Chris@127 471
Chris@127 472
Chris@127 473 // Use this for delegation, because we can't subclass from
Chris@127 474 // PropertyContainer (which is a QObject) ourselves because of
Chris@127 475 // ambiguity with QFrame parent
Chris@127 476
Chris@127 477 class ViewPropertyContainer : public PropertyContainer
Chris@127 478 {
Chris@127 479 Q_OBJECT
Chris@127 480
Chris@127 481 public:
Chris@127 482 ViewPropertyContainer(View *v);
Chris@728 483 virtual ~ViewPropertyContainer();
Chris@728 484
Chris@127 485 PropertyList getProperties() const { return m_v->getProperties(); }
Chris@127 486 QString getPropertyLabel(const PropertyName &n) const {
Chris@127 487 return m_v->getPropertyLabel(n);
Chris@127 488 }
Chris@127 489 PropertyType getPropertyType(const PropertyName &n) const {
Chris@127 490 return m_v->getPropertyType(n);
Chris@127 491 }
Chris@216 492 int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max,
Chris@216 493 int *deflt) const {
Chris@216 494 return m_v->getPropertyRangeAndValue(n, min, max, deflt);
Chris@127 495 }
Chris@127 496 QString getPropertyValueLabel(const PropertyName &n, int value) const {
Chris@127 497 return m_v->getPropertyValueLabel(n, value);
Chris@127 498 }
Chris@127 499 QString getPropertyContainerName() const {
Chris@127 500 return m_v->getPropertyContainerName();
Chris@127 501 }
Chris@127 502 QString getPropertyContainerIconName() const {
Chris@127 503 return m_v->getPropertyContainerIconName();
Chris@127 504 }
Chris@127 505
Chris@127 506 public slots:
Chris@127 507 virtual void setProperty(const PropertyName &n, int value) {
Chris@127 508 m_v->setProperty(n, value);
Chris@127 509 }
Chris@127 510
Chris@127 511 protected:
Chris@127 512 View *m_v;
Chris@127 513 };
Chris@127 514
Chris@127 515 #endif
Chris@127 516