forked from musescore/MuseScore
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbeam.h
170 lines (128 loc) · 5.69 KB
/
beam.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2002-2012 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#ifndef __BEAM_H__
#define __BEAM_H__
#include "element.h"
#include "durationtype.h"
#include "property.h"
namespace Ms {
class ChordRest;
class MuseScoreView;
class Chord;
class System;
class Skyline;
enum class IconType : signed char;
enum class SpannerSegmentType;
struct BeamFragment;
//---------------------------------------------------------
// @@ Beam
//---------------------------------------------------------
class Beam final : public Element {
Q_GADGET
QVector<ChordRest*> _elements; // must be sorted by tick
QVector<QLineF*> beamSegments;
Direction _direction;
bool _up;
bool _distribute; // equal spacing of elements
bool _noSlope;
bool _userModified[2]; // 0: auto/down 1: up
bool _isGrace;
bool _cross;
qreal _grow1; // define "feather" beams
qreal _grow2;
qreal _beamDist;
QVector<BeamFragment*> fragments; // beam splits across systems
mutable int _id; // used in read()/write()
int minMove; // set in layout1()
int maxMove;
TDuration maxDuration;
qreal slope { 0.0 };
void layout2(std::vector<ChordRest*>, SpannerSegmentType, int frag);
bool twoBeamedNotes();
void computeStemLen(const std::vector<ChordRest*>& crl, qreal& py1, int beamLevels);
bool slopeZero(const std::vector<ChordRest*>& crl);
bool hasNoSlope();
void addChordRest(ChordRest* a);
void removeChordRest(ChordRest* a);
public:
enum class Mode : signed char {
///.\{
AUTO, BEGIN, MID, END, NONE, BEGIN32, BEGIN64, INVALID = -1
///\}
};
Q_ENUM(Mode);
Beam(Score* = 0);
Beam(const Beam&);
~Beam();
virtual Beam* clone() const override { return new Beam(*this); }
virtual ElementType type() const override { return ElementType::BEAM; }
virtual QPointF pagePos() const override; ///< position in page coordinates
virtual QPointF canvasPos() const override; ///< position in page coordinates
virtual bool isEditable() const override { return true; }
virtual void startEdit(EditData&) override;
virtual void endEdit(EditData&) override;
virtual void editDrag(EditData&) override;
virtual Fraction tick() const override;
virtual Fraction rtick() const override;
virtual void write(XmlWriter& xml) const override;
virtual void read(XmlReader&) override;
virtual void spatiumChanged(qreal /*oldValue*/, qreal /*newValue*/) override;
virtual void reset() override;
System* system() const { return toSystem(parent()); }
void layout1();
void layoutGraceNotes();
void layout();
const QVector<ChordRest*>& elements() { return _elements; }
void clear() { _elements.clear(); }
bool empty() const { return _elements.empty(); }
bool contains(const ChordRest* cr) const { return std::find(_elements.begin(), _elements.end(), cr) != _elements.end(); }
virtual void add(Element*) override;
virtual void remove(Element*) override;
virtual void move(const QPointF&) override;
virtual void draw(QPainter*) const override;
bool up() const { return _up; }
void setUp(bool v) { _up = v; }
void setId(int i) const { _id = i; }
int id() const { return _id; }
bool noSlope() const { return _noSlope; }
void setNoSlope(bool val) { _noSlope = val; }
void setBeamDirection(Direction d);
Direction beamDirection() const { return _direction; }
virtual bool acceptDrop(EditData&) const override;
virtual Element* drop(EditData&) override;
qreal growLeft() const { return _grow1; }
qreal growRight() const { return _grow2; }
void setGrowLeft(qreal val) { _grow1 = val; }
void setGrowRight(qreal val) { _grow2 = val; }
bool distribute() const { return _distribute; }
void setDistribute(bool val) { _distribute = val; }
bool userModified() const;
void setUserModified(bool val);
QPointF beamPos() const;
void setBeamPos(const QPointF& bp);
qreal beamDist() const { return _beamDist; }
virtual QVariant getProperty(Pid propertyId) const override;
virtual bool setProperty(Pid propertyId, const QVariant&) override;
virtual QVariant propertyDefault(Pid id) const override;
bool isGrace() const { return _isGrace; } // for debugger
bool cross() const { return _cross; }
void addSkyline(Skyline&);
virtual void triggerLayout() const override;
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; }
int gripsCount() const override { return 3; }
Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::MIDDLE; }
std::vector<QPointF> gripsPositions(const EditData&) const override;
static IconType iconType(Mode);
};
} // namespace Ms
#endif