Anim: Add option to show modified property on slider #119920

Merged
Christoph Lendenfeld merged 9 commits from ChrisLend/blender:slider_show_modified_property into main 2024-04-25 15:48:32 +02:00
3 changed files with 54 additions and 12 deletions

View File

@ -104,6 +104,9 @@ void ED_slider_allow_increments_set(tSlider *slider, bool value);
void ED_slider_mode_set(tSlider *slider, SliderMode mode);
SliderMode ED_slider_mode_get(const tSlider *slider);
void ED_slider_unit_set(tSlider *slider, const char *unit);
/* Set a name that will show next to the slider to indicate which property is modified currently.
* To clear, set to an empty string. */
void ED_slider_property_label_set(tSlider *slider, const char *prop_name);
/* ************** XXX OLD CRUFT WARNING ************* */

View File

@ -1030,6 +1030,7 @@ static int ease_modal(bContext *C, wmOperator *op, const wmEvent *event)
ED_slider_unit_set(gso->slider, "%");
gso->factor_prop = RNA_struct_find_property(op->ptr, "factor");
}
ED_slider_property_label_set(gso->slider, RNA_property_ui_name(gso->factor_prop));
ease_modal_update(C, op);
break;
}
@ -1055,6 +1056,7 @@ static int ease_invoke(bContext *C, wmOperator *op, const wmEvent *event)
ED_slider_allow_overshoot_set(gso->slider, false, false);
ED_slider_factor_bounds_set(gso->slider, -1, 1);
ED_slider_factor_set(gso->slider, 0.0f);
ED_slider_property_label_set(gso->slider, RNA_property_ui_name(gso->factor_prop));
return invoke_result;
}

View File

@ -81,6 +81,10 @@ struct tSlider {
/* How the factor number is drawn. When drawing percent it is factor*100. */
SliderMode slider_mode;
/* Optional string that will display next to the slider to indicate which property is modified
* right now. */
std::string property_label;

Given that this is runtime data that's owned by tSlider anyway, do we need a fixed-size char[]? Or could we just use std::string instead? That could get rid of the fixed array size. Passing references around could then be via a StringRef instead of const char *.

Given that this is runtime data that's owned by `tSlider` anyway, do we need a fixed-size `char[]`? Or could we just use `std::string` instead? That could get rid of the fixed array size. Passing references around could then be via a `StringRef` instead of `const char *`.
/* What unit to add to the slider. */
char unit_string[SLIDER_UNIT_STRING_SIZE];
@ -224,19 +228,28 @@ static void draw_backdrop(const int fontid,
const rctf *main_line_rect,
const uint8_t color_bg[4],
const short region_y_size,
const float base_tick_height)
const float base_tick_height,
const std::string &property_label)
{
float string_pixel_size[2];
float percent_string_pixel_size[2];
const char *percentage_string_placeholder = "000%%";
BLF_width_and_height(fontid,
percentage_string_placeholder,
sizeof(percentage_string_placeholder),
&string_pixel_size[0],
&string_pixel_size[1]);
const float pad[2] = {(region_y_size - base_tick_height) / 2, 2.0f * U.pixelsize};
&percent_string_pixel_size[0],
&percent_string_pixel_size[1]);
float property_name_pixel_size[2];
BLF_width_and_height(fontid,
property_label.c_str(),
property_label.size(),
&property_name_pixel_size[0],
&property_name_pixel_size[1]);
const float pad[2] = {(region_y_size - base_tick_height) / 2 + 12.0f * U.pixelsize,
2.0f * U.pixelsize};
rctf backdrop_rect{};
backdrop_rect.xmin = main_line_rect->xmin - string_pixel_size[0] - pad[0];
backdrop_rect.xmax = main_line_rect->xmax + pad[0];
backdrop_rect.xmin = main_line_rect->xmin - property_name_pixel_size[0] - pad[0];
backdrop_rect.xmax = main_line_rect->xmax + percent_string_pixel_size[0] + pad[0];
backdrop_rect.ymin = pad[1];
backdrop_rect.ymax = region_y_size - pad[1];
UI_draw_roundbox_3ub_alpha(&backdrop_rect, true, 4.0f, color_bg, color_bg[3]);
@ -304,7 +317,12 @@ static void slider_draw(const bContext * /*C*/, ARegion *region, void *arg)
handle_pos_x = main_line_rect.xmin + SLIDE_PIXEL_DISTANCE * range_factor;
}
draw_backdrop(fontid, &main_line_rect, color_bg, slider->region_header->winy, base_tick_height);
draw_backdrop(fontid,
&main_line_rect,
color_bg,
slider->region_header->winy,
base_tick_height,
slider->property_label);
draw_main_line(&main_line_rect, slider->factor, slider->overshoot, color_overshoot, color_line);
@ -356,11 +374,25 @@ static void slider_draw(const bContext * /*C*/, ARegion *region, void *arg)
&factor_string_pixel_size[0],
&factor_string_pixel_size[1]);
BLF_position(fontid,
main_line_rect.xmin - 12.0 * U.pixelsize - factor_string_pixel_size[0],
(region->winy / 2) - factor_string_pixel_size[1] / 2,
0.0f);
const float text_padding = 12.0 * U.pixelsize;
const float factor_string_pos_x = main_line_rect.xmax + text_padding;
BLF_position(
fontid, factor_string_pos_x, (region->winy / 2) - factor_string_pixel_size[1] / 2, 0.0f);
BLF_draw(fontid, factor_string, sizeof(factor_string));
if (!slider->property_label.empty()) {
float property_name_pixel_size[2];
BLF_width_and_height(fontid,
dr.sybren marked this conversation as resolved

warning: address of array 'slider->property_name' will always evaluate to 'true'

I think you want if (slider->property_name[0])

`warning: address of array 'slider->property_name' will always evaluate to 'true'` I think you want `if (slider->property_name[0])`
slider->property_label.c_str(),
slider->property_label.length(),

sizeof is incorrect here, I think you need slider->property_label.length()

`sizeof` is incorrect here, I think you need `slider->property_label.length()`
&property_name_pixel_size[0],
&property_name_pixel_size[1]);
BLF_position(fontid,
main_line_rect.xmin - text_padding - property_name_pixel_size[0],
(region->winy / 2) - property_name_pixel_size[1] / 2,
0.0f);
BLF_draw(fontid, slider->property_label.c_str(), slider->property_label.length());

same sizeof here

same `sizeof` here
}
}
static void slider_update_factor(tSlider *slider, const wmEvent *event)
@ -584,6 +616,11 @@ void ED_slider_unit_set(tSlider *slider, const char *unit)
STRNCPY(slider->unit_string, unit);
}
void ED_slider_property_label_set(tSlider *slider, const char *property_label)
{
slider->property_label.assign(property_label);
}
/** \} */
void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *region, void *arg_info)