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:
-rw-r--r--source/blender/editors/interface/interface.c40
-rw-r--r--source/blender/editors/interface/interface_handlers.c28
-rw-r--r--source/blender/editors/interface/interface_intern.h2
-rw-r--r--source/blender/editors/interface/interface_widgets.c7
4 files changed, 75 insertions, 2 deletions
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index e1e16636253..5e17354f3f7 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -767,6 +767,38 @@ uiBut *ui_but_find_new(uiBlock *block_new, const uiBut *but_old)
return but_new;
}
+static bool ui_but_extra_icons_equals_old(const uiButExtraOpIcon *new_extra_icon,
+ const uiButExtraOpIcon *old_extra_icon)
+{
+ return (new_extra_icon->optype_params->optype == old_extra_icon->optype_params->optype) &&
+ (new_extra_icon->icon == old_extra_icon->icon);
+}
+
+static uiButExtraOpIcon *ui_but_extra_icon_find_old(const uiButExtraOpIcon *new_extra_icon,
+ const uiBut *old_but)
+{
+ LISTBASE_FOREACH (uiButExtraOpIcon *, op_icon, &old_but->extra_op_icons) {
+ if (ui_but_extra_icons_equals_old(new_extra_icon, op_icon)) {
+ return op_icon;
+ }
+ }
+ return NULL;
+}
+
+static void ui_but_extra_icons_update_from_old_but(const uiBut *new_but, const uiBut *old_but)
+{
+ /* Specifically for keeping some state info for the active button. */
+ BLI_assert(old_but->active);
+
+ LISTBASE_FOREACH (uiButExtraOpIcon *, new_extra_icon, &new_but->extra_op_icons) {
+ uiButExtraOpIcon *old_extra_icon = ui_but_extra_icon_find_old(new_extra_icon, old_but);
+ /* Keep the highlighting state, and let handling update it later. */
+ if (old_extra_icon) {
+ new_extra_icon->highlighted = old_extra_icon->highlighted;
+ }
+ }
+}
+
/**
* \return true when \a but_p is set (only done for active buttons).
*/
@@ -854,6 +886,7 @@ static bool ui_but_update_from_old_block(const bContext *C,
oldbut->flag = (oldbut->flag & ~flag_copy) | (but->flag & flag_copy);
oldbut->drawflag = (oldbut->drawflag & ~drawflag_copy) | (but->drawflag & drawflag_copy);
+ ui_but_extra_icons_update_from_old_but(but, oldbut);
SWAP(ListBase, but->extra_op_icons, oldbut->extra_op_icons);
if (oldbut->type == UI_BTYPE_SEARCH_MENU) {
@@ -1605,6 +1638,7 @@ static PointerRNA *ui_but_extra_operator_icon_add_ptr(uiBut *but,
WM_operator_properties_create_ptr(extra_op_icon->optype_params->opptr,
extra_op_icon->optype_params->optype);
extra_op_icon->optype_params->opcontext = opcontext;
+ extra_op_icon->highlighted = false;
BLI_addtail(&but->extra_op_icons, extra_op_icon);
@@ -1810,6 +1844,11 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_x
BLI_assert(block->active);
+ /* Extend button data. This needs to be done before the block updating. */
+ LISTBASE_FOREACH (uiBut *, but, &block->buttons) {
+ ui_but_predefined_extra_operator_icons_add(but);
+ }
+
UI_block_update_from_old(C, block);
/* inherit flags from 'old' buttons that was drawn here previous, based
@@ -1841,7 +1880,6 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2], int r_x
if (UI_but_is_decorator(but)) {
ui_but_anim_decorate_update_from_flag((uiButDecorator *)but);
}
- ui_but_predefined_extra_operator_icons_add(but);
#ifndef NDEBUG
ui_but_validate(but);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index eb0d18956d9..a5e275c27b5 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -4194,6 +4194,31 @@ static bool ui_do_but_extra_operator_icon(bContext *C,
return false;
}
+static void ui_do_but_extra_operator_icons_mousemove(uiBut *but,
+ uiHandleButtonData *data,
+ const wmEvent *event)
+{
+ uiButExtraOpIcon *old_highlighted = NULL;
+
+ /* Unset highlighting of all first. */
+ LISTBASE_FOREACH (uiButExtraOpIcon *, op_icon, &but->extra_op_icons) {
+ if (op_icon->highlighted) {
+ old_highlighted = op_icon;
+ }
+ op_icon->highlighted = false;
+ }
+
+ uiButExtraOpIcon *hovered = ui_but_extra_operator_icon_mouse_over_get(but, data, event);
+
+ if (hovered) {
+ hovered->highlighted = true;
+ }
+
+ if (old_highlighted != hovered) {
+ ED_region_tag_redraw_no_rebuild(data->region);
+ }
+}
+
#ifdef USE_DRAG_TOGGLE
/* Shared by any button that supports drag-toggle. */
static bool ui_do_but_ANY_drag_toggle(
@@ -8709,6 +8734,9 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
button_tooltip_timer_reset(C, but);
}
+ /* Update extra icons states. */
+ ui_do_but_extra_operator_icons_mousemove(but, data, event);
+
break;
}
case TIMER: {
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index d62b8a0258a..c233bebd88b 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -375,6 +375,8 @@ typedef struct uiButExtraOpIcon {
BIFIconID icon;
struct wmOperatorCallParams *optype_params;
+
+ bool highlighted;
} uiButExtraOpIcon;
typedef struct ColorPicker {
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index c7840aae07a..3d103190a0d 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -2248,10 +2248,15 @@ static void widget_draw_extra_icons(const uiWidgetColors *wcol,
/* inverse order, from right to left. */
LISTBASE_FOREACH_BACKWARD (uiButExtraOpIcon *, op_icon, &but->extra_op_icons) {
rcti temp = *rect;
+ float alpha_this = alpha;
temp.xmin = temp.xmax - (BLI_rcti_size_y(rect) * 1.08f);
- widget_draw_icon(but, op_icon->icon, alpha, &temp, wcol->text);
+ if (!op_icon->highlighted) {
+ alpha_this *= 0.75f;
+ }
+
+ widget_draw_icon(but, op_icon->icon, alpha_this, &temp, wcol->text);
rect->xmax -= ICON_SIZE_FROM_BUTRECT(rect);
}