Skip to content

Commit 0d3b133

Browse files
committed
Create Expression class
1 parent 5fef293 commit 0d3b133

File tree

17 files changed

+85
-5
lines changed

17 files changed

+85
-5
lines changed

src/engraving/layout/layoutsystem.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,6 @@ void LayoutSystem::layoutSystemElements(const LayoutOptions& options, LayoutCont
949949
if (e->isDynamic()) {
950950
Dynamic* d = toDynamic(e);
951951
d->layout();
952-
953952
if (d->autoplace()) {
954953
d->manageBarlineCollisions();
955954
d->autoplaceSegmentElement(false);
@@ -963,7 +962,6 @@ void LayoutSystem::layoutSystemElements(const LayoutOptions& options, LayoutCont
963962
}
964963

965964
// add dynamics shape to skyline
966-
967965
for (Dynamic* d : dynamics) {
968966
if (!d->addToSkyline()) {
969967
continue;
@@ -974,6 +972,19 @@ void LayoutSystem::layoutSystemElements(const LayoutOptions& options, LayoutCont
974972
system->staff(si)->skyline().add(d->shape().translate(d->pos() + s->pos() + m->pos()));
975973
}
976974

975+
//-------------------------------------------------------------
976+
// Expressions
977+
// (must be done right after dynamics)
978+
//-------------------------------------------------------------
979+
for (Segment* s : sl) {
980+
for (EngravingItem* e : s->annotations()) {
981+
if (e->isExpression()) {
982+
e->layout();
983+
e->autoplaceSegmentElement();
984+
}
985+
}
986+
}
987+
977988
//-------------------------------------------------------------
978989
// layout SpannerSegments for current system
979990
// voltas and tempo change lines are collected here, but laid out later

src/engraving/libmscore/chordrest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ EngravingItem* ChordRest::drop(EditData& data)
380380
// fall through
381381
case ElementType::TEMPO_TEXT:
382382
case ElementType::DYNAMIC:
383+
case ElementType::EXPRESSION:
383384
case ElementType::FRET_DIAGRAM:
384385
case ElementType::TREMOLOBAR:
385386
case ElementType::SYMBOL:

src/engraving/libmscore/edit.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5624,6 +5624,7 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool
56245624
&& et != ElementType::PEDAL
56255625
&& et != ElementType::BREATH
56265626
&& et != ElementType::DYNAMIC
5627+
&& et != ElementType::EXPRESSION
56275628
&& et != ElementType::STAFF_TEXT
56285629
&& et != ElementType::SYSTEM_TEXT
56295630
&& et != ElementType::TRIPLET_FEEL
@@ -5694,6 +5695,7 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool
56945695
|| element->isImage()
56955696
|| element->isTremoloBar()
56965697
|| element->isDynamic()
5698+
|| element->isExpression()
56975699
|| element->isStaffText()
56985700
|| element->isPlayTechAnnotation()
56995701
|| element->isSticking()
@@ -5727,6 +5729,7 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool
57275729
case ElementType::HARMONY:
57285730
case ElementType::FIGURED_BASS:
57295731
case ElementType::DYNAMIC:
5732+
case ElementType::EXPRESSION:
57305733
case ElementType::LYRICS: // not normally segment-attached
57315734
continue;
57325735
default:
@@ -5820,6 +5823,7 @@ void Score::undoAddElement(EngravingItem* element, bool addToLinkedStaves, bool
58205823
|| element->isImage()
58215824
|| element->isTremoloBar()
58225825
|| element->isDynamic()
5826+
|| element->isExpression()
58235827
|| element->isStaffText()
58245828
|| element->isPlayTechAnnotation()
58255829
|| element->isSticking()

src/engraving/libmscore/engravingobject.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,7 @@ bool EngravingObject::isTextBase() const
826826
return type() == ElementType::TEXT
827827
|| type() == ElementType::LYRICS
828828
|| type() == ElementType::DYNAMIC
829+
|| type() == ElementType::EXPRESSION
829830
|| type() == ElementType::FINGERING
830831
|| type() == ElementType::HARMONY
831832
|| type() == ElementType::MARKER

src/engraving/libmscore/engravingobject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ConnectorInfoReader;
6868
class DeadSlapped;
6969
class DurationElement;
7070
class Dynamic;
71+
class Expression;
7172
class EngravingItem;
7273
class EngravingObject;
7374
class FBox;
@@ -371,6 +372,7 @@ class EngravingObject
371372
CONVERT(Tuplet, TUPLET)
372373
CONVERT(NoteDot, NOTEDOT)
373374
CONVERT(Dynamic, DYNAMIC)
375+
CONVERT(Expression, EXPRESSION)
374376
CONVERT(InstrumentName, INSTRUMENT_NAME)
375377
CONVERT(Accidental, ACCIDENTAL)
376378
CONVERT(TextLine, TEXTLINE)
@@ -717,6 +719,7 @@ CONVERT(MMRest)
717719
CONVERT(Tuplet)
718720
CONVERT(NoteDot)
719721
CONVERT(Dynamic)
722+
CONVERT(Expression)
720723
CONVERT(InstrumentName)
721724
CONVERT(Accidental)
722725
CONVERT(TextLine)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "expression.h"
2+
#include "segment.h"
3+
4+
namespace mu::engraving {
5+
static const ElementStyle expressionStyle {
6+
{ Sid::expressionPlacement, Pid::PLACEMENT },
7+
};
8+
9+
Expression::Expression(Segment* parent)
10+
: TextBase(ElementType::EXPRESSION, parent, TextStyleType::EXPRESSION, ElementFlag::MOVABLE | ElementFlag::ON_STAFF)
11+
{
12+
initElementStyle(&expressionStyle);
13+
}
14+
15+
Expression::Expression(const Expression& expression)
16+
: TextBase(expression) {}
17+
18+
PropertyValue Expression::propertyDefault(Pid id) const
19+
{
20+
switch (id) {
21+
case Pid::TEXT_STYLE:
22+
return TextStyleType::EXPRESSION;
23+
default:
24+
return TextBase::propertyDefault(id);
25+
}
26+
}
27+
} // namespace mu::engraving

src/engraving/libmscore/expression.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef EXPRESSION_H
2+
#define EXPRESSION_H
3+
4+
#include "textbase.h"
5+
6+
namespace mu::engraving {
7+
class Expression final : public TextBase
8+
{
9+
public:
10+
Expression(Segment* parent);
11+
Expression(const Expression& expression);
12+
Expression* clone() const override { return new Expression(*this); }
13+
14+
PropertyValue propertyDefault(Pid id) const override;
15+
};
16+
} // namespace mu::engraving
17+
#endif // EXPRESSION_H

src/engraving/libmscore/factory.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "chordline.h"
4141
#include "deadslapped.h"
4242
#include "dynamic.h"
43+
#include "expression.h"
4344
#include "fermata.h"
4445
#include "figuredbass.h"
4546
#include "fingering.h"
@@ -155,6 +156,7 @@ EngravingItem* Factory::doCreateItem(ElementType type, EngravingItem* parent)
155156
case ElementType::CHORDLINE: return new ChordLine(parent->isChord() ? toChord(parent) : dummy->chord());
156157
case ElementType::ACCIDENTAL: return new Accidental(parent);
157158
case ElementType::DYNAMIC: return new Dynamic(parent->isSegment() ? toSegment(parent) : dummy->segment());
159+
case ElementType::EXPRESSION: return new Expression(parent->isSegment() ? toSegment(parent) : dummy->segment());
158160
case ElementType::TEXT: return new Text(parent);
159161
case ElementType::MEASURE_NUMBER: return new MeasureNumber(parent->isMeasure() ? toMeasure(parent) : dummy->measure());
160162
case ElementType::MMREST_RANGE: return new MMRestRange(parent->isMeasure() ? toMeasure(parent) : dummy->measure());

src/engraving/libmscore/libmscore.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ set(LIBMSCORE_SRC
8383
${CMAKE_CURRENT_LIST_DIR}/durationtype.h
8484
${CMAKE_CURRENT_LIST_DIR}/dynamic.cpp
8585
${CMAKE_CURRENT_LIST_DIR}/dynamic.h
86+
${CMAKE_CURRENT_LIST_DIR}/expression.cpp
87+
${CMAKE_CURRENT_LIST_DIR}/expression.h
8688
${CMAKE_CURRENT_LIST_DIR}/dynamichairpingroup.cpp
8789
${CMAKE_CURRENT_LIST_DIR}/dynamichairpingroup.h
8890
${CMAKE_CURRENT_LIST_DIR}/easeInOut.cpp

src/engraving/libmscore/measure.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,6 +1576,7 @@ EngravingItem* Measure::drop(EditData& data)
15761576
return e;
15771577

15781578
case ElementType::DYNAMIC:
1579+
case ElementType::EXPRESSION:
15791580
case ElementType::FRET_DIAGRAM:
15801581
e->setParent(seg);
15811582
e->setTrack(staffIdx * VOICES);

src/engraving/libmscore/note.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,6 +1791,7 @@ bool Note::acceptDrop(EditData& data) const
17911791
|| type == ElementType::CHORD
17921792
|| type == ElementType::HARMONY
17931793
|| type == ElementType::DYNAMIC
1794+
|| type == ElementType::EXPRESSION
17941795
|| (type == ElementType::ACTION_ICON && toActionIcon(e)->actionType() == ActionIconType::ACCIACCATURA)
17951796
|| (type == ElementType::ACTION_ICON && toActionIcon(e)->actionType() == ActionIconType::APPOGGIATURA)
17961797
|| (type == ElementType::ACTION_ICON && toActionIcon(e)->actionType() == ActionIconType::GRACE4)

src/engraving/libmscore/rest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ bool Rest::acceptDrop(EditData& data) const
205205
|| (type == ElementType::STAFF_STATE)
206206
|| (type == ElementType::INSTRUMENT_CHANGE)
207207
|| (type == ElementType::DYNAMIC)
208+
|| (type == ElementType::EXPRESSION)
208209
|| (type == ElementType::HARMONY)
209210
|| (type == ElementType::TEMPO_TEXT)
210211
|| (type == ElementType::REHEARSAL_MARK)

src/engraving/libmscore/segment.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,7 @@ void Segment::add(EngravingItem* el)
583583

584584
case ElementType::TEMPO_TEXT:
585585
case ElementType::DYNAMIC:
586+
case ElementType::EXPRESSION:
586587
case ElementType::HARMONY:
587588
case ElementType::SYMBOL:
588589
case ElementType::FRET_DIAGRAM:
@@ -749,6 +750,7 @@ void Segment::remove(EngravingItem* el)
749750
break;
750751

751752
case ElementType::DYNAMIC:
753+
case ElementType::EXPRESSION:
752754
case ElementType::FIGURED_BASS:
753755
case ElementType::FRET_DIAGRAM:
754756
case ElementType::HARMONY:
@@ -1804,6 +1806,7 @@ EngravingItem* Segment::nextElement(staff_idx_t activeStaff)
18041806
switch (e->type()) {
18051807
case ElementType::DYNAMIC:
18061808
case ElementType::HARMONY:
1809+
case ElementType::EXPRESSION:
18071810
case ElementType::SYMBOL:
18081811
case ElementType::FERMATA:
18091812
case ElementType::FRET_DIAGRAM:
@@ -1946,6 +1949,7 @@ EngravingItem* Segment::prevElement(staff_idx_t activeStaff)
19461949
}
19471950
switch (e->type()) {
19481951
case ElementType::DYNAMIC:
1952+
case ElementType::EXPRESSION:
19491953
case ElementType::HARMONY:
19501954
case ElementType::SYMBOL:
19511955
case ElementType::FERMATA:
@@ -2326,6 +2330,7 @@ void Segment::createShape(staff_idx_t staffIdx)
23262330
&& !e->isHarmony()
23272331
&& !e->isTempoText()
23282332
&& !e->isDynamic()
2333+
&& !e->isExpression()
23292334
&& !e->isFiguredBass()
23302335
&& !e->isSymbol()
23312336
&& !e->isFSymbol()

src/engraving/rw/400/measurerw.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ void MeasureRW::readVoice(Measure* measure, XmlReader& e, ReadContext& ctx, int
529529
|| tag == "InstrumentChange"
530530
|| tag == "StaffState"
531531
|| tag == "FiguredBass"
532+
|| tag == "Expression"
532533
) {
533534
// hack - getSegment needed because tick tags are unreliable in 1.3 scores
534535
// for symbols attached to anything but a measure

src/engraving/types/types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ enum class ElementType {
9696
FERMATA,
9797
CHORDLINE,
9898
DYNAMIC,
99+
EXPRESSION,
99100
BEAM,
100101
BEAM_SEGMENT,
101102
HOOK,

src/engraving/types/typesconv.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ static const std::vector<Item<ElementType> > ELEMENT_TYPES = {
168168
{ ElementType::FERMATA, "Fermata", TranslatableString("engraving", "Fermata") },
169169
{ ElementType::CHORDLINE, "ChordLine", TranslatableString("engraving", "Chord line") },
170170
{ ElementType::DYNAMIC, "Dynamic", TranslatableString("engraving", "Dynamic") },
171+
{ ElementType::EXPRESSION, "Expression", TranslatableString("engraving", "Expression") },
171172
{ ElementType::BEAM, "Beam", TranslatableString("engraving", "Beam") },
172173
{ ElementType::BEAM_SEGMENT, "BeamSegment", TranslatableString("engraving", "Beam segment") },
173174
{ ElementType::HOOK, "Hook", TranslatableString("engraving", "Flag") }, // internally called "Hook", but "Flag" in SMuFL, so here externally too

src/palette/internal/palettecreator.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "libmscore/clef.h"
4545
#include "libmscore/drumset.h"
4646
#include "libmscore/dynamic.h"
47+
#include "libmscore/expression.h"
4748
#include "libmscore/fermata.h"
4849
#include "libmscore/fingering.h"
4950
#include "libmscore/fret.h"
@@ -105,6 +106,7 @@ MAKE_ELEMENT(Hairpin, score->dummy()->segment())
105106
MAKE_ELEMENT(SystemText, score->dummy()->segment())
106107
MAKE_ELEMENT(TempoText, score->dummy()->segment())
107108
MAKE_ELEMENT(StaffText, score->dummy()->segment())
109+
MAKE_ELEMENT(Expression, score->dummy()->segment())
108110
MAKE_ELEMENT(PlayTechAnnotation, score->dummy()->segment())
109111
MAKE_ELEMENT(RehearsalMark, score->dummy()->segment())
110112

@@ -1521,11 +1523,10 @@ PalettePtr PaletteCreator::newTextPalette(bool defaultPalette)
15211523
systemTextLine->setEndHookType(HookType::HOOK_90);
15221524
sp->appendElement(systemTextLine, QT_TRANSLATE_NOOP("palette", "System text line"));
15231525

1524-
auto expressionText = makeElement<StaffText>(gpaletteScore);
1526+
auto expressionText = makeElement<Expression>(gpaletteScore);
15251527
expressionText->setTextStyleType(TextStyleType::EXPRESSION);
1526-
expressionText->setXmlText(QT_TRANSLATE_NOOP("palette", "Expression"));
1528+
expressionText->setXmlText(QT_TRANSLATE_NOOP("palette", "expression"));
15271529
expressionText->setPlacement(PlacementV::BELOW);
1528-
expressionText->setPropertyFlags(Pid::PLACEMENT, PropertyFlags::UNSTYLED);
15291530
sp->appendElement(expressionText, QT_TRANSLATE_NOOP("palette", "Expression text"))->setElementTranslated(true);
15301531

15311532
auto is = makeElement<InstrumentChange>(gpaletteScore);

0 commit comments

Comments
 (0)