annotate view/View.h @ 1363:bbeffb29bf09

Fix inconsistency between centre frame actually set and centre frame notified as set, which caused the start frame location to creep out of place gradually as you page through
author Chris Cannam
date Tue, 30 Oct 2018 14:00:20 +0000
parents 93eaff6f206d
children 694004228ab7
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@1225 16 #ifndef SV_VIEW_H
Chris@1225 17 #define SV_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@1266 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@1266 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@1183 151 * Return the zoom level, i.e. the number of frames per pixel or
Chris@1183 152 * pixels per frame
Chris@127 153 */
Chris@1183 154 ZoomLevel getZoomLevel() const;
Chris@127 155
Chris@127 156 /**
Chris@1183 157 * Set the zoom level, i.e. the number of frames per pixel or
Chris@1183 158 * pixels per frame. The centre frame will be unchanged; the
Chris@1183 159 * start and end frames will change.
Chris@127 160 */
Chris@1183 161 virtual void setZoomLevel(ZoomLevel z);
Chris@127 162
Chris@127 163 /**
Chris@127 164 * Zoom in or out.
Chris@127 165 */
Chris@127 166 virtual void zoom(bool in);
Chris@127 167
Chris@127 168 /**
Chris@127 169 * Scroll left or right by a smallish or largish amount.
Chris@127 170 */
Chris@510 171 virtual void scroll(bool right, bool lots, bool doEmit = true);
Chris@127 172
Chris@834 173 /**
Chris@834 174 * Add a layer to the view. (Normally this should be handled
Chris@834 175 * through some command abstraction instead of using this function
Chris@834 176 * directly.)
Chris@834 177 */
Chris@127 178 virtual void addLayer(Layer *v);
Chris@834 179
Chris@834 180 /**
Chris@834 181 * Remove a layer from the view. Does not delete the
Chris@834 182 * layer. (Normally this should be handled through some command
Chris@834 183 * abstraction instead of using this function directly.)
Chris@834 184 */
Chris@834 185 virtual void removeLayer(Layer *v);
Chris@834 186
Chris@834 187 /**
Chris@834 188 * Return the number of layers, regardless of whether visible or
Chris@834 189 * dormant, i.e. invisible, in this view.
Chris@834 190 */
Chris@902 191 virtual int getLayerCount() const { return int(m_layerStack.size()); }
Chris@127 192
Chris@127 193 /**
Chris@834 194 * Return the nth layer, counted in stacking order. That is,
Chris@834 195 * layer 0 is the bottom layer and layer "getLayerCount()-1" is
Chris@834 196 * the top one. The returned layer may be visible or it may be
Chris@834 197 * dormant, i.e. invisible.
Chris@127 198 */
Chris@277 199 virtual Layer *getLayer(int n) {
Chris@902 200 if (in_range_for(m_layerStack, n)) return m_layerStack[n];
Chris@835 201 else return 0;
Chris@277 202 }
Chris@127 203
Chris@127 204 /**
Chris@835 205 * Return the nth layer, counted in the order they were
Chris@835 206 * added. Unlike the stacking order used in getLayer(), which
Chris@835 207 * changes each time a layer is selected, this ordering remains
Chris@835 208 * fixed. The returned layer may be visible or it may be dormant,
Chris@835 209 * i.e. invisible.
Chris@268 210 */
Chris@835 211 virtual Layer *getFixedOrderLayer(int n) {
Chris@835 212 if (n < int(m_fixedOrderLayers.size())) return m_fixedOrderLayers[n];
Chris@835 213 else return 0;
Chris@268 214 }
Chris@268 215
Chris@268 216 /**
Chris@834 217 * Return the layer currently active for tool interaction. This is
Chris@834 218 * the topmost non-dormant (i.e. visible) layer in the view. If
Chris@834 219 * there are no visible layers in the view, return 0.
Chris@834 220 */
Chris@834 221 virtual Layer *getInteractionLayer();
Chris@834 222
Chris@841 223 virtual const Layer *getInteractionLayer() const;
Chris@841 224
Chris@834 225 /**
Chris@835 226 * Return the layer most recently selected by the user. This is
Chris@835 227 * the layer that any non-tool-driven commands should operate on,
Chris@835 228 * in the case where this view is the "current" one.
Chris@835 229 *
Chris@835 230 * If the user has selected the view itself more recently than any
Chris@835 231 * of the layers on it, this function will return 0, and any
Chris@835 232 * non-tool-driven layer commands should be deactivated while this
Chris@835 233 * view is current. It will also return 0 if there are no layers
Chris@835 234 * in the view.
Chris@834 235 *
Chris@834 236 * Note that, unlike getInteractionLayer(), this could return an
Chris@834 237 * invisible (dormant) layer.
Chris@127 238 */
Chris@127 239 virtual Layer *getSelectedLayer();
Chris@834 240
Chris@127 241 virtual const Layer *getSelectedLayer() const;
Chris@127 242
Chris@835 243 /**
Chris@835 244 * Return the "top" layer in the view, whether visible or dormant.
Chris@835 245 * This is the same as getLayer(getLayerCount()-1) if there is at
Chris@835 246 * least one layer, and 0 otherwise.
Chris@835 247 *
Chris@835 248 * For most purposes involving interaction or commands, you
Chris@835 249 * probably want either getInteractionLayer() or
Chris@835 250 * getSelectedLayer() instead.
Chris@835 251 */
Chris@835 252 virtual Layer *getTopLayer() {
Chris@835 253 return m_layerStack.empty() ? 0 : m_layerStack[m_layerStack.size()-1];
Chris@835 254 }
Chris@835 255
Chris@127 256 virtual void setViewManager(ViewManager *m);
Chris@908 257 virtual void setViewManager(ViewManager *m, sv_frame_t initialFrame);
Chris@127 258 virtual ViewManager *getViewManager() const { return m_manager; }
Chris@127 259
Chris@127 260 virtual void setFollowGlobalPan(bool f);
Chris@127 261 virtual bool getFollowGlobalPan() const { return m_followPan; }
Chris@127 262
Chris@127 263 virtual void setFollowGlobalZoom(bool f);
Chris@127 264 virtual bool getFollowGlobalZoom() const { return m_followZoom; }
Chris@127 265
Chris@224 266 virtual bool hasLightBackground() const;
Chris@287 267 virtual QColor getForeground() const;
Chris@287 268 virtual QColor getBackground() const;
Chris@127 269
Chris@270 270 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@270 271 QRect rect, bool focus) const;
Chris@127 272
Chris@741 273 virtual bool shouldShowFeatureLabels() const {
Chris@741 274 return m_manager && m_manager->shouldShowFeatureLabels();
Chris@741 275 }
Chris@127 276 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const {
Chris@1266 277 return false;
Chris@127 278 }
Chris@127 279 virtual bool shouldIlluminateLocalSelection(QPoint &, bool &, bool &) const {
Chris@1266 280 return false;
Chris@127 281 }
Chris@127 282
Chris@127 283 virtual void setPlaybackFollow(PlaybackFollowMode m);
Chris@127 284 virtual PlaybackFollowMode getPlaybackFollow() const { return m_followPlay; }
Chris@127 285
Chris@127 286 typedef PropertyContainer::PropertyName PropertyName;
Chris@127 287
Chris@127 288 // We implement the PropertyContainer API, although we don't
Chris@127 289 // actually subclass PropertyContainer. We have our own
Chris@127 290 // PropertyContainer that we can return on request that just
Chris@127 291 // delegates back to us.
Chris@127 292 virtual PropertyContainer::PropertyList getProperties() const;
Chris@127 293 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@127 294 virtual PropertyContainer::PropertyType getPropertyType(const PropertyName &) const;
Chris@127 295 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@1266 296 int *min, int *max, int *deflt) const;
Chris@127 297 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@1266 298 int value) const;
Chris@127 299 virtual void setProperty(const PropertyName &, int value);
Chris@127 300 virtual QString getPropertyContainerName() const {
Chris@1266 301 return objectName();
Chris@127 302 }
Chris@127 303 virtual QString getPropertyContainerIconName() const = 0;
Chris@127 304
Chris@806 305 virtual int getPropertyContainerCount() const;
Chris@127 306
Chris@837 307 // The 0th property container is the view's own; the rest are the
Chris@837 308 // layers in fixed-order series
Chris@806 309 virtual const PropertyContainer *getPropertyContainer(int i) const;
Chris@806 310 virtual PropertyContainer *getPropertyContainer(int i);
Chris@127 311
Chris@1202 312 /**
Chris@1202 313 * Render the view contents to a new QImage (which may be wider
Chris@1202 314 * than the visible View).
Chris@1202 315 */
Chris@1202 316 virtual QImage *renderToNewImage();
Chris@226 317
Chris@1202 318 /**
Chris@1202 319 * Render the view contents between the given frame extents to a
Chris@1202 320 * new QImage (which may be wider than the visible View).
Chris@1202 321 */
Chris@1202 322 virtual QImage *renderPartToNewImage(sv_frame_t f0, sv_frame_t f1);
Chris@1202 323
Chris@1202 324 /**
Chris@1202 325 * Calculate and return the size of image that will be generated
Chris@1202 326 * by renderToNewImage().
Chris@1202 327 */
Chris@1202 328 virtual QSize getRenderedImageSize();
Chris@1202 329
Chris@1202 330 /**
Chris@1202 331 * Calculate and return the size of image that will be generated
Chris@1202 332 * by renderPartToNewImage(f0, f1).
Chris@1202 333 */
Chris@1202 334 virtual QSize getRenderedPartImageSize(sv_frame_t f0, sv_frame_t f1);
Chris@1202 335
Chris@1202 336 /**
Chris@1202 337 * Render the view contents to a new SVG file.
Chris@1202 338 */
Chris@1202 339 virtual bool renderToSvgFile(QString filename);
Chris@1202 340
Chris@1202 341 /**
Chris@1202 342 * Render the view contents between the given frame extents to a
Chris@1202 343 * new SVG file.
Chris@1202 344 */
Chris@1202 345 virtual bool renderPartToSvgFile(QString filename,
Chris@1202 346 sv_frame_t f0, sv_frame_t f1);
Chris@1202 347
Chris@127 348 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const;
Chris@127 349
Chris@904 350 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@127 351 bool &log) const;
Chris@127 352
Chris@316 353 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 354 QString extraAttributes = "") const;
Chris@127 355
Chris@222 356 // First frame actually in model, to right of scale, if present
Chris@902 357 virtual sv_frame_t getFirstVisibleFrame() const;
Chris@902 358 virtual sv_frame_t getLastVisibleFrame() const;
Chris@222 359
Chris@902 360 sv_frame_t getModelsStartFrame() const;
Chris@902 361 sv_frame_t getModelsEndFrame() const;
Chris@127 362
Chris@915 363 /**
Chris@915 364 * To be called from a layer, to obtain the extent of the surface
Chris@915 365 * that the layer is currently painting to. This may be the extent
Chris@915 366 * of the view (if 1x display scaling is in effect) or of a larger
Chris@915 367 * cached pixmap (if greater display scaling is in effect).
Chris@915 368 */
Chris@915 369 QRect getPaintRect() const;
Chris@915 370
Chris@915 371 QSize getPaintSize() const { return getPaintRect().size(); }
Chris@915 372 int getPaintWidth() const { return getPaintRect().width(); }
Chris@915 373 int getPaintHeight() const { return getPaintRect().height(); }
Chris@915 374
Chris@315 375 typedef std::set<Model *> ModelSet;
Chris@315 376 ModelSet getModels();
Chris@315 377
Chris@301 378 //!!!
Chris@320 379 Model *getAligningModel() const;
Chris@902 380 sv_frame_t alignFromReference(sv_frame_t) const;
Chris@902 381 sv_frame_t alignToReference(sv_frame_t) const;
Chris@902 382 sv_frame_t getAlignedPlaybackFrame() const;
Chris@301 383
Chris@1030 384 void updatePaintRect(QRect r) { update(r); }
Chris@1030 385
Chris@918 386 View *getView() { return this; }
Chris@918 387 const View *getView() const { return this; }
Chris@918 388
Chris@127 389 signals:
Chris@127 390 void propertyContainerAdded(PropertyContainer *pc);
Chris@127 391 void propertyContainerRemoved(PropertyContainer *pc);
Chris@127 392 void propertyContainerPropertyChanged(PropertyContainer *pc);
Chris@197 393 void propertyContainerPropertyRangeChanged(PropertyContainer *pc);
Chris@127 394 void propertyContainerNameChanged(PropertyContainer *pc);
Chris@298 395 void propertyContainerSelected(PropertyContainer *pc);
Chris@127 396 void propertyChanged(PropertyContainer::PropertyName);
Chris@127 397
Chris@336 398 void layerModelChanged();
Chris@336 399
Chris@902 400 void centreFrameChanged(sv_frame_t frame,
Chris@211 401 bool globalScroll,
Chris@211 402 PlaybackFollowMode followMode);
Chris@211 403
Chris@1183 404 void zoomLevelChanged(ZoomLevel level, bool locked);
Chris@127 405
Chris@189 406 void contextHelpChanged(const QString &);
Chris@189 407
Chris@127 408 public slots:
Chris@127 409 virtual void modelChanged();
Chris@902 410 virtual void modelChangedWithin(sv_frame_t startFrame, sv_frame_t endFrame);
Chris@127 411 virtual void modelCompletionChanged();
Chris@320 412 virtual void modelAlignmentCompletionChanged();
Chris@127 413 virtual void modelReplaced();
Chris@127 414 virtual void layerParametersChanged();
Chris@197 415 virtual void layerParameterRangesChanged();
Chris@268 416 virtual void layerMeasurementRectsChanged();
Chris@127 417 virtual void layerNameChanged();
Chris@127 418
Chris@902 419 virtual void globalCentreFrameChanged(sv_frame_t);
Chris@902 420 virtual void viewCentreFrameChanged(View *, sv_frame_t);
Chris@902 421 virtual void viewManagerPlaybackFrameChanged(sv_frame_t);
Chris@1183 422 virtual void viewZoomLevelChanged(View *, ZoomLevel, bool);
Chris@127 423
Chris@127 424 virtual void propertyContainerSelected(View *, PropertyContainer *pc);
Chris@127 425
Chris@127 426 virtual void selectionChanged();
Chris@127 427 virtual void toolModeChanged();
Chris@133 428 virtual void overlayModeChanged();
Chris@133 429 virtual void zoomWheelsEnabledChanged();
Chris@127 430
Chris@797 431 virtual void cancelClicked();
Chris@797 432
Chris@555 433 virtual void progressCheckStalledTimerElapsed();
Chris@555 434
Chris@127 435 protected:
Chris@127 436 View(QWidget *, bool showProgress);
Chris@1030 437
Chris@1030 438 int m_id;
Chris@1030 439
Chris@127 440 virtual void paintEvent(QPaintEvent *e);
Chris@127 441 virtual void drawSelections(QPainter &);
Chris@127 442 virtual bool shouldLabelSelections() const { return true; }
Chris@1357 443 virtual void drawPlayPointer(QPainter &);
Chris@908 444 virtual bool render(QPainter &paint, int x0, sv_frame_t f0, sv_frame_t f1);
Chris@339 445 virtual void setPaintFont(QPainter &paint);
Chris@952 446
Chris@952 447 QSize scaledSize(const QSize &s, int factor) {
Chris@952 448 return QSize(s.width() * factor, s.height() * factor);
Chris@952 449 }
Chris@952 450 QRect scaledRect(const QRect &r, int factor) {
Chris@952 451 return QRect(r.x() * factor, r.y() * factor,
Chris@952 452 r.width() * factor, r.height() * factor);
Chris@952 453 }
Chris@339 454
Chris@127 455 typedef std::vector<Layer *> LayerList;
Chris@127 456
Chris@908 457 sv_samplerate_t getModelsSampleRate() const;
Chris@127 458 bool areLayersScrollable() const;
Chris@127 459 LayerList getScrollableBackLayers(bool testChanged, bool &changed) const;
Chris@127 460 LayerList getNonScrollableFrontLayers(bool testChanged, bool &changed) const;
Chris@1354 461
Chris@1183 462 ZoomLevel getZoomConstraintLevel(ZoomLevel level,
Chris@1183 463 ZoomConstraint::RoundingDirection dir =
Chris@1183 464 ZoomConstraint::RoundNearest) const;
Chris@127 465
Chris@1354 466 // These three are slow, intended for indexing GUI thumbwheel stuff
Chris@1354 467 int countZoomLevels() const;
Chris@1354 468 int getZoomLevelIndex(ZoomLevel level) const;
Chris@1354 469 ZoomLevel getZoomLevelByIndex(int ix) const;
Chris@1354 470
Chris@183 471 // True if the top layer(s) use colours for meaningful things. If
Chris@183 472 // this is the case, selections will be shown using unfilled boxes
Chris@183 473 // rather than with a translucent fill.
Chris@183 474 bool areLayerColoursSignificant() const;
Chris@183 475
Chris@217 476 // True if the top layer has a time axis on the x coordinate (this
Chris@217 477 // is generally the case except for spectrum/slice layers). It
Chris@217 478 // will not be possible to make or display selections if this is
Chris@217 479 // false.
Chris@217 480 bool hasTopLayerTimeXAxis() const;
Chris@217 481
Chris@902 482 bool setCentreFrame(sv_frame_t f, bool doEmit);
Chris@127 483
Chris@902 484 void movePlayPointer(sv_frame_t f);
Chris@511 485
Chris@127 486 void checkProgress(void *object);
Chris@384 487 int getProgressBarWidth() const; // if visible
Chris@127 488
Chris@956 489 int effectiveDevicePixelRatio() const;
Chris@956 490
Chris@902 491 sv_frame_t m_centreFrame;
Chris@1183 492 ZoomLevel m_zoomLevel;
Chris@127 493 bool m_followPan;
Chris@127 494 bool m_followZoom;
Chris@127 495 PlaybackFollowMode m_followPlay;
Chris@789 496 bool m_followPlayIsDetached;
Chris@902 497 sv_frame_t m_playPointerFrame;
Chris@127 498 bool m_lightBackground;
Chris@127 499 bool m_showProgress;
Chris@127 500
Chris@1215 501 QPixmap *m_cache; // I own this
Chris@1215 502 QPixmap *m_buffer; // I own this
Chris@1357 503 bool m_cacheValid;
Chris@902 504 sv_frame_t m_cacheCentreFrame;
Chris@1183 505 ZoomLevel m_cacheZoomLevel;
Chris@127 506 bool m_selectionCached;
Chris@127 507
Chris@127 508 bool m_deleting;
Chris@127 509
Chris@835 510 LayerList m_layerStack; // I don't own these, but see dtor note above
Chris@835 511 LayerList m_fixedOrderLayers;
Chris@127 512 bool m_haveSelectedLayer;
Chris@127 513
Chris@583 514 QString m_lastError;
Chris@583 515
Chris@127 516 // caches for use in getScrollableBackLayers, getNonScrollableFrontLayers
Chris@127 517 mutable LayerList m_lastScrollableBackLayers;
Chris@127 518 mutable LayerList m_lastNonScrollableBackLayers;
Chris@127 519
Chris@555 520 struct ProgressBarRec {
Chris@797 521 QPushButton *cancel;
Chris@555 522 QProgressBar *bar;
Chris@555 523 int lastCheck;
Chris@555 524 QTimer *checkTimer;
Chris@555 525 };
Chris@555 526 typedef std::map<Layer *, ProgressBarRec> ProgressMap;
Chris@127 527 ProgressMap m_progressBars; // I own the ProgressBars
Chris@127 528
Chris@127 529 ViewManager *m_manager; // I don't own this
Chris@127 530 ViewPropertyContainer *m_propertyContainer; // I own this
Chris@127 531 };
Chris@127 532
Chris@127 533
Chris@127 534 // Use this for delegation, because we can't subclass from
Chris@127 535 // PropertyContainer (which is a QObject) ourselves because of
Chris@127 536 // ambiguity with QFrame parent
Chris@127 537
Chris@127 538 class ViewPropertyContainer : public PropertyContainer
Chris@127 539 {
Chris@127 540 Q_OBJECT
Chris@127 541
Chris@127 542 public:
Chris@127 543 ViewPropertyContainer(View *v);
Chris@728 544 virtual ~ViewPropertyContainer();
Chris@728 545
Chris@127 546 PropertyList getProperties() const { return m_v->getProperties(); }
Chris@127 547 QString getPropertyLabel(const PropertyName &n) const {
Chris@127 548 return m_v->getPropertyLabel(n);
Chris@127 549 }
Chris@127 550 PropertyType getPropertyType(const PropertyName &n) const {
Chris@1266 551 return m_v->getPropertyType(n);
Chris@127 552 }
Chris@216 553 int getPropertyRangeAndValue(const PropertyName &n, int *min, int *max,
Chris@216 554 int *deflt) const {
Chris@1266 555 return m_v->getPropertyRangeAndValue(n, min, max, deflt);
Chris@127 556 }
Chris@127 557 QString getPropertyValueLabel(const PropertyName &n, int value) const {
Chris@1266 558 return m_v->getPropertyValueLabel(n, value);
Chris@127 559 }
Chris@127 560 QString getPropertyContainerName() const {
Chris@1266 561 return m_v->getPropertyContainerName();
Chris@127 562 }
Chris@127 563 QString getPropertyContainerIconName() const {
Chris@1266 564 return m_v->getPropertyContainerIconName();
Chris@127 565 }
Chris@127 566
Chris@127 567 public slots:
Chris@127 568 virtual void setProperty(const PropertyName &n, int value) {
Chris@1266 569 m_v->setProperty(n, value);
Chris@127 570 }
Chris@127 571
Chris@127 572 protected:
Chris@127 573 View *m_v;
Chris@127 574 };
Chris@127 575
Chris@127 576 #endif
Chris@127 577