annotate layer/FlexiNoteLayer.h @ 738:d26545a2a02d tonioni

Rather than undrawing the bottom bit of the dial, don't draw it in the first place (necessary on shaded background)
author Chris Cannam
date Thu, 06 Mar 2014 13:52:33 +0000
parents ceb9a2992d96
children d50f91fe374e
rev   line source
Chris@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@30 2
Chris@30 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@30 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@30 14 */
Chris@30 15
matthiasm@620 16 #ifndef _FLEXINOTE_LAYER_H_
matthiasm@620 17 #define _FLEXINOTE_LAYER_H_
Chris@30 18
matthiasm@651 19 #define NOTE_HEIGHT 16
gyorgyf@646 20
Chris@287 21 #include "SingleColourLayer.h"
Chris@701 22 #include "VerticalScaleLayer.h"
Chris@701 23
matthiasm@620 24 #include "data/model/FlexiNoteModel.h"
Chris@30 25
Chris@30 26 #include <QObject>
Chris@30 27 #include <QColor>
Chris@30 28
Chris@30 29 class View;
Chris@30 30 class QPainter;
Chris@30 31
Chris@702 32
Chris@702 33 class FlexiNoteLayer : public SingleColourLayer,
Chris@702 34 public VerticalScaleLayer
Chris@30 35 {
Chris@30 36 Q_OBJECT
Chris@30 37
Chris@30 38 public:
matthiasm@620 39 FlexiNoteLayer();
Chris@30 40
Chris@44 41 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@30 42
Chris@692 43 virtual int getVerticalScaleWidth(View *v, bool, QPainter &) const;
Chris@692 44 virtual void paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const;
Chris@692 45
Chris@44 46 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@30 47
Chris@44 48 virtual bool snapToFeatureFrame(View *v, int &frame,
gyorgyf@646 49 size_t &resolution,
gyorgyf@646 50 SnapType snap) const;
Chris@30 51
Chris@44 52 virtual void drawStart(View *v, QMouseEvent *);
Chris@44 53 virtual void drawDrag(View *v, QMouseEvent *);
Chris@44 54 virtual void drawEnd(View *v, QMouseEvent *);
Chris@30 55
Chris@335 56 virtual void eraseStart(View *v, QMouseEvent *);
Chris@335 57 virtual void eraseDrag(View *v, QMouseEvent *);
Chris@335 58 virtual void eraseEnd(View *v, QMouseEvent *);
Chris@335 59
Chris@44 60 virtual void editStart(View *v, QMouseEvent *);
Chris@44 61 virtual void editDrag(View *v, QMouseEvent *);
Chris@44 62 virtual void editEnd(View *v, QMouseEvent *);
Chris@30 63
gyorgyf@635 64 virtual void splitStart(View *v, QMouseEvent *);
gyorgyf@635 65 virtual void splitEnd(View *v, QMouseEvent *);
matthiasm@660 66
matthiasm@660 67 virtual void addNote(View *v, QMouseEvent *e);
gyorgyf@635 68
gyorgyf@646 69 virtual void mouseMoveEvent(View *v, QMouseEvent *);
gyorgyf@646 70
Chris@255 71 virtual bool editOpen(View *v, QMouseEvent *);
Chris@70 72
Chris@43 73 virtual void moveSelection(Selection s, size_t newStartFrame);
Chris@43 74 virtual void resizeSelection(Selection s, Selection newSize);
Chris@76 75 virtual void deleteSelection(Selection s);
Chris@76 76
Chris@359 77 virtual void copy(View *v, Selection s, Clipboard &to);
Chris@359 78 virtual bool paste(View *v, const Clipboard &from, int frameOffset,
Chris@125 79 bool interactive);
Chris@43 80
Chris@30 81 virtual const Model *getModel() const { return m_model; }
matthiasm@620 82 void setModel(FlexiNoteModel *model);
Chris@30 83
Chris@30 84 virtual PropertyList getProperties() const;
Chris@87 85 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@30 86 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@198 87 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@30 88 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 89 int *min, int *max, int *deflt) const;
Chris@30 90 virtual QString getPropertyValueLabel(const PropertyName &,
gyorgyf@646 91 int value) const;
Chris@30 92 virtual void setProperty(const PropertyName &, int value);
Chris@30 93
Chris@30 94 enum VerticalScale {
Chris@101 95 AutoAlignScale,
Chris@101 96 LinearScale,
Chris@101 97 LogScale,
Chris@101 98 MIDIRangeScale
Chris@30 99 };
gyorgyf@649 100
gyorgyf@649 101 //GF: Tonioni: context sensitive note edit actions (denoted clockwise from top).
gyorgyf@649 102 enum EditMode {
matthiasm@651 103 DragNote,
matthiasm@651 104 RightBoundary,
matthiasm@651 105 SplitNote,
matthiasm@651 106 LeftBoundary
gyorgyf@649 107 };
gyorgyf@658 108
gyorgyf@658 109 void setIntelligentActions(bool on) { m_intelligentActions=on; }
Chris@30 110
Chris@30 111 void setVerticalScale(VerticalScale scale);
Chris@30 112 VerticalScale getVerticalScale() const { return m_verticalScale; }
Chris@30 113
Chris@44 114 virtual bool isLayerScrollable(const View *v) const;
Chris@30 115
Chris@30 116 virtual bool isLayerEditable() const { return true; }
Chris@30 117
Chris@115 118 virtual int getCompletion(View *) const { return m_model->getCompletion(); }
Chris@30 119
Chris@101 120 virtual bool getValueExtents(float &min, float &max,
Chris@101 121 bool &log, QString &unit) const;
Chris@101 122
Chris@101 123 virtual bool getDisplayExtents(float &min, float &max) const;
Chris@439 124 virtual bool setDisplayExtents(float min, float max);
Chris@439 125
Chris@439 126 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@439 127 virtual int getCurrentVerticalZoomStep() const;
Chris@439 128 virtual void setVerticalZoomStep(int);
Chris@439 129 virtual RangeMapper *getNewVerticalZoomRangeMapper() const;
Chris@79 130
Chris@507 131 /**
Chris@507 132 * Add a note-on. Used when recording MIDI "live". The note will
Chris@507 133 * not be finally added to the layer until the corresponding
Chris@507 134 * note-off.
Chris@507 135 */
Chris@507 136 void addNoteOn(long frame, int pitch, int velocity);
Chris@507 137
Chris@507 138 /**
Chris@507 139 * Add a note-off. This will cause a note to appear, if and only
Chris@507 140 * if there is a matching pending note-on.
Chris@507 141 */
Chris@507 142 void addNoteOff(long frame, int pitch);
Chris@507 143
Chris@507 144 /**
Chris@507 145 * Abandon all pending note-on events.
Chris@507 146 */
Chris@507 147 void abandonNoteOns();
Chris@507 148
Chris@316 149 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 150 QString extraAttributes = "") const;
Chris@30 151
Chris@30 152 void setProperties(const QXmlAttributes &attributes);
matthiasm@651 153
matthiasm@656 154 void setVerticalRangeToNoteRange(View *v);
Chris@30 155
Chris@701 156 /// VerticalScaleLayer methods
Chris@701 157 virtual int getYForValue(View *v, float value) const;
Chris@701 158 virtual float getValueForY(View *v, int y) const;
Chris@701 159 virtual QString getScaleUnits() const;
Chris@701 160
Chris@30 161 protected:
Chris@101 162 void getScaleExtents(View *, float &min, float &max, bool &log) const;
Chris@101 163 bool shouldConvertMIDIToHz() const;
Chris@30 164
Chris@287 165 virtual int getDefaultColourHint(bool dark, bool &impose);
Chris@287 166
matthiasm@620 167 FlexiNoteModel::PointList getLocalPoints(View *v, int) const;
Chris@30 168
matthiasm@620 169 bool getPointToDrag(View *v, int x, int y, FlexiNoteModel::Point &) const;
gyorgyf@646 170 bool getNoteToEdit(View *v, int x, int y, FlexiNoteModel::Point &) const;
gyorgyf@646 171 void getRelativeMousePosition(View *v, FlexiNoteModel::Point &note, int x, int y, bool &closeToLeft, bool &closeToRight, bool &closeToTop, bool &closeToBottom) const;
gyorgyf@655 172 void updateNoteValue(View *v, FlexiNoteModel::Point &note) const;
Chris@550 173
matthiasm@620 174 FlexiNoteModel *m_model;
Chris@30 175 bool m_editing;
gyorgyf@658 176 bool m_intelligentActions;
Chris@551 177 int m_dragPointX;
Chris@551 178 int m_dragPointY;
Chris@551 179 int m_dragStartX;
Chris@551 180 int m_dragStartY;
matthiasm@620 181 FlexiNoteModel::Point m_originalPoint;
matthiasm@620 182 FlexiNoteModel::Point m_editingPoint;
matthiasm@651 183 long m_greatestLeftNeighbourFrame;
matthiasm@651 184 long m_smallestRightNeighbourFrame;
matthiasm@620 185 FlexiNoteModel::EditCommand *m_editingCommand;
Chris@30 186 VerticalScale m_verticalScale;
gyorgyf@649 187 EditMode m_editMode;
Chris@376 188
matthiasm@620 189 typedef std::set<FlexiNoteModel::Point, FlexiNoteModel::Point::Comparator> FlexiNoteSet;
matthiasm@620 190 FlexiNoteSet m_pendingNoteOns;
Chris@507 191
Chris@439 192 mutable float m_scaleMinimum;
Chris@439 193 mutable float m_scaleMaximum;
Chris@439 194
Chris@439 195 bool shouldAutoAlign() const;
Chris@439 196
matthiasm@620 197 void finish(FlexiNoteModel::EditCommand *command) {
Chris@376 198 Command *c = command->finish();
Chris@376 199 if (c) CommandHistory::getInstance()->addCommand(c, false);
Chris@376 200 }
Chris@30 201 };
Chris@30 202
Chris@30 203 #endif
Chris@30 204