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 __MEASUREBASE_H__ 14 #define __MEASUREBASE_H__ 15 16 /** 17 \file 18 Definition of MeasureBase class. 19 */ 20 21 #include "element.h" 22 #include "layoutbreak.h" 23 24 namespace Ms { 25 26 class Score; 27 class System; 28 class Measure; 29 30 //--------------------------------------------------------- 31 // Repeat 32 //--------------------------------------------------------- 33 34 enum class Repeat : char { 35 NONE = 0, 36 END = 1, 37 START = 2, 38 MEASURE = 4, 39 JUMP = 8 40 }; 41 42 constexpr Repeat operator| (Repeat t1, Repeat t2) { 43 return static_cast<Repeat>(static_cast<int>(t1) | static_cast<int>(t2)); 44 } 45 constexpr bool operator& (Repeat t1, Repeat t2) { 46 return static_cast<int>(t1) & static_cast<int>(t2); 47 } 48 49 //--------------------------------------------------------- 50 // @@ MeasureBase 51 /// Virtual base class for Measure, HBox and VBox 52 // 53 // @P lineBreak bool true if a system break is positioned on this measure 54 // @P nextMeasure Measure the next Measure (read-only) 55 // @P nextMeasureMM Measure the next multi-measure rest Measure (read-only) 56 // @P pageBreak bool true if a page break is positioned on this measure 57 // @P prevMeasure Measure the previous Measure (read-only) 58 // @P prevMeasureMM Measure the previous multi-measure rest Measure (read-only) 59 //--------------------------------------------------------- 60 61 class MeasureBase : public Element { 62 MeasureBase* _next { 0 }; 63 MeasureBase* _prev { 0 }; 64 65 ElementList _el; ///< Measure(/tick) relative -elements: with defined start time 66 ///< but outside the staff 67 Fraction _tick { Fraction(0, 1) }; 68 int _no { 0 }; ///< Measure number, counting from zero 69 int _noOffset { 0 }; ///< Offset to measure number 70 71 protected: 72 Fraction _len { Fraction(0, 1) }; ///< actual length of measure 73 void cleanupLayoutBreaks(bool undo); 74 75 public: 76 MeasureBase(Score* score = 0); 77 ~MeasureBase(); 78 MeasureBase(const MeasureBase&); 79 80 virtual MeasureBase* clone() const = 0; 81 virtual ElementType type() const = 0; 82 83 virtual void setScore(Score* s) override; 84 next()85 MeasureBase* next() const { return _next; } 86 MeasureBase* nextMM() const; setNext(MeasureBase * e)87 void setNext(MeasureBase* e) { _next = e; } prev()88 MeasureBase* prev() const { return _prev; } 89 MeasureBase* prevMM() const; setPrev(MeasureBase * e)90 void setPrev(MeasureBase* e) { _prev = e; } 91 MeasureBase *top() const; 92 93 Ms::Measure* nextMeasure() const; 94 Ms::Measure* prevMeasure() const; 95 Ms::Measure* nextMeasureMM() const; 96 Ms::Measure* prevMeasureMM() const; 97 98 virtual void write(XmlWriter&) const override = 0; 99 virtual void write(XmlWriter&, int, bool, bool) const = 0; 100 101 virtual void layout(); 102 103 virtual void scanElements(void* data, void (*func)(void*, Element*), bool all=true); el()104 ElementList& el() { return _el; } el()105 const ElementList& el() const { return _el; } system()106 System* system() const { return (System*)parent(); } setSystem(System * s)107 void setSystem(System* s) { setParent((Element*)s); } 108 109 const MeasureBase* findPotentialSectionBreak() const; 110 LayoutBreak* sectionBreakElement() const; 111 112 void undoSetBreak(bool v, LayoutBreak::Type type); undoSetLineBreak(bool v)113 void undoSetLineBreak(bool v) { undoSetBreak(v, LayoutBreak::LINE);} undoSetPageBreak(bool v)114 void undoSetPageBreak(bool v) { undoSetBreak(v, LayoutBreak::PAGE);} undoSetSectionBreak(bool v)115 void undoSetSectionBreak(bool v) { undoSetBreak(v, LayoutBreak::SECTION);} undoSetNoBreak(bool v)116 void undoSetNoBreak(bool v) { undoSetBreak(v, LayoutBreak::NOBREAK);} 117 moveTicks(const Fraction & diff)118 virtual void moveTicks(const Fraction& diff) { setTick(tick() + diff); } 119 120 virtual void add(Element*) override; 121 virtual void remove(Element*) override; 122 virtual void writeProperties(XmlWriter&) const override; 123 virtual bool readProperties(XmlReader&) override; 124 125 Fraction tick() const override; setTick(const Fraction & f)126 void setTick(const Fraction& f) { _tick = f; } 127 ticks()128 Fraction ticks() const { return _len; } setTicks(const Fraction & f)129 void setTicks(const Fraction& f) { _len = f; } 130 endTick()131 Fraction endTick() const { return _tick + _len; } 132 133 void triggerLayout() const override; 134 135 qreal pause() const; 136 137 virtual QVariant getProperty(Pid) const override; 138 virtual bool setProperty(Pid, const QVariant&) override; 139 virtual QVariant propertyDefault(Pid) const override; 140 141 void clearElements(); 142 ElementList takeElements(); 143 no()144 int no() const { return _no; } setNo(int n)145 void setNo(int n) { _no = n; } noOffset()146 int noOffset() const { return _noOffset; } setNoOffset(int n)147 void setNoOffset(int n) { _noOffset = n; } 148 repeatEnd()149 bool repeatEnd() const { return flag(ElementFlag::REPEAT_END); } setRepeatEnd(bool v)150 void setRepeatEnd(bool v) { setFlag(ElementFlag::REPEAT_END, v); } 151 repeatStart()152 bool repeatStart() const { return flag(ElementFlag::REPEAT_START); } setRepeatStart(bool v)153 void setRepeatStart(bool v) { setFlag(ElementFlag::REPEAT_START, v); } 154 repeatJump()155 bool repeatJump() const { return flag(ElementFlag::REPEAT_JUMP); } setRepeatJump(bool v)156 void setRepeatJump(bool v) { setFlag(ElementFlag::REPEAT_JUMP, v); } 157 irregular()158 bool irregular() const { return flag(ElementFlag::IRREGULAR); } setIrregular(bool v)159 void setIrregular(bool v) { setFlag(ElementFlag::IRREGULAR, v); } 160 lineBreak()161 bool lineBreak() const { return flag(ElementFlag::LINE_BREAK); } setLineBreak(bool v)162 void setLineBreak(bool v) { setFlag(ElementFlag::LINE_BREAK, v); } 163 pageBreak()164 bool pageBreak() const { return flag(ElementFlag::PAGE_BREAK); } setPageBreak(bool v)165 void setPageBreak(bool v) { setFlag(ElementFlag::PAGE_BREAK, v); } 166 sectionBreak()167 bool sectionBreak() const { return flag(ElementFlag::SECTION_BREAK); } setSectionBreak(bool v)168 void setSectionBreak(bool v) { setFlag(ElementFlag::SECTION_BREAK, v); } 169 noBreak()170 bool noBreak() const { return flag(ElementFlag::NO_BREAK); } setNoBreak(bool v)171 void setNoBreak(bool v) { setFlag(ElementFlag::NO_BREAK, v); } 172 hasCourtesyKeySig()173 bool hasCourtesyKeySig() const { return flag(ElementFlag::KEYSIG); } setHasCourtesyKeySig(int v)174 void setHasCourtesyKeySig(int v) { setFlag(ElementFlag::KEYSIG, v); } 175 computeMinWidth()176 virtual void computeMinWidth() { } 177 178 int index() const; 179 int measureIndex() const; 180 }; 181 182 183 } // namespace Ms 184 #endif 185 186