Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-03-27 13:39:44 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-03-27 16:26:00 +0300
commit2d34420648e5feacf1237abc975f8ff2a0c2a907 (patch)
tree1a59f1e4afa3d84e6b7899f9501ad5a346054571 /source/blender/editors/interface
parente3b83e2921922a45db5a33c739e1d993452944d0 (diff)
UI: support an 'active default' button for pop-ups
Use this for the save confirmation dialog so it has a default action when pressing enter which draws with a highlight so it's clear what the default action is (the dialog was just closing before). Resolves T57686
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r--source/blender/editors/interface/interface_handlers.c9
-rw-r--r--source/blender/editors/interface/interface_intern.h1
-rw-r--r--source/blender/editors/interface/interface_layout.c15
-rw-r--r--source/blender/editors/interface/interface_query.c15
-rw-r--r--source/blender/editors/interface/interface_widgets.c31
5 files changed, 59 insertions, 12 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index d1294dcfed2..c388ed40851 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -9241,9 +9241,16 @@ static int ui_handle_menu_event(
menu->menuretval = UI_RETURN_CANCEL;
}
else if (ELEM(event->type, RETKEY, PADENTER) && event->val == KM_PRESS) {
+ uiBut *but_active = ui_region_find_first_but_test_flag(ar, UI_BUT_ACTIVE_DEFAULT, UI_HIDDEN);
+ if (but_active != NULL) {
+ ui_handle_button_activate(C, ar, but_active, BUTTON_ACTIVATE);
+ /* Get again below just incase it's disabled for eg. */
+ }
+ but_active = ui_region_find_active_but(ar);
+
/* enter will always close this block, we let the event
* get handled by the button if it is activated, otherwise we cancel */
- if (!ui_region_find_active_but(ar)) {
+ if (but_active == NULL) {
menu->menuretval = UI_RETURN_CANCEL | UI_RETURN_POPUP_OK;
}
}
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 794c6c2568a..3580b2ff3a5 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -846,6 +846,7 @@ bool ui_block_is_popover(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
bool ui_block_is_pie_menu(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
bool ui_block_is_popup_any(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
+uiBut *ui_region_find_first_but_test_flag(struct ARegion *ar, int flag_include, int flag_exclude);
uiBut *ui_region_find_active_but(struct ARegion *ar) ATTR_WARN_UNUSED_RESULT;
bool ui_region_contains_point_px(
const struct ARegion *ar, int x, int y) ATTR_WARN_UNUSED_RESULT;
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index e2933f75440..6c4389aabd9 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -160,6 +160,7 @@ struct uiLayout {
short space;
bool align;
bool active;
+ bool active_default;
bool activate_init;
bool enabled;
bool redalert;
@@ -1060,6 +1061,10 @@ static uiBut *uiItemFullO_ptr_ex(
UI_but_flag_enable(but, UI_BUT_REDALERT);
}
+ if (layout->active_default) {
+ UI_but_flag_enable(but, UI_BUT_ACTIVE_DEFAULT);
+ }
+
/* assign properties */
if (properties || r_opptr) {
PointerRNA *opptr = UI_but_operator_ptr_get(but);
@@ -4150,6 +4155,11 @@ void uiLayoutSetActive(uiLayout *layout, bool active)
layout->active = active;
}
+void uiLayoutSetActiveDefault(uiLayout *layout, bool active_default)
+{
+ layout->active_default = active_default;
+}
+
void uiLayoutSetActivateInit(uiLayout *layout, bool activate_init)
{
layout->activate_init = activate_init;
@@ -4225,6 +4235,11 @@ bool uiLayoutGetActive(uiLayout *layout)
return layout->active;
}
+bool uiLayoutGetActiveDefault(uiLayout *layout)
+{
+ return layout->active_default;
+}
+
bool uiLayoutGetActivateInit(uiLayout *layout)
{
return layout->activate_init;
diff --git a/source/blender/editors/interface/interface_query.c b/source/blender/editors/interface/interface_query.c
index 8300ee71c50..1954e20ab8b 100644
--- a/source/blender/editors/interface/interface_query.c
+++ b/source/blender/editors/interface/interface_query.c
@@ -469,6 +469,21 @@ uiBut *ui_region_find_active_but(ARegion *ar)
return NULL;
}
+uiBut *ui_region_find_first_but_test_flag(ARegion *ar, int flag_include, int flag_exclude)
+{
+ for (uiBlock *block = ar->uiblocks.first; block; block = block->next) {
+ for (uiBut *but = block->buttons.first; but; but = but->next) {
+ if (((but->flag & flag_include) == flag_include) &&
+ ((but->flag & flag_exclude) == 0))
+ {
+ return but;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index be571de4c4e..6528faca265 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -4563,23 +4563,32 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
GPU_blend(true);
}
+ bool show_semi_highlight = false;
+
#ifdef USE_UI_POPOVER_ONCE
if (but->block->flag & UI_BLOCK_POPOVER_ONCE) {
if ((state & UI_ACTIVE) && ui_but_is_popover_once_compat(but)) {
- uiWidgetType wt_back = *wt;
- uiWidgetType *wt_temp = widget_type(UI_WTYPE_MENU_ITEM);
- wt_temp->state(wt_temp, state, drawflag);
- copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel);
- wt->wcol.inner[3] = 128;
- wt->wcol.roundness = 0.5f;
- ui_draw_roundbox(
- &rect_orig,
- 0.25f * min_ff(BLI_rcti_size_x(&rect_orig), BLI_rcti_size_y(&rect_orig)),
- &wt_temp->wcol);
- *wt = wt_back;
+ show_semi_highlight = true;
}
}
#endif
+ if (but->flag & UI_BUT_ACTIVE_DEFAULT) {
+ show_semi_highlight = true;
+ }
+
+ if (show_semi_highlight) {
+ uiWidgetType wt_back = *wt;
+ uiWidgetType *wt_temp = widget_type(UI_WTYPE_MENU_ITEM);
+ wt_temp->state(wt_temp, state, drawflag);
+ copy_v4_v4_char(wt->wcol.inner, wt->wcol.inner_sel);
+ wt->wcol.inner[3] = 128;
+ wt->wcol.roundness = 0.5f;
+ ui_draw_roundbox(
+ &rect_orig,
+ 0.25f * min_ff(BLI_rcti_size_x(&rect_orig), BLI_rcti_size_y(&rect_orig)),
+ &wt_temp->wcol);
+ *wt = wt_back;
+ }
wt->text(fstyle, &wt->wcol, but, rect);
if (disabled) {