Refactor: Allow to explicitly set the range on the slider UI element #107406

Merged
Christoph Lendenfeld merged 5 commits from ChrisLend/blender:slider_overshoot_refactor into main 2023-05-05 17:22:46 +02:00
3 changed files with 32 additions and 29 deletions
Showing only changes of commit 6a01a46b7b - Show all commits

View File

@ -117,7 +117,8 @@ static void poselib_keytag_pose(bContext *C, Scene *scene, PoseBlendData *pbd)
AnimData *adt = BKE_animdata_from_id(&pbd->ob->id);
if (adt != NULL && adt->action != NULL &&
!BKE_id_is_editable(CTX_data_main(C), &adt->action->id)) {
!BKE_id_is_editable(CTX_data_main(C), &adt->action->id))
{
/* Changes to linked-in Actions are not allowed. */
return;
}
@ -368,8 +369,7 @@ static bool poselib_blend_init_data(bContext *C, wmOperator *op, const wmEvent *
ED_slider_factor_set(pbd->slider, pbd->blend_factor);
ED_slider_allow_overshoot_set(pbd->slider, true, true);
ED_slider_allow_increments_set(pbd->slider, false);
float range[2] = {-1, 1};
ED_slider_range_set(pbd->slider, range);
ED_slider_factor_bounds_set(pbd->slider, -1, 1);
}
if (pbd->release_confirm_info.use_release_confirm) {

View File

@ -97,7 +97,7 @@ void ED_slider_factor_set(struct tSlider *slider, float factor);
/* One bool value for each side of the slider. Allows to allow overshoot only on one side. */
void ED_slider_allow_overshoot_set(struct tSlider *slider, bool left, bool right);
void ED_slider_range_set(struct tSlider *slider, float range[2]);
void ED_slider_factor_bounds_set(struct tSlider *slider, float lower_bound, float upper_bound);

I think a comment here would be in order, something like:

/**
 * Set the bounds for the slider, which are applied until the user enables overshooting.
 */
void ED_slider_factor_bounds_set(struct tSlider *slider, float lower_bound, float upper_bound);

Just to make it clear what the relation between 'bounds' and 'overshoot' is.

I think a comment here would be in order, something like: ``` /** * Set the bounds for the slider, which are applied until the user enables overshooting. */ void ED_slider_factor_bounds_set(struct tSlider *slider, float lower_bound, float upper_bound); ``` Just to make it clear what the relation between 'bounds' and 'overshoot' is.
bool ED_slider_allow_increments_get(struct tSlider *slider);
void ED_slider_allow_increments_set(struct tSlider *slider, bool value);

View File

@ -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;
}
/** \} */