87 maximum_ = std::max(min_value, max_value);
91 double minimum()
const {
return minimum_; }
92 double maximum()
const {
return maximum_; }
99 double skew()
const {
return skew_; }
103 const double n = std::clamp(normalized_for(mid_value), 1
e-4, 1.0 - 1
e-4);
104 skew_ = std::max(1
e-4, std::log(0.5) / std::log(
n));
109 double value()
const {
return value_; }
116 if (next == value_)
return false;
118 notify_value(notify);
135 double normalized()
const {
return std::clamp(normalized_for(value_), 0.0, 1.0); }
137 return minimum_ + std::clamp(
n, 0.0, 1.0) * (maximum_ - minimum_);
144 const double n = std::clamp(normalized_for(
v), 0.0, 1.0);
145 return skew_ == 1.0 ?
n : std::pow(
n, skew_);
148 p = std::clamp(
p, 0.0, 1.0);
149 const double n = skew_ == 1.0 ?
p : std::pow(
p, 1.0 / skew_);
150 return minimum_ +
n * (maximum_ - minimum_);
155 v = std::clamp(
v, minimum_, maximum_);
156 if (interval_ > 0.0) {
157 v = minimum_ + std::round((
v - minimum_) / interval_) * interval_;
158 v = std::clamp(
v, minimum_, maximum_);
176 if (!has_default_)
return false;
177 return set_value(default_value_, notify);
199 bool drag_to(
double delta_pixels,
double proportion_at_press,
bool fine,
201 double span =
static_cast<double>(drag_pixels_);
202 if (fine) span *= fine_divisor_;
203 return set_proportion(proportion_at_press + delta_pixels / span, notify);
212 double span =
static_cast<double>(drag_pixels_);
213 if (fine) span *= fine_divisor_;
229 if (gesture_active_)
return;
230 gesture_active_ =
true;
234 if (!gesture_active_)
return;
235 gesture_active_ =
false;
247 double normalized_for(
double v)
const {
248 const double span = maximum_ - minimum_;
249 if (span <= 0.0)
return 0.0;
250 return (
v - minimum_) / span;
253 void notify_value(
Notify notify) {
263 const double v = value_;
267 double minimum_ = 0.0;
268 double maximum_ = 1.0;
269 double interval_ = 0.0;
272 double default_value_ = 0.0;
273 bool has_default_ =
false;
274 int drag_pixels_ = 250;
275 bool velocity_mode_ =
false;
276 double velocity_sensitivity_ = 1.0;
277 double fine_divisor_ = 10.0;
278 bool gesture_active_ =
false;
Definition slider_core.hpp:77
int drag_sensitivity() const
Definition slider_core.hpp:185
double proportion() const
Travel proportion in [0,1] for the current value, after the curve.
Definition slider_core.hpp:123
std::function< void()> on_gesture_end
Definition slider_core.hpp:244
double value_for_proportion(double p) const
Definition slider_core.hpp:147
bool reset_to_default(Notify notify=Notify::sync)
Definition slider_core.hpp:175
bool set_value(double v, Notify notify=Notify::sync)
Write a real-world value.
Definition slider_core.hpp:114
void set_velocity_sensitivity(double s)
Definition slider_core.hpp:192
double value_for_normalized(double n) const
Definition slider_core.hpp:136
double proportion_for(double v) const
Definition slider_core.hpp:143
void begin_gesture()
Definition slider_core.hpp:228
double maximum() const
Definition slider_core.hpp:92
bool gesture_active() const
Definition slider_core.hpp:238
bool drag_step(double delta_pixels, bool fine, Notify notify=Notify::sync)
VELOCITY drag: delta_pixels is the pointer's travel since the LAST tick, and the control integrates i...
Definition slider_core.hpp:211
bool drag_to(double delta_pixels, double proportion_at_press, bool fine, Notify notify=Notify::sync)
ABSOLUTE drag: delta_pixels is the pointer's total travel SINCE the gesture began (positive = increas...
Definition slider_core.hpp:199
void set_skew_from_midpoint(double mid_value)
Choose the skew that places mid_value (real-world units) at half travel.
Definition slider_core.hpp:102
void set_velocity_mode(bool on)
In velocity mode the value moves by pointer SPEED rather than by absolute pointer travel,...
Definition slider_core.hpp:190
double minimum() const
Definition slider_core.hpp:91
void set_fine_divisor(double d)
Definition slider_core.hpp:218
void set_skew(double skew)
1 = linear. Below 1, the low end of the range gets more travel.
Definition slider_core.hpp:98
double default_value() const
Definition slider_core.hpp:174
double skew() const
Definition slider_core.hpp:99
double interval() const
Definition slider_core.hpp:93
double constrain(double v) const
Clamp to the range and snap to the interval.
Definition slider_core.hpp:154
bool velocity_mode() const
Definition slider_core.hpp:191
void set_drag_sensitivity(int pixels)
Pointer pixels that cross the FULL range in a plain (non-velocity) drag.
Definition slider_core.hpp:184
double normalized() const
LINEAR position of the value in the range, in [0,1], with NO response curve applied.
Definition slider_core.hpp:135
void set_default_value(double v)
The value the control returns to on a reset gesture (conventionally a double-click or alt-click).
Definition slider_core.hpp:169
void end_gesture()
Definition slider_core.hpp:233
bool set_normalized(double n, Notify notify=Notify::sync)
Definition slider_core.hpp:139
std::function< void()> on_gesture_begin
Definition slider_core.hpp:243
double value() const
Definition slider_core.hpp:109
bool set_proportion(double p, Notify notify=Notify::sync)
Write from a travel proportion (what a drag or a painter's inverse hit-test produces).
Definition slider_core.hpp:127
bool has_default() const
Definition slider_core.hpp:173
double fine_divisor() const
Definition slider_core.hpp:219
void set_range(double min_value, double max_value, double interval=0.0)
Set the real-world range and the quantization interval.
Definition slider_core.hpp:85
std::function< void(double)> on_value_change
Definition slider_core.hpp:242
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
void queue_async_notification(std::function< void()> fn)
Queue a callback for the next flush.
@ none
Definition appearance_defects.hpp:53
Notify
Whether a value write notifies listeners, and when.
Definition slider_core.hpp:60
@ async
fire listeners at the next flush_async_notifications()
Definition slider_core.hpp:63
@ none
change the value silently
Definition slider_core.hpp:61
@ sync
fire listeners before returning
Definition slider_core.hpp:62
@ s
Definition input_events.hpp:41
@ n
Definition input_events.hpp:40
@ d
Definition input_events.hpp:39
@ p
Definition input_events.hpp:40
@ v
Definition input_events.hpp:41
@ e
Definition input_events.hpp:39
void flush_async_notifications()
Deferred Notify::async callbacks, oldest first.
@ on
Definition accessibility.hpp:132