UI: delay tool label tip display
[blender.git] / source / blender / windowmanager / intern / wm_tooltip.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/windowmanager/intern/wm_tooltip.c
22  *  \ingroup wm
23  *
24  * Manages a per-window tool-tip.
25  */
26
27 #include "MEM_guardedalloc.h"
28
29 #include "BLI_utildefines.h"
30
31 #include "BKE_context.h"
32
33 #include "ED_screen.h"
34
35 #include "UI_interface.h"
36
37 #include "WM_api.h"
38 #include "WM_types.h"
39
40 void WM_tooltip_immediate_init(
41         bContext *C, wmWindow *win, ARegion *ar,
42         wmTooltipInitFn init)
43 {
44         WM_tooltip_timer_clear(C, win);
45
46         bScreen *screen = WM_window_get_active_screen(win);
47         if (screen->tool_tip == NULL) {
48                 screen->tool_tip = MEM_callocN(sizeof(*screen->tool_tip), __func__);
49         }
50         screen->tool_tip->region_from = ar;
51         screen->tool_tip->init = init;
52         WM_tooltip_init(C, win);
53 }
54
55 void WM_tooltip_timer_init_ex(
56         bContext *C, wmWindow *win, ARegion *ar,
57         wmTooltipInitFn init, double delay)
58 {
59         WM_tooltip_timer_clear(C, win);
60
61         bScreen *screen = WM_window_get_active_screen(win);
62         wmWindowManager *wm = CTX_wm_manager(C);
63         if (screen->tool_tip == NULL) {
64                 screen->tool_tip = MEM_callocN(sizeof(*screen->tool_tip), __func__);
65         }
66         screen->tool_tip->region_from = ar;
67         screen->tool_tip->timer = WM_event_add_timer(wm, win, TIMER, delay);
68         screen->tool_tip->init = init;
69 }
70
71 void WM_tooltip_timer_init(
72         bContext *C, wmWindow *win, ARegion *ar,
73         wmTooltipInitFn init)
74 {
75         WM_tooltip_timer_init_ex(C, win, ar, init, UI_TOOLTIP_DELAY);
76 }
77
78 void WM_tooltip_timer_clear(bContext *C, wmWindow *win)
79 {
80         wmWindowManager *wm = CTX_wm_manager(C);
81         bScreen *screen = WM_window_get_active_screen(win);
82         if (screen->tool_tip != NULL) {
83                 if (screen->tool_tip->timer != NULL) {
84                         WM_event_remove_timer(wm, win, screen->tool_tip->timer);
85                         screen->tool_tip->timer = NULL;
86                 }
87         }
88 }
89
90 void WM_tooltip_clear(bContext *C, wmWindow *win)
91 {
92         WM_tooltip_timer_clear(C, win);
93         bScreen *screen = WM_window_get_active_screen(win);
94         if (screen->tool_tip != NULL) {
95                 if (screen->tool_tip->region) {
96                         UI_tooltip_free(C, screen, screen->tool_tip->region);
97                         screen->tool_tip->region = NULL;
98                 }
99                 MEM_freeN(screen->tool_tip);
100                 screen->tool_tip = NULL;
101         }
102 }
103
104 void WM_tooltip_init(bContext *C, wmWindow *win)
105 {
106         WM_tooltip_timer_clear(C, win);
107         bScreen *screen = WM_window_get_active_screen(win);
108         if (screen->tool_tip->region) {
109                 UI_tooltip_free(C, screen, screen->tool_tip->region);
110                 screen->tool_tip->region = NULL;
111         }
112         const int pass_prev = screen->tool_tip->pass;
113         double pass_delay = 0.0;
114         screen->tool_tip->region = screen->tool_tip->init(
115                 C, screen->tool_tip->region_from,
116                 &screen->tool_tip->pass, &pass_delay, &screen->tool_tip->exit_on_event);
117         if (pass_prev != screen->tool_tip->pass) {
118                 /* The pass changed, add timer for next pass. */
119                 wmWindowManager *wm = CTX_wm_manager(C);
120                 screen->tool_tip->timer = WM_event_add_timer(wm, win, TIMER, pass_delay);
121         }
122         if (screen->tool_tip->region == NULL) {
123                 WM_tooltip_clear(C, win);
124         }
125 }
126
127 void WM_tooltip_refresh(bContext *C, wmWindow *win)
128 {
129         WM_tooltip_timer_clear(C, win);
130         bScreen *screen = WM_window_get_active_screen(win);
131         if (screen->tool_tip != NULL) {
132                 if (screen->tool_tip->region) {
133                         UI_tooltip_free(C, screen, screen->tool_tip->region);
134                         screen->tool_tip->region = NULL;
135                 }
136                 WM_tooltip_init(C, win);
137         }
138 }