[Bf-blender-cvs] [d4bdf219296] master: Fix T96701: RMB select fails to show gizmo on mouse button release

Campbell Barton noreply at git.blender.org
Tue Mar 29 07:57:26 CEST 2022


Commit: d4bdf2192964f786520c774d1a2ee44617302bc1
Author: Campbell Barton
Date:   Tue Mar 29 16:11:44 2022 +1100
Branches: master
https://developer.blender.org/rBd4bdf2192964f786520c774d1a2ee44617302bc1

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

===================================================================

M	source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
M	source/blender/windowmanager/intern/wm_event_system.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list