annotate layer/LayerGeometryProvider.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 c8c747783110
children 57d192e26331
rev   line source
Chris@916 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@916 2
Chris@916 3 /*
Chris@916 4 Sonic Visualiser
Chris@916 5 An audio file viewer and annotation editor.
Chris@916 6 Centre for Digital Music, Queen Mary, University of London.
Chris@916 7
Chris@916 8 This program is free software; you can redistribute it and/or
Chris@916 9 modify it under the terms of the GNU General Public License as
Chris@916 10 published by the Free Software Foundation; either version 2 of the
Chris@916 11 License, or (at your option) any later version. See the file
Chris@916 12 COPYING included with this distribution for more information.
Chris@916 13 */
Chris@916 14
Chris@916 15 #ifndef LAYER_GEOMETRY_PROVIDER_H
Chris@916 16 #define LAYER_GEOMETRY_PROVIDER_H
Chris@916 17
Chris@916 18 #include "base/BaseTypes.h"
Chris@916 19
Chris@1030 20 #include <QMutex>
Chris@1030 21 #include <QMutexLocker>
Chris@1031 22 #include <QPainter>
Chris@1030 23
Chris@916 24 class ViewManager;
Chris@918 25 class View;
Chris@916 26 class Layer;
Chris@916 27
Chris@1090 28 /**
Chris@1090 29 * Interface for classes that provide geometry information (such as
Chris@1090 30 * size, start frame, and a large number of other properties) about
Chris@1090 31 * the disposition of a layer. The main implementor of this interface
Chris@1090 32 * is the View class, but other implementations may be used in
Chris@1090 33 * different circumstances, e.g. as a proxy to handle hi-dpi
Chris@1090 34 * coordinate mapping.
Chris@1090 35 *
Chris@1090 36 * Note it is expected that some implementations of this may be
Chris@1090 37 * disposable, created on-the-fly for a single use. Code that receives
Chris@1090 38 * a LayerGeometryProvider pointer as an argument to something should
Chris@1090 39 * not, in general, store that pointer as it may be invalidated before
Chris@1090 40 * the next use. Use getId() to instead obtain a persistent identifier
Chris@1090 41 * for a LayerGeometryProvider, for example to establish whether the
Chris@1090 42 * same one is being provided in two separate calls.
Chris@1090 43 */
Chris@916 44 class LayerGeometryProvider
Chris@916 45 {
Chris@1044 46 protected:
Chris@1044 47 static int getNextId() {
Chris@1030 48 static QMutex idMutex;
Chris@1030 49 static int nextId = 1;
Chris@1044 50 static int maxId = INT_MAX;
Chris@1030 51 QMutexLocker locker(&idMutex);
Chris@1044 52 int id = nextId;
Chris@1044 53 if (nextId == maxId) {
Chris@1044 54 // we don't expect this to happen in the lifetime of a
Chris@1044 55 // process, but it would be undefined behaviour if it did
Chris@1044 56 // since we're using a signed int, so we should really
Chris@1044 57 // guard for it...
Chris@1044 58 nextId = 1;
Chris@1044 59 } else {
Chris@1044 60 nextId++;
Chris@1044 61 }
Chris@1044 62 return id;
Chris@1044 63 }
Chris@1044 64
Chris@1044 65 public:
Chris@1044 66 LayerGeometryProvider() { }
Chris@1030 67
Chris@1030 68 /**
Chris@1044 69 * Retrieve the id of this object.
Chris@1030 70 */
Chris@1044 71 virtual int getId() const = 0;
Chris@1030 72
Chris@916 73 /**
Chris@916 74 * Retrieve the first visible sample frame on the widget.
Chris@916 75 * This is a calculated value based on the centre-frame, widget
Chris@916 76 * width and zoom level. The result may be negative.
Chris@916 77 */
Chris@916 78 virtual sv_frame_t getStartFrame() const = 0;
Chris@916 79
Chris@916 80 /**
Chris@916 81 * Return the centre frame of the visible widget. This is an
Chris@916 82 * exact value that does not depend on the zoom block size. Other
Chris@916 83 * frame values (start, end) are calculated from this based on the
Chris@916 84 * zoom and other factors.
Chris@916 85 */
Chris@916 86 virtual sv_frame_t getCentreFrame() const = 0;
Chris@916 87
Chris@916 88 /**
Chris@916 89 * Retrieve the last visible sample frame on the widget.
Chris@916 90 * This is a calculated value based on the centre-frame, widget
Chris@916 91 * width and zoom level.
Chris@916 92 */
Chris@916 93 virtual sv_frame_t getEndFrame() const = 0;
Chris@916 94
Chris@916 95 /**
Chris@916 96 * Return the pixel x-coordinate corresponding to a given sample
Chris@916 97 * frame (which may be negative).
Chris@916 98 */
Chris@916 99 virtual int getXForFrame(sv_frame_t frame) const = 0;
Chris@916 100
Chris@916 101 /**
Chris@916 102 * Return the closest frame to the given pixel x-coordinate.
Chris@916 103 */
Chris@916 104 virtual sv_frame_t getFrameForX(int x) const = 0;
Chris@916 105
Chris@919 106 virtual sv_frame_t getModelsStartFrame() const = 0;
Chris@919 107 virtual sv_frame_t getModelsEndFrame() const = 0;
Chris@919 108
Chris@916 109 /**
Chris@1030 110 * Return the closest pixel x-coordinate corresponding to a given
Chris@1030 111 * view x-coordinate.
Chris@1030 112 */
Chris@1030 113 virtual int getXForViewX(int viewx) const = 0;
Chris@1030 114
Chris@1030 115 /**
Chris@1030 116 * Return the closest view x-coordinate corresponding to a given
Chris@1030 117 * pixel x-coordinate.
Chris@1030 118 */
Chris@1030 119 virtual int getViewXForX(int x) const = 0;
Chris@1030 120
Chris@1030 121 /**
Chris@1085 122 * Return the (maybe fractional) pixel y-coordinate corresponding
Chris@1085 123 * to a given frequency, if the frequency range is as specified.
Chris@1085 124 * This does not imply any policy about layer frequency ranges,
Chris@1085 125 * but it might be useful for layers to match theirs up if
Chris@1085 126 * desired.
Chris@916 127 *
Chris@916 128 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@916 129 */
Chris@1085 130 virtual double getYForFrequency(double frequency,
Chris@1085 131 double minFreq, double maxFreq,
Chris@916 132 bool logarithmic) const = 0;
Chris@916 133
Chris@916 134 /**
Chris@1085 135 * Return the closest frequency to the given (maybe fractional)
Chris@1085 136 * pixel y-coordinate, if the frequency range is as specified.
Chris@916 137 *
Chris@916 138 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@916 139 */
Chris@1085 140 virtual double getFrequencyForY(double y,
Chris@1085 141 double minFreq, double maxFreq,
Chris@1082 142 bool logarithmic) const = 0;
Chris@916 143
Chris@918 144 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const = 0;
Chris@918 145
Chris@918 146 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@918 147 bool &log) const = 0;
Chris@918 148
Chris@916 149 /**
Chris@916 150 * Return the zoom level, i.e. the number of frames per pixel
Chris@916 151 */
Chris@916 152 virtual int getZoomLevel() const = 0;
Chris@916 153
Chris@916 154 /**
Chris@916 155 * To be called from a layer, to obtain the extent of the surface
Chris@916 156 * that the layer is currently painting to. This may be the extent
Chris@916 157 * of the view (if 1x display scaling is in effect) or of a larger
Chris@916 158 * cached pixmap (if greater display scaling is in effect).
Chris@916 159 */
Chris@916 160 virtual QRect getPaintRect() const = 0;
Chris@916 161
Chris@916 162 virtual QSize getPaintSize() const { return getPaintRect().size(); }
Chris@916 163 virtual int getPaintWidth() const { return getPaintRect().width(); }
Chris@916 164 virtual int getPaintHeight() const { return getPaintRect().height(); }
Chris@916 165
Chris@916 166 virtual bool hasLightBackground() const = 0;
Chris@916 167 virtual QColor getForeground() const = 0;
Chris@916 168 virtual QColor getBackground() const = 0;
Chris@916 169
Chris@916 170 virtual ViewManager *getViewManager() const = 0;
Chris@916 171
Chris@916 172 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const = 0;
Chris@919 173 virtual bool shouldShowFeatureLabels() const = 0;
Chris@916 174
Chris@916 175 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@916 176 QRect rect, bool focus) const = 0;
Chris@916 177
Chris@1030 178 virtual void updatePaintRect(QRect r) = 0;
Chris@1030 179
Chris@918 180 virtual View *getView() = 0;
Chris@918 181 virtual const View *getView() const = 0;
Chris@916 182 };
Chris@916 183
Chris@916 184 #endif