From 96acfe5f46ae4e5e55fe489c0bf1004c6f7d9ed2 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Wed, 26 Feb 2025 18:16:29 +0100 Subject: [PATCH] Dynamics popup: change existing hairpin instead of creating new one Resolves: point 8 from https://github.com/musescore/MuseScore/issues/26019 --- .../view/internal/dynamicpopupmodel.cpp | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/notation/view/internal/dynamicpopupmodel.cpp b/src/notation/view/internal/dynamicpopupmodel.cpp index 401aedb5cc88e..9832000a8d398 100644 --- a/src/notation/view/internal/dynamicpopupmodel.cpp +++ b/src/notation/view/internal/dynamicpopupmodel.cpp @@ -180,17 +180,27 @@ void DynamicPopupModel::addHairpinToDynamic(ItemType itemType) return; } - beginCommand(TranslatableString("undoableAction", "Add hairpin")); + engraving::Dynamic* dynamic = toDynamic(m_item); - Hairpin* pin = Factory::createHairpin(m_item->score()->dummy()->segment()); - if (itemType == ItemType::Crescendo) { - pin->setHairpinType(HairpinType::CRESC_HAIRPIN); - } else if (itemType == ItemType::Decrescendo) { - pin->setHairpinType(HairpinType::DECRESC_HAIRPIN); - } + HairpinType hairpinType = itemType == ItemType::Crescendo + ? HairpinType::CRESC_HAIRPIN + : HairpinType::DECRESC_HAIRPIN; - m_item->score()->addHairpinToDynamic(pin, toDynamic(m_item)); + if (Hairpin* existingHairpin = dynamic->rightHairpin()) { + if (existingHairpin->hairpinType() == hairpinType) { + return; + } + beginCommand(TranslatableString("undoableAction", "Change hairpin type")); + existingHairpin->undoChangeProperty(Pid::HAIRPIN_TYPE, int(hairpinType)); + endCommand(); + updateNotation(); + return; + } + beginCommand(TranslatableString("undoableAction", "Add hairpin")); + Hairpin* hairpin = Factory::createHairpin(m_item->score()->dummy()->segment()); + hairpin->setHairpinType(hairpinType); + m_item->score()->addHairpinToDynamic(hairpin, dynamic); endCommand(); updateNotation(); }