annotate layer/RegionLayer.h @ 1330:c1f719094c25 zoom

Ensure getFrameForX returns value on zoom blocksize boundary; take advantage of that (this is essentially reverting to the same behaviour as in the default branch, which we should probably have done all along)
author Chris Cannam
date Fri, 21 Sep 2018 11:50:05 +0100
parents a34a2a25907c
children d79e21855aef
rev   line source
Chris@411 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@411 2
Chris@411 3 /*
Chris@411 4 Sonic Visualiser
Chris@411 5 An audio file viewer and annotation editor.
Chris@411 6 Centre for Digital Music, Queen Mary, University of London.
Chris@411 7 This file copyright 2006-2008 Chris Cannam and QMUL.
Chris@411 8
Chris@411 9 This program is free software; you can redistribute it and/or
Chris@411 10 modify it under the terms of the GNU General Public License as
Chris@411 11 published by the Free Software Foundation; either version 2 of the
Chris@411 12 License, or (at your option) any later version. See the file
Chris@411 13 COPYING included with this distribution for more information.
Chris@411 14 */
Chris@411 15
Chris@411 16 #ifndef _REGION_LAYER_H_
Chris@411 17 #define _REGION_LAYER_H_
Chris@411 18
Chris@411 19 #include "SingleColourLayer.h"
Chris@701 20 #include "VerticalScaleLayer.h"
Chris@701 21 #include "ColourScaleLayer.h"
Chris@701 22
Chris@411 23 #include "data/model/RegionModel.h"
Chris@411 24
Chris@411 25 #include <QObject>
Chris@411 26 #include <QColor>
Chris@411 27
Chris@433 28 #include <map>
Chris@433 29
Chris@411 30 class View;
Chris@411 31 class QPainter;
Chris@411 32
Chris@701 33 class RegionLayer : public SingleColourLayer,
Chris@701 34 public VerticalScaleLayer,
Chris@701 35 public ColourScaleLayer
Chris@411 36 {
Chris@411 37 Q_OBJECT
Chris@411 38
Chris@411 39 public:
Chris@411 40 RegionLayer();
Chris@411 41
Chris@916 42 virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const;
Chris@411 43
Chris@918 44 virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const;
Chris@918 45 virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const;
Chris@701 46
Chris@918 47 virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const;
Chris@909 48 virtual QString getLabelPreceding(sv_frame_t) const;
Chris@411 49
Chris@918 50 virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame,
Chris@1266 51 int &resolution,
Chris@1266 52 SnapType snap) const;
Chris@918 53 virtual bool snapToSimilarFeature(LayerGeometryProvider *v, sv_frame_t &frame,
Chris@805 54 int &resolution,
Chris@559 55 SnapType snap) const;
Chris@411 56
Chris@918 57 virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 58 virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 59 virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *);
Chris@411 60
Chris@918 61 virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 62 virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 63 virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *);
Chris@411 64
Chris@918 65 virtual void editStart(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 66 virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 67 virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *);
Chris@411 68
Chris@918 69 virtual bool editOpen(LayerGeometryProvider *v, QMouseEvent *);
Chris@411 70
Chris@905 71 virtual void moveSelection(Selection s, sv_frame_t newStartFrame);
Chris@411 72 virtual void resizeSelection(Selection s, Selection newSize);
Chris@411 73 virtual void deleteSelection(Selection s);
Chris@411 74
Chris@918 75 virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to);
Chris@918 76 virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset,
Chris@411 77 bool interactive);
Chris@411 78
Chris@411 79 virtual const Model *getModel() const { return m_model; }
Chris@411 80 void setModel(RegionModel *model);
Chris@411 81
Chris@411 82 virtual PropertyList getProperties() const;
Chris@411 83 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@411 84 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@411 85 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@411 86 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@411 87 int *min, int *max, int *deflt) const;
Chris@411 88 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@1266 89 int value) const;
Chris@411 90 virtual void setProperty(const PropertyName &, int value);
Chris@411 91
Chris@427 92 void setFillColourMap(int);
Chris@427 93 int getFillColourMap() const { return m_colourMap; }
Chris@427 94
Chris@411 95 enum VerticalScale {
Chris@411 96 AutoAlignScale,
Chris@433 97 EqualSpaced,
Chris@411 98 LinearScale,
Chris@411 99 LogScale,
Chris@411 100 };
Chris@411 101
Chris@411 102 void setVerticalScale(VerticalScale scale);
Chris@411 103 VerticalScale getVerticalScale() const { return m_verticalScale; }
Chris@411 104
Chris@412 105 enum PlotStyle {
Chris@1266 106 PlotLines,
Chris@1266 107 PlotSegmentation
Chris@412 108 };
Chris@412 109
Chris@412 110 void setPlotStyle(PlotStyle style);
Chris@412 111 PlotStyle getPlotStyle() const { return m_plotStyle; }
Chris@412 112
Chris@918 113 virtual bool isLayerScrollable(const LayerGeometryProvider *v) const;
Chris@411 114
Chris@411 115 virtual bool isLayerEditable() const { return true; }
Chris@411 116
Chris@918 117 virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); }
Chris@411 118
Chris@905 119 virtual bool getValueExtents(double &min, double &max,
Chris@411 120 bool &log, QString &unit) const;
Chris@411 121
Chris@905 122 virtual bool getDisplayExtents(double &min, double &max) const;
Chris@411 123
Chris@411 124 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@411 125 QString extraAttributes = "") const;
Chris@411 126
Chris@701 127 void setProperties(const QXmlAttributes &attributes);
Chris@607 128
Chris@701 129 /// VerticalScaleLayer and ColourScaleLayer methods
Chris@918 130 int getYForValue(LayerGeometryProvider *v, double value) const;
Chris@918 131 double getValueForY(LayerGeometryProvider *v, int y) const;
Chris@701 132 virtual QString getScaleUnits() const;
Chris@918 133 QColor getColourForValue(LayerGeometryProvider *v, double value) const;
Chris@411 134
Chris@433 135 protected slots:
Chris@433 136 void recalcSpacing();
Chris@433 137
Chris@411 138 protected:
Chris@918 139 double getValueForY(LayerGeometryProvider *v, int y, int avoid) const;
Chris@918 140 void getScaleExtents(LayerGeometryProvider *, double &min, double &max, bool &log) const;
Chris@411 141
Chris@411 142 virtual int getDefaultColourHint(bool dark, bool &impose);
Chris@411 143
Chris@918 144 RegionModel::PointList getLocalPoints(LayerGeometryProvider *v, int x) const;
Chris@550 145
Chris@918 146 bool getPointToDrag(LayerGeometryProvider *v, int x, int y, RegionModel::Point &) const;
Chris@411 147
Chris@411 148 RegionModel *m_model;
Chris@411 149 bool m_editing;
Chris@551 150 int m_dragPointX;
Chris@551 151 int m_dragPointY;
Chris@551 152 int m_dragStartX;
Chris@551 153 int m_dragStartY;
Chris@411 154 RegionModel::Point m_originalPoint;
Chris@411 155 RegionModel::Point m_editingPoint;
Chris@411 156 RegionModel::EditCommand *m_editingCommand;
Chris@411 157 VerticalScale m_verticalScale;
Chris@427 158 int m_colourMap;
Chris@412 159 PlotStyle m_plotStyle;
Chris@411 160
Chris@905 161 typedef std::map<double, int> SpacingMap;
Chris@551 162
Chris@542 163 // region value -> ordering
Chris@433 164 SpacingMap m_spacingMap;
Chris@433 165
Chris@551 166 // region value -> number of regions with this value
Chris@551 167 SpacingMap m_distributionMap;
Chris@551 168
Chris@918 169 int spacingIndexToY(LayerGeometryProvider *v, int i) const;
Chris@918 170 double yToSpacingIndex(LayerGeometryProvider *v, int y) const;
Chris@542 171
Chris@411 172 void finish(RegionModel::EditCommand *command) {
Chris@411 173 Command *c = command->finish();
Chris@411 174 if (c) CommandHistory::getInstance()->addCommand(c, false);
Chris@411 175 }
Chris@411 176 };
Chris@411 177
Chris@411 178 #endif
Chris@411 179