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 : #include "whammybar.h"
24 :
25 : #include "score.h"
26 : #include "system.h"
27 : #include "text.h"
28 :
29 : using namespace mu;
30 : using namespace mu::engraving;
31 :
32 : namespace mu::engraving {
33 : static const ElementStyle whammyBarStyle {
34 : { Sid::whammyBarFontFace, Pid::BEGIN_FONT_FACE },
35 : { Sid::whammyBarFontFace, Pid::CONTINUE_FONT_FACE },
36 : { Sid::whammyBarFontFace, Pid::END_FONT_FACE },
37 : { Sid::whammyBarFontSize, Pid::BEGIN_FONT_SIZE },
38 : { Sid::whammyBarFontSize, Pid::CONTINUE_FONT_SIZE },
39 : { Sid::whammyBarFontSize, Pid::END_FONT_SIZE },
40 : { Sid::whammyBarFontStyle, Pid::BEGIN_FONT_STYLE },
41 : { Sid::whammyBarFontStyle, Pid::CONTINUE_FONT_STYLE },
42 : { Sid::whammyBarFontStyle, Pid::END_FONT_STYLE },
43 : { Sid::whammyBarTextAlign, Pid::BEGIN_TEXT_ALIGN },
44 : { Sid::whammyBarTextAlign, Pid::CONTINUE_TEXT_ALIGN },
45 : { Sid::whammyBarTextAlign, Pid::END_TEXT_ALIGN },
46 : { Sid::whammyBarPosition, Pid::BEGIN_TEXT_POSITION },
47 : { Sid::whammyBarPosition, Pid::CONTINUE_TEXT_POSITION },
48 : { Sid::whammyBarPosition, Pid::END_TEXT_POSITION },
49 : { Sid::whammyBarHookHeight, Pid::BEGIN_HOOK_HEIGHT },
50 : { Sid::whammyBarHookHeight, Pid::END_HOOK_HEIGHT },
51 : { Sid::whammyBarLineStyle, Pid::LINE_STYLE },
52 : { Sid::whammyBarDashLineLen, Pid::DASH_LINE_LEN },
53 : { Sid::whammyBarDashGapLen, Pid::DASH_GAP_LEN },
54 : { Sid::whammyBarFontSpatiumDependent, Pid::TEXT_SIZE_SPATIUM_DEPENDENT },
55 : { Sid::whammyBarEndHookType, Pid::END_HOOK_TYPE },
56 : { Sid::whammyBarLineWidth, Pid::LINE_WIDTH },
57 : { Sid::whammyBarText, Pid::BEGIN_TEXT },
58 : { Sid::whammyBarPlacement, Pid::PLACEMENT },
59 :
60 : { Sid::whammyBarMusicalSymbolSize, Pid::BEGIN_TEXT_MUSIC_SYMBOLS_SIZE },
61 : { Sid::whammyBarMusicalSymbolSize, Pid::CONTINUE_TEXT_MUSIC_SYMBOLS_SIZE },
62 : { Sid::whammyBarMusicalSymbolSize, Pid::END_TEXT_MUSIC_SYMBOLS_SIZE },
63 : { Sid::dummyMusicalSymbolsScale, Pid::BEGIN_TEXT_MUSICAL_SYMBOLS_SCALE },
64 : { Sid::dummyMusicalSymbolsScale, Pid::CONTINUE_TEXT_MUSICAL_SYMBOLS_SCALE },
65 : { Sid::dummyMusicalSymbolsScale, Pid::END_TEXT_MUSICAL_SYMBOLS_SCALE },
66 : };
67 :
68 0 : WhammyBarSegment::WhammyBarSegment(WhammyBar* sp)
69 0 : : TextLineBaseSegment(ElementType::WHAMMY_BAR_SEGMENT, sp, ElementFlag::MOVABLE | ElementFlag::ON_STAFF)
70 : {
71 0 : m_text->setTextStyleType(propertyDefault(Pid::TEXT_STYLE).value<TextStyleType>());
72 0 : m_endText->setTextStyleType(propertyDefault(Pid::TEXT_STYLE).value<TextStyleType>());
73 0 : }
74 :
75 : //---------------------------------------------------------
76 : // WhammyBar
77 : //---------------------------------------------------------
78 :
79 64 : WhammyBar::WhammyBar(DummyParentOr<EngravingItem> parent)
80 64 : : ChordTextLineBase(ElementType::WHAMMY_BAR, parent)
81 : {
82 64 : initElementStyle(&whammyBarStyle);
83 64 : resetProperty(Pid::LINE_VISIBLE);
84 :
85 64 : resetProperty(Pid::BEGIN_TEXT_PLACE);
86 64 : resetProperty(Pid::BEGIN_TEXT);
87 64 : resetProperty(Pid::CONTINUE_TEXT_PLACE);
88 64 : resetProperty(Pid::CONTINUE_TEXT);
89 64 : resetProperty(Pid::END_TEXT_PLACE);
90 64 : resetProperty(Pid::END_TEXT);
91 64 : }
92 :
93 : static const ElementStyle whammyBarSegmentStyle {
94 : { Sid::letRingMinDistance, Pid::MIN_DISTANCE },
95 : };
96 :
97 : //---------------------------------------------------------
98 : // createLineSegment
99 : //---------------------------------------------------------
100 :
101 0 : LineSegment* WhammyBar::createLineSegment()
102 : {
103 0 : WhammyBarSegment* wb = new WhammyBarSegment(this);
104 0 : wb->setTrack(track());
105 0 : wb->initElementStyle(&whammyBarSegmentStyle);
106 0 : return wb;
107 : }
108 :
109 : //---------------------------------------------------------
110 : // propertyDefault
111 : //---------------------------------------------------------
112 :
113 1406 : PropertyValue WhammyBar::propertyDefault(Pid propertyId) const
114 : {
115 1406 : switch (propertyId) {
116 2 : case Pid::LINE_WIDTH:
117 2 : return style().styleV(Sid::whammyBarLineWidth);
118 :
119 2 : case Pid::LINE_STYLE:
120 2 : return style().styleV(Sid::whammyBarLineStyle);
121 :
122 96 : case Pid::LINE_VISIBLE:
123 96 : return true;
124 :
125 64 : case Pid::CONTINUE_TEXT_OFFSET:
126 : case Pid::END_TEXT_OFFSET:
127 64 : return PropertyValue::fromValue(PointF(0, 0));
128 :
129 2 : case Pid::BEGIN_FONT_STYLE:
130 2 : return style().styleV(Sid::whammyBarFontStyle);
131 :
132 162 : case Pid::BEGIN_TEXT:
133 : case Pid::CONTINUE_TEXT:
134 162 : return style().styleV(Sid::whammyBarText).value<String>(); // TODO: fix the style
135 :
136 96 : case Pid::END_TEXT:
137 96 : return "";
138 :
139 32 : case Pid::BEGIN_HOOK_TYPE:
140 32 : return HookType::NONE;
141 :
142 288 : case Pid::BEGIN_TEXT_PLACE:
143 : case Pid::CONTINUE_TEXT_PLACE:
144 : case Pid::END_TEXT_PLACE:
145 288 : return TextPlace::AUTO;
146 :
147 0 : case Pid::TEXT_STYLE:
148 0 : return TextStyleType::WHAMMY_BAR;
149 :
150 256 : case Pid::BEGIN_FILLED_ARROW_HEIGHT: // No arrow endings for whammy bar
151 : case Pid::BEGIN_FILLED_ARROW_WIDTH:
152 : case Pid::END_FILLED_ARROW_HEIGHT:
153 : case Pid::END_FILLED_ARROW_WIDTH:
154 : case Pid::BEGIN_LINE_ARROW_HEIGHT:
155 : case Pid::BEGIN_LINE_ARROW_WIDTH:
156 : case Pid::END_LINE_ARROW_HEIGHT:
157 : case Pid::END_LINE_ARROW_WIDTH:
158 256 : return 0.0;
159 :
160 406 : default:
161 406 : return TextLineBase::propertyDefault(propertyId);
162 : }
163 : }
164 :
165 : //---------------------------------------------------------
166 : // getPropertyStyle
167 : //---------------------------------------------------------
168 :
169 2070 : Sid WhammyBar::getPropertyStyle(Pid id) const
170 : {
171 2070 : switch (id) {
172 66 : case Pid::PLACEMENT:
173 66 : return Sid::whammyBarPlacement;
174 66 : case Pid::BEGIN_FONT_FACE:
175 66 : return Sid::whammyBarFontFace;
176 198 : case Pid::BEGIN_FONT_SIZE:
177 : case Pid::CONTINUE_FONT_SIZE:
178 : case Pid::END_FONT_SIZE:
179 198 : return Sid::whammyBarFontSize;
180 196 : case Pid::BEGIN_FONT_STYLE:
181 : case Pid::CONTINUE_FONT_STYLE:
182 : case Pid::END_FONT_STYLE:
183 196 : return Sid::whammyBarFontStyle;
184 198 : case Pid::BEGIN_TEXT_ALIGN:
185 : case Pid::CONTINUE_TEXT_ALIGN:
186 : case Pid::END_TEXT_ALIGN:
187 198 : return Sid::whammyBarTextAlign;
188 132 : case Pid::BEGIN_HOOK_HEIGHT:
189 : case Pid::END_HOOK_HEIGHT:
190 132 : return Sid::whammyBarHookHeight;
191 1214 : default:
192 1214 : break;
193 : }
194 1214 : return TextLineBase::getPropertyStyle(id);
195 : }
196 :
197 0 : Sid WhammyBar::defaultPosSid() const
198 : {
199 0 : return placeAbove() ? Sid::whammyBarPosAbove : Sid::whammyBarPosBelow;
200 : }
201 : }
|