Animation: Allow setting the slider unit and mode
Split off from [#106952: Animation: Butterworth Smoothing filter](https://projects.blender.org/blender/blender/pulls/106952) This patch allows the slider to take a different string than just "%", the use case is on #106952 where we want to display "Hz" instead. Additionally the slider got the ability to set modes, which determine how the factor number is displayed. `SLIDER_MODE_PERCENT` means it will multiply by 100 and display as whole numbers `SLIDER_MODE_FLOAT` means it will display just floats with one digit after the comma Additionally to that, because the slider range is now arbitrary and potentially deals with large numbers, the mouse distance needed to travel from min to max has been normalized to the range. Pull Request: https://projects.blender.org/blender/blender/pulls/109768
This commit is contained in:
committed by
Christoph Lendenfeld
parent
6332d1b8a8
commit
79b2e8f211
@@ -73,6 +73,7 @@ void ED_region_image_metadata_draw(
|
||||
/* Slider */
|
||||
|
||||
struct tSlider;
|
||||
typedef enum SliderMode { SLIDER_MODE_PERCENT = 0, SLIDER_MODE_FLOAT = 1 } SliderMode;
|
||||
|
||||
struct tSlider *ED_slider_create(struct bContext *C);
|
||||
/**
|
||||
@@ -106,6 +107,9 @@ void ED_slider_factor_bounds_set(struct tSlider *slider, float lower_bound, floa
|
||||
bool ED_slider_allow_increments_get(struct tSlider *slider);
|
||||
void ED_slider_allow_increments_set(struct tSlider *slider, bool value);
|
||||
|
||||
void ED_slider_mode_set(struct tSlider *slider, SliderMode unit);
|
||||
void ED_slider_unit_set(struct tSlider *slider, const char *unit);
|
||||
|
||||
/* ************** XXX OLD CRUFT WARNING ************* */
|
||||
|
||||
/**
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
#define SLIDE_PIXEL_DISTANCE (300.0f * UI_SCALE_FAC)
|
||||
#define OVERSHOOT_RANGE_DELTA 0.2f
|
||||
#define SLIDER_UNIT_STRING_SIZE 64
|
||||
|
||||
typedef struct tSlider {
|
||||
Scene *scene;
|
||||
@@ -79,6 +80,12 @@ typedef struct tSlider {
|
||||
/** Range of the slider without overshoot. */
|
||||
float factor_bounds[2];
|
||||
|
||||
/* How the factor number is drawn. When drawing percent it is factor*100. */
|
||||
SliderMode slider_mode;
|
||||
|
||||
/* What unit to add to the slider. */
|
||||
char unit_string[SLIDER_UNIT_STRING_SIZE];
|
||||
|
||||
/** Enable range beyond factor_bounds.
|
||||
* This is set by the code that uses the slider, as not all operations support
|
||||
* extrapolation. */
|
||||
@@ -328,8 +335,6 @@ static void slider_draw(const bContext *UNUSED(C), ARegion *region, void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
char percentage_string[256];
|
||||
|
||||
/* Draw handle indicating current factor. */
|
||||
const rctf handle_rect = {
|
||||
.xmin = handle_pos_x - (line_width),
|
||||
@@ -339,26 +344,39 @@ static void slider_draw(const bContext *UNUSED(C), ARegion *region, void *arg)
|
||||
};
|
||||
|
||||
UI_draw_roundbox_3ub_alpha(&handle_rect, true, 1, color_handle, 255);
|
||||
SNPRINTF(percentage_string, "%.0f%%", slider->factor * 100);
|
||||
|
||||
/* Draw percentage string. */
|
||||
float percentage_string_pixel_size[2];
|
||||
char factor_string[256];
|
||||
switch (slider->slider_mode) {
|
||||
case SLIDER_MODE_PERCENT:
|
||||
SNPRINTF(factor_string, "%.0f %s", slider->factor * 100, slider->unit_string);
|
||||
break;
|
||||
case SLIDER_MODE_FLOAT:
|
||||
SNPRINTF(factor_string, "%.1f %s", slider->factor, slider->unit_string);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Draw factor string. */
|
||||
float factor_string_pixel_size[2];
|
||||
BLF_width_and_height(fontid,
|
||||
percentage_string,
|
||||
sizeof(percentage_string),
|
||||
&percentage_string_pixel_size[0],
|
||||
&percentage_string_pixel_size[1]);
|
||||
factor_string,
|
||||
sizeof(factor_string),
|
||||
&factor_string_pixel_size[0],
|
||||
&factor_string_pixel_size[1]);
|
||||
|
||||
BLF_position(fontid,
|
||||
main_line_rect.xmin - 24.0 * U.pixelsize - percentage_string_pixel_size[0] / 2,
|
||||
(region->winy / 2) - percentage_string_pixel_size[1] / 2,
|
||||
main_line_rect.xmin - 24.0 * U.pixelsize - factor_string_pixel_size[0] / 2,
|
||||
(region->winy / 2) - factor_string_pixel_size[1] / 2,
|
||||
0.0f);
|
||||
BLF_draw(fontid, percentage_string, sizeof(percentage_string));
|
||||
BLF_draw(fontid, factor_string, sizeof(factor_string));
|
||||
}
|
||||
|
||||
static void slider_update_factor(tSlider *slider, const wmEvent *event)
|
||||
{
|
||||
const float factor_delta = (event->xy[0] - slider->last_cursor[0]) / SLIDE_PIXEL_DISTANCE;
|
||||
/* Normalize so no matter the factor bounds, the mouse distance travelled from min to max is
|
||||
* constant. */
|
||||
const float slider_range = slider->factor_bounds[1] - slider->factor_bounds[0];
|
||||
const float factor_delta = (event->xy[0] - slider->last_cursor[0]) /
|
||||
(SLIDE_PIXEL_DISTANCE / slider_range);
|
||||
/* Reduced factor delta in precision mode (shift held). */
|
||||
slider->raw_factor += slider->precision ? (factor_delta / 8) : factor_delta;
|
||||
slider->factor = slider->raw_factor;
|
||||
@@ -396,6 +414,10 @@ tSlider *ED_slider_create(bContext *C)
|
||||
slider->factor_bounds[0] = 0;
|
||||
slider->factor_bounds[1] = 1;
|
||||
|
||||
slider->unit_string[0] = "%";
|
||||
|
||||
slider->slider_mode = SLIDER_MODE_PERCENT;
|
||||
|
||||
/* Set initial factor. */
|
||||
slider->raw_factor = 0.5f;
|
||||
slider->factor = 0.5;
|
||||
@@ -554,6 +576,16 @@ void ED_slider_factor_bounds_set(tSlider *slider,
|
||||
slider->factor_bounds[1] = factor_bound_upper;
|
||||
}
|
||||
|
||||
void ED_slider_mode_set(tSlider *slider, SliderMode mode)
|
||||
{
|
||||
slider->slider_mode = mode;
|
||||
}
|
||||
|
||||
void ED_slider_unit_set(tSlider *slider, const char *unit)
|
||||
{
|
||||
BLI_strncpy(slider->unit_string, unit, SLIDER_UNIT_STRING_SIZE);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *region, void *arg_info)
|
||||
|
||||
Reference in New Issue
Block a user