Fix T97518: All buttons with eyedropper highlight if one is hovered
Issue is that the operator acts on the active button, and also uses that in the poll. So the actually active button would affect the poll of a different button. For the superimposed icons we need to be able to execute these polls properly for non-active buttons. This enables temporarily overriding the active button for lookups via context. While a bit of a hack it makes sense conceptually. Reviewed By: Campbell Barton Maniphest Tasks: T97518 Differential Revision: https://developer.blender.org/D14880
This commit is contained in:
parent
6f3d155293
commit
4680331749
Notes:
blender-bot
2023-02-14 09:33:11 +01:00
Referenced by commit8e717ce55a
, Fix crash when displaying some button tooltips Referenced by commit908e6c7c4d
, Fix crash when displaying some button tooltips Referenced by issue #97518, Regression: All properties with eyedropper in same panel get bright when any of them is hovered
|
@ -184,26 +184,26 @@ enum {
|
|||
|
||||
/** #uiBut.flag general state flags. */
|
||||
enum {
|
||||
/* WARNING: the first 7 flags are internal (see #UI_SELECT definition). */
|
||||
UI_BUT_ICON_SUBMENU = 1 << 7,
|
||||
UI_BUT_ICON_PREVIEW = 1 << 8,
|
||||
/* WARNING: the first 8 flags are internal (see #UI_SELECT definition). */
|
||||
UI_BUT_ICON_SUBMENU = 1 << 8,
|
||||
UI_BUT_ICON_PREVIEW = 1 << 9,
|
||||
|
||||
UI_BUT_NODE_LINK = 1 << 9,
|
||||
UI_BUT_NODE_ACTIVE = 1 << 10,
|
||||
UI_BUT_DRAG_LOCK = 1 << 11,
|
||||
UI_BUT_NODE_LINK = 1 << 10,
|
||||
UI_BUT_NODE_ACTIVE = 1 << 11,
|
||||
UI_BUT_DRAG_LOCK = 1 << 12,
|
||||
/** Grayed out and un-editable. */
|
||||
UI_BUT_DISABLED = 1 << 12,
|
||||
UI_BUT_DISABLED = 1 << 13,
|
||||
|
||||
UI_BUT_ANIMATED = 1 << 13,
|
||||
UI_BUT_ANIMATED_KEY = 1 << 14,
|
||||
UI_BUT_DRIVEN = 1 << 15,
|
||||
UI_BUT_REDALERT = 1 << 16,
|
||||
UI_BUT_ANIMATED = 1 << 14,
|
||||
UI_BUT_ANIMATED_KEY = 1 << 15,
|
||||
UI_BUT_DRIVEN = 1 << 16,
|
||||
UI_BUT_REDALERT = 1 << 17,
|
||||
/** Grayed out but still editable. */
|
||||
UI_BUT_INACTIVE = 1 << 17,
|
||||
UI_BUT_LAST_ACTIVE = 1 << 18,
|
||||
UI_BUT_UNDO = 1 << 19,
|
||||
UI_BUT_IMMEDIATE = 1 << 20,
|
||||
UI_BUT_NO_UTF8 = 1 << 21,
|
||||
UI_BUT_INACTIVE = 1 << 18,
|
||||
UI_BUT_LAST_ACTIVE = 1 << 19,
|
||||
UI_BUT_UNDO = 1 << 20,
|
||||
UI_BUT_IMMEDIATE = 1 << 21,
|
||||
UI_BUT_NO_UTF8 = 1 << 22,
|
||||
|
||||
/** For popups, pressing return activates this button, overriding the highlighted button.
|
||||
* For non-popups this is just used as a display hint for the user to let them
|
||||
|
|
|
@ -1861,15 +1861,32 @@ bool ui_but_context_poll_operator_ex(bContext *C,
|
|||
const wmOperatorCallParams *optype_params)
|
||||
{
|
||||
bool result;
|
||||
int old_but_flag = 0;
|
||||
|
||||
if (but && but->context) {
|
||||
CTX_store_set(C, but->context);
|
||||
if (but) {
|
||||
old_but_flag = but->flag;
|
||||
|
||||
/* Temporarily make this button override the active one, in case the poll acts on the active
|
||||
* button. */
|
||||
const_cast<uiBut *>(but)->flag |= UI_BUT_ACTIVE_OVERRIDE;
|
||||
|
||||
if (but->context) {
|
||||
CTX_store_set(C, but->context);
|
||||
}
|
||||
}
|
||||
|
||||
result = WM_operator_poll_context(C, optype_params->optype, optype_params->opcontext);
|
||||
|
||||
if (but && but->context) {
|
||||
CTX_store_set(C, nullptr);
|
||||
if (but) {
|
||||
BLI_assert_msg((but->flag & ~UI_BUT_ACTIVE_OVERRIDE) ==
|
||||
(old_but_flag & ~UI_BUT_ACTIVE_OVERRIDE),
|
||||
"Operator polls shouldn't change button flags");
|
||||
|
||||
const_cast<uiBut *>(but)->flag = old_but_flag;
|
||||
|
||||
if (but->context) {
|
||||
CTX_store_set(C, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
@ -8717,13 +8717,23 @@ static uiBut *ui_context_button_active(const ARegion *region, bool (*but_check_c
|
|||
/* find active button */
|
||||
LISTBASE_FOREACH (uiBlock *, block, ®ion->uiblocks) {
|
||||
LISTBASE_FOREACH (uiBut *, but, &block->buttons) {
|
||||
if (but->flag & UI_BUT_ACTIVE_OVERRIDE) {
|
||||
activebut = but;
|
||||
break;
|
||||
}
|
||||
if (but->active) {
|
||||
activebut = but;
|
||||
break;
|
||||
}
|
||||
else if (!activebut && (but->flag & UI_BUT_LAST_ACTIVE)) {
|
||||
if (but->flag & UI_BUT_LAST_ACTIVE) {
|
||||
activebut = but;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (activebut) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (activebut && (but_check_cb == NULL || but_check_cb(activebut))) {
|
||||
|
|
|
@ -74,6 +74,12 @@ enum {
|
|||
UI_SELECT_DRAW = (1 << 5),
|
||||
/** Property search filter is active and the button does not match. */
|
||||
UI_SEARCH_FILTER_NO_MATCH = (1 << 6),
|
||||
|
||||
/** Temporarily override the active button for lookups in context, regions, etc. (everything
|
||||
* using #ui_context_button_active()). For example, so that operators normally acting on the
|
||||
* active button can be polled on non-active buttons to (e.g. for disabling). */
|
||||
UI_BUT_ACTIVE_OVERRIDE = (1 << 7),
|
||||
|
||||
/* WARNING: rest of #uiBut.flag in UI_interface.h */
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue