Fix T76635: Clicking the text button X in a pop-up doesn't clear
In this case giving `CTX_wm_menu()` priority over `CTX_wm_region()` is all that's needed and makes sense (since we want exactly the hovered button, not some other active button in the region/menu hierarchy). The situation with pop-ups is still tricky, see T73565. But as a first step it's probably good to let functions be more explicit about what they want when querying UI context. So I added a variation of a UI-context function for cases like this.
This commit is contained in:
@@ -2411,6 +2411,7 @@ bool UI_context_copy_to_selected_list(struct bContext *C,
|
||||
|
||||
/* Helpers for Operators */
|
||||
uiBut *UI_context_active_but_get(const struct bContext *C);
|
||||
uiBut *UI_context_active_but_get_respect_menu(const struct bContext *C);
|
||||
uiBut *UI_context_active_but_prop_get(const struct bContext *C,
|
||||
struct PointerRNA *r_ptr,
|
||||
struct PropertyRNA **r_prop,
|
||||
|
||||
@@ -8259,11 +8259,22 @@ static uiBut *ui_context_rna_button_active(const bContext *C)
|
||||
return ui_context_button_active(CTX_wm_region(C), ui_context_rna_button_active_test);
|
||||
}
|
||||
|
||||
uiBut *UI_context_active_but_get(const struct bContext *C)
|
||||
uiBut *UI_context_active_but_get(const bContext *C)
|
||||
{
|
||||
return ui_context_button_active(CTX_wm_region(C), NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Version of #UI_context_active_get() that uses the result of #CTX_wm_menu()
|
||||
* if set. Does not traverse into parent menus, which may be wanted in some
|
||||
* cases.
|
||||
*/
|
||||
uiBut *UI_context_active_but_get_respect_menu(const bContext *C)
|
||||
{
|
||||
ARegion *ar_menu = CTX_wm_menu(C);
|
||||
return ui_context_button_active(ar_menu ? ar_menu : CTX_wm_region(C), NULL);
|
||||
}
|
||||
|
||||
uiBut *UI_region_active_but_get(ARegion *region)
|
||||
{
|
||||
return ui_context_button_active(region, NULL);
|
||||
|
||||
@@ -1679,7 +1679,7 @@ static void UI_OT_button_execute(wmOperatorType *ot)
|
||||
|
||||
static int button_string_clear_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
uiBut *but = UI_context_active_but_get(C);
|
||||
uiBut *but = UI_context_active_but_get_respect_menu(C);
|
||||
|
||||
if (but) {
|
||||
ui_but_active_string_clear_and_exit(C, but);
|
||||
|
||||
Reference in New Issue
Block a user