1 //=============================================================================
2 //  MuseScore
3 //  Music Composition & Notation
4 //
5 //  Copyright (C) 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 __PROPERTY_H__
14 #define __PROPERTY_H__
15 
16 namespace Ms {
17 
18 class XmlReader;
19 
20 //------------------------------------------------------------------------
21 //    M_PROPERTY (type, getter_name, setter_name)
22 //       helper macro to define a styled ScoreElement property
23 //
24 //    usage example:
25 //    class Text : public Element {
26 //          M_PROPERTY(QColor, color, setColor)
27 //          ...
28 //          };
29 //    this defines:
30 //          QColor _color;
31 //          const QColor& color() const { return _color; }
32 //          void setColor(const QColor& val) { _color = val; }
33 //---------------------------------------------------------
34 
35 #define M_PROPERTY(a,b,c)                                      \
36       a _ ## b;                                                \
37    public:                                                     \
38       const a& b() const   { return _ ## b; }                  \
39       void c(const a& val) { _ ## b = val;  }                  \
40    private:
41 
42 #define M_PROPERTY2(a,b,c,d)                                   \
43       a _ ## b { d };                                          \
44    public:                                                     \
45       const a& b() const   { return _ ## b; }                  \
46       void c(const a& val) { _ ## b = val;  }                  \
47    private:
48 
49 //---------------------------------------------------------
50 //   PropertyFlags
51 //---------------------------------------------------------
52 
53 enum class PropertyFlags : char {
54       NOSTYLE, UNSTYLED, STYLED
55       };
56 
57 //------------------------------------------------------------------------
58 //   Element Properties
59 //------------------------------------------------------------------------
60 
61 enum class Pid {
62       SUBTYPE,
63       SELECTED,
64       GENERATED,
65       COLOR,
66       VISIBLE,
67       Z,
68       SMALL,
69       SHOW_COURTESY,
70       KEYSIG_MODE,
71       LINE_TYPE,
72       PITCH,
73 
74       TPC1,
75       TPC2,
76       LINE,
77       FIXED,
78       FIXED_LINE,
79       HEAD_TYPE,
80       HEAD_GROUP,
81       VELO_TYPE,
82       VELO_OFFSET,
83       ARTICULATION_ANCHOR,
84 
85       DIRECTION,
86       STEM_DIRECTION,
87       NO_STEM,
88       SLUR_DIRECTION,
89       LEADING_SPACE,
90       DISTRIBUTE,
91       MIRROR_HEAD,
92       DOT_POSITION,
93       TUNING,
94       PAUSE,
95 
96       BARLINE_TYPE,
97       BARLINE_SPAN,
98       BARLINE_SPAN_FROM,
99       BARLINE_SPAN_TO,
100       OFFSET,
101       FRET,
102       STRING,
103       GHOST,
104       PLAY,
105       TIMESIG_NOMINAL,
106 
107       TIMESIG_ACTUAL,
108       NUMBER_TYPE,
109       BRACKET_TYPE,
110       NORMAL_NOTES,
111       ACTUAL_NOTES,
112       P1,
113       P2,
114       GROW_LEFT,
115       GROW_RIGHT,
116       BOX_HEIGHT,
117       BOX_WIDTH,
118       BOX_AUTOSIZE,
119       TOP_GAP,
120       BOTTOM_GAP,
121       LEFT_MARGIN,
122       RIGHT_MARGIN,
123       TOP_MARGIN,
124       BOTTOM_MARGIN,
125       LAYOUT_BREAK,
126       AUTOSCALE,
127       SIZE,
128 
129       SCALE,
130       LOCK_ASPECT_RATIO,
131       SIZE_IS_SPATIUM,
132       TEXT,
133       HTML_TEXT,
134       USER_MODIFIED,
135       BEAM_POS,
136       BEAM_MODE,
137       BEAM_NO_SLOPE,
138       USER_LEN,       // used for stems
139 
140       SPACE,          // used for spacer
141       TEMPO,
142       TEMPO_FOLLOW_TEXT,
143       ACCIDENTAL_BRACKET,
144       ACCIDENTAL_TYPE,
145       NUMERATOR_STRING,
146       DENOMINATOR_STRING,
147       FBPREFIX,             // used for FiguredBassItem
148       FBDIGIT,              //    "           "
149       FBSUFFIX,             //    "           "
150       FBCONTINUATIONLINE,   //    "           "
151 
152       FBPARENTHESIS1,       //    "           "
153       FBPARENTHESIS2,       //    "           "
154       FBPARENTHESIS3,       //    "           "
155       FBPARENTHESIS4,       //    "           "
156       FBPARENTHESIS5,       //    "           "
157       OTTAVA_TYPE,
158       NUMBERS_ONLY,
159       TRILL_TYPE,
160       VIBRATO_TYPE,
161       HAIRPIN_CIRCLEDTIP,
162 
163       HAIRPIN_TYPE,
164       HAIRPIN_HEIGHT,
165       HAIRPIN_CONT_HEIGHT,
166       VELO_CHANGE,
167       VELO_CHANGE_METHOD,
168       VELO_CHANGE_SPEED,
169       DYNAMIC_TYPE,
170       DYNAMIC_RANGE,
171 //100
172       SINGLE_NOTE_DYNAMICS,
173       CHANGE_METHOD,
174       PLACEMENT,              // Goes with P_TYPE::PLACEMENT
175       HPLACEMENT,             // Goes with P_TYPE::HPLACEMENT
176       MMREST_RANGE_BRACKET_TYPE, // The brackets used arond the measure numbers indicating the range covered by the mmrest
177       VELOCITY,
178       JUMP_TO,
179       PLAY_UNTIL,
180       CONTINUE_AT,
181       LABEL,
182       MARKER_TYPE,
183       ARP_USER_LEN1,
184       ARP_USER_LEN2,
185       REPEAT_END,
186       REPEAT_START,
187       REPEAT_JUMP,
188       MEASURE_NUMBER_MODE,
189 
190       GLISS_TYPE,
191       GLISS_TEXT,
192       GLISS_SHOW_TEXT,
193       GLISS_STYLE,
194       GLISS_EASEIN,
195       GLISS_EASEOUT,
196       DIAGONAL,
197       GROUPS,
198       LINE_STYLE,
199       LINE_WIDTH,
200       LINE_WIDTH_SPATIUM,
201       LASSO_POS,
202       LASSO_SIZE,
203       TIME_STRETCH,
204       ORNAMENT_STYLE,
205 
206       TIMESIG,
207       TIMESIG_GLOBAL,
208       TIMESIG_STRETCH,
209       TIMESIG_TYPE,
210       SPANNER_TICK,
211       SPANNER_TICKS,
212       SPANNER_TRACK2,
213       OFFSET2,
214       BREAK_MMR,
215       MMREST_NUMBER_POS,
216       REPEAT_COUNT,
217 
218       USER_STRETCH,
219       NO_OFFSET,
220       IRREGULAR,
221       ANCHOR,
222       SLUR_UOFF1,
223       SLUR_UOFF2,
224       SLUR_UOFF3,
225       SLUR_UOFF4,
226       STAFF_MOVE,
227       VERSE,
228 
229       SYLLABIC,
230       LYRIC_TICKS,
231       VOLTA_ENDING,
232       LINE_VISIBLE,
233       MAG,
234       USE_DRUMSET,
235       DURATION,
236       DURATION_TYPE,
237       ROLE,
238       TRACK,
239 
240       FRET_STRINGS,
241       FRET_FRETS,
242       FRET_NUT,
243       FRET_OFFSET,
244       FRET_NUM_POS,
245       ORIENTATION,
246 
247       HARMONY_VOICE_LITERAL,
248       HARMONY_VOICING,
249       HARMONY_DURATION,
250 
251       SYSTEM_BRACKET,
252       GAP,
253       AUTOPLACE,
254       DASH_LINE_LEN,
255       DASH_GAP_LEN,
256       TICK,
257       PLAYBACK_VOICE1,
258       PLAYBACK_VOICE2,
259       PLAYBACK_VOICE3,
260 
261       PLAYBACK_VOICE4,
262       SYMBOL,
263       PLAY_REPEATS,
264       CREATE_SYSTEM_HEADER,
265       STAFF_LINES,
266       LINE_DISTANCE,
267       STEP_OFFSET,
268       STAFF_SHOW_BARLINES,
269       STAFF_SHOW_LEDGERLINES,
270       STAFF_STEMLESS,
271       STAFF_INVISIBLE,
272       STAFF_COLOR,
273 
274       HEAD_SCHEME,
275       STAFF_GEN_CLEF,
276       STAFF_GEN_TIMESIG,
277       STAFF_GEN_KEYSIG,
278       STAFF_YOFFSET,
279       STAFF_USERDIST,
280       STAFF_BARLINE_SPAN,
281       STAFF_BARLINE_SPAN_FROM,
282       STAFF_BARLINE_SPAN_TO,
283       BRACKET_SPAN,
284 
285       BRACKET_COLUMN,
286       INAME_LAYOUT_POSITION,
287 //200
288       SUB_STYLE,
289 
290       FONT_FACE,
291       FONT_SIZE,
292       FONT_STYLE,
293       TEXT_LINE_SPACING,
294 
295       FRAME_TYPE,
296       FRAME_WIDTH,
297       FRAME_PADDING,
298       FRAME_ROUND,
299       FRAME_FG_COLOR,
300 
301       FRAME_BG_COLOR,
302       SIZE_SPATIUM_DEPENDENT,
303       ALIGN,
304       SYSTEM_FLAG,
305       BEGIN_TEXT,
306 
307       BEGIN_TEXT_ALIGN,
308       BEGIN_TEXT_PLACE,
309       BEGIN_HOOK_TYPE,
310       BEGIN_HOOK_HEIGHT,
311       BEGIN_FONT_FACE,
312       BEGIN_FONT_SIZE,
313       BEGIN_FONT_STYLE,
314       BEGIN_TEXT_OFFSET,
315 
316       CONTINUE_TEXT,
317       CONTINUE_TEXT_ALIGN,
318       CONTINUE_TEXT_PLACE,
319       CONTINUE_FONT_FACE,
320       CONTINUE_FONT_SIZE,
321       CONTINUE_FONT_STYLE,
322       CONTINUE_TEXT_OFFSET,
323       END_TEXT,
324 
325       END_TEXT_ALIGN,
326       END_TEXT_PLACE,
327       END_HOOK_TYPE,
328       END_HOOK_HEIGHT,
329       END_FONT_FACE,
330       END_FONT_SIZE,
331       END_FONT_STYLE,
332       END_TEXT_OFFSET,
333 
334       POS_ABOVE,
335 
336       LOCATION_STAVES,
337       LOCATION_VOICES,
338       LOCATION_MEASURES,
339       LOCATION_FRACTIONS,
340       LOCATION_GRACE,
341       LOCATION_NOTE,
342 
343       VOICE,
344       POSITION,
345 
346       CLEF_TYPE_CONCERT,
347       CLEF_TYPE_TRANSPOSING,
348       KEY,
349       ACTION, // for Icon
350       MIN_DISTANCE,
351 
352       ARPEGGIO_TYPE,
353       CHORD_LINE_TYPE,
354       CHORD_LINE_STRAIGHT,
355       TREMOLO_TYPE,
356       TREMOLO_STYLE,
357       HARMONY_TYPE,
358 
359       START_WITH_LONG_NAMES,
360       START_WITH_MEASURE_ONE,
361       FIRST_SYSTEM_INDENTATION,
362 
363       PATH, // for ChordLine to make its shape changes undoable
364 
365       PREFER_SHARP_FLAT,
366 
367       END
368       };
369 
370 enum class P_TYPE : char {
371       BOOL,
372       INT,
373       REAL,
374       SPATIUM,
375       SP_REAL,          // real (point) value saved in (score) spatium units
376       FRACTION,
377       POINT,
378       POINT_SP,         // point units, value saved in (score) spatium units
379       POINT_MM,
380       POINT_SP_MM,      // point units, value saved as mm or spatium depending on Element->sizeIsSpatiumDependent()
381       SIZE,
382       SIZE_MM,
383       STRING,
384       SCALE,
385       COLOR,
386       DIRECTION,      // enum class Direction
387       DIRECTION_H,    // enum class MScore::DirectionH
388       ORNAMENT_STYLE, // enum class MScore::OrnamentStyle
389       TDURATION,
390       LAYOUT_BREAK,
391       VALUE_TYPE,
392       BEAM_MODE,
393       PLACEMENT,      // ABOVE or BELOW
394       HPLACEMENT,     // LEFT, CENTER or RIGHT
395       TEXT_PLACE,
396       TEMPO,
397       GROUPS,
398       SYMID,
399       INT_LIST,
400       GLISS_STYLE,
401       BARLINE_TYPE,
402       HEAD_TYPE,        // enum class Notehead::Type
403       HEAD_GROUP,       // enum class Notehead::Group
404       ZERO_INT,         // displayed with offset +1
405       FONT,
406       SUB_STYLE,
407       ALIGN,
408       CHANGE_METHOD,    // enum class VeloChangeMethod (for single note dynamics)
409       CHANGE_SPEED,     // enum class Dynamic::Speed
410       CLEF_TYPE,        // enum class ClefType
411       DYNAMIC_TYPE,     // enum class Dynamic::Type
412       KEYMODE,          // enum class KeyMode
413       ORIENTATION,      // enum class Orientation
414 
415       PATH,             // QPainterPath
416       HEAD_SCHEME,      // enum class NoteHead::Scheme
417       };
418 
419 extern QVariant readProperty(Pid type, XmlReader& e);
420 extern QVariant propertyFromString(Pid type, QString value);
421 extern QString propertyToString(Pid, QVariant value, bool mscx);
422 extern P_TYPE propertyType(Pid);
423 extern const char* propertyName(Pid);
424 extern bool propertyLink(Pid id);
425 extern Pid propertyId(const QString& name);
426 extern Pid propertyId(const QStringRef& name);
427 extern QString propertyUserName(Pid);
428 
429 }     // namespace Ms
430 
431 Q_DECLARE_METATYPE(QPainterPath); // for properties with P_TYPE::PATH
432 
433 #endif
434 
435