From d4bdf2192964f786520c774d1a2ee44617302bc1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 29 Mar 2022 16:11:44 +1100 Subject: Fix T96701: RMB select fails to show gizmo on mouse button release Regression in [0] which removed a special check when tweak events ended. Add a similar check for drag events that runs drag is disabled in the main event handling loop. [0]: 4986f718482b061082936f1f6aa13929741093a2 --- .../windowmanager/gizmo/intern/wm_gizmo_group.c | 7 ++++++- .../blender/windowmanager/intern/wm_event_system.c | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c index 00615d9d662..d7b54129caa 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c @@ -1130,7 +1130,12 @@ void WM_gizmo_group_refresh(const bContext *C, wmGizmoGroup *gzgroup) const wmGizmoGroupType *gzgt = gzgroup->type; if (gzgt->flag & WM_GIZMOGROUPTYPE_DELAY_REFRESH_FOR_TWEAK) { wmGizmoMap *gzmap = gzgroup->parent_gzmap; - wmGizmo *gz = wm_gizmomap_highlight_get(gzmap); + wmGizmo *gz = NULL; + /* Without the check for refresh, any highlighted gizmo will prevent hiding + * when selecting with RMB when the cursor happens to be over a gizmo. */ + if ((gzgroup->init_flag & WM_GIZMOGROUP_INIT_REFRESH) == 0) { + gz = wm_gizmomap_highlight_get(gzmap); + } if (!gz || gz->parent_gzgroup != gzgroup) { wmWindow *win = CTX_wm_window(C); ARegion *region = CTX_wm_region(C); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 60ae4eccbbe..84c40c42adc 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1297,6 +1297,23 @@ static wmOperator *wm_operator_create(wmWindowManager *wm, return op; } +/** + * This isn't very nice but needed to redraw gizmos which are hidden while tweaking, + * See #WM_GIZMOGROUPTYPE_DELAY_REFRESH_FOR_TWEAK for details. + */ +static void wm_region_tag_draw_on_gizmo_delay_refresh_for_tweak(wmWindow *win, bScreen *screen) +{ + ED_screen_areas_iter (win, screen, area) { + LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { + if (region->gizmo_map != NULL) { + if (WM_gizmomap_tag_delay_refresh_for_tweak_check(region->gizmo_map)) { + ED_region_tag_redraw(region); + } + } + } + } +} + static void wm_region_mouse_co(bContext *C, wmEvent *event) { ARegion *region = CTX_wm_region(C); @@ -3711,6 +3728,7 @@ void wm_event_do_handlers(bContext *C) event->flag |= WM_EVENT_FORCE_DRAG_THRESHOLD; } } + const bool event_queue_check_drag_prev = win->event_queue_check_drag; /* Active screen might change during handlers, update pointer. */ screen = WM_window_get_active_screen(win); @@ -3870,6 +3888,10 @@ void wm_event_do_handlers(bContext *C) win->event_queue_check_drag_handled = false; } + if (event_queue_check_drag_prev && (win->event_queue_check_drag == false)) { + wm_region_tag_draw_on_gizmo_delay_refresh_for_tweak(win, screen); + } + /* Update previous mouse position for following events to use. */ copy_v2_v2_int(win->eventstate->prev_xy, event->xy); -- cgit v1.2.3