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