annotate layer/TimeValueLayer.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@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@59 4 Sonic Visualiser
Chris@59 5 An audio file viewer and annotation editor.
Chris@59 6 Centre for Digital Music, Queen Mary, University of London.
Chris@59 7 This file copyright 2006 Chris Cannam.
Chris@0 8
Chris@59 9 This program is free software; you can redistribute it and/or
Chris@59 10 modify it under the terms of the GNU General Public License as
Chris@59 11 published by the Free Software Foundation; either version 2 of the
Chris@59 12 License, or (at your option) any later version. See the file
Chris@59 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@1227 16 #ifndef SV_TIME_VALUE_LAYER_H
Chris@1227 17 #define SV_TIME_VALUE_LAYER_H
Chris@0 18
Chris@287 19 #include "SingleColourLayer.h"
Chris@696 20 #include "VerticalScaleLayer.h"
Chris@699 21 #include "ColourScaleLayer.h"
Chris@699 22
Chris@128 23 #include "data/model/SparseTimeValueModel.h"
Chris@0 24
Chris@0 25 #include <QObject>
Chris@0 26 #include <QColor>
Chris@0 27
Chris@0 28 class View;
Chris@0 29 class QPainter;
Chris@0 30
Chris@699 31 class TimeValueLayer : public SingleColourLayer,
Chris@699 32 public VerticalScaleLayer,
Chris@699 33 public ColourScaleLayer
Chris@0 34 {
Chris@0 35 Q_OBJECT
Chris@0 36
Chris@0 37 public:
Chris@44 38 TimeValueLayer();
Chris@0 39
Chris@916 40 virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const;
Chris@0 41
Chris@918 42 virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const;
Chris@918 43 virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const;
Chris@42 44
Chris@918 45 virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const;
Chris@909 46 virtual QString getLabelPreceding(sv_frame_t) const;
Chris@0 47
Chris@918 48 virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame,
Chris@1266 49 int &resolution,
Chris@1266 50 SnapType snap) const;
Chris@918 51 virtual bool snapToSimilarFeature(LayerGeometryProvider *v, sv_frame_t &frame,
Chris@805 52 int &resolution,
Chris@517 53 SnapType snap) const;
Chris@13 54
Chris@918 55 virtual void drawStart(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 56 virtual void drawDrag(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 57 virtual void drawEnd(LayerGeometryProvider *v, QMouseEvent *);
Chris@21 58
Chris@918 59 virtual void eraseStart(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 60 virtual void eraseDrag(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 61 virtual void eraseEnd(LayerGeometryProvider *v, QMouseEvent *);
Chris@335 62
Chris@918 63 virtual void editStart(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 64 virtual void editDrag(LayerGeometryProvider *v, QMouseEvent *);
Chris@918 65 virtual void editEnd(LayerGeometryProvider *v, QMouseEvent *);
Chris@21 66
Chris@918 67 virtual bool editOpen(LayerGeometryProvider *v, QMouseEvent *);
Chris@70 68
Chris@905 69 virtual void moveSelection(Selection s, sv_frame_t newStartFrame);
Chris@43 70 virtual void resizeSelection(Selection s, Selection newSize);
Chris@76 71 virtual void deleteSelection(Selection s);
Chris@76 72
Chris@918 73 virtual void copy(LayerGeometryProvider *v, Selection s, Clipboard &to);
Chris@918 74 virtual bool paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t frameOffset,
Chris@125 75 bool interactive);
Chris@43 76
Chris@0 77 virtual const Model *getModel() const { return m_model; }
Chris@0 78 void setModel(SparseTimeValueModel *model);
Chris@0 79
Chris@0 80 virtual PropertyList getProperties() const;
Chris@87 81 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@515 82 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@0 83 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@198 84 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 85 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 86 int *min, int *max, int *deflt) const;
Chris@0 87 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@1266 88 int value) const;
Chris@0 89 virtual void setProperty(const PropertyName &, int value);
Chris@0 90
Chris@197 91 void setFillColourMap(int);
Chris@197 92 int getFillColourMap() const { return m_colourMap; }
Chris@197 93
Chris@26 94 enum PlotStyle {
Chris@1266 95 PlotPoints,
Chris@1266 96 PlotStems,
Chris@1266 97 PlotConnectedPoints,
Chris@1266 98 PlotLines,
Chris@1266 99 PlotCurve,
Chris@1266 100 PlotSegmentation,
Chris@615 101 PlotDiscreteCurves
Chris@26 102 };
Chris@0 103
Chris@0 104 void setPlotStyle(PlotStyle style);
Chris@0 105 PlotStyle getPlotStyle() const { return m_plotStyle; }
Chris@0 106
Chris@66 107 enum VerticalScale {
Chris@101 108 AutoAlignScale,
Chris@66 109 LinearScale,
Chris@66 110 LogScale,
Chris@101 111 PlusMinusOneScale
Chris@66 112 };
Chris@66 113
Chris@66 114 void setVerticalScale(VerticalScale scale);
Chris@66 115 VerticalScale getVerticalScale() const { return m_verticalScale; }
Chris@66 116
Chris@513 117 void setDrawSegmentDivisions(bool);
Chris@513 118 bool getDrawSegmentDivisions() const { return m_drawSegmentDivisions; }
Chris@513 119
Chris@553 120 void setShowDerivative(bool);
Chris@553 121 bool getShowDerivative() const { return m_derivative; }
Chris@553 122
Chris@918 123 virtual bool isLayerScrollable(const LayerGeometryProvider *v) const;
Chris@0 124
Chris@23 125 virtual bool isLayerEditable() const { return true; }
Chris@23 126
Chris@918 127 virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); }
Chris@0 128
Chris@79 129 virtual bool needsTextLabelHeight() const {
Chris@81 130 return m_plotStyle == PlotSegmentation && m_model->hasTextLabels();
Chris@79 131 }
Chris@79 132
Chris@905 133 virtual bool getValueExtents(double &min, double &max,
Chris@101 134 bool &logarithmic, QString &unit) const;
Chris@101 135
Chris@905 136 virtual bool getDisplayExtents(double &min, double &max) const;
Chris@905 137 virtual bool setDisplayExtents(double min, double max);
Chris@437 138
Chris@437 139 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@437 140 virtual int getCurrentVerticalZoomStep() const;
Chris@437 141 virtual void setVerticalZoomStep(int);
Chris@437 142 virtual RangeMapper *getNewVerticalZoomRangeMapper() const;
Chris@79 143
Chris@316 144 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 145 QString extraAttributes = "") const;
Chris@6 146
Chris@11 147 void setProperties(const QXmlAttributes &attributes);
Chris@11 148
Chris@1205 149 /// Override from SingleColourLayer
Chris@494 150 virtual ColourSignificance getLayerColourSignificance() const {
Chris@494 151 if (m_plotStyle == PlotSegmentation) {
Chris@494 152 return ColourHasMeaningfulValue;
Chris@494 153 } else {
Chris@494 154 return ColourDistinguishes;
Chris@494 155 }
Chris@494 156 }
Chris@494 157
Chris@1205 158 /// Override from SingleColourLayer
Chris@1205 159 virtual bool hasLightBackground() const {
Chris@1205 160 if (m_plotStyle == PlotSegmentation) {
Chris@1205 161 return true;
Chris@1205 162 } else {
Chris@1205 163 return SingleColourLayer::hasLightBackground();
Chris@1205 164 }
Chris@1205 165 }
Chris@1205 166
Chris@699 167 /// VerticalScaleLayer and ColourScaleLayer methods
Chris@918 168 virtual int getYForValue(LayerGeometryProvider *, double value) const;
Chris@918 169 virtual double getValueForY(LayerGeometryProvider *, int y) const;
Chris@696 170 virtual QString getScaleUnits() const;
Chris@918 171 virtual QColor getColourForValue(LayerGeometryProvider *v, double value) const;
Chris@696 172
Chris@0 173 protected:
Chris@918 174 void getScaleExtents(LayerGeometryProvider *, double &min, double &max, bool &log) const;
Chris@296 175 bool shouldAutoAlign() const;
Chris@68 176
Chris@918 177 SparseTimeValueModel::PointList getLocalPoints(LayerGeometryProvider *v, int) const;
Chris@0 178
Chris@287 179 virtual int getDefaultColourHint(bool dark, bool &impose);
Chris@287 180
Chris@0 181 SparseTimeValueModel *m_model;
Chris@21 182 bool m_editing;
Chris@23 183 SparseTimeValueModel::Point m_originalPoint;
Chris@21 184 SparseTimeValueModel::Point m_editingPoint;
Chris@22 185 SparseTimeValueModel::EditCommand *m_editingCommand;
Chris@197 186 int m_colourMap;
Chris@0 187 PlotStyle m_plotStyle;
Chris@66 188 VerticalScale m_verticalScale;
Chris@513 189 bool m_drawSegmentDivisions;
Chris@553 190 bool m_derivative;
Chris@376 191
Chris@905 192 mutable double m_scaleMinimum;
Chris@905 193 mutable double m_scaleMaximum;
Chris@437 194
Chris@376 195 void finish(SparseTimeValueModel::EditCommand *command) {
Chris@376 196 Command *c = command->finish();
Chris@376 197 if (c) CommandHistory::getInstance()->addCommand(c, false);
Chris@376 198 }
Chris@0 199 };
Chris@0 200
Chris@0 201 #endif
Chris@0 202