Fix T76098: Dragging text selection with offset resets select start
This commit is contained in:
parent
ef1187387b
commit
612757b524
Notes:
blender-bot
2023-02-14 03:00:45 +01:00
Referenced by issue #76098, UI button text selecting ignore text offset.
|
@ -335,12 +335,7 @@ typedef struct uiHandleButtonData {
|
|||
int maxlen;
|
||||
/* Button text selection:
|
||||
* extension direction, selextend, inside ui_do_but_TEX */
|
||||
enum {
|
||||
EXTEND_NONE = 0,
|
||||
EXTEND_LEFT = 1,
|
||||
EXTEND_RIGHT = 2,
|
||||
} selextend;
|
||||
float selstartx;
|
||||
int sel_pos_init;
|
||||
/* allow to realloc str/editstr and use 'maxlen' to track alloc size (maxlen + 1) */
|
||||
bool is_str_dynamic;
|
||||
|
||||
|
@ -2965,20 +2960,12 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
|
|||
|
||||
static void ui_textedit_set_cursor_select(uiBut *but, uiHandleButtonData *data, const float x)
|
||||
{
|
||||
if (x > data->selstartx) {
|
||||
data->selextend = EXTEND_RIGHT;
|
||||
}
|
||||
else if (x < data->selstartx) {
|
||||
data->selextend = EXTEND_LEFT;
|
||||
}
|
||||
|
||||
ui_textedit_set_cursor_pos(but, data, x);
|
||||
|
||||
if (data->selextend == EXTEND_RIGHT) {
|
||||
but->selend = but->pos;
|
||||
}
|
||||
else if (data->selextend == EXTEND_LEFT) {
|
||||
but->selsta = but->pos;
|
||||
but->selsta = but->pos;
|
||||
but->selend = data->sel_pos_init;
|
||||
if (but->selend < but->selsta) {
|
||||
SWAP(short, but->selsta, but->selend);
|
||||
}
|
||||
|
||||
ui_but_update(but);
|
||||
|
@ -3074,7 +3061,7 @@ static void ui_textedit_move(uiBut *but,
|
|||
but->pos = but->selend = but->selsta;
|
||||
}
|
||||
}
|
||||
data->selextend = EXTEND_NONE;
|
||||
data->sel_pos_init = but->pos;
|
||||
}
|
||||
else {
|
||||
int pos_i = but->pos;
|
||||
|
@ -3082,48 +3069,14 @@ static void ui_textedit_move(uiBut *but,
|
|||
but->pos = pos_i;
|
||||
|
||||
if (select) {
|
||||
/* existing selection */
|
||||
if (has_sel) {
|
||||
|
||||
if (data->selextend == EXTEND_NONE) {
|
||||
data->selextend = EXTEND_RIGHT;
|
||||
}
|
||||
|
||||
if (direction) {
|
||||
if (data->selextend == EXTEND_RIGHT) {
|
||||
but->selend = but->pos;
|
||||
}
|
||||
else {
|
||||
but->selsta = but->pos;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (data->selextend == EXTEND_LEFT) {
|
||||
but->selsta = but->pos;
|
||||
}
|
||||
else {
|
||||
but->selend = but->pos;
|
||||
}
|
||||
}
|
||||
|
||||
if (but->selend < but->selsta) {
|
||||
SWAP(short, but->selsta, but->selend);
|
||||
data->selextend = (data->selextend == EXTEND_RIGHT) ? EXTEND_LEFT : EXTEND_RIGHT;
|
||||
}
|
||||
|
||||
} /* new selection */
|
||||
else {
|
||||
if (direction) {
|
||||
data->selextend = EXTEND_RIGHT;
|
||||
but->selend = but->pos;
|
||||
but->selsta = pos_prev;
|
||||
}
|
||||
else {
|
||||
data->selextend = EXTEND_LEFT;
|
||||
but->selend = pos_prev;
|
||||
but->selsta = but->pos;
|
||||
}
|
||||
if (has_sel == false) {
|
||||
data->sel_pos_init = pos_prev;
|
||||
}
|
||||
but->selsta = but->pos;
|
||||
but->selend = data->sel_pos_init;
|
||||
}
|
||||
if (but->selend < but->selsta) {
|
||||
SWAP(short, but->selsta, but->selend);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3353,8 +3306,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
|
|||
len = strlen(data->str);
|
||||
|
||||
data->origstr = BLI_strdupn(data->str, len);
|
||||
data->selextend = EXTEND_NONE;
|
||||
data->selstartx = 0.0f;
|
||||
data->sel_pos_init = 0;
|
||||
|
||||
/* set cursor pos to the end of the text */
|
||||
but->editstr = data->str;
|
||||
|
@ -3560,7 +3512,7 @@ static void ui_do_but_textedit(
|
|||
if (ui_but_contains_pt(but, mx, my)) {
|
||||
ui_textedit_set_cursor_pos(but, data, event->x);
|
||||
but->selsta = but->selend = but->pos;
|
||||
data->selstartx = event->x;
|
||||
data->sel_pos_init = but->pos;
|
||||
|
||||
button_activate_state(C, but, BUTTON_STATE_TEXT_SELECTING);
|
||||
retval = WM_UI_HANDLER_BREAK;
|
||||
|
|
Loading…
Reference in New Issue