Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/app/configs/data/shortcuts.xml
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,14 @@
<key>add-hairpin-reverse</key>
<seq>Shift+.</seq>
</SC>
<SC>
<key>increase-dynamic</key>
<seq>Alt+.</seq>
</SC>
<SC>
<key>decrease-dynamic</key>
<seq>Alt+,</seq>
</SC>
<SC>
<key>time-delete</key>
<seq>Ctrl+Del</seq>
Expand Down
8 changes: 8 additions & 0 deletions src/app/configs/data/shortcuts_mac.xml
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,14 @@
<SC>
<key>add-hairpin-reverse</key>
<seq>Shift+.</seq>
</SC>
<SC>
<key>increase-dynamic</key>
<seq>Alt+.</seq>
</SC>
<SC>
<key>decrease-dynamic</key>
<seq>Alt+,</seq>
</SC>
<SC>
<key>time-delete</key>
Expand Down
3 changes: 3 additions & 0 deletions src/notation/inotationinteraction.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,9 @@ class INotationInteraction
virtual void autoFlipHairpinsType(engraving::Dynamic* selDyn) = 0;

virtual void toggleDynamicPopup() = 0;
virtual void increaseDecreaseDynamic(engraving::Dynamic* dynamic, int delta) = 0;
virtual void increaseDecreaseDynamicsForSelection(int delta) = 0;

virtual bool toggleLayoutBreakAvailable() const = 0;
virtual void toggleLayoutBreak(LayoutBreakType breakType) = 0;
virtual void moveMeasureToPrevSystem() = 0;
Expand Down
102 changes: 91 additions & 11 deletions src/notation/internal/notationinteraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5764,6 +5764,82 @@ void NotationInteraction::addHairpinsToSelection(HairpinType type)
}
}

void NotationInteraction::increaseDecreaseDynamic(Dynamic* dynamic, int delta)
{
const DynamicType currentType = dynamic->dynamicType();
auto inRange = [](DynamicType type) {
return type >= DynamicType::PPPPP && type <= DynamicType::FFFFF;
};
if (!inRange(currentType)) {
return;
}
DynamicType newType = static_cast<DynamicType>(static_cast<int>(currentType) + delta);
if (!inRange(newType)) {
return;
}

dynamic->undoChangeProperty(Pid::DYNAMIC_TYPE, newType);
dynamic->undoChangeProperty(Pid::TEXT, Dynamic::dynamicText(newType));
autoFlipHairpinsTypeImpl(dynamic);
}

std::vector<Dynamic*> findDynamicsForElement(const EngravingItem* element)
{
const ChordRest* cr = nullptr;

if (element->isChordRest()) {
cr = toChordRest(element);
} else if (element->isNote()) {
auto parent = element->parent();
if (parent && parent->isChordRest()) {
cr = toChordRest(parent);
}
}

if (!cr) {
return {};
}

Segment* segment = cr->segment();

std::vector<Dynamic*> dynamics;
for (EngravingItem* item : segment->annotations()) {
if (!item->isDynamic()) {
continue;
}

Dynamic* dynamic = toDynamic(item);
if (dynamic->elementAppliesToTrack(cr->track())
&& (dynamic->staffIdx() == cr->staffIdx() || dynamic->appliesToAllVoicesInInstrument())) {
dynamics.push_back(dynamic);
}
}

return dynamics;
}

void NotationInteraction::increaseDecreaseDynamicsForSelection(int delta)
{
if (selection()->isNone()) {
return;
}
startEdit(TranslatableString("undoableAction", delta > 0 ? "Increase dynamics" : "Decrease dynamics"));
if (selection()->element() && !selection()->element()->isDynamic()) {
std::vector<Dynamic*> dynamics = findDynamicsForElement(selection()->element());
for (Dynamic* dynamic : dynamics) {
increaseDecreaseDynamic(dynamic, delta);
}
} else {
for (EngravingItem* item : selection()->elements()) {
if (!item->isDynamic()) {
continue;
}
increaseDecreaseDynamic(toDynamic(item), delta);
}
}
apply();
}

void NotationInteraction::putRestToSelection()
{
mu::engraving::InputState& is = score()->inputState();
Expand Down Expand Up @@ -6026,20 +6102,10 @@ void NotationInteraction::increaseDecreaseDuration(int steps, bool stepByDots)
notifyAboutNotationChanged();
}

