Blender V4.3
wm_tooltip.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#include "MEM_guardedalloc.h"
12
13#include "BLI_math_vector.h"
14#include "BLI_time.h"
15#include "BLI_utildefines.h"
16
17#include "BKE_context.hh"
18
19#include "UI_interface.hh"
20
21#include "WM_api.hh"
22#include "WM_types.hh"
23
29
31 bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
32{
34
36 if (screen->tool_tip == nullptr) {
37 screen->tool_tip = static_cast<wmTooltipState *>(
38 MEM_callocN(sizeof(*screen->tool_tip), __func__));
39 }
40 screen->tool_tip->area_from = area;
41 screen->tool_tip->region_from = region;
42 screen->tool_tip->init = init;
43 WM_tooltip_init(C, win);
44}
45
47 bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init, double delay)
48{
50
53 if (screen->tool_tip == nullptr) {
54 screen->tool_tip = static_cast<wmTooltipState *>(
55 MEM_callocN(sizeof(*screen->tool_tip), __func__));
56 }
57 screen->tool_tip->area_from = area;
58 screen->tool_tip->region_from = region;
59 screen->tool_tip->timer = WM_event_timer_add(wm, win, TIMER, delay);
60 screen->tool_tip->init = init;
61}
62
64 bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
65{
66 WM_tooltip_timer_init_ex(C, win, area, region, init, UI_TOOLTIP_DELAY);
67}
68
70{
73 if (screen->tool_tip != nullptr) {
74 if (screen->tool_tip->timer != nullptr) {
75 WM_event_timer_remove(wm, win, screen->tool_tip->timer);
76 screen->tool_tip->timer = nullptr;
77 }
78 }
79}
80
82{
85 if (screen->tool_tip != nullptr) {
86 if (screen->tool_tip->region) {
87 UI_tooltip_free(C, screen, screen->tool_tip->region);
88 screen->tool_tip->region = nullptr;
90 }
91 MEM_freeN(screen->tool_tip);
92 screen->tool_tip = nullptr;
93 }
94}
95
97{
100 if (screen->tool_tip->region) {
101 UI_tooltip_free(C, screen, screen->tool_tip->region);
102 screen->tool_tip->region = nullptr;
103 }
104 const int pass_prev = screen->tool_tip->pass;
105 double pass_delay = 0.0;
106
107 {
108 ScrArea *area_prev = CTX_wm_area(C);
109 ARegion *region_prev = CTX_wm_region(C);
110 CTX_wm_area_set(C, screen->tool_tip->area_from);
111 CTX_wm_region_set(C, screen->tool_tip->region_from);
112 screen->tool_tip->region = screen->tool_tip->init(C,
113 screen->tool_tip->region_from,
114 &screen->tool_tip->pass,
115 &pass_delay,
116 &screen->tool_tip->exit_on_event);
117 CTX_wm_area_set(C, area_prev);
118 CTX_wm_region_set(C, region_prev);
119 }
120
121 copy_v2_v2_int(screen->tool_tip->event_xy, win->eventstate->xy);
122 if (pass_prev != screen->tool_tip->pass) {
123 /* The pass changed, add timer for next pass. */
125 screen->tool_tip->timer = WM_event_timer_add(wm, win, TIMER, pass_delay);
126 }
127 if (screen->tool_tip->region == nullptr) {
128 WM_tooltip_clear(C, win);
129 }
130}
131
133{
136 if (screen->tool_tip != nullptr) {
137 if (screen->tool_tip->region) {
138 UI_tooltip_free(C, screen, screen->tool_tip->region);
139 screen->tool_tip->region = nullptr;
140 }
141 WM_tooltip_init(C, win);
142 }
143}
ScrArea * CTX_wm_area(const bContext *C)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
Platform independent time functions.
double BLI_time_now_seconds(void)
Definition time.c:65
Read Guarded memory(de)allocation.
void UI_tooltip_free(bContext *C, bScreen *screen, ARegion *region)
#define UI_TOOLTIP_DELAY
ARegion *(*)(bContext *C, ARegion *region, int *pass, double *r_pass_delay, bool *r_exit_on_event) wmTooltipInitFn
Definition WM_api.hh:1914
void init()
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
int xy[2]
Definition WM_types.hh:726
ScrArea * area_from
Definition WM_types.hh:1379
struct wmEvent * eventstate
@ TIMER
void WM_tooltip_timer_clear(bContext *C, wmWindow *win)
Definition wm_tooltip.cc:69
void WM_tooltip_clear(bContext *C, wmWindow *win)
Definition wm_tooltip.cc:81
void WM_tooltip_init(bContext *C, wmWindow *win)
Definition wm_tooltip.cc:96
void WM_tooltip_timer_init_ex(bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init, double delay)
Definition wm_tooltip.cc:46
void WM_tooltip_immediate_init(bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
Definition wm_tooltip.cc:30
void WM_tooltip_refresh(bContext *C, wmWindow *win)
void WM_tooltip_timer_init(bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
Definition wm_tooltip.cc:63
double WM_tooltip_time_closed()
Definition wm_tooltip.cc:25
static double g_tooltip_time_closed
Definition wm_tooltip.cc:24
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const int event_type, const double time_step)
bScreen * WM_window_get_active_screen(const wmWindow *win)