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