void NotationInteraction::autoFlipHairpinsType(Dynamic* selDyn)
void NotationInteraction::autoFlipHairpinsTypeImpl(Dynamic* selDyn)
{
if (!selDyn) {
return;
}

if (selDyn->dynamicType() == DynamicType::OTHER || selDyn->dynamicType() >= DynamicType::FP) {
return;
}

selDyn->findAdjacentHairpins();

startEdit(TranslatableString("undoableAction", "Change hairpin type"));

if (Hairpin* leftHp = selDyn->leftHairpin()) {
const Dynamic* startDyn = leftHp->dynamicSnappedBefore();
if (startDyn
Expand All @@ -6065,6 +6131,20 @@ void NotationInteraction::autoFlipHairpinsType(Dynamic* selDyn)
}
}
}
}

void NotationInteraction::autoFlipHairpinsType(Dynamic* selDyn)
{
if (!selDyn) {
return;
}

if (selDyn->dynamicType() == DynamicType::OTHER || selDyn->dynamicType() >= DynamicType::FP) {
return;
}

startEdit(TranslatableString("undoableAction", "Change hairpin type"));
autoFlipHairpinsTypeImpl(selDyn);

apply();
}
Expand Down
4 changes: 4 additions & 0 deletions src/notation/internal/notationinteraction.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,12 @@ class NotationInteraction : public INotationInteraction, public muse::Contextabl
void increaseDecreaseDuration(int steps, bool stepByDots) override;

void autoFlipHairpinsType(engraving::Dynamic* selDyn) override;
void autoFlipHairpinsTypeImpl(engraving::Dynamic* selDyn);

void toggleDynamicPopup() override;
void increaseDecreaseDynamic(engraving::Dynamic* dynamic, int delta) override;
void increaseDecreaseDynamicsForSelection(int delta) override;

bool toggleLayoutBreakAvailable() const override;
void toggleLayoutBreak(LayoutBreakType breakType) override;
void moveMeasureToPrevSystem() override;
Expand Down
1 change: 1 addition & 0 deletions src/notation/tests/mocks/notationinteractionmock.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ class NotationInteractionMock : public INotationInteraction
MOCK_METHOD(void, autoFlipHairpinsType, (engraving::Dynamic * selDyn), (override));

MOCK_METHOD(void, toggleDynamicPopup, (), (override));
MOCK_METHOD(void, increaseDecreaseDynamicsForSelection, (int), (override));
MOCK_METHOD(bool, toggleLayoutBreakAvailable, (), (const, override));
MOCK_METHOD(void, toggleLayoutBreak, (LayoutBreakType), (override));
MOCK_METHOD(void, moveMeasureToPrevSystem, (), (override));
Expand Down
10 changes: 10 additions & 0 deletions src/notationscene/internal/notationactioncontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,16 @@ void NotationActionController::init()
registerAction("add-hairpin", &Interaction::addHairpinsToSelection, HairpinType::CRESC_HAIRPIN, &Controller::noteOrRestSelected);
registerAction("add-hairpin-reverse", &Interaction::addHairpinsToSelection, HairpinType::DIM_HAIRPIN,
&Controller::noteOrRestSelected);

registerAction("increase-dynamic", [this]() {
currentNotationInteraction()->increaseDecreaseDynamicsForSelection(
1);
}, &Controller::hasSelection);
registerAction("decrease-dynamic", [this]() {
currentNotationInteraction()->increaseDecreaseDynamicsForSelection(
-1);
}, &Controller::hasSelection);

registerAction("add-noteline", &Interaction::addAnchoredLineToSelectedNotes);

registerAction("add-image", [this]() { addImage(); });
Expand Down
12 changes: 12 additions & 0 deletions src/notationscene/internal/notationuiactions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1263,6 +1263,18 @@ const UiActionList NotationUiActions::s_actions = {
TranslatableString("action", "&Diminuendo"),
TranslatableString("action", "Add hairpin: diminuendo")
),
UiAction("increase-dynamic",
mu::context::UiCtxProjectOpened,
mu::context::CTX_NOTATION_OPENED,
TranslatableString("action", "Increase dynamics"),
TranslatableString("action", "Increase selected dynamics")
),
UiAction("decrease-dynamic",
mu::context::UiCtxProjectOpened,
mu::context::CTX_NOTATION_OPENED,
TranslatableString("action", "Decrease dynamics"),
TranslatableString("action", "Decrease selected dynamics")
),
UiAction("add-noteline",
mu::context::UiCtxProjectOpened,
mu::context::CTX_NOTATION_OPENED,
Expand Down
Loading