diff options
Diffstat (limited to 'source/blender/editors/interface/interface_handlers.c')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 136 |
1 files changed, 58 insertions, 78 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index c02bbafce15..f4400d2d7db 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -107,12 +107,6 @@ typedef enum uiHandleButtonState { BUTTON_STATE_EXIT } uiHandleButtonState; -typedef enum uiButtonJumpType { - BUTTON_EDIT_JUMP_NONE, - BUTTON_EDIT_JUMP_DELIM, - BUTTON_EDIT_JUMP_ALL -} uiButtonJumpType; - typedef struct uiHandleButtonData { wmWindowManager *wm; wmWindow *window; @@ -266,7 +260,7 @@ static int ui_is_a_warp_but(uiBut *but) } /* file selectors are exempt from utf-8 checks */ -int ui_is_but_utf8(uiBut *but) +static int ui_is_utf8_but(uiBut *but) { if (but->rnaprop) { const int subtype= RNA_property_subtype(but->rnaprop); @@ -1169,10 +1163,7 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, } else { button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING); - - if(ui_is_but_utf8(but)) BLI_strncpy_utf8(active_data->str, buf, active_data->maxlen); - else BLI_strncpy(active_data->str, buf, active_data->maxlen); - + BLI_strncpy(active_data->str, buf, active_data->maxlen); if(but->type == SEARCH_MENU) { /* else uiSearchboxData.active member is not updated [#26856] */ ui_searchbox_update(C, data->searchbox, but, 1); @@ -1291,18 +1282,18 @@ static int ui_textedit_step_prev_utf8(const char *str, size_t UNUSED(maxlen), sh static void ui_textedit_step_utf8(const char *str, size_t maxlen, short *pos, const char direction, - uiButtonJumpType jump) + const short do_jump, const short do_all) { const short pos_prev= *pos; if(direction) { /* right*/ - if(jump != BUTTON_EDIT_JUMP_NONE) { + if(do_jump) { /* jump between special characters (/,\,_,-, etc.), * look at function test_special_char() for complete * list of special character, ctr -> */ while((*pos) < maxlen) { if (ui_textedit_step_next_utf8(str, maxlen, pos)) { - if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break; + if(!do_all && test_special_char(str[(*pos)])) break; } else { break; /* unlikely but just incase */ @@ -1314,7 +1305,7 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen, } } else { /* left */ - if(jump != BUTTON_EDIT_JUMP_NONE) { + if(do_jump) { /* left only: compensate for index/change in direction */ ui_textedit_step_prev_utf8(str, maxlen, pos); @@ -1323,7 +1314,7 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen, * list of special character, ctr -> */ while ((*pos) > 0) { if (ui_textedit_step_prev_utf8(str, maxlen, pos)) { - if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break; + if(!do_all && test_special_char(str[(*pos)])) break; } else { break; @@ -1437,28 +1428,27 @@ static void ui_textedit_set_cursor_select(uiBut *but, uiHandleButtonData *data, ui_check_but(but); } -/* note: utf8 & ascii funcs should be merged */ -static int ui_textedit_type_utf8(uiBut *but, uiHandleButtonData *data, const char utf8_buf[6]) +static int ui_textedit_type_ascii(uiBut *but, uiHandleButtonData *data, char ascii) { char *str; - int len, changed= 0; + int len, x, changed= 0; str= data->str; len= strlen(str); if(len-(but->selend - but->selsta)+1 <= data->maxlen) { - int step= BLI_strnlen(utf8_buf, sizeof(utf8_buf)); - /* type over the current selection */ - if ((but->selend - but->selsta) > 0) { + if ((but->selend - but->selsta) > 0) changed= ui_textedit_delete_selection(but, data); - len= strlen(str); - } - if(len + step < data->maxlen) { - memmove(&str[but->pos + step], &str[but->pos], (len + 1) - but->pos); - memcpy(&str[but->pos], utf8_buf, step * sizeof(char)); - but->pos += step; + len= strlen(str); + if(len+1 < data->maxlen) { + for(x= data->maxlen; x>but->pos; x--) + str[x]= str[x-1]; + str[but->pos]= ascii; + str[len+1]= '\0'; + + but->pos++; changed= 1; } } @@ -1466,13 +1456,7 @@ static int ui_textedit_type_utf8(uiBut *but, uiHandleButtonData *data, const cha return changed; } -static int ui_textedit_type_ascii(uiBut *but, uiHandleButtonData *data, char ascii) -{ - char utf8_buf[6]= {ascii, '\0'}; - return ui_textedit_type_utf8(but, data, utf8_buf); -} - -static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, uiButtonJumpType jump) +static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump, int jump_all) { const char *str= data->str; const int len= strlen(str); @@ -1481,7 +1465,7 @@ static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction /* special case, quit selection and set cursor */ if (has_sel && !select) { - if (jump == BUTTON_EDIT_JUMP_ALL) { + if (jump_all) { but->selsta = but->selend= but->pos = direction ? len : 0; } else { @@ -1495,7 +1479,7 @@ static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction data->selextend = 0; } else { - ui_textedit_step_utf8(str, len, &but->pos, direction, jump); + ui_textedit_step_utf8(str, len, &but->pos, direction, jump, jump_all); if(select) { /* existing selection */ @@ -1544,33 +1528,35 @@ static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction } } -static int ui_textedit_delete(uiBut *but, uiHandleButtonData *data, int direction, uiButtonJumpType jump) +static int ui_textedit_delete(uiBut *but, uiHandleButtonData *data, int direction, const int all, const int jump) { char *str= data->str; const int len= strlen(str); - int changed= 0; + int x, changed= 0; - if(jump == BUTTON_EDIT_JUMP_ALL) { + if(all) { if(len) changed=1; - str[0]= '\0'; + str[0]= 0; but->pos= 0; } else if(direction) { /* delete */ if ((but->selend - but->selsta) > 0) { changed= ui_textedit_delete_selection(but, data); } - else if (but->pos>=0 && but->pos<len) { + else if(but->pos>=0 && but->pos<len) { short pos= but->pos; int step; - ui_textedit_step_utf8(str, len, &pos, direction, jump); + ui_textedit_step_utf8(str, len, &pos, direction, jump, all); step= pos - but->pos; - memmove(&str[but->pos], &str[but->pos + step], (len + 1) - but->pos); + for(x=but->pos; x<len; x++) + str[x]= str[x+step]; + str[len-step]='\0'; changed= 1; } } else { /* backspace */ - if (len != 0) { + if(len!=0) { if ((but->selend - but->selsta) > 0) { changed= ui_textedit_delete_selection(but, data); } @@ -1578,9 +1564,13 @@ static int ui_textedit_delete(uiBut *but, uiHandleButtonData *data, int directio short pos= but->pos; int step; - ui_textedit_step_utf8(str, len, &pos, direction, jump); + ui_textedit_step_utf8(str, len, &pos, direction, jump, all); step= but->pos - pos; - memmove(&str[but->pos - step], &str[but->pos], (len + 1) - but->pos); + + for(x=but->pos; x<len; x++) + str[x-step]= str[x]; + str[len-step]='\0'; + but->pos -= step; changed= 1; } @@ -1690,9 +1680,19 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data) ui_get_but_string(but, data->str, data->maxlen); if(ELEM3(but->type, NUM, NUMABS, NUMSLI)) { - ui_convert_to_unit_alt_name(but, data->str, data->maxlen); + /* XXX: we dont have utf editing yet so for numbers its best to strip out utf chars + * this is so the deg' synbol isnt included in number editing fields: bug 22274 */ + int i; + for(i=0; data->str[i]; i++) { + if(!isascii(data->str[i])) { + /* no stripping actually: just convert to alt name */ + ui_convert_to_unit_alt_name(but, data->str, data->maxlen); + break; + } + } } - + + data->origstr= BLI_strdup(data->str); data->selextend= 0; data->selstartx= 0; @@ -1717,7 +1717,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data) static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data) { if(but) { - if(ui_is_but_utf8(but)) { + if(ui_is_utf8_but(but)) { int strip= BLI_utf8_invalid_strip(but->editstr, strlen(but->editstr)); /* not a file?, strip non utf-8 chars */ if(strip) { @@ -1869,11 +1869,11 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle } break; case RIGHTARROWKEY: - ui_textedit_move(but, data, 1, event->shift, event->ctrl ? BUTTON_EDIT_JUMP_DELIM : BUTTON_EDIT_JUMP_NONE); + ui_textedit_move(but, data, 1, event->shift, event->ctrl, FALSE); retval= WM_UI_HANDLER_BREAK; break; case LEFTARROWKEY: - ui_textedit_move(but, data, 0, event->shift, event->ctrl ? BUTTON_EDIT_JUMP_DELIM : BUTTON_EDIT_JUMP_NONE); + ui_textedit_move(but, data, 0, event->shift, event->ctrl, FALSE); retval= WM_UI_HANDLER_BREAK; break; case DOWNARROWKEY: @@ -1883,7 +1883,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle } /* pass on purposedly */ case ENDKEY: - ui_textedit_move(but, data, 1, event->shift, BUTTON_EDIT_JUMP_ALL); + ui_textedit_move(but, data, 1, event->shift, TRUE, TRUE); retval= WM_UI_HANDLER_BREAK; break; case UPARROWKEY: @@ -1893,7 +1893,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle } /* pass on purposedly */ case HOMEKEY: - ui_textedit_move(but, data, 0, event->shift, BUTTON_EDIT_JUMP_ALL); + ui_textedit_move(but, data, 0, event->shift, TRUE, TRUE); retval= WM_UI_HANDLER_BREAK; break; case PADENTER: @@ -1902,12 +1902,12 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle retval= WM_UI_HANDLER_BREAK; break; case DELKEY: - changed= ui_textedit_delete(but, data, 1, event->ctrl ? BUTTON_EDIT_JUMP_DELIM : BUTTON_EDIT_JUMP_NONE); + changed= ui_textedit_delete(but, data, 1, 0, event->ctrl); retval= WM_UI_HANDLER_BREAK; break; case BACKSPACEKEY: - changed= ui_textedit_delete(but, data, 0, event->shift ? BUTTON_EDIT_JUMP_ALL : (event->ctrl ? BUTTON_EDIT_JUMP_DELIM : BUTTON_EDIT_JUMP_NONE)); + changed= ui_textedit_delete(but, data, 0, event->shift, event->ctrl); retval= WM_UI_HANDLER_BREAK; break; @@ -1930,7 +1930,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle break; } - if((event->ascii || event->utf8_buf[0]) && (retval == WM_UI_HANDLER_CONTINUE)) { + if(event->ascii && (retval == WM_UI_HANDLER_CONTINUE)) { char ascii = event->ascii; /* exception that's useful for number buttons, some keyboard @@ -1939,16 +1939,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle if(event->type == PADPERIOD && ascii == ',') ascii = '.'; - if(event->utf8_buf[0]) { - /* keep this printf until utf8 is well tested */ - printf("%s: utf8 char '%s'\n", __func__, event->utf8_buf); - // strcpy(event->utf8_buf, "12345"); - changed= ui_textedit_type_utf8(but, data, event->utf8_buf); - } - else { - changed= ui_textedit_type_ascii(but, data, ascii); - } - + changed= ui_textedit_type_ascii(but, data, ascii); retval= WM_UI_HANDLER_BREAK; } @@ -4447,17 +4438,6 @@ static int ui_but_menu(bContext *C, uiBut *but) } } -#ifdef WITH_PYTHON_UI_INFO - if (but->py_dbg_ln != -1) { - PointerRNA ptr_props; - - WM_operator_properties_create(&ptr_props, "WM_OT_text_edit"); - RNA_string_set(&ptr_props, "filepath", but->py_dbg_fn); - RNA_int_set(&ptr_props, "line", but->py_dbg_ln); - uiItemFullO(layout, "WM_OT_text_edit", "Edit Source", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0); - } -#endif /* WITH_PYTHON_UI_INFO */ - uiPupMenuEnd(C, pup); return 1; |