Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #pragma once
24 :
25 : #include "engravingitem.h"
26 : #include "bracketitem.h"
27 :
28 : namespace mu::engraving {
29 : class Factory;
30 : class System;
31 : class Transaction;
32 : enum class BracketType : signed char;
33 : enum class InstrumentNameType : char;
34 :
35 : //---------------------------------------------------------
36 : // @@ Bracket
37 : //---------------------------------------------------------
38 :
39 : class Bracket final : public EngravingItem
40 : {
41 4055 : OBJECT_ALLOCATOR(engraving, Bracket)
42 1866 : DECLARE_CLASSOF(ElementType::BRACKET)
43 :
44 : public:
45 :
46 : ~Bracket();
47 :
48 0 : Bracket* clone() const override { return new Bracket(*this); }
49 :
50 : void scanElements(std::function<void(EngravingItem*)> func) override;
51 :
52 2069 : void setBracketItem(BracketItem* i) { m_bi = i; }
53 5298 : BracketItem* bracketItem() const { return m_bi; }
54 :
55 25903 : BracketType bracketType() const { return m_bi->bracketType(); }
56 :
57 0 : int subtype() const override { return int(bracketType()); }
58 : TranslatableString subtypeUserName() const override;
59 :
60 3921 : size_t firstStaff() const { return m_firstStaff; }
61 3921 : size_t lastStaff() const { return m_lastStaff; }
62 : void setStaffSpan(size_t a, size_t b);
63 :
64 0 : InstrumentNameType labelType() const { return m_labelType; }
65 2816 : void setLabelType(InstrumentNameType t) { m_labelType = t; }
66 :
67 11209 : SymId braceSymbol() const { return m_braceSymbol; }
68 : void setBraceSymbol(const SymId& sym) { m_braceSymbol = sym; }
69 11672 : size_t column() const { return m_bi->column(); }
70 35 : size_t span() const { return m_bi->bracketSpan(); }
71 3773 : double magx() const { return m_magx; }
72 :
73 6140 : System* system() const { return (System*)ownershipParent(); }
74 :
75 1666 : Measure* measure() const { return m_measure; }
76 1335 : void setMeasure(Measure* measure) { m_measure = measure; }
77 :
78 7436 : const BracketItem* bi() const { return m_bi; }
79 :
80 : bool isEditable() const override;
81 : bool needStartEditingAfterSelecting() const override;
82 : void startEdit(EditData&) override;
83 : bool isEditAllowed(EditData&) const override;
84 : bool edit(EditData&) override;
85 : void endEdit(EditData&) override;
86 : void dragGrip(EditData&) override;
87 : void endDragGrip(EditData&) override;
88 :
89 0 : Color color() const override { return m_bi->color(); }
90 :
91 : bool acceptDrop(EditData&) const override;
92 : EngravingItem* drop(Transaction& tx, EditData&) override;
93 :
94 : PropertyValue getProperty(Pid propertyId) const override;
95 : bool setProperty(Pid propertyId, const PropertyValue&) override;
96 : PropertyValue propertyDefault(Pid) const override;
97 :
98 : void undoChangeProperty(Pid id, const PropertyValue& v, PropertyFlags ps) override;
99 : using EngravingObject::undoChangeProperty;
100 :
101 : Fraction tick() const override;
102 :
103 0 : int gripsCount() const override { return 1; }
104 0 : Grip initialEditModeGrip() const override { return Grip::START; }
105 0 : Grip defaultGrip() const override { return Grip::START; }
106 : std::vector<PointF> gripsPositions(const EditData&) const override;
107 :
108 : void setSelected(bool f) override;
109 :
110 0 : Text* text() const { return m_text; }
111 0 : void setText(Text* t) { m_text = t; }
112 :
113 : bool intersects(const Bracket* other) const;
114 : bool contains(staff_idx_t staffIdx) const;
115 :
116 : struct LayoutData : public EngravingItem::LayoutData {
117 : SymId braceSymbol = SymId::noSym;
118 : PainterPath path;
119 : Shape shape;
120 : ld_field<double> bracketHeight = { "[Bracket] bracketHeight", 0.0 };
121 : ld_field<double> bracketWidth = { "[Bracket] bracketWidth", 0.0 };
122 :
123 0 : double h2(LD_ACCESS mode = LD_ACCESS::CHECK) const { return bracketHeight.value(mode) * 0.5; }
124 : };
125 23301 : DECLARE_LAYOUTDATA_METHODS(Bracket)
126 :
127 : private:
128 : friend class Factory;
129 :
130 : Bracket(DummyParentOr<EngravingItem> parent);
131 :
132 : BracketItem* m_bi = nullptr;
133 : double m_ay1 = 0.0;
134 :
135 : size_t m_firstStaff = 0;
136 : size_t m_lastStaff = 0;
137 :
138 : InstrumentNameType m_labelType;
139 :
140 : SymId m_braceSymbol = SymId::noSym;
141 :
142 : // horizontal scaling factor for brace symbol. Cannot be equal to magY or depend on h
143 : // because layout needs width of brace before knowing height of system...
144 : double m_magx = 0.0;
145 : Measure* m_measure = nullptr;
146 :
147 : Text* m_text = nullptr;
148 : };
149 : }
|