|
|
|
@ -69,21 +69,22 @@ typedef struct tSlider {
|
|
|
|
|
/** Accumulative factor (not clamped or rounded). */
|
|
|
|
|
float raw_factor;
|
|
|
|
|
|
|
|
|
|
/** 0-1 value for determining the influence of whatever is relevant. */
|
|
|
|
|
/** Current value for determining the influence of whatever is relevant. */
|
|
|
|
|
float factor;
|
|
|
|
|
|
|
|
|
|
/** Last mouse cursor position used for mouse movement delta calculation. */
|
|
|
|
|
float last_cursor[2];
|
|
|
|
|
|
|
|
|
|
float range[2];
|
|
|
|
|
/** Range of the slider without overshoot. */
|
|
|
|
|
float factor_bounds[2];
|
|
|
|
|
|
|
|
|
|
/** Enable range beyond 0-100%.
|
|
|
|
|
/** Enable range beyond factor_bounds.
|
|
|
|
|
* This is set by the code that uses the slider, as not all operations support
|
|
|
|
|
* extrapolation. */
|
|
|
|
|
bool allow_overshoot_right;
|
|
|
|
|
bool allow_overshoot_left;
|
|
|
|
|
bool allow_overshoot_lower;
|
|
|
|
|
bool allow_overshoot_upper;
|
|
|
|
|
|
|
|
|
|
/** Allow overshoot or clamp between 0% and 100%.
|
|
|
|
|
/** Allow overshoot or clamp between factor_bounds.
|
|
|
|
|
* This is set by the artist while using the slider. */
|
|
|
|
|
bool overshoot;
|
|
|
|
|
|
|
|
|
@ -295,9 +296,9 @@ static void slider_draw(const struct bContext *UNUSED(C), ARegion *region, void
|
|
|
|
|
handle_pos_x = region->winx / 2;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const float total_range = slider->range[1] - slider->range[0];
|
|
|
|
|
const float total_range = slider->factor_bounds[1] - slider->factor_bounds[0];
|
|
|
|
|
/* 0-1 value of the representing the position of the slider in the allowed range. */
|
|
|
|
|
const float range_factor = (slider->factor - slider->range[0]) / total_range;
|
|
|
|
|
const float range_factor = (slider->factor - slider->factor_bounds[0]) / total_range;
|
|
|
|
|
handle_pos_x = main_line_rect.xmin + SLIDE_PIXEL_DISTANCE * range_factor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -363,14 +364,14 @@ static void slider_update_factor(tSlider *slider, const wmEvent *event)
|
|
|
|
|
copy_v2fl_v2i(slider->last_cursor, event->xy);
|
|
|
|
|
|
|
|
|
|
if (!slider->overshoot) {
|
|
|
|
|
slider->factor = clamp_f(slider->factor, slider->range[0], slider->range[1]);
|
|
|
|
|
slider->factor = clamp_f(slider->factor, slider->factor_bounds[0], slider->factor_bounds[1]);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (!slider->allow_overshoot_left) {
|
|
|
|
|
slider->factor = max_ff(slider->factor, slider->range[0]);
|
|
|
|
|
if (!slider->allow_overshoot_lower) {
|
|
|
|
|
slider->factor = max_ff(slider->factor, slider->factor_bounds[0]);
|
|
|
|
|
}
|
|
|
|
|
if (!slider->allow_overshoot_right) {
|
|
|
|
|
slider->factor = min_ff(slider->factor, slider->range[1]);
|
|
|
|
|
if (!slider->allow_overshoot_upper) {
|
|
|
|
|
slider->factor = min_ff(slider->factor, slider->factor_bounds[1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -387,12 +388,12 @@ tSlider *ED_slider_create(struct bContext *C)
|
|
|
|
|
slider->region_header = CTX_wm_region(C);
|
|
|
|
|
|
|
|
|
|
/* Default is true, caller needs to manually set to false. */
|
|
|
|
|
slider->allow_overshoot_left = true;
|
|
|
|
|
slider->allow_overshoot_right = true;
|
|
|
|
|
slider->allow_overshoot_lower = true;
|
|
|
|
|
slider->allow_overshoot_upper = true;
|
|
|
|
|
slider->allow_increments = true;
|
|
|
|
|
|
|
|
|
|
slider->range[0] = 0;
|
|
|
|
|
slider->range[1] = 1;
|
|
|
|
|
slider->factor_bounds[0] = 0;
|
|
|
|
|
slider->factor_bounds[1] = 1;
|
|
|
|
|
|
|
|
|
|
/* Set initial factor. */
|
|
|
|
|
slider->raw_factor = 0.5f;
|
|
|
|
@ -426,7 +427,7 @@ bool ED_slider_modal(tSlider *slider, const wmEvent *event)
|
|
|
|
|
/* Handle key presses. */
|
|
|
|
|
switch (event->type) {
|
|
|
|
|
case EVT_EKEY:
|
|
|
|
|
if (slider->allow_overshoot_left || slider->allow_overshoot_right) {
|
|
|
|
|
if (slider->allow_overshoot_lower || slider->allow_overshoot_upper) {
|
|
|
|
|
slider->overshoot = event->val == KM_PRESS ? !slider->overshoot : slider->overshoot;
|
|
|
|
|
slider_update_factor(slider, event);
|
|
|
|
|
}
|
|
|
|
@ -462,7 +463,7 @@ void ED_slider_status_string_get(const struct tSlider *slider,
|
|
|
|
|
char precision_str[50];
|
|
|
|
|
char increments_str[50];
|
|
|
|
|
|
|
|
|
|
if (slider->allow_overshoot_left || slider->allow_overshoot_right) {
|
|
|
|
|
if (slider->allow_overshoot_lower || slider->allow_overshoot_upper) {
|
|
|
|
|
if (slider->overshoot) {
|
|
|
|
|
STRNCPY(overshoot_str, TIP_("[E] - Disable overshoot"));
|
|
|
|
|
}
|
|
|
|
@ -528,10 +529,10 @@ void ED_slider_factor_set(struct tSlider *slider, const float factor)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ED_slider_allow_overshoot_set(struct tSlider *slider, const bool left, const bool right)
|
|
|
|
|
void ED_slider_allow_overshoot_set(struct tSlider *slider, const bool lower, const bool upper)
|
|
|
|
|
{
|
|
|
|
|
slider->allow_overshoot_right = left;
|
|
|
|
|
slider->allow_overshoot_left = right;
|
|
|
|
|
slider->allow_overshoot_lower = lower;
|
|
|
|
|
slider->allow_overshoot_upper = upper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ED_slider_allow_increments_get(struct tSlider *slider)
|
|
|
|
@ -544,10 +545,12 @@ void ED_slider_allow_increments_set(struct tSlider *slider, const bool value)
|
|
|
|
|
slider->allow_increments = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ED_slider_range_set(struct tSlider *slider, float range[2])
|
|
|
|
|
void ED_slider_factor_bounds_set(struct tSlider *slider,
|
|
|
|
|
float factor_bound_lower,
|
|
|
|
|
float factor_bound_upper)
|
|
|
|
|
{
|
|
|
|
|
slider->range[0] = range[0];
|
|
|
|
|
slider->range[1] = range[1];
|
|
|
|
|
slider->factor_bounds[0] = factor_bound_lower;
|
|
|
|
|
slider->factor_bounds[1] = factor_bound_upper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** \} */
|
|
|
|
|
I think a comment here would be in order, something like:
Just to make it clear what the relation between 'bounds' and 'overshoot' is.