Blender V5.0
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
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_math_vector.h"
14#include "BLI_time.h"
15
16#include "BKE_context.hh"
17
18#include "UI_interface.hh"
19
20#include "WM_api.hh"
21#include "WM_types.hh"
22
28
30 bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
31{
33
35 if (screen->tool_tip == nullptr) {
36 screen->tool_tip = MEM_callocN<wmTooltipState>(__func__);
37 }
38 screen->tool_tip->area_from = area;
39 screen->tool_tip->region_from = region;
40 screen->tool_tip->init = init;
41 WM_tooltip_init(C, win);
42}
43
45 bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init, double delay)
46{
48
51 if (screen->tool_tip == nullptr) {
52 screen->tool_tip = MEM_callocN<wmTooltipState>(__func__);
53 }
54 screen->tool_tip->area_from = area;
55 screen->tool_tip->region_from = region;
56 screen->tool_tip->timer = WM_event_timer_add(wm, win, TIMER, delay);
57 screen->tool_tip->init = init;
58
59 /* Mouse position will be updated when the tooltip is shown, but save now
60 * because we cancel the showing if there is movement before timer expiry. */
62}
63
65 bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
66{
67 WM_tooltip_timer_init_ex(C, win, area, region, init, UI_TOOLTIP_DELAY);
68}
69
71{
74 if (screen->tool_tip != nullptr) {
75 if (screen->tool_tip->timer != nullptr) {
76 WM_event_timer_remove(wm, win, screen->tool_tip->timer);
77 screen->tool_tip->timer = nullptr;
78 }
79 }
80}
81
83{
86 if (screen->tool_tip != nullptr) {
87 if (screen->tool_tip->region) {
88 UI_tooltip_free(C, screen, screen->tool_tip->region);
89 screen->tool_tip->region = nullptr;
91 }
92 MEM_freeN(screen->tool_tip);
93 screen->tool_tip = nullptr;
94 }
95}
96
98{
101 if (screen->tool_tip->region) {
102 UI_tooltip_free(C, screen, screen->tool_tip->region);
103 screen->tool_tip->region = nullptr;
104 }
105 const int pass_prev = screen->tool_tip->pass;
106 double pass_delay = 0.0;
107
108 {
109 ScrArea *area_prev = CTX_wm_area(C);
110 ARegion *region_prev = CTX_wm_region(C);
113 screen->tool_tip->region = screen->tool_tip->init(C,
114 screen->tool_tip->region_from,
115 &screen->tool_tip->pass,
116 &pass_delay,
117 &screen->tool_tip->exit_on_event);
118 CTX_wm_area_set(C, area_prev);
119 CTX_wm_region_set(C, region_prev);
120 }
121
123 if (pass_prev != screen->tool_tip->pass) {
124 /* The pass changed, add timer for next pass. */
126 screen->tool_tip->timer = WM_event_timer_add(wm, win, TIMER, pass_delay);
127 }
128 if (screen->tool_tip->region == nullptr) {
129 WM_tooltip_clear(C, win);
130 }
131}
132
134{
137 if (screen->tool_tip != nullptr) {
138 if (screen->tool_tip->region) {
139 UI_tooltip_free(C, screen, screen->tool_tip->region);
140 screen->tool_tip->region = nullptr;
141 }
142 WM_tooltip_init(C, win);
143 }
144}
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.cc:113
Read Guarded memory(de)allocation.
#define C
Definition RandGen.cpp:29
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:2124
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static void init(bNodeTree *, bNode *node)
struct wmTooltipState * tool_tip
int xy[2]
Definition WM_types.hh:761
ARegion * region
Definition WM_types.hh:1435
ARegion * region_from
Definition WM_types.hh:1433
ScrArea * area_from
Definition WM_types.hh:1431
wmTimer * timer
Definition WM_types.hh:1429
ARegion *(* init)(bContext *C, ARegion *region, int *pass, double *pass_delay, bool *r_exit_on_event)
Definition WM_types.hh:1437
struct wmEvent * eventstate
@ TIMER
void WM_tooltip_timer_clear(bContext *C, wmWindow *win)
Definition wm_tooltip.cc:70
void WM_tooltip_clear(bContext *C, wmWindow *win)
Definition wm_tooltip.cc:82
void WM_tooltip_init(bContext *C, wmWindow *win)
Definition wm_tooltip.cc:97
void WM_tooltip_timer_init_ex(bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init, double delay)
Definition wm_tooltip.cc:44
void WM_tooltip_immediate_init(bContext *C, wmWindow *win, ScrArea *area, ARegion *region, wmTooltipInitFn init)
Definition wm_tooltip.cc:29
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:64
double WM_tooltip_time_closed()
Definition wm_tooltip.cc:24
static double g_tooltip_time_closed
Definition wm_tooltip.cc:23
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const wmEventType event_type, const double time_step)
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)
bScreen * WM_window_get_active_screen(const wmWindow *win)