UI: support alt+wheel for expanded enums

This commit is contained in:
Campbell Barton 2015-01-21 16:27:21 +11:00
parent 17422124ec
commit 4422ecbb96
2 changed files with 73 additions and 0 deletions

View File

@ -114,6 +114,7 @@
static void ui_but_smart_controller_add(bContext *C, uiBut *from, uiBut *to);
static void ui_but_link_add(bContext *C, uiBut *from, uiBut *to);
static int ui_do_but_EXIT(bContext *C, uiBut *but, struct uiHandleButtonData *data, const wmEvent *event);
static bool ui_but_find_select_in_enum__cmp(const uiBut *but_a, const uiBut *but_b);
#ifdef USE_KEYNAV_LIMIT
static void ui_mouse_motion_keynav_init(struct uiKeyNavLock *keynav, const wmEvent *event);
@ -3348,6 +3349,38 @@ static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, cons
button_activate_state(C, but, BUTTON_STATE_EXIT);
return WM_UI_HANDLER_BREAK;
}
else if (ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) {
/* Support alt+wheel on expanded enum rows */
if (but->type == UI_BTYPE_ROW) {
const int direction = (event->type == WHEELDOWNMOUSE) ? -1 : 1;
uiBut *but_select = ui_but_find_select_in_enum(but, direction);
if (but_select) {
uiBut *but_other = (direction == -1) ? but_select->next : but_select->prev;
if (but_other && ui_but_find_select_in_enum__cmp(but, but_other)) {
ARegion *ar = data->region;
data->cancel = true;
button_activate_exit(C, but, data, false, false);
/* Activate the text button. */
button_activate_init(C, ar, but_other, BUTTON_ACTIVATE_OVER);
data = but_other->active;
if (data) {
ui_apply_but(C, but->block, but_other, but_other->active, true);
button_activate_exit(C, but_other, data, false, false);
/* restore active button */
button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
}
else {
/* shouldn't happen */
BLI_assert(0);
}
}
}
return WM_UI_HANDLER_BREAK;
}
}
}
return WM_UI_HANDLER_CONTINUE;
}
@ -6597,6 +6630,45 @@ static bool ui_but_isect_pie_seg(uiBlock *block, uiBut *but)
return false;
}
static bool ui_but_find_select_in_enum__cmp(const uiBut *but_a, const uiBut *but_b)
{
return ((but_a->type == but_b->type) &&
(but_a->alignnr == but_b->alignnr) &&
(but_a->poin == but_b->poin) &&
(but_a->rnapoin.type == but_b->rnapoin.type) &&
(but_a->rnaprop == but_b->rnaprop));
}
/**
* Finds the pressed button in an aligned row (typically an expanded enum).
*
* \param direction Use when there may be multiple buttons pressed.
*/
uiBut *ui_but_find_select_in_enum(uiBut *but, int direction)
{
uiBut *but_iter = but;
uiBut *but_found = NULL;
BLI_assert(ELEM(direction, -1, 1));
while ((but_iter->prev) &&
ui_but_find_select_in_enum__cmp(but_iter->prev, but))
{
but_iter = but_iter->prev;
}
while (but_iter && ui_but_find_select_in_enum__cmp(but_iter, but)) {
if (but_iter->flag & UI_SELECT) {
but_found = but_iter;
if (direction == 1) {
break;
}
}
but_iter = but_iter->next;
}
return but_found;
}
uiBut *ui_but_find_active_in_region(ARegion *ar)
{
uiBlock *block;

View File

@ -616,6 +616,7 @@ extern void ui_but_active_free(const struct bContext *C, uiBut *but);
extern bool ui_but_is_active(struct ARegion *ar) ATTR_WARN_UNUSED_RESULT;
extern int ui_but_menu_direction(uiBut *but);
extern void ui_but_text_password_hide(char password_str[UI_MAX_DRAW_STR], uiBut *but, const bool restore);
extern uiBut *ui_but_find_select_in_enum(uiBut *but, int direction);
extern uiBut *ui_but_find_active_in_region(struct ARegion *ar);
bool ui_but_is_editable(const uiBut *but);
bool ui_but_is_editable_as_text(const uiBut *but);