diff options
author | Ton Roosendaal <ton@blender.org> | 2009-06-10 15:43:21 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-06-10 15:43:21 +0400 |
commit | fba6a9931c81e8cc6a3ea5d3cbd466f2d759c514 (patch) | |
tree | 573f2d39036d37cecde991ffba8000a5f845b48d /source/blender/editors/interface/interface_handlers.c | |
parent | 872767f5c76db75797344b84c056d6cef28248e8 (diff) |
2.5
First version of search-based ID browsing. Now only in use for the
top bar screen/scene browse. The python buttons will follow.
Also made search button colors match the theme colors from menu back.
Todos for browse-search:
- "Add new" will disappear, and become a separate icon button in the
row of widgets (like X, delete).
- Drawing the preview icons in menu
- Make search menu dynamic, with configurable number of items? And/or
multi-collumn... for now it's static
- Search menu should popup with last active ID visible and selected
Diffstat (limited to 'source/blender/editors/interface/interface_handlers.c')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 214 |
1 files changed, 110 insertions, 104 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index b9e4b18761f..74559b36c60 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -1494,7 +1494,7 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data } else { func= but->block_create_func; - arg= but->poin; + arg= but->poin?but->poin:but->func_argN; } break; case MENU: @@ -2078,6 +2078,7 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) { + if(data->state == BUTTON_STATE_HIGHLIGHT) { if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) { button_activate_state(C, but, BUTTON_STATE_MENU_OPEN); @@ -3112,7 +3113,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA but->block->auto_open= 0; button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT); - + if(type == BUTTON_ACTIVATE_OPEN) { button_activate_state(C, but, BUTTON_STATE_MENU_OPEN); @@ -3522,7 +3523,9 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, if(block->miny <= my && block->maxy >= my) inside= 1; - if((but=ui_but_find_activated(ar)) && button_modal_state(but->active->state)) { + /* if there's an active modal button, don't check events or outside, except for search menu */ + but= ui_but_find_activated(ar); + if(but && button_modal_state(but->active->state) && but->type!=SEARCH_MENU) { /* if a button is activated modal, always reset the start mouse * position of the towards mechanism to avoid loosing focus, * and don't handle events */ @@ -3533,125 +3536,128 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, if(event->type == MOUSEMOVE) ui_mouse_motion_towards_init(menu, mx, my, 0); - switch(event->type) { - /* closing sublevels of pulldowns */ - case LEFTARROWKEY: - if(event->val==KM_PRESS && (block->flag & UI_BLOCK_LOOP)) - if(BLI_countlist(&block->saferct) > 0) - menu->menuretval= UI_RETURN_OUT; + /* events not for active search menu button */ + if(but==NULL || but->type!=SEARCH_MENU) { + switch(event->type) { + /* closing sublevels of pulldowns */ + case LEFTARROWKEY: + if(event->val==KM_PRESS && (block->flag & UI_BLOCK_LOOP)) + if(BLI_countlist(&block->saferct) > 0) + menu->menuretval= UI_RETURN_OUT; - retval= WM_UI_HANDLER_BREAK; - break; - - /* opening sublevels of pulldowns */ - case RIGHTARROWKEY: - if(event->val==KM_PRESS && (block->flag & UI_BLOCK_LOOP)) { - but= ui_but_find_activated(ar); - - if(!but) { - /* no item active, we make first active */ - if(block->direction & UI_TOP) but= ui_but_last(block); - else but= ui_but_first(block); - } - - if(but && ELEM(but->type, BLOCK, PULLDOWN)) - ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_OPEN); - } + retval= WM_UI_HANDLER_BREAK; + break; - retval= WM_UI_HANDLER_BREAK; - break; - - case UPARROWKEY: - case DOWNARROWKEY: - case WHEELUPMOUSE: - case WHEELDOWNMOUSE: - /* arrowkeys: only handle for block_loop blocks */ - if(inside || (block->flag & UI_BLOCK_LOOP)) { - if(event->val==KM_PRESS) { + /* opening sublevels of pulldowns */ + case RIGHTARROWKEY: + if(event->val==KM_PRESS && (block->flag & UI_BLOCK_LOOP)) { but= ui_but_find_activated(ar); - if(but) { - if(ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) { - if(block->direction & UI_TOP) but= ui_but_prev(but); - else but= ui_but_next(but); - } - else { - if(block->direction & UI_TOP) but= ui_but_next(but); - else but= ui_but_prev(but); - } - if(but) - ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE); + if(!but) { + /* no item active, we make first active */ + if(block->direction & UI_TOP) but= ui_but_last(block); + else but= ui_but_first(block); } - if(!but) { - if(ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) { - if(block->direction & UI_TOP) bt= ui_but_first(block); - else bt= ui_but_last(block); - } - else { - if(block->direction & UI_TOP) bt= ui_but_last(block); - else bt= ui_but_first(block); + if(but && ELEM(but->type, BLOCK, PULLDOWN)) + ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_OPEN); + } + + retval= WM_UI_HANDLER_BREAK; + break; + + case UPARROWKEY: + case DOWNARROWKEY: + case WHEELUPMOUSE: + case WHEELDOWNMOUSE: + /* arrowkeys: only handle for block_loop blocks */ + if(inside || (block->flag & UI_BLOCK_LOOP)) { + if(event->val==KM_PRESS) { + but= ui_but_find_activated(ar); + if(but) { + if(ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) { + if(block->direction & UI_TOP) but= ui_but_prev(but); + else but= ui_but_next(but); + } + else { + if(block->direction & UI_TOP) but= ui_but_next(but); + else but= ui_but_prev(but); + } + + if(but) + ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE); } - if(bt) - ui_handle_button_activate(C, ar, bt, BUTTON_ACTIVATE); + if(!but) { + if(ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) { + if(block->direction & UI_TOP) bt= ui_but_first(block); + else bt= ui_but_last(block); + } + else { + if(block->direction & UI_TOP) bt= ui_but_last(block); + else bt= ui_but_first(block); + } + + if(bt) + ui_handle_button_activate(C, ar, bt, BUTTON_ACTIVATE); + } } } - } - retval= WM_UI_HANDLER_BREAK; - break; + retval= WM_UI_HANDLER_BREAK; + break; - case ONEKEY: case PAD1: - act= 1; - case TWOKEY: case PAD2: - if(act==0) act= 2; - case THREEKEY: case PAD3: - if(act==0) act= 3; - case FOURKEY: case PAD4: - if(act==0) act= 4; - case FIVEKEY: case PAD5: - if(act==0) act= 5; - case SIXKEY: case PAD6: - if(act==0) act= 6; - case SEVENKEY: case PAD7: - if(act==0) act= 7; - case EIGHTKEY: case PAD8: - if(act==0) act= 8; - case NINEKEY: case PAD9: - if(act==0) act= 9; - case ZEROKEY: case PAD0: - if(act==0) act= 10; - - if(block->flag & UI_BLOCK_NUMSELECT) { - if(event->alt) act+= 10; - - count= 0; - for(but= block->buttons.first; but; but= but->next) { - int doit= 0; + case ONEKEY: case PAD1: + act= 1; + case TWOKEY: case PAD2: + if(act==0) act= 2; + case THREEKEY: case PAD3: + if(act==0) act= 3; + case FOURKEY: case PAD4: + if(act==0) act= 4; + case FIVEKEY: case PAD5: + if(act==0) act= 5; + case SIXKEY: case PAD6: + if(act==0) act= 6; + case SEVENKEY: case PAD7: + if(act==0) act= 7; + case EIGHTKEY: case PAD8: + if(act==0) act= 8; + case NINEKEY: case PAD9: + if(act==0) act= 9; + case ZEROKEY: case PAD0: + if(act==0) act= 10; + + if(block->flag & UI_BLOCK_NUMSELECT) { + if(event->alt) act+= 10; - if(but->type!=LABEL && but->type!=SEPR) - count++; + count= 0; + for(but= block->buttons.first; but; but= but->next) { + int doit= 0; + + if(but->type!=LABEL && but->type!=SEPR) + count++; - /* exception for menus like layer buts, with button aligning they're not drawn in order */ - if(but->type==TOGR) { - if(but->bitnr==act-1) - doit= 1; - } - else if(count==act) - doit=1; - - if(doit) { - ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_APPLY); - break; + /* exception for menus like layer buts, with button aligning they're not drawn in order */ + if(but->type==TOGR) { + if(but->bitnr==act-1) + doit= 1; + } + else if(count==act) + doit=1; + + if(doit) { + ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_APPLY); + break; + } } } - } - retval= WM_UI_HANDLER_BREAK; - break; + retval= WM_UI_HANDLER_BREAK; + break; + } } - + /* here we check return conditions for menus */ if(block->flag & UI_BLOCK_LOOP) { /* if we click outside the block, verify if we clicked on the |