UI: avoid duplicating the string to set the cursor

Internal change only.
This commit is contained in:
2015-11-10 05:31:29 +11:00
parent cfbbf72d89
commit edc780c3b0

View File

@@ -2497,7 +2497,9 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
float startx = but->rect.xmin;
float starty_dummy = 0.0f;
char *origstr, password_str[UI_MAX_PASSWORD_STR];
char password_str[UI_MAX_PASSWORD_STR];
/* treat 'str_last' as null terminator for str, no need to modify in-place */
const char *str = but->editstr, *str_last;
ui_block_to_window_fl(data->region, but->block, &startx, &starty_dummy);
@@ -2510,10 +2512,6 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
ui_but_text_password_hide(password_str, but, false);
origstr = MEM_mallocN(sizeof(char) * data->maxlen, "ui_textedit origstr");
BLI_strncpy(origstr, but->editstr, data->maxlen);
if (ELEM(but->type, UI_BTYPE_TEXT, UI_BTYPE_SEARCH_MENU)) {
if (but->flag & UI_HAS_ICON) {
startx += UI_DPI_ICON_SIZE / aspect;
@@ -2526,12 +2524,12 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
if (x < startx) {
int i = but->ofs;
origstr[but->ofs] = '\0';
str_last = &str[but->ofs];
while (i > 0) {
if (BLI_str_cursor_step_prev_utf8(origstr, but->ofs, &i)) {
if (BLI_str_cursor_step_prev_utf8(str, but->ofs, &i)) {
/* 0.25 == scale factor for less sensitivity */
if (BLF_width(fstyle->uifont_id, origstr + i, BLF_DRAW_STR_DUMMY_MAX) > (startx - x) * 0.25f) {
if (BLF_width(fstyle->uifont_id, str + i, (str_last - str) - i) > (startx - x) * 0.25f) {
break;
}
}
@@ -2550,10 +2548,12 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
float cdist, cdist_prev = 0.0f;
short pos_prev;
but->pos = pos_prev = strlen(origstr) - but->ofs;
str_last = &str[strlen(str)];
but->pos = pos_prev = ((str_last - str) - but->ofs);
while (true) {
cdist = startx + BLF_width(fstyle->uifont_id, origstr + but->ofs, BLF_DRAW_STR_DUMMY_MAX);
cdist = startx + BLF_width(fstyle->uifont_id, str + but->ofs, (str_last - str) - but->ofs);
/* check if position is found */
if (cdist < x) {
@@ -2569,9 +2569,9 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
pos_i = but->pos;
if (but->pos <= 0) break;
if (BLI_str_cursor_step_prev_utf8(origstr, but->ofs, &pos_i)) {
if (BLI_str_cursor_step_prev_utf8(str, but->ofs, &pos_i)) {
but->pos = pos_i;
origstr[but->pos + but->ofs] = 0;
str_last = &str[but->pos + but->ofs];
}
else {
break; /* unlikely but possible */
@@ -2586,8 +2586,6 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con
ui_but_text_password_hide(password_str, but, true);
MEM_freeN(origstr);
fstyle->points = fstyle_points_prev;
}