# HG changeset patch # User Chris Cannam # Date 1467280751 -3600 # Node ID 5144d7185fb5efc40d78c976adab41f6a2b7dcd7 # Parent e536dfc6b250b74e93ef40aff42d2aea738f4a79 Move LayerGeometryProvider from view to layer diff -r e536dfc6b250 -r 5144d7185fb5 layer/Colour3DPlotLayer.cpp --- a/layer/Colour3DPlotLayer.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/Colour3DPlotLayer.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -15,11 +15,14 @@ #include "Colour3DPlotLayer.h" -#include "view/View.h" #include "base/Profiler.h" #include "base/LogRange.h" #include "base/RangeMapper.h" + #include "ColourMapper.h" +#include "LayerGeometryProvider.h" + +#include "view/ViewManager.h" #include #include @@ -864,12 +867,12 @@ paint.setWorldMatrix(m); - v->drawVisibleText(paint, 2, 0, minstr, View::OutlinedText); + v->drawVisibleText(paint, 2, 0, minstr, LayerGeometryProvider::OutlinedText); m.translate(ch - msw - 2, 0); paint.setWorldMatrix(m); - v->drawVisibleText(paint, 0, 0, maxstr, View::OutlinedText); + v->drawVisibleText(paint, 0, 0, maxstr, LayerGeometryProvider::OutlinedText); paint.restore(); } @@ -1442,7 +1445,7 @@ rx0 + 2, ry0 - h / sh - 1 + 2 + paint.fontMetrics().ascent(), text, - View::OutlinedText); + LayerGeometryProvider::OutlinedText); } } } diff -r e536dfc6b250 -r 5144d7185fb5 layer/Colour3DPlotRenderer.cpp --- a/layer/Colour3DPlotRenderer.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/Colour3DPlotRenderer.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -20,7 +20,7 @@ #include "data/model/Dense3DModelPeakCache.h" #include "data/model/FFTModel.h" -#include "view/LayerGeometryProvider.h" +#include "LayerGeometryProvider.h" Colour3DPlotRenderer::RenderResult Colour3DPlotRenderer::render(QPainter &paint, QRect rect) diff -r e536dfc6b250 -r 5144d7185fb5 layer/FlexiNoteLayer.cpp --- a/layer/FlexiNoteLayer.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/FlexiNoteLayer.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -23,7 +23,7 @@ #include "base/LogRange.h" #include "base/RangeMapper.h" #include "ColourDatabase.h" -#include "view/View.h" +#include "LayerGeometryProvider.h" #include "PianoScale.h" #include "LinearNumericalScale.h" @@ -31,6 +31,8 @@ #include "data/model/FlexiNoteModel.h" +#include "view/View.h" + #include "widgets/ItemEditDialog.h" #include "widgets/TextAbbrev.h" @@ -871,30 +873,30 @@ // x - paint.fontMetrics().width(vlabel) - 2, // y + paint.fontMetrics().height()/2 // - paint.fontMetrics().descent(), - // vlabel, View::OutlinedText); + // vlabel, LayerGeometryProvider::OutlinedText); v->drawVisibleText(paint, x, y - h/2 - 2 - paint.fontMetrics().height() - paint.fontMetrics().descent(), - vlabel, View::OutlinedText); + vlabel, LayerGeometryProvider::OutlinedText); QString hlabel = "dur: " + QString(RealTime::frame2RealTime (p.duration, m_model->getSampleRate()).toText(true).c_str()); v->drawVisibleText(paint, x, y - h/2 - paint.fontMetrics().descent() - 2, - hlabel, View::OutlinedText); + hlabel, LayerGeometryProvider::OutlinedText); QString llabel = QString("%1").arg(p.label); v->drawVisibleText(paint, x, y + h + 2 + paint.fontMetrics().descent(), - llabel, View::OutlinedText); + llabel, LayerGeometryProvider::OutlinedText); QString nlabel = QString("%1").arg(noteNumber); v->drawVisibleText(paint, x + paint.fontMetrics().averageCharWidth() / 2, y + h/2 - paint.fontMetrics().descent(), - nlabel, View::OutlinedText); + nlabel, LayerGeometryProvider::OutlinedText); } paint.drawRect(x, y - h/2, w, h); diff -r e536dfc6b250 -r 5144d7185fb5 layer/LayerGeometryProvider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layer/LayerGeometryProvider.h Thu Jun 30 10:59:11 2016 +0100 @@ -0,0 +1,174 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef LAYER_GEOMETRY_PROVIDER_H +#define LAYER_GEOMETRY_PROVIDER_H + +#include "base/BaseTypes.h" + +#include +#include +#include + +class ViewManager; +class View; +class Layer; + +class LayerGeometryProvider +{ +protected: + static int getNextId() { + static QMutex idMutex; + static int nextId = 1; + static int maxId = INT_MAX; + QMutexLocker locker(&idMutex); + int id = nextId; + if (nextId == maxId) { + // we don't expect this to happen in the lifetime of a + // process, but it would be undefined behaviour if it did + // since we're using a signed int, so we should really + // guard for it... + nextId = 1; + } else { + nextId++; + } + return id; + } + +public: + LayerGeometryProvider() { } + + /** + * Retrieve the id of this object. + */ + virtual int getId() const = 0; + + /** + * Retrieve the first visible sample frame on the widget. + * This is a calculated value based on the centre-frame, widget + * width and zoom level. The result may be negative. + */ + virtual sv_frame_t getStartFrame() const = 0; + + /** + * Return the centre frame of the visible widget. This is an + * exact value that does not depend on the zoom block size. Other + * frame values (start, end) are calculated from this based on the + * zoom and other factors. + */ + virtual sv_frame_t getCentreFrame() const = 0; + + /** + * Retrieve the last visible sample frame on the widget. + * This is a calculated value based on the centre-frame, widget + * width and zoom level. + */ + virtual sv_frame_t getEndFrame() const = 0; + + /** + * Return the pixel x-coordinate corresponding to a given sample + * frame (which may be negative). + */ + virtual int getXForFrame(sv_frame_t frame) const = 0; + + /** + * Return the closest frame to the given pixel x-coordinate. + */ + virtual sv_frame_t getFrameForX(int x) const = 0; + + virtual sv_frame_t getModelsStartFrame() const = 0; + virtual sv_frame_t getModelsEndFrame() const = 0; + + /** + * Return the closest pixel x-coordinate corresponding to a given + * view x-coordinate. + */ + virtual int getXForViewX(int viewx) const = 0; + + /** + * Return the closest view x-coordinate corresponding to a given + * pixel x-coordinate. + */ + virtual int getViewXForX(int x) const = 0; + + /** + * Return the pixel y-coordinate corresponding to a given + * frequency, if the frequency range is as specified. This does + * not imply any policy about layer frequency ranges, but it might + * be useful for layers to match theirs up if desired. + * + * Not thread-safe in logarithmic mode. Call only from GUI thread. + */ + virtual double getYForFrequency(double frequency, double minFreq, double maxFreq, + bool logarithmic) const = 0; + + /** + * Return the closest frequency to the given pixel y-coordinate, + * if the frequency range is as specified. + * + * Not thread-safe in logarithmic mode. Call only from GUI thread. + */ + virtual double getFrequencyForY(int y, double minFreq, double maxFreq, + bool logarithmic) const = 0; + + virtual int getTextLabelHeight(const Layer *layer, QPainter &) const = 0; + + virtual bool getValueExtents(QString unit, double &min, double &max, + bool &log) const = 0; + + /** + * Return the zoom level, i.e. the number of frames per pixel + */ + virtual int getZoomLevel() const = 0; + + /** + * To be called from a layer, to obtain the extent of the surface + * that the layer is currently painting to. This may be the extent + * of the view (if 1x display scaling is in effect) or of a larger + * cached pixmap (if greater display scaling is in effect). + */ + virtual QRect getPaintRect() const = 0; + + virtual QSize getPaintSize() const { return getPaintRect().size(); } + virtual int getPaintWidth() const { return getPaintRect().width(); } + virtual int getPaintHeight() const { return getPaintRect().height(); } + + virtual bool hasLightBackground() const = 0; + virtual QColor getForeground() const = 0; + virtual QColor getBackground() const = 0; + + virtual ViewManager *getViewManager() const = 0; + + virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const = 0; + virtual bool shouldShowFeatureLabels() const = 0; + + enum TextStyle { + BoxedText, + OutlinedText, + OutlinedItalicText + }; + + virtual void drawVisibleText(QPainter &p, int x, int y, + QString text, TextStyle style) const = 0; + + virtual void drawMeasurementRect(QPainter &p, const Layer *, + QRect rect, bool focus) const = 0; + + virtual void updatePaintRect(QRect r) = 0; + + virtual View *getView() = 0; + virtual const View *getView() const = 0; +}; + +#endif diff -r e536dfc6b250 -r 5144d7185fb5 layer/LinearColourScale.cpp --- a/layer/LinearColourScale.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/LinearColourScale.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -20,7 +20,7 @@ #include -#include "view/LayerGeometryProvider.h" +#include "LayerGeometryProvider.h" int LinearColourScale::getWidth(LayerGeometryProvider *, diff -r e536dfc6b250 -r 5144d7185fb5 layer/LinearNumericalScale.cpp --- a/layer/LinearNumericalScale.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/LinearNumericalScale.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -20,7 +20,7 @@ #include -#include "view/View.h" +#include "LayerGeometryProvider.h" int LinearNumericalScale::getWidth(LayerGeometryProvider *, diff -r e536dfc6b250 -r 5144d7185fb5 layer/LogColourScale.cpp --- a/layer/LogColourScale.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/LogColourScale.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -22,7 +22,7 @@ #include -#include "view/View.h" +#include "LayerGeometryProvider.h" int LogColourScale::getWidth(LayerGeometryProvider *, diff -r e536dfc6b250 -r 5144d7185fb5 layer/LogNumericalScale.cpp --- a/layer/LogNumericalScale.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/LogNumericalScale.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -22,7 +22,7 @@ #include -#include "view/View.h" +#include "LayerGeometryProvider.h" //#define DEBUG_TIME_VALUE_LAYER 1 diff -r e536dfc6b250 -r 5144d7185fb5 layer/NoteLayer.cpp --- a/layer/NoteLayer.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/NoteLayer.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -813,14 +813,14 @@ x - paint.fontMetrics().width(vlabel) - 2, y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(), - vlabel, View::OutlinedText); + vlabel, LayerGeometryProvider::OutlinedText); QString hlabel = RealTime::frame2RealTime (p.frame, m_model->getSampleRate()).toText(true).c_str(); v->drawVisibleText(paint, x, y - h/2 - paint.fontMetrics().descent() - 2, - hlabel, View::OutlinedText); + hlabel, LayerGeometryProvider::OutlinedText); } paint.drawRect(x, y - h/2, w, h); diff -r e536dfc6b250 -r 5144d7185fb5 layer/PianoScale.cpp --- a/layer/PianoScale.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/PianoScale.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -21,7 +21,7 @@ #include "base/Pitch.h" -#include "view/LayerGeometryProvider.h" +#include "LayerGeometryProvider.h" void PianoScale::paintPianoVertical(LayerGeometryProvider *v, diff -r e536dfc6b250 -r 5144d7185fb5 layer/RegionLayer.cpp --- a/layer/RegionLayer.cpp Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/RegionLayer.cpp Thu Jun 30 10:59:11 2016 +0100 @@ -983,14 +983,14 @@ x - paint.fontMetrics().width(vlabel) - 2, y + paint.fontMetrics().height()/2 - paint.fontMetrics().descent(), - vlabel, View::OutlinedText); + vlabel, LayerGeometryProvider::OutlinedText); QString hlabel = RealTime::frame2RealTime (p.frame, m_model->getSampleRate()).toText(true).c_str(); v->drawVisibleText(paint, x, y - h/2 - paint.fontMetrics().descent() - 2, - hlabel, View::OutlinedText); + hlabel, LayerGeometryProvider::OutlinedText); } paint.drawLine(x, y-1, x + w, y-1); @@ -1048,7 +1048,7 @@ nextLabelMinX = labelX + paint.fontMetrics().width(label); } - v->drawVisibleText(paint, labelX, labelY, label, View::OutlinedText); + v->drawVisibleText(paint, labelX, labelY, label, LayerGeometryProvider::OutlinedText); } } diff -r e536dfc6b250 -r 5144d7185fb5 layer/ScrollableImageCache.h --- a/layer/ScrollableImageCache.h Thu Jun 30 10:36:52 2016 +0100 +++ b/layer/ScrollableImageCache.h Thu Jun 30 10:59:11 2016 +0100 @@ -17,7 +17,7 @@ #include "base/BaseTypes.h" -#include "view/LayerGeometryProvider.h" +#include "LayerGeometryProvider.h" #include #include diff -r e536dfc6b250 -r 5144d7185fb5 svgui.pro --- a/svgui.pro Thu Jun 30 10:36:52 2016 +0100 +++ b/svgui.pro Thu Jun 30 10:59:11 2016 +0100 @@ -49,6 +49,7 @@ layer/ImageRegionFinder.h \ layer/Layer.h \ layer/LayerFactory.h \ + layer/LayerGeometryProvider.h \ layer/LinearNumericalScale.h \ layer/LogNumericalScale.h \ layer/LinearColourScale.h \ diff -r e536dfc6b250 -r 5144d7185fb5 view/LayerGeometryProvider.h --- a/view/LayerGeometryProvider.h Thu Jun 30 10:36:52 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Sonic Visualiser - An audio file viewer and annotation editor. - Centre for Digital Music, Queen Mary, University of London. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. See the file - COPYING included with this distribution for more information. -*/ - -#ifndef LAYER_GEOMETRY_PROVIDER_H -#define LAYER_GEOMETRY_PROVIDER_H - -#include "base/BaseTypes.h" - -#include -#include -#include - -class ViewManager; -class View; -class Layer; - -class LayerGeometryProvider -{ -protected: - static int getNextId() { - static QMutex idMutex; - static int nextId = 1; - static int maxId = INT_MAX; - QMutexLocker locker(&idMutex); - int id = nextId; - if (nextId == maxId) { - // we don't expect this to happen in the lifetime of a - // process, but it would be undefined behaviour if it did - // since we're using a signed int, so we should really - // guard for it... - nextId = 1; - } else { - nextId++; - } - return id; - } - -public: - LayerGeometryProvider() { } - - /** - * Retrieve the id of this object. - */ - virtual int getId() const = 0; - - /** - * Retrieve the first visible sample frame on the widget. - * This is a calculated value based on the centre-frame, widget - * width and zoom level. The result may be negative. - */ - virtual sv_frame_t getStartFrame() const = 0; - - /** - * Return the centre frame of the visible widget. This is an - * exact value that does not depend on the zoom block size. Other - * frame values (start, end) are calculated from this based on the - * zoom and other factors. - */ - virtual sv_frame_t getCentreFrame() const = 0; - - /** - * Retrieve the last visible sample frame on the widget. - * This is a calculated value based on the centre-frame, widget - * width and zoom level. - */ - virtual sv_frame_t getEndFrame() const = 0; - - /** - * Return the pixel x-coordinate corresponding to a given sample - * frame (which may be negative). - */ - virtual int getXForFrame(sv_frame_t frame) const = 0; - - /** - * Return the closest frame to the given pixel x-coordinate. - */ - virtual sv_frame_t getFrameForX(int x) const = 0; - - virtual sv_frame_t getModelsStartFrame() const = 0; - virtual sv_frame_t getModelsEndFrame() const = 0; - - /** - * Return the closest pixel x-coordinate corresponding to a given - * view x-coordinate. - */ - virtual int getXForViewX(int viewx) const = 0; - - /** - * Return the closest view x-coordinate corresponding to a given - * pixel x-coordinate. - */ - virtual int getViewXForX(int x) const = 0; - - /** - * Return the pixel y-coordinate corresponding to a given - * frequency, if the frequency range is as specified. This does - * not imply any policy about layer frequency ranges, but it might - * be useful for layers to match theirs up if desired. - * - * Not thread-safe in logarithmic mode. Call only from GUI thread. - */ - virtual double getYForFrequency(double frequency, double minFreq, double maxFreq, - bool logarithmic) const = 0; - - /** - * Return the closest frequency to the given pixel y-coordinate, - * if the frequency range is as specified. - * - * Not thread-safe in logarithmic mode. Call only from GUI thread. - */ - virtual double getFrequencyForY(int y, double minFreq, double maxFreq, - bool logarithmic) const = 0; - - virtual int getTextLabelHeight(const Layer *layer, QPainter &) const = 0; - - virtual bool getValueExtents(QString unit, double &min, double &max, - bool &log) const = 0; - - /** - * Return the zoom level, i.e. the number of frames per pixel - */ - virtual int getZoomLevel() const = 0; - - /** - * To be called from a layer, to obtain the extent of the surface - * that the layer is currently painting to. This may be the extent - * of the view (if 1x display scaling is in effect) or of a larger - * cached pixmap (if greater display scaling is in effect). - */ - virtual QRect getPaintRect() const = 0; - - virtual QSize getPaintSize() const { return getPaintRect().size(); } - virtual int getPaintWidth() const { return getPaintRect().width(); } - virtual int getPaintHeight() const { return getPaintRect().height(); } - - virtual bool hasLightBackground() const = 0; - virtual QColor getForeground() const = 0; - virtual QColor getBackground() const = 0; - - virtual ViewManager *getViewManager() const = 0; - - virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const = 0; - virtual bool shouldShowFeatureLabels() const = 0; - - enum TextStyle { - BoxedText, - OutlinedText, - OutlinedItalicText - }; - - virtual void drawVisibleText(QPainter &p, int x, int y, - QString text, TextStyle style) const = 0; - - virtual void drawMeasurementRect(QPainter &p, const Layer *, - QRect rect, bool focus) const = 0; - - virtual void updatePaintRect(QRect r) = 0; - - virtual View *getView() = 0; - virtual const View *getView() const = 0; -}; - -#endif diff -r e536dfc6b250 -r 5144d7185fb5 view/View.h --- a/view/View.h Thu Jun 30 10:36:52 2016 +0100 +++ b/view/View.h Thu Jun 30 10:59:11 2016 +0100 @@ -19,7 +19,7 @@ #include #include -#include "LayerGeometryProvider.h" +#include "layer/LayerGeometryProvider.h" #include "base/ZoomConstraint.h" #include "base/PropertyContainer.h" diff -r e536dfc6b250 -r 5144d7185fb5 view/ViewProxy.h --- a/view/ViewProxy.h Thu Jun 30 10:36:52 2016 +0100 +++ b/view/ViewProxy.h Thu Jun 30 10:59:11 2016 +0100 @@ -15,7 +15,7 @@ #ifndef VIEW_PROXY_H #define VIEW_PROXY_H -#include "LayerGeometryProvider.h" +#include "layer/LayerGeometryProvider.h" class ViewProxy : public LayerGeometryProvider {