1 //============================================================================= 2 // MuseScore 3 // Music Composition & Notation 4 // 5 // Copyright (C) 2002-2011 Werner Schweer 6 // 7 // This program is free software; you can redistribute it and/or modify 8 // it under the terms of the GNU General Public License version 2 9 // as published by the Free Software Foundation and appearing in 10 // the file LICENCE.GPL 11 //============================================================================= 12 13 #ifndef __CHORDREST_H__ 14 #define __CHORDREST_H__ 15 16 #include <functional> 17 #include "symbol.h" 18 #include "duration.h" 19 #include "beam.h" 20 #include "shape.h" 21 #include "measure.h" 22 23 namespace Ms { 24 25 enum class CrossMeasure : signed char { 26 UNKNOWN = -1, 27 NONE = 0, 28 FIRST, 29 SECOND 30 }; 31 32 class Score; 33 class Measure; 34 class Tuplet; 35 class Segment; 36 class Slur; 37 class Articulation; 38 class Lyrics; 39 class TabDurationSymbol; 40 class Spanner; 41 enum class SegmentType; 42 43 //------------------------------------------------------------------- 44 // ChordRest 45 // Virtual base class. Chords and rests can be part of a beam 46 // 47 //------------------------------------------------------------------- 48 49 class ChordRest : public DurationElement { 50 ElementList _el; 51 TDuration _durationType; 52 int _staffMove; // -1, 0, +1, used for crossbeaming 53 54 void processSiblings(std::function<void(Element*)> func); 55 56 protected: 57 std::vector<Lyrics*> _lyrics; 58 TabDurationSymbol* _tabDur; // stores a duration symbol in tablature staves 59 60 Beam* _beam; 61 Beam::Mode _beamMode; 62 bool _up; // actual stem direction 63 bool _small; 64 bool _melismaEnd; 65 66 // CrossMeasure: combine 2 tied notes if across a bar line and can be combined in a single duration 67 CrossMeasure _crossMeasure; ///< 0: no cross-measure modification; 1: 1st note of a mod.; -1: 2nd note 68 TDuration _crossMeasureTDur; ///< the total Duration type of the combined notes 69 70 public: 71 ChordRest(Score*); 72 ChordRest(const ChordRest&, bool link = false); 73 ChordRest &operator=(const ChordRest&) = delete; 74 ~ChordRest(); 75 76 virtual ElementType type() const = 0; 77 78 virtual Element* drop(EditData&) override; 79 virtual void undoUnlink() override; 80 segment()81 virtual Segment* segment() const { return (Segment*)parent(); } 82 virtual Measure* measure() const = 0; 83 84 virtual void writeProperties(XmlWriter& xml) const; 85 virtual bool readProperties(XmlReader&); 86 virtual void readAddConnector(ConnectorInfoReader* info, bool pasteMode) override; 87 virtual void scanElements(void* data, void (*func)(void*, Element*), bool all=true) override; 88 setBeamMode(Beam::Mode m)89 void setBeamMode(Beam::Mode m) { _beamMode = m; } 90 void undoSetBeamMode(Beam::Mode m); beamMode()91 Beam::Mode beamMode() const { return _beamMode; } 92 93 void setBeam(Beam* b); beam()94 virtual Beam* beam() const final { return !(measure() && measure()->stemless(staffIdx())) ? _beam : nullptr; } beams()95 int beams() const { return _durationType.hooks(); } 96 virtual qreal upPos() const = 0; 97 virtual qreal downPos() const = 0; 98 line(bool up)99 int line(bool up) const { return up ? upLine() : downLine(); } line()100 int line() const { return _up ? upLine() : downLine(); } 101 virtual int upLine() const = 0; 102 virtual int downLine() const = 0; 103 virtual QPointF stemPos() const = 0; 104 virtual qreal stemPosX() const = 0; 105 virtual QPointF stemPosBeam() const = 0; 106 virtual qreal rightEdge() const = 0; 107 up()108 bool up() const { return _up; } setUp(bool val)109 void setUp(bool val) { _up = val; } 110 111 small()112 bool small() const { return _small; } 113 void setSmall(bool val); 114 void undoSetSmall(bool val); 115 staffMove()116 int staffMove() const { return _staffMove; } setStaffMove(int val)117 void setStaffMove(int val) { _staffMove = val; } vStaffIdx()118 virtual int vStaffIdx() const override { return staffIdx() + _staffMove; } 119 durationType()120 const TDuration durationType() const { return _crossMeasure == CrossMeasure::FIRST ? 121 _crossMeasureTDur : _durationType; } 122 actualDurationType()123 const TDuration actualDurationType() const { return _durationType; } 124 void setDurationType(TDuration::DurationType t); 125 void setDurationType(const QString& s); 126 void setDurationType(const Fraction& ticks); 127 void setDurationType(TDuration v); setDots(int n)128 void setDots(int n) { _durationType.setDots(n); } dots()129 int dots() const { return _crossMeasure == CrossMeasure::FIRST ? _crossMeasureTDur.dots() 130 : (_crossMeasure == CrossMeasure::SECOND ? 0 : _durationType.dots()); } actualDots()131 int actualDots() const { return _durationType.dots(); } durationTypeTicks()132 Fraction durationTypeTicks() { return _crossMeasure == CrossMeasure::FIRST ? _crossMeasureTDur.ticks() : _durationType.ticks(); } 133 QString durationUserName() const; 134 135 virtual void setTrack(int val) override; 136 lyrics()137 const std::vector<Lyrics*>& lyrics() const { return _lyrics; } lyrics()138 std::vector<Lyrics*>& lyrics() { return _lyrics; } 139 Lyrics* lyrics(int verse, Placement) const; 140 int lastVerse(Placement) const; 141 bool isMelismaEnd() const; 142 void setMelismaEnd(bool v); 143 144 virtual void add(Element*); 145 virtual void remove(Element*); 146 void removeDeleteBeam(bool beamed); 147 void replaceBeam(Beam* newBeam); 148 el()149 ElementList& el() { return _el; } el()150 const ElementList& el() const { return _el; } 151 crossMeasure()152 CrossMeasure crossMeasure() const { return _crossMeasure; } setCrossMeasure(CrossMeasure val)153 void setCrossMeasure(CrossMeasure val) { _crossMeasure = val; } crossMeasureSetup(bool)154 virtual void crossMeasureSetup(bool /*on*/) { } 155 // the following two functions should not be used, unless absolutely necessary; 156 // the cross-measure duration is best managed through setDuration() and crossMeasureSetup() crossMeasureDurationType()157 TDuration crossMeasureDurationType() const { return _crossMeasureTDur; } setCrossMeasureDurationType(TDuration v)158 void setCrossMeasureDurationType(TDuration v) { _crossMeasureTDur = v; } 159 160 virtual void localSpatiumChanged(qreal oldValue, qreal newValue) override; 161 virtual QVariant getProperty(Pid propertyId) const override; 162 virtual bool setProperty(Pid propertyId, const QVariant&) override; 163 virtual QVariant propertyDefault(Pid) const override; 164 bool isGrace() const; 165 bool isGraceBefore() const; 166 bool isGraceAfter() const; 167 Breath* hasBreathMark() const; 168 void writeBeam(XmlWriter& xml) const; 169 Segment* nextSegmentAfterCR(SegmentType types) const; 170 171 virtual void setScore(Score* s) override; 172 Element* nextArticulationOrLyric(Element* e); 173 Element* prevArticulationOrLyric(Element* e); 174 virtual Element* nextElement() override; 175 virtual Element* prevElement() override; 176 Element* lastElementBeforeSegment(); 177 virtual Element* nextSegmentElement() override; 178 virtual Element* prevSegmentElement() override; 179 virtual QString accessibleExtraInfo() const override; 180 virtual Shape shape() const override; layoutStem1()181 virtual void layoutStem1() {} computeUp()182 virtual void computeUp() { _up = true; } 183 isFullMeasureRest()184 bool isFullMeasureRest() const { return _durationType == TDuration::DurationType::V_MEASURE; } 185 virtual void removeMarkings(bool keepTremolo = false); 186 187 bool isBefore(const ChordRest*) const; 188 189 void undoAddAnnotation(Element*); 190 }; 191 192 193 } // namespace Ms 194 #endif 195 196