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:
authorCampbell Barton <ideasman42@gmail.com>2021-04-19 10:18:59 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-04-19 10:18:59 +0300
commit6dffdb02fa2a416cc8ffb49d8b842704aadad3a9 (patch)
tree1e5f618cac424d1a1bb13af000afafef6aef4319 /source/blender/windowmanager/intern/wm_event_system.c
parent3b4b231be52608a366af67e7effdd996cfbb3d17 (diff)
Fix drag event leaving the gizmo not under the cursor highlighted
Prevent drag events from changing the highlighted gizmo unless the drag event activates the gizmo. This resolves a glitch where testing a drag event would highlight at the point the drag was initiated even when the event was not handled.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 0764dce7158..0d1f4cc4830 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2599,6 +2599,10 @@ static int wm_handlers_do_gizmo_handler(bContext *C,
* Get the highlight again in case the user dragged off the gizmo. */
const bool is_event_drag = ISTWEAK(event->type) || (event->val == KM_CLICK_DRAG);
const bool is_event_modifier = ISKEYMODIFIER(event->type);
+ /* Only keep the highlight if the gizmo becomes modal as result of event handling.
+ * Without this check, even un-handled drag events will set the highlight if the drag
+ * was initiated over a gizmo. */
+ const bool restore_highlight_unless_activated = is_event_drag;
int action = WM_HANDLER_CONTINUE;
ScrArea *area = CTX_wm_area(C);
@@ -2613,8 +2617,10 @@ static int wm_handlers_do_gizmo_handler(bContext *C,
if (region->type->clip_gizmo_events_by_ui) {
if (UI_region_block_find_mouse_over(region, &event->x, true)) {
if (gz != NULL && event->type != EVT_GIZMO_UPDATE) {
- WM_tooltip_clear(C, CTX_wm_window(C));
- wm_gizmomap_highlight_set(gzmap, C, NULL, 0);
+ if (restore_highlight_unless_activated == false) {
+ WM_tooltip_clear(C, CTX_wm_window(C));
+ wm_gizmomap_highlight_set(gzmap, C, NULL, 0);
+ }
}
return action;
}
@@ -2652,6 +2658,14 @@ static int wm_handlers_do_gizmo_handler(bContext *C,
handle_keymap = true;
}
+ /* There is no need to handle this event when the key-map isn't being applied
+ * since any change to the highlight will be restored to the previous value. */
+ if (restore_highlight_unless_activated) {
+ if ((handle_highlight == true) && (handle_keymap == false)) {
+ return action;
+ }
+ }
+
if (handle_highlight) {
int part = -1;
gz = wm_gizmomap_highlight_find(gzmap, C, event, &part);
@@ -2737,6 +2751,16 @@ static int wm_handlers_do_gizmo_handler(bContext *C,
}
}
+ if (handle_highlight) {
+ if (restore_highlight_unless_activated) {
+ /* Check handling the key-map didn't activate a gizmo. */
+ wmGizmo *gz_modal = wm_gizmomap_modal_get(gzmap);
+ if (!(gz_modal && (gz_modal != prev.gz_modal))) {
+ wm_gizmomap_highlight_set(gzmap, C, prev.gz, prev.part);
+ }
+ }
+ }
+
if (is_event_handle_all) {
if (action == WM_HANDLER_CONTINUE) {
action |= WM_HANDLER_BREAK | WM_HANDLER_MODAL;