Revert "Always remove selection after cursor up/down"

This reverts commit 008a0825e8.

This commit was part of bug #12310. The goal was to remove the
selection when using "up" at the start of selection (so that the
cursor cannot move). Unfortunately, it creates navigation issues for
insets inside tabulars.

Since the fix was minor, the safest decision is to revert.

The part of ticket #12310 that resets selection with
char-forwars/backward when moving is not possible still works.

Fixes bug #12593.
This commit is contained in:
Jean-Marc Lasgouttes 2022-10-25 18:18:49 +02:00
parent 0008604b20
commit a559616cbd
5 changed files with 15 additions and 54 deletions

View File

@ -2217,7 +2217,7 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
if (updateNeeded)
forceBufferUpdate();
}
return valid_destination;
return false;
}
// with and without selection are handled differently

View File

@ -496,9 +496,8 @@ public:
/// return true if fullscreen update is needed
bool down();
/// move up/down in a text inset, called for LFUN_UP/DOWN,
/// return true if the cursor has moved or can move, updateNeeded
/// set to true if fullscreen update is needed, otherwise it's not
/// touched
/// return true if successful, updateNeeded set to true if fullscreen
/// update is needed, otherwise it's not touched
bool upDownInText(bool up, bool & updateNeeded);
/// move up/down in math or any non text inset, call for LFUN_UP/DOWN
/// return true if successful

View File

@ -500,8 +500,6 @@ enum FuncCode
LFUN_SPELLING_ADD_LOCAL, // jspitzm 20210306
// 390
LFUN_SPELLING_REMOVE_LOCAL, // jspitzm 20210307
LFUN_FINISHED_DOWN, // lasgouttes 20210629
LFUN_FINISHED_UP, // lasgouttes 20210629
LFUN_BRANCH_SYNC_ALL, // sanda 20220415
LFUN_LASTACTION // end of the table
};

View File

@ -1677,22 +1677,6 @@ void LyXAction::init()
*/
{ LFUN_FINISHED_RIGHT, "", ReadOnly, Hidden },
/*!
* \var lyx::FuncCode lyx::LFUN_FINISHED_UP
* \li Action: Moves the cursor out of the current slice, going up.
* \li Notion: See also #LFUN_FINISHED_DOWN.
* \endvar
*/
{ LFUN_FINISHED_UP, "", ReadOnly, Hidden },
/*!
* \var lyx::FuncCode lyx::LFUN_FINISHED_DOWN
* \li Action: Moves the cursor out of the current slice, going down.
* \li Notion: See also #LFUN_FINISHED_DOWN.
* \endvar
*/
{ LFUN_FINISHED_DOWN, "", ReadOnly, Hidden },
/*!
* \var lyx::FuncCode lyx::LFUN_FLEX_INSERT
* \li Action: Inserts CharStyle, Custom inset or XML short element.

View File

@ -914,12 +914,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
case LFUN_UP:
case LFUN_DOWN: {
// stop/start the selection
bool const select = cmd.action() == LFUN_DOWN_SELECT
|| cmd.action() == LFUN_UP_SELECT;
// move cursor up/down
bool const up = cmd.action() == LFUN_UP_SELECT || cmd.action() == LFUN_UP;
bool select = cmd.action() == LFUN_DOWN_SELECT ||
cmd.action() == LFUN_UP_SELECT;
if (!cur.atFirstOrLastRow(up)) {
// move cursor up/down
bool up = cmd.action() == LFUN_UP_SELECT || cmd.action() == LFUN_UP;
bool const atFirstOrLastRow = cur.atFirstOrLastRow(up);
if (!atFirstOrLastRow) {
needsUpdate |= cur.selHandle(select);
cur.upDownInText(up, needsUpdate);
needsUpdate |= cur.beforeDispatchCursor().inMathed();
@ -935,35 +937,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
cur.forceBufferUpdate();
break;
}
needsUpdate |= cur.selHandle(select);
bool const can_move = cur.upDownInText(up, needsUpdate);
// if the cursor can be moved up or down at an upper level,
// delegate the dispatch to next level. Otherwise, we are
// done.
if (can_move) {
cmd = FuncRequest(up ? LFUN_FINISHED_UP : LFUN_FINISHED_DOWN);
cur.undispatched();
}
}
break;
}
case LFUN_FINISHED_UP:
case LFUN_FINISHED_DOWN: {
// move cursor up/down
bool const up = cmd.action() == LFUN_FINISHED_UP;
if (!cur.atFirstOrLastRow(up)) {
// if the cursor cannot be moved up or down do not remove
// the selection right now, but wait for the next dispatch.
if (select)
needsUpdate |= cur.selHandle(select);
cur.upDownInText(up, needsUpdate);
needsUpdate |= cur.beforeDispatchCursor().inMathed();
} else {
bool const can_move = cur.upDownInText(up, needsUpdate);
// if the cursor can be moved up or down and we are not
// moving cusor at top level, wait for the next dispatch.
// Otherwise, we are done.
if (can_move)
cur.undispatched();
cur.undispatched();
}
break;