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