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