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:
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_types.h2
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c7
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c28
-rw-r--r--source/blender/windowmanager/intern/wm_tooltip.c2
4 files changed, 32 insertions, 7 deletions
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index c725b9f51c9..51c75430271 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -787,6 +787,8 @@ typedef struct wmTooltipState {
bool *r_exit_on_event);
/** Exit on any event, not needed for buttons since their highlight state is used. */
bool exit_on_event;
+ /** Cursor location at the point of tooltip creation. */
+ int event_xy[2];
/** Pass, use when we want multiple tips, count down to zero. */
int pass;
} wmTooltipState;
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index 73fae5fd46a..6915ea91c8e 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -1144,10 +1144,15 @@ struct ARegion *WM_gizmomap_tooltip_init(struct bContext *C,
bool *r_exit_on_event)
{
wmGizmoMap *gzmap = ar->gizmo_map;
- *r_exit_on_event = true;
+ *r_exit_on_event = false;
if (gzmap) {
wmGizmo *gz = gzmap->gzmap_context.highlight;
if (gz) {
+ wmGizmoGroup *gzgroup = gz->parent_gzgroup;
+ if ((gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) != 0) {
+ /* On screen area of 3D gizmos may be large, exit on cursor motion. */
+ *r_exit_on_event = true;
+ }
return UI_tooltip_create_from_gizmo(C, gz);
}
}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 632b0131191..ea76fba46b1 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2784,11 +2784,25 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
}
if (handle_highlight) {
- int part;
+ struct {
+ wmGizmo *gz;
+ int part;
+ } prev = {
+ .gz = gz,
+ .part = gz ? gz->highlight_part : 0,
+ };
+ int part = -1;
gz = wm_gizmomap_highlight_find(gzmap, C, event, &part);
- if (wm_gizmomap_highlight_set(gzmap, C, gz, part) && gz != NULL) {
- if (U.flag & USER_TOOLTIPS) {
- WM_tooltip_timer_init(C, CTX_wm_window(C), region, WM_gizmomap_tooltip_init);
+
+ if ((gz == NULL) || (prev.gz != gz) || (prev.part != part)) {
+ WM_tooltip_clear(C, CTX_wm_window(C));
+ }
+
+ if (wm_gizmomap_highlight_set(gzmap, C, gz, part)) {
+ if (gz != NULL) {
+ if (U.flag & USER_TOOLTIPS) {
+ WM_tooltip_timer_init(C, CTX_wm_window(C), region, WM_gizmomap_tooltip_init);
+ }
}
}
}
@@ -3278,8 +3292,10 @@ void wm_event_do_handlers(bContext *C)
/* Clear tool-tip on mouse move. */
if (screen->tool_tip && screen->tool_tip->exit_on_event) {
- if (ISMOUSE(event->type)) {
- WM_tooltip_clear(C, win);
+ if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
+ if (len_manhattan_v2v2_int(screen->tool_tip->event_xy, &event->x) > U.move_threshold) {
+ WM_tooltip_clear(C, win);
+ }
}
}
diff --git a/source/blender/windowmanager/intern/wm_tooltip.c b/source/blender/windowmanager/intern/wm_tooltip.c
index fb56b2ef23f..3a219d7a573 100644
--- a/source/blender/windowmanager/intern/wm_tooltip.c
+++ b/source/blender/windowmanager/intern/wm_tooltip.c
@@ -22,6 +22,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math_vector.h"
#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -116,6 +117,7 @@ void WM_tooltip_init(bContext *C, wmWindow *win)
&screen->tool_tip->pass,
&pass_delay,
&screen->tool_tip->exit_on_event);
+ copy_v2_v2_int(screen->tool_tip->event_xy, &win->eventstate->x);
if (pass_prev != screen->tool_tip->pass) {
/* The pass changed, add timer for next pass. */
wmWindowManager *wm = CTX_wm_manager(C);