From c24be7ec6e5269c54552d1fb03707b97befd48d1 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 7 Jun 2013 15:42:26 +0000 Subject: Usablity: Textbuttons: double click now selects entire words (like on file path segements) Triple click was requested too, but that's not a WM event type yet. --- source/blender/editors/interface/interface_handlers.c | 13 ++++++++++++- source/blender/windowmanager/intern/wm_event_system.c | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 5ca22a3419e..0d8c11c0036 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -2192,11 +2192,14 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle break; case LEFTMOUSE: { + bool had_selection = but->selsta != but->selend; + /* exit on LMB only on RELEASE for searchbox, to mimic other popups, and allow multiple menu levels */ if (data->searchbox) inbox = ui_searchbox_inside(data->searchbox, event->x, event->y); - if (event->val == KM_PRESS) { + /* for double click: we do a press again for when you first click on button (selects all text, no cursor pos) */ + if (event->val == KM_PRESS || event->val == KM_DBL_CLICK) { mx = event->x; my = event->y; ui_window_to_block(data->region, block, &mx, &my); @@ -2217,6 +2220,14 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle retval = WM_UI_HANDLER_BREAK; } } + + /* only select a word in button if there was no selection before */ + if (event->val == KM_DBL_CLICK && had_selection == false) { + ui_textedit_move(but, data, STRCUR_DIR_PREV, 0, STRCUR_JUMP_DELIM); + ui_textedit_move(but, data, STRCUR_DIR_NEXT, true, STRCUR_JUMP_DELIM); + retval = WM_UI_HANDLER_BREAK; + changed = true; + } else if (inbox) { button_activate_state(C, but, BUTTON_STATE_EXIT); retval = WM_UI_HANDLER_BREAK; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index de961afefd8..ac714b09bb0 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -380,8 +380,8 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve int retval; /* UI code doesn't handle return values - it just always returns break. - * to make the DBL_CLICK conversion work, we just don't send this to UI */ - if (event->val == KM_DBL_CLICK) + * to make the DBL_CLICK conversion work, we just don't send this to UI, except mouse clicks */ + if (event->type != LEFTMOUSE && event->val == KM_DBL_CLICK) return WM_HANDLER_CONTINUE; /* UI is quite aggressive with swallowing events, like scrollwheel */ -- cgit v1.2.3