Skip to content

Commit 6283c5c

Browse files
committed
start/end of measure/system shortcuts for textbase
1 parent 42f4b00 commit 6283c5c

File tree

1 file changed

+84
-29
lines changed

1 file changed

+84
-29
lines changed

src/engraving/dom/textbase.cpp

Lines changed: 84 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include "mscore.h"
5252
#include "page.h"
5353
#include "score.h"
54+
#include "system.h"
5455
#include "textedit.h"
5556
#include "textline.h"
5657
#include "undo.h"
@@ -3358,30 +3359,18 @@ bool TextBase::editNonTextual(EditData& ed)
33583359
return false;
33593360
}
33603361

3361-
bool leftRightKey = ed.key == Key_Left || ed.key == Key_Right;
3362-
bool altMod = ed.modifiers & AltModifier;
3363-
bool shiftMod = ed.modifiers & ShiftModifier;
3364-
3365-
bool changeAnchorType = shiftMod && altMod && leftRightKey;
3366-
if (changeAnchorType) {
3367-
undoChangeProperty(Pid::ANCHOR_TO_END_OF_PREVIOUS, !anchorToEndOfPrevious(), propertyFlags(Pid::ANCHOR_TO_END_OF_PREVIOUS));
3368-
}
3369-
bool doesntNeedMoveSeg = changeAnchorType && ((ed.key == Key_Left && anchorToEndOfPrevious())
3370-
|| (ed.key == Key_Right && !anchorToEndOfPrevious()));
3371-
if (doesntNeedMoveSeg) {
3372-
checkMeasureBoundariesAndMoveIfNeed();
3373-
return true;
3374-
}
3375-
3376-
bool moveSeg = shiftMod && (ed.key == Key_Left || ed.key == Key_Right);
3377-
if (moveSeg) {
3362+
Segment* oldSeg = toSegment(parent());
3363+
if (ed.modifiers & ShiftModifier
3364+
&& (ed.key == Key_Left || ed.key == Key_Right || ed.key == Key_Home || ed.key == Key_End)) {
33783365
bool moved = moveSegment(ed);
3379-
EditTimeTickAnchors::updateAnchors(this, track());
3366+
if (oldSeg != toSegment(parent())) {
3367+
EditTimeTickAnchors::updateAnchors(this, track());
3368+
}
33803369
checkMeasureBoundariesAndMoveIfNeed();
33813370
return moved;
33823371
}
33833372

3384-
if (shiftMod) {
3373+
if (ed.modifiers & ShiftModifier) {
33853374
return false;
33863375
}
33873376

@@ -3404,7 +3393,9 @@ bool TextBase::isNonTextualEditAllowed(EditData& ed) const
34043393
Key_Left,
34053394
Key_Right,
34063395
Key_Up,
3407-
Key_Down
3396+
Key_Down,
3397+
Key_Home,
3398+
Key_End,
34083399
};
34093400

34103401
bool altKeyWithoutShift = (ed.modifiers & AltModifier) && !(ed.modifiers & ShiftModifier);
@@ -3453,22 +3444,86 @@ bool TextBase::moveSegment(const EditData& ed)
34533444
{
34543445
assert(hasParentSegment());
34553446

3456-
bool forward = ed.key == Key_Right;
3457-
if (!(ed.modifiers & AltModifier)) {
3458-
if (anchorToEndOfPrevious()) {
3459-
undoResetProperty(Pid::ANCHOR_TO_END_OF_PREVIOUS);
3460-
if (forward) {
3447+
Segment* curSeg = toSegment(parent());
3448+
IF_ASSERT_FAILED(curSeg) {
3449+
return false;
3450+
}
3451+
3452+
Segment* newSeg = nullptr;
3453+
3454+
bool beforeFirstSeg = false;
3455+
3456+
if (anchorToEndOfPrevious()) {
3457+
if (curSeg->prev1ChordRestOrTimeTick()) {
3458+
if (ed.key == Key_Right || ed.key == Key_End) {
3459+
curSeg = curSeg->prev1ChordRestOrTimeTick();
3460+
}
3461+
} else {
3462+
if (ed.key == Key_Left || ed.key == Key_Home) {
34613463
return true;
34623464
}
3465+
beforeFirstSeg = true;
34633466
}
34643467
}
34653468

3466-
Segment* curSeg = toSegment(parent());
3467-
IF_ASSERT_FAILED(curSeg) {
3468-
return false;
3469+
if (ed.modifiers & AltModifier) {
3470+
undoChangeProperty(Pid::ANCHOR_TO_END_OF_PREVIOUS, !anchorToEndOfPrevious(), propertyFlags(Pid::ANCHOR_TO_END_OF_PREVIOUS));
3471+
} else {
3472+
undoResetProperty(Pid::ANCHOR_TO_END_OF_PREVIOUS);
3473+
}
3474+
3475+
if (beforeFirstSeg) {
3476+
return true;
3477+
}
3478+
3479+
switch (ed.key) {
3480+
case Key_Left: {
3481+
if (ed.modifiers & ControlModifier) {
3482+
Measure* m = curSeg->rtick().isZero() ? curSeg->measure()->prevMeasure() : curSeg->measure();
3483+
newSeg = m ? m->findFirstR(SegmentType::ChordRest, Fraction(0, 1)) : nullptr;
3484+
} else {
3485+
newSeg = curSeg->prev1ChordRestOrTimeTick();
3486+
}
3487+
break;
3488+
}
3489+
case Key_Right: {
3490+
if (ed.modifiers & ControlModifier) {
3491+
Measure* measure = curSeg->measure()->nextMeasure();
3492+
if (measure) {
3493+
newSeg = measure->findFirstR(SegmentType::ChordRest, Fraction(0, 1));
3494+
} else {
3495+
Measure* m = score()->lastMeasure();
3496+
EditTimeTickAnchors::updateAnchors(m, staffIdx());
3497+
newSeg = m->getChordRestOrTimeTickSegment(m->endTick());
3498+
}
3499+
} else {
3500+
newSeg = curSeg->next1ChordRestOrTimeTick();
3501+
}
3502+
break;
3503+
}
3504+
case Key_Home: {
3505+
Measure* m = curSeg->measure()->system()->firstMeasure();
3506+
if (curSeg->rtick() == Fraction(0, 1) && m == curSeg->measure() && m->prevMeasure()) {
3507+
m = m->prevMeasure()->system()->firstMeasure();
3508+
}
3509+
newSeg = m->findFirstR(SegmentType::ChordRest, Fraction(0, 1));
3510+
break;
3511+
}
3512+
case Key_End: {
3513+
Measure* measure = curSeg->measure()->system()->lastMeasure()->nextMeasure();
3514+
if (measure) {
3515+
newSeg = measure->findFirstR(SegmentType::ChordRest, Fraction(0, 1));
3516+
} else {
3517+
Measure* m = score()->lastMeasure();
3518+
EditTimeTickAnchors::updateAnchors(m, staffIdx());
3519+
newSeg = m->getChordRestOrTimeTickSegment(m->endTick());
3520+
}
3521+
break;
3522+
}
3523+
default:
3524+
break;
34693525
}
34703526

3471-
Segment* newSeg = forward ? curSeg->next1ChordRestOrTimeTick() : curSeg->prev1ChordRestOrTimeTick();
34723527
if (!newSeg) {
34733528
return false;
34743529
}

0 commit comments

Comments
 (0)