annotate view/LayerGeometryProvider.h @ 1064:77564d4fff43 spectrogram-minor-refactor

Extend column logic to peak frequency display as well, and correct some scopes according to whether values are per source column or per target pixel
author Chris Cannam
date Mon, 20 Jun 2016 12:00:32 +0100
parents 4e5c1c326794
children
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@916 28 class LayerGeometryProvider
Chris@916 29 {
Chris@1044 30 protected:
Chris@1044 31 static int getNextId() {
Chris@1030 32 static QMutex idMutex;
Chris@1030 33 static int nextId = 1;
Chris@1044 34 static int maxId = INT_MAX;
Chris@1030 35 QMutexLocker locker(&idMutex);
Chris@1044 36 int id = nextId;
Chris@1044 37 if (nextId == maxId) {
Chris@1044 38 // we don't expect this to happen in the lifetime of a
Chris@1044 39 // process, but it would be undefined behaviour if it did
Chris@1044 40 // since we're using a signed int, so we should really
Chris@1044 41 // guard for it...
Chris@1044 42 nextId = 1;
Chris@1044 43 } else {
Chris@1044 44 nextId++;
Chris@1044 45 }
Chris@1044 46 return id;
Chris@1044 47 }
Chris@1044 48
Chris@1044 49 public:
Chris@1044 50 LayerGeometryProvider() { }
Chris@1030 51
Chris@1030 52 /**
Chris@1044 53 * Retrieve the id of this object.
Chris@1030 54 */
Chris@1044 55 virtual int getId() const = 0;
Chris@1030 56
Chris@916 57 /**
Chris@916 58 * Retrieve the first visible sample frame on the widget.
Chris@916 59 * This is a calculated value based on the centre-frame, widget
Chris@916 60 * width and zoom level. The result may be negative.
Chris@916 61 */
Chris@916 62 virtual sv_frame_t getStartFrame() const = 0;
Chris@916 63
Chris@916 64 /**
Chris@916 65 * Return the centre frame of the visible widget. This is an
Chris@916 66 * exact value that does not depend on the zoom block size. Other
Chris@916 67 * frame values (start, end) are calculated from this based on the
Chris@916 68 * zoom and other factors.
Chris@916 69 */
Chris@916 70 virtual sv_frame_t getCentreFrame() const = 0;
Chris@916 71
Chris@916 72 /**
Chris@916 73 * Retrieve the last visible sample frame on the widget.
Chris@916 74 * This is a calculated value based on the centre-frame, widget
Chris@916 75 * width and zoom level.
Chris@916 76 */
Chris@916 77 virtual sv_frame_t getEndFrame() const = 0;
Chris@916 78
Chris@916 79 /**
Chris@916 80 * Return the pixel x-coordinate corresponding to a given sample
Chris@916 81 * frame (which may be negative).
Chris@916 82 */
Chris@916 83 virtual int getXForFrame(sv_frame_t frame) const = 0;
Chris@916 84
Chris@916 85 /**
Chris@916 86 * Return the closest frame to the given pixel x-coordinate.
Chris@916 87 */
Chris@916 88 virtual sv_frame_t getFrameForX(int x) const = 0;
Chris@916 89
Chris@919 90 virtual sv_frame_t getModelsStartFrame() const = 0;
Chris@919 91 virtual sv_frame_t getModelsEndFrame() const = 0;
Chris@919 92
Chris@916 93 /**
Chris@1030 94 * Return the closest pixel x-coordinate corresponding to a given
Chris@1030 95 * view x-coordinate.
Chris@1030 96 */
Chris@1030 97 virtual int getXForViewX(int viewx) const = 0;
Chris@1030 98
Chris@1030 99 /**
Chris@1030 100 * Return the closest view x-coordinate corresponding to a given
Chris@1030 101 * pixel x-coordinate.
Chris@1030 102 */
Chris@1030 103 virtual int getViewXForX(int x) const = 0;
Chris@1030 104
Chris@1030 105 /**
Chris@916 106 * Return the pixel y-coordinate corresponding to a given
Chris@916 107 * frequency, if the frequency range is as specified. This does
Chris@916 108 * not imply any policy about layer frequency ranges, but it might
Chris@916 109 * be useful for layers to match theirs up if desired.
Chris@916 110 *
Chris@916 111 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@916 112 */
Chris@916 113 virtual double getYForFrequency(double frequency, double minFreq, double maxFreq,
Chris@916 114 bool logarithmic) const = 0;
Chris@916 115
Chris@916 116 /**
Chris@916 117 * Return the closest frequency to the given pixel y-coordinate,
Chris@916 118 * if the frequency range is as specified.
Chris@916 119 *
Chris@916 120 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@916 121 */
Chris@916 122 virtual double getFrequencyForY(int y, double minFreq, double maxFreq,
Chris@916 123 bool logarithmic) const = 0;
Chris@916 124
Chris@918 125 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const = 0;
Chris@918 126
Chris@918 127 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@918 128 bool &log) const = 0;
Chris@918 129
Chris@916 130 /**
Chris@916 131 * Return the zoom level, i.e. the number of frames per pixel
Chris@916 132 */
Chris@916 133 virtual int getZoomLevel() const = 0;
Chris@916 134
Chris@916 135 /**
Chris@916 136 * To be called from a layer, to obtain the extent of the surface
Chris@916 137 * that the layer is currently painting to. This may be the extent
Chris@916 138 * of the view (if 1x display scaling is in effect) or of a larger
Chris@916 139 * cached pixmap (if greater display scaling is in effect).
Chris@916 140 */
Chris@916 141 virtual QRect getPaintRect() const = 0;
Chris@916 142
Chris@916 143 virtual QSize getPaintSize() const { return getPaintRect().size(); }
Chris@916 144 virtual int getPaintWidth() const { return getPaintRect().width(); }
Chris@916 145 virtual int getPaintHeight() const { return getPaintRect().height(); }
Chris@916 146
Chris@916 147 virtual bool hasLightBackground() const = 0;
Chris@916 148 virtual QColor getForeground() const = 0;
Chris@916 149 virtual QColor getBackground() const = 0;
Chris@916 150
Chris@916 151 virtual ViewManager *getViewManager() const = 0;
Chris@916 152
Chris@916 153 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const = 0;
Chris@919 154 virtual bool shouldShowFeatureLabels() const = 0;
Chris@916 155
Chris@916 156 enum TextStyle {
Chris@916 157 BoxedText,
Chris@916 158 OutlinedText,
Chris@916 159 OutlinedItalicText
Chris@916 160 };
Chris@916 161
Chris@916 162 virtual void drawVisibleText(QPainter &p, int x, int y,
Chris@916 163 QString text, TextStyle style) const = 0;
Chris@916 164
Chris@916 165 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@916 166 QRect rect, bool focus) const = 0;
Chris@916 167
Chris@1030 168 virtual void updatePaintRect(QRect r) = 0;
Chris@1030 169
Chris@918 170 virtual View *getView() = 0;
Chris@918 171 virtual const View *getView() const = 0;
Chris@916 172 };
Chris@916 173
Chris@916 174 #endif