annotate view/View.h @ 1204:d421df27e184 3.0-integration

Further PropertyBox layout overhaul: avoid crash (/ assertion failure) when property type changes from e.g. colour to colourmap, by replacing the existing widget within the layout rather than trying to repopulate it
author Chris Cannam
date Tue, 20 Dec 2016 10:49:24 +0000
parents 6828735468c9
children c603aba61702
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@1202 311 /**
Chris@1202 312 * Render the view contents to a new QImage (which may be wider
Chris@1202 313 * than the visible View).
Chris@1202 314 */
Chris@1202 315 virtual QImage *renderToNewImage();
Chris@226 316
Chris@1202 317 /**
Chris@1202 318 * Render the view contents between the given frame extents to a
Chris@1202 319 * new QImage (which may be wider than the visible View).
Chris@1202 320 */
Chris@1202 321 virtual QImage *renderPartToNewImage(sv_frame_t f0, sv_frame_t f1);
Chris@1202 322
Chris@1202 323 /**
Chris@1202 324 * Calculate and return the size of image that will be generated
Chris@1202 325 * by renderToNewImage().
Chris@1202 326 */
Chris@1202 327 virtual QSize getRenderedImageSize();
Chris@1202 328
Chris@1202 329 /**
Chris@1202 330 * Calculate and return the size of image that will be generated
Chris@1202 331 * by renderPartToNewImage(f0, f1).
Chris@1202 332 */
Chris@1202 333 virtual QSize getRenderedPartImageSize(sv_frame_t f0, sv_frame_t f1);
Chris@1202 334
Chris@1202 335 /**
Chris@1202 336 * Render the view contents to a new SVG file.
Chris@1202 337 */
Chris@1202 338 virtual bool renderToSvgFile(QString filename);
Chris@1202 339
Chris@1202 340 /**
Chris@1202 341 * Render the view contents between the given frame extents to a
Chris@1202 342 * new SVG file.
Chris@1202 343 */
Chris@1202 344 virtual bool renderPartToSvgFile(QString filename,
Chris@1202 345 sv_frame_t f0, sv_frame_t f1);
Chris@1202 346
Chris@127 347 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const;
Chris@127 348
Chris@904 349 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@127 350 bool &log) const;
Chris@127 351
Chris@316 352 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 353 QString extraAttributes = "") const;
Chris@127 354
Chris@222 355 // First frame actually in model, to right of scale, if present
Chris@902 356 virtual sv_frame_t getFirstVisibleFrame() const;
Chris@902 357 virtual sv_frame_t getLastVisibleFrame() const;
Chris@222 358
Chris@902 359 sv_frame_t getModelsStartFrame() const;
Chris@902 360 sv_frame_t getModelsEndFrame() const;
Chris@127 361
Chris@915 362 /**
Chris@915 363 * To be called from a layer, to obtain the extent of the surface
Chris@915 364 * that the layer is currently painting to. This may be the extent
Chris@915 365 * of the view (if 1x display scaling is in effect) or of a larger
Chris@915 366 * cached pixmap (if greater display scaling is in effect).
Chris@915 367 */
Chris@915 368 QRect getPaintRect() const;
Chris@915 369
Chris@915 370 QSize getPaintSize() const { return getPaintRect().size(); }
Chris@915 371 int getPaintWidth() const { return getPaintRect().width(); }
Chris@915 372 int getPaintHeight() const { return getPaintRect().height(); }
Chris@915 373
Chris@315 374 typedef std::set<Model *> ModelSet;
Chris@315 375 ModelSet getModels();
Chris@315 376
Chris@301 377 //!!!
Chris@320 378 Model *getAligningModel() const;
Chris@902 379 sv_frame_t alignFromReference(sv_frame_t) const;
Chris@902 380 sv_frame_t alignToReference(sv_frame_t) const;
Chris@902 381 sv_frame_t getAlignedPlaybackFrame() const;
Chris@301 382
Chris@1030 383 void updatePaintRect(QRect r) { update(r); }
Chris@1030 384
Chris@918 385 View *getView() { return this; }
Chris@918 386 const View *getView() const { return this; }
Chris@918 387
Chris@127 388 signals:
Chris@127 389 void propertyContainerAdded(PropertyContainer *pc);
Chris@127 390 void propertyContainerRemoved(PropertyContainer *pc);
Chris@127 391 void propertyContainerPropertyChanged(PropertyContainer *pc);
Chris@197 392 void propertyContainerPropertyRangeChanged(PropertyContainer *pc);
Chris@127 393 void propertyContainerNameChanged(PropertyContainer *pc);
Chris@298 394 void propertyContainerSelected(PropertyContainer *pc);
Chris@127 395 void propertyChanged(PropertyContainer::PropertyName);
Chris@127 396
Chris@336 397 void layerModelChanged();
Chris@336 398
Chris@902 399 void centreFrameChanged(sv_frame_t frame,
Chris@211 400 bool globalScroll,
Chris@211 401 PlaybackFollowMode followMode);
Chris@211 402
Chris@867 403 void zoomLevelChanged(int level, bool locked);
Chris@127 404
Chris@189 405 void contextHelpChanged(const QString &);
Chris@189 406
Chris@127 407 public slots:
Chris@127 408 virtual void modelChanged();
Chris@902 409 virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame);
Chris@127 410 virtual void modelCompletionChanged();
Chris@320 411 virtual void modelAlignmentCompletionChanged();
Chris@127 412 virtual void modelReplaced();
Chris@127 413 virtual void layerParametersChanged();
Chris@197 414 virtual void layerParameterRangesChanged();
Chris@268 415 virtual void layerMeasurementRectsChanged();
Chris@127 416 virtual void layerNameChanged();
Chris@127 417
Chris@902 418 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@902 419 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@902 420 virtual void viewManagerPlaybackFrameChanged(sv_frame_t);
Chris@806 421 virtual void viewZoomLevelChanged(View *, int, bool);
Chris@127 422
Chris@127 423 virtual void propertyContainerSelected(View *, PropertyContainer *pc);
Chris@127 424
Chris@127 425 virtual void selectionChanged();
Chris@127 426 virtual void toolModeChanged();
Chris@133 427 virtual void overlayModeChanged();
Chris@133 428 virtual void zoomWheelsEnabledChanged();
Chris@127 429
Chris@797 430 virtual void cancelClicked();
Chris@797 431
Chris@555 432 virtual void progressCheckStalledTimerElapsed();
Chris@555 433
Chris@127 434 protected:
Chris@127 435 View(QWidget *, bool showProgress);
Chris@1030 436
Chris@1030 437 int m_id;
Chris@1030 438
Chris@127 439 virtual void paintEvent(QPaintEvent *e);
Chris@127 440 virtual void drawSelections(QPainter &);
Chris@127 441 virtual bool shouldLabelSelections() const { return true; }
Chris@908 442 virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1);
Chris@339 443 virtual void setPaintFont(QPainter &paint);
Chris@952 444
Chris@952 445 QSize scaledSize(const QSize &s, int factor) {
Chris@952 446 return QSize(s.width() * factor, s.height() * factor);
Chris@952 447 }
Chris@952 448 QRect scaledRect(const QRect &r, int factor) {
Chris@952 449 return QRect(r.x() * factor, r.y() * factor,
Chris@952 450 r.width() * factor, r.height() * factor);
Chris@952 451 }
Chris@339 452
Chris@127 453 typedef std::vector<Layer *> LayerList;
Chris@127 454
Chris@908 455 sv_samplerate_t getModelsSampleRate() const;
Chris@127 456 bool areLayersScrollable() const;
Chris@127 457 LayerList getScrollableBackLayers(bool testChanged, bool &changed) const;
Chris@127 458 LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const;
Chris@806 459 int getZoomConstraintBlockSize(int blockSize,
Chris@127 460 ZoomConstraint::RoundingDirection dir =
Chris@127 461 ZoomConstraint::RoundNearest) const;
Chris@127 462
Chris@183 463 // True if the top layer(s) use colours for meaningful things. If
Chris@183 464 // this is the case, selections will be shown using unfilled boxes
Chris@183 465 // rather than with a translucent fill.
Chris@183 466 bool areLayerColoursSignificant() const;
Chris@183 467
Chris@217 468 // True if the top layer has a time axis on the x coordinate (this
Chris@217 469 // is generally the case except for spectrum/slice layers). It
Chris@217 470 // will not be possible to make or display selections if this is
Chris@217 471 // false.
Chris@217 472 bool hasTopLayerTimeXAxis() const;
Chris@217 473
Chris@902 474 bool setCentreFrame(sv_frame_t f, bool doEmit);
Chris@127 475
Chris@902 476 void movePlayPointer(sv_frame_t f);
Chris@511 477
Chris@127 478 void checkProgress(void *object);
Chris@384 479 int getProgressBarWidth() const; // if visible
Chris@127 480
Chris@956 481 int effectiveDevicePixelRatio() const;
Chris@956 482
Chris@902 483 sv_frame_t m_centreFrame;
Chris@127 484 int m_zoomLevel;
Chris@127 485 bool m_followPan;
Chris@127 486 bool m_followZoom;
Chris@127 487 PlaybackFollowMode m_followPlay;
Chris@789 488 bool m_followPlayIsDetached;
Chris@902 489 sv_frame_t m_playPointerFrame;
Chris@127 490 bool m_lightBackground;
Chris@127 491 bool m_showProgress;
Chris@127 492
Chris@127 493 QPixmap *m_cache;
Chris@952 494 QPixmap *m_buffer;
Chris@902 495 sv_frame_t m_cacheCentreFrame;
Chris@127 496 int m_cacheZoomLevel;
Chris@127 497 bool m_selectionCached;
Chris@127 498
Chris@127 499 bool m_deleting;
Chris@127 500
Chris@835 501 LayerList m_layerStack; // I don't own these, but see dtor note above
Chris@835 502 LayerList m_fixedOrderLayers;
Chris@127 503 bool m_haveSelectedLayer;
Chris@127 504
Chris@583 505 QString m_lastError;
Chris@583 506
Chris@127 507 // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers
Chris@127 508 mutable LayerList m_lastScrollableBackLayers;
Chris@127 509 mutable LayerList m_lastNonScrollableBackLayers;
Chris@127 510
Chris@555 511 struct ProgressBarRec {
Chris@797 512 QPushButton *cancel;
Chris@555 513 QProgressBar *bar;
Chris@555 514 int lastCheck;
Chris@555 515 QTimer *checkTimer;
Chris@555 516 };
Chris@555 517 typedef std::map<Layer *, ProgressBarRec> ProgressMap;
Chris@127 518 ProgressMap m_progressBars; // I own the ProgressBars
Chris@127 519
Chris@127 520 ViewManager *m_manager; // I don't own this
Chris@127 521 ViewPropertyContainer *m_propertyContainer; // I own this
Chris@127 522 };
Chris@127 523
Chris@127 524
Chris@127 525 // Use this for delegation, because we can't subclass from
Chris@127 526 // PropertyContainer (which is a QObject) ourselves because of
Chris@127 527 // ambiguity with QFrame parent
Chris@127 528
Chris@127 529 class ViewPropertyContainer : public PropertyContainer
Chris@127 530 {
Chris@127 531 Q_OBJECT
Chris@127 532
Chris@127 533 public:
Chris@127 534 ViewPropertyContainer(View *v);
Chris@728 535 virtual ~ViewPropertyContainer();
Chris@728 536
Chris@127 537 PropertyList getProperties() const { return m_v->getProperties(); }
Chris@127 538 QString getPropertyLabel(const PropertyName &n) const {
Chris@127 539 return m_v->getPropertyLabel(n);
Chris@127 540 }
Chris@127 541 PropertyType getPropertyType(const PropertyName &n) const {
Chris@127 542 return m_v->getPropertyType(n);
Chris@127 543 }
Chris@216 544 int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max,
Chris@216 545 int *deflt) const {
Chris@216 546 return m_v->getPropertyRangeAndValue(n, min, max, deflt);
Chris@127 547 }
Chris@127 548 QString getPropertyValueLabel(const PropertyName &n, int value) const {
Chris@127 549 return m_v->getPropertyValueLabel(n, value);
Chris@127 550 }
Chris@127 551 QString getPropertyContainerName() const {
Chris@127 552 return m_v->getPropertyContainerName();
Chris@127 553 }
Chris@127 554 QString getPropertyContainerIconName() const {
Chris@127 555 return m_v->getPropertyContainerIconName();
Chris@127 556 }
Chris@127 557
Chris@127 558 public slots:
Chris@127 559 virtual void setProperty(const PropertyName &n, int value) {
Chris@127 560 m_v->setProperty(n, value);
Chris@127 561 }
Chris@127 562
Chris@127 563 protected:
Chris@127 564 View *m_v;
Chris@127 565 };
Chris@127 566
Chris@127 567 #endif
Chris@127 568