Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
tooltip_window.hpp
Go to the documentation of this file.
1#pragma once
2
31
32#include <algorithm>
33#include <functional>
34#include <string>
38
39namespace pulp::view {
40
42public:
49
50 TooltipWindow() = default;
51
61 void show(std::string text, Point anchor) {
62 last_anchor_ = anchor;
63 if (phase_ == Phase::showing || phase_ == Phase::hiding) {
64 // Already up — replace text + anchor and re-anchor.
65 text_ = std::move(text);
66 position_ = compute_position(anchor);
67 if (phase_ == Phase::hiding) {
68 phase_ = Phase::showing;
69 opacity_.animate_to(1.0f, fade_duration_);
70 elapsed_visible_ = 0;
71 }
72 return;
73 }
74 text_ = std::move(text);
75 position_ = compute_position(anchor);
76 elapsed_pending_ = 0;
77 elapsed_visible_ = 0;
78 phase_ = Phase::pending;
79 }
80
83 void move_to(Point anchor) {
84 last_anchor_ = anchor;
85 if (phase_ == Phase::idle) return;
86 position_ = compute_position(anchor);
87 }
88
91 void hide() {
92 if (phase_ == Phase::idle || phase_ == Phase::hiding) return;
93 if (phase_ == Phase::pending) {
94 phase_ = Phase::idle;
95 elapsed_pending_ = 0;
96 return;
97 }
98 opacity_.animate_to(0.0f, fade_duration_);
99 phase_ = Phase::hiding;
100 }
101
105 if (phase_ == Phase::pending) {
106 phase_ = Phase::idle;
107 elapsed_pending_ = 0;
108 }
109 }
110
114 bool tick(float dt) {
115 switch (phase_) {
116 case Phase::idle:
117 return false;
118
119 case Phase::pending:
120 elapsed_pending_ += dt;
121 if (elapsed_pending_ >= hover_delay_) {
122 phase_ = Phase::showing;
123 opacity_.set(0.0f);
124 opacity_.animate_to(1.0f, fade_duration_);
125 elapsed_visible_ = 0;
126 }
127 return true;
128
129 case Phase::showing:
130 opacity_.advance(dt);
131 elapsed_visible_ += dt;
132 if (auto_hide_ > 0 && elapsed_visible_ >= auto_hide_) {
133 hide();
134 }
135 return opacity_.animating() || (auto_hide_ > 0);
136
137 case Phase::hiding:
138 opacity_.advance(dt);
139 if (!opacity_.animating()) {
140 phase_ = Phase::idle;
141 return false;
142 }
143 return true;
144 }
145 return false;
146 }
147
148 // ── State accessors ──────────────────────────────────────────────
149
152 bool visible() const {
153 return phase_ == Phase::showing || phase_ == Phase::hiding;
154 }
155 bool pending() const { return phase_ == Phase::pending; }
156 Phase phase() const { return phase_; }
157
158 float opacity() const { return opacity_.value(); }
159 Point position() const { return position_; }
160 const std::string& text() const { return text_; }
161 Point last_anchor() const { return last_anchor_; }
162
163 // ── Configuration ────────────────────────────────────────────────
164
167 void set_hover_delay(float seconds) { hover_delay_ = std::max(0.0f, seconds); }
168 float hover_delay() const { return hover_delay_; }
169
173 void set_fade_duration(float seconds) { fade_duration_ = std::max(0.0f, seconds); }
174 float fade_duration() const { return fade_duration_; }
175
179 void set_auto_hide(float seconds) { auto_hide_ = std::max(0.0f, seconds); }
180 float auto_hide() const { return auto_hide_; }
181
184 void set_cursor_offset(Point offset) { cursor_offset_ = offset; }
185 Point cursor_offset() const { return cursor_offset_; }
186
188 std::function<void(Phase)> on_phase_change;
189
190private:
191 Point compute_position(Point anchor) const {
192 return {anchor.x + cursor_offset_.x, anchor.y + cursor_offset_.y};
193 }
194
195 Phase phase_ = Phase::idle;
196 std::string text_;
197 Point last_anchor_{};
198 Point position_{};
199
200 float hover_delay_ = 0.6f;
201 float fade_duration_ = 0.12f;
202 float auto_hide_ = 0.0f;
203 Point cursor_offset_{12, 18};
204
205 float elapsed_pending_ = 0;
206 float elapsed_visible_ = 0;
207 ValueAnimation opacity_{0.0f};
208};
209
210} // namespace pulp::view
Point cursor_offset() const
Definition tooltip_window.hpp:185
void set_auto_hide(float seconds)
When > 0, the tooltip auto-hides this many seconds after it becomes visible.
Definition tooltip_window.hpp:179
void cancel_pending()
Cancel any pending hover-delay without showing.
Definition tooltip_window.hpp:104
Point last_anchor() const
Definition tooltip_window.hpp:161
std::function< void(Phase)> on_phase_change
Optional observer fired on every phase transition.
Definition tooltip_window.hpp:188
bool tick(float dt)
Advance time.
Definition tooltip_window.hpp:114
void move_to(Point anchor)
Update the anchor position.
Definition tooltip_window.hpp:83
float auto_hide() const
Definition tooltip_window.hpp:180
Phase
Definition tooltip_window.hpp:43
@ hiding
Fade-out in progress.
Definition tooltip_window.hpp:47
@ showing
Visible (possibly still fading in).
Definition tooltip_window.hpp:46
@ pending
Hover-delay timer running, not yet visible.
Definition tooltip_window.hpp:45
@ idle
Nothing showing, no pending show.
Definition tooltip_window.hpp:44
Point position() const
Definition tooltip_window.hpp:159
void set_cursor_offset(Point offset)
Pixel offset applied to anchor when computing the tooltip's rendered position.
Definition tooltip_window.hpp:184
bool visible() const
True once the tooltip is past the hover-delay (showing or hiding).
Definition tooltip_window.hpp:152
void set_fade_duration(float seconds)
Fade-in / fade-out duration in seconds.
Definition tooltip_window.hpp:173
float fade_duration() const
Definition tooltip_window.hpp:174
void show(std::string text, Point anchor)
Begin showing a tooltip near anchor.
Definition tooltip_window.hpp:61
const std::string & text() const
Definition tooltip_window.hpp:160
void hide()
Begin fade-out.
Definition tooltip_window.hpp:91
bool pending() const
Definition tooltip_window.hpp:155
float opacity() const
Definition tooltip_window.hpp:158
float hover_delay() const
Definition tooltip_window.hpp:168
void set_hover_delay(float seconds)
Time in seconds the pointer must hover before the tooltip appears.
Definition tooltip_window.hpp:167
Phase phase() const
Definition tooltip_window.hpp:156
System-level reduced-motion preferences.
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
Definition geometry.hpp:20