Skip to content

Commit 2c6fafc

Browse files
authored
Merge pull request #24152 from ketgg/gsoc_dynamics_popup_part_3
GSoC '24 - Dynamics Popup - Part 3
2 parents 0584c02 + 2ad0ba8 commit 2c6fafc

17 files changed

+259
-30
lines changed

src/app/configs/data/shortcuts.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,10 @@
362362
<key>flip</key>
363363
<seq>X</seq>
364364
</SC>
365+
<SC>
366+
<key>flip-horizontally</key>
367+
<seq>Alt+X</seq>
368+
</SC>
365369
<SC>
366370
<key>pitch-up</key>
367371
<seq>Up</seq>
@@ -538,6 +542,10 @@
538542
<key>add-slur</key>
539543
<seq>S</seq>
540544
</SC>
545+
<SC>
546+
<key>add-dynamic</key>
547+
<seq>Ctrl+D</seq>
548+
</SC>
541549
<SC>
542550
<key>add-hairpin</key>
543551
<seq>Shift+,</seq>
@@ -743,10 +751,6 @@
743751
<key>staff-text</key>
744752
<seq>Ctrl+T</seq>
745753
</SC>
746-
<SC>
747-
<key>dynamics</key>
748-
<seq>Ctrl+D</seq>
749-
</SC>
750754
<SC>
751755
<key>expression-text</key>
752756
<seq>Ctrl+E</seq>

src/app/configs/data/shortcuts_azerty.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@
371371
<key>flip</key>
372372
<seq>X</seq>
373373
</SC>
374+
<SC>
375+
<key>flip-horizontally</key>
376+
<seq>Alt+X</seq>
377+
</SC>
374378
<SC>
375379
<key>pitch-up</key>
376380
<seq>Up</seq>
@@ -547,6 +551,10 @@
547551
<key>add-slur</key>
548552
<seq>S</seq>
549553
</SC>
554+
<SC>
555+
<key>add-dynamic</key>
556+
<seq>Ctrl+D</seq>
557+
</SC>
550558
<SC>
551559
<key>add-hairpin</key>
552560
<seq>Shift+,</seq>
@@ -769,10 +777,6 @@
769777
<key>staff-text</key>
770778
<seq>Ctrl+T</seq>
771779
</SC>
772-
<SC>
773-
<key>dynamics</key>
774-
<seq>Ctrl+D</seq>
775-
</SC>
776780
<SC>
777781
<key>expression-text</key>
778782
<seq>Ctrl+E</seq>

src/app/configs/data/shortcuts_mac.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,10 @@
362362
<key>flip</key>
363363
<seq>X</seq>
364364
</SC>
365+
<SC>
366+
<key>flip-horizontally</key>
367+
<seq>Alt+X</seq>
368+
</SC>
365369
<SC>
366370
<key>pitch-up</key>
367371
<seq>Up</seq>
@@ -538,6 +542,10 @@
538542
<key>add-slur</key>
539543
<seq>S</seq>
540544
</SC>
545+
<SC>
546+
<key>add-dynamic</key>
547+
<seq>Ctrl+D</seq>
548+
</SC>
541549
<SC>
542550
<key>add-hairpin</key>
543551
<seq>Shift+,</seq>
@@ -743,10 +751,6 @@
743751
<key>staff-text</key>
744752
<seq>Ctrl+T</seq>
745753
</SC>
746-
<SC>
747-
<key>dynamics</key>
748-
<seq>Ctrl+D</seq>
749-
</SC>
750754
<SC>
751755
<key>expression-text</key>
752756
<seq>Ctrl+E</seq>

src/appshell/view/appmenumodel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ MenuItemList AppMenuModel::makeTextItems()
643643
makeSeparator(),
644644
makeMenuItem("system-text"),
645645
makeMenuItem("staff-text"),
646-
makeMenuItem("dynamics"),
646+
makeMenuItem("add-dynamic"),
647647
makeMenuItem("expression-text"),
648648
makeMenuItem("rehearsalmark-text"),
649649
makeMenuItem("instrument-change-text"),

src/engraving/dom/edit.cpp

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,15 @@ TextBase* Score::addText(TextStyleType type, EngravingItem* destinationElement)
763763
chordRest->undoAddAnnotation(textBox);
764764
break;
765765
}
766+
case TextStyleType::DYNAMICS: {
767+
ChordRest* chordRest = chordOrRest(destinationElement);
768+
if (!chordRest) {
769+
break;
770+
}
771+
textBox = Factory::createDynamic(dummy()->segment());
772+
chordRest->undoAddAnnotation(textBox);
773+
break;
774+
}
766775
case TextStyleType::EXPRESSION: {
767776
ChordRest* chordRest = chordOrRest(destinationElement);
768777
if (!chordRest) {
@@ -955,15 +964,6 @@ TextBase* Score::addText(TextStyleType type, EngravingItem* destinationElement)
955964
undoAddElement(textBox);
956965
break;
957966
}
958-
case TextStyleType::DYNAMICS: {
959-
ChordRest* chordRest = chordOrRest(destinationElement);
960-
if (!chordRest) {
961-
break;
962-
}
963-
textBox = Factory::createDynamic(dummy()->segment());
964-
chordRest->undoAddAnnotation(textBox);
965-
break;
966-
}
967967
case TextStyleType::HARP_PEDAL_DIAGRAM:
968968
case TextStyleType::HARP_PEDAL_TEXT_DIAGRAM: {
969969
ChordRest* chordRest = getSelectedChordRest();
@@ -2459,6 +2459,38 @@ void Score::cmdFlip()
24592459
}
24602460
}
24612461

2462+
void Score::cmdFlipHorizontally()
2463+
{
2464+
const std::vector<EngravingItem*>& el = selection().elements();
2465+
if (el.empty()) {
2466+
MScore::setError(MsError::NO_FLIPPABLE_SELECTED);
2467+
return;
2468+
}
2469+
2470+
std::set<const EngravingItem*> alreadyFlippedElements;
2471+
auto flipOnce = [&alreadyFlippedElements](const EngravingItem* element, std::function<void()> flipFunction) -> void {
2472+
if (alreadyFlippedElements.insert(element).second) {
2473+
flipFunction();
2474+
}
2475+
};
2476+
2477+
for (EngravingItem* e : el) {
2478+
if (e->isHairpinSegment()) {
2479+
e = toHairpinSegment(e)->hairpin();
2480+
}
2481+
if (e->isHairpin()) {
2482+
Hairpin* h = toHairpin(e);
2483+
flipOnce(h, [h] {
2484+
if (h->hairpinType() == HairpinType::CRESC_HAIRPIN) {
2485+
h->undoChangeProperty(Pid::HAIRPIN_TYPE, int(HairpinType::DECRESC_HAIRPIN));
2486+
} else if (h->hairpinType() == HairpinType::DECRESC_HAIRPIN) {
2487+
h->undoChangeProperty(Pid::HAIRPIN_TYPE, int(HairpinType::CRESC_HAIRPIN));
2488+
}
2489+
});
2490+
}
2491+
}
2492+
}
2493+
24622494
//---------------------------------------------------------
24632495
// deleteItem
24642496
//---------------------------------------------------------

src/engraving/dom/hairpin.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,36 @@ DynamicType Hairpin::dynamicTypeTo() const
520520
return TConv::dynamicType(ba.constChar());
521521
}
522522

523+
const Dynamic* Hairpin::dynamicSnappedBefore() const
524+
{
525+
const LineSegment* seg = frontSegment();
526+
if (!seg) {
527+
return nullptr;
528+
}
529+
530+
const EngravingItem* item = seg->ldata()->itemSnappedBefore();
531+
if (!item || !item->isDynamic()) {
532+
return nullptr;
533+
}
534+
535+
return toDynamic(item);
536+
}
537+
538+
const Dynamic* Hairpin::dynamicSnappedAfter() const
539+
{
540+
const LineSegment* seg = backSegment();
541+
if (!seg) {
542+
return nullptr;
543+
}
544+
545+
const EngravingItem* item = seg->ldata()->itemSnappedAfter();
546+
if (!item || !item->isDynamic()) {
547+
return nullptr;
548+
}
549+
550+
return toDynamic(item);
551+
}
552+
523553
//---------------------------------------------------------
524554
// setHairpinType
525555
//---------------------------------------------------------

src/engraving/dom/hairpin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ class Hairpin final : public TextLineBase
115115
DynamicType dynamicTypeFrom() const;
116116
DynamicType dynamicTypeTo() const;
117117

118+
const Dynamic* dynamicSnappedBefore() const;
119+
const Dynamic* dynamicSnappedAfter() const;
120+
118121
HairpinType hairpinType() const { return m_hairpinType; }
119122
void setHairpinType(HairpinType val);
120123

src/engraving/dom/score.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ class Score : public EngravingObject, public muse::Injectable
378378
void cmdAddMeasureRepeat(Measure*, int numMeasures, staff_idx_t staffIdx);
379379
bool makeMeasureRepeatGroup(Measure*, int numMeasures, staff_idx_t staffIdx);
380380
void cmdFlip();
381+
void cmdFlipHorizontally();
381382
void resetUserStretch();
382383
void cmdResetToDefaultLayout();
383384
void cmdResetBeamMode();

src/notation/inotationinteraction.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ class INotationInteraction
185185
virtual void swapSelection() = 0;
186186
virtual void deleteSelection() = 0;
187187
virtual void flipSelection() = 0;
188+
virtual void flipSelectionHorizontally() = 0;
188189
virtual void addTieToSelection() = 0;
189190
virtual void addTiedNoteToChord() = 0;
190191
virtual void addLaissezVibToSelection() = 0;
@@ -205,6 +206,9 @@ class INotationInteraction
205206

206207
virtual void increaseDecreaseDuration(int steps, bool stepByDots) = 0;
207208

209+
virtual void autoFlipHairpinsType(engraving::Dynamic* selDyn) = 0;
210+
211+
virtual void toggleDynamicPopup() = 0;
208212
virtual bool toggleLayoutBreakAvailable() const = 0;
209213
virtual void toggleLayoutBreak(LayoutBreakType breakType) = 0;
210214
virtual void moveMeasureToPrevSystem() = 0;

src/notation/internal/notationactioncontroller.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ void NotationActionController::init()
223223
registerAction("notation-delete", &Interaction::deleteSelection, &Controller::hasSelection);
224224

225225
registerAction("flip", &Interaction::flipSelection, &Controller::hasSelection);
226+
registerAction("flip-horizontally", &Interaction::flipSelectionHorizontally, &Controller::hasSelection);
226227
registerAction("tie", &Controller::addTie);
227228
registerAction("chord-tie", &Controller::chordTie);
228229
registerAction("lv", &Controller::addLaissezVib);
@@ -322,6 +323,7 @@ void NotationActionController::init()
322323

323324
registerAction("add-8va", &Interaction::addOttavaToSelection, OttavaType::OTTAVA_8VA);
324325
registerAction("add-8vb", &Interaction::addOttavaToSelection, OttavaType::OTTAVA_8VB);
326+
registerAction("add-dynamic", &Interaction::toggleDynamicPopup, &Controller::noteOrRestSelected);
325327
registerAction("add-hairpin", &Interaction::addHairpinsToSelection, HairpinType::CRESC_HAIRPIN, &Controller::noteOrRestSelected);
326328
registerAction("add-hairpin-reverse", &Interaction::addHairpinsToSelection, HairpinType::DECRESC_HAIRPIN,
327329
&Controller::noteOrRestSelected);
@@ -338,7 +340,6 @@ void NotationActionController::init()
338340

339341
registerAction("system-text", [this]() { addText(TextStyleType::SYSTEM); });
340342
registerAction("staff-text", [this]() { addText(TextStyleType::STAFF); });
341-
registerAction("dynamics", [this]() { addText(TextStyleType::DYNAMICS); });
342343
registerAction("expression-text", [this]() { addText(TextStyleType::EXPRESSION); });
343344
registerAction("rehearsalmark-text", [this]() { addText(TextStyleType::REHEARSAL_MARK); });
344345
registerAction("instrument-change-text", [this]() { addText(TextStyleType::INSTRUMENT_CHANGE); });

0 commit comments

Comments
 (0)