diff options
| author | Federico Angelilli <code@fedang.net> | 2024-11-28 01:09:40 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-11-28 01:09:40 +0100 |
| commit | 737167955e8347ce06718e7a8324c9d2ac89dfba (patch) | |
| tree | d187ac026739c01eb5df22a3954b95eb7bc63a7b /src/blocks/slider.c | |
| parent | 6ab3b52fbde3ab2ac11e66e4d664f67e108f6aee (diff) | |
Refactor actions
Diffstat (limited to 'src/blocks/slider.c')
| -rw-r--r-- | src/blocks/slider.c | 92 |
1 files changed, 59 insertions, 33 deletions
diff --git a/src/blocks/slider.c b/src/blocks/slider.c index 1b5d4c3..32ec3e6 100644 --- a/src/blocks/slider.c +++ b/src/blocks/slider.c @@ -4,6 +4,7 @@ #include <stdlib.h> #include <math.h> +#include "../action.h" #include "../block.h" #include "../format.h" #include "../any_log.h" @@ -78,7 +79,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) pattern = slider->line_color.pattern; if (pattern != NULL) { - int line_radius = radius - slider->line_width / 2; + int line_radius = radius + slider->line_width / 2; render_capsule_fast(cr, bar_x, bar_y, slider->width, radius, line_radius); cairo_pattern_set_matrix(pattern, &matrix); @@ -172,35 +173,65 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) } } -static void block_slider_event(layout_t *layout, event_t event) +static void block_slider_event(layout_t *layout, config_t *config, event_t event) { block_slider_t *slider = (block_slider_t *)layout->block; - int value = slider->value; - if (layout->block->hidden) return; - if (!slider->seekable) return; + int value = slider->value; if (event_is_click(event)) { - int bar_x = layout->x + (layout->width - slider->width) / 2; - int bar_y = layout->y + (layout->height - slider->height) / 2; + int bar_x = layout->x + (layout->width - slider->width) / 2 - slider->line_width; + int bar_y = layout->y + (layout->height - slider->height) / 2 - slider->line_width; + + int bar_width = slider->width + 2 * slider->line_width; + int bar_height = slider->height + 2 * slider->line_width; + + bool clicked = check_capsule(event.x, event.y, bar_x, bar_y, bar_width, bar_height); + + action_t *action = layout->block->actions[event.type]; + switch (event.type) { + case EVENT_LEFT_CLICK: + if (slider->left_click != NULL && clicked) + action = slider->left_click; + break; + + case EVENT_MIDDLE_CLICK: + if (slider->middle_click != NULL && clicked) + action = slider->middle_click; + break; - if (check_capsule(event.x, event.y, bar_x, bar_y, slider->width, slider->height)) { - int value = 100 * (event.x - bar_x) / (double)(slider->width - 1); - slider->value = value; + case EVENT_RIGHT_CLICK: + if (slider->right_click != NULL && clicked) + action = slider->right_click; + break; + + default: + unreachable(); + } + + action_perform(action, layout->block, config); + + if (slider->seekable && clicked) + slider->value = 100 * (event.x - bar_x) / (double)(slider->width - 1); + } else { + action_perform(layout->block->actions[event.type], layout->block, config); + + if (slider->seekable && event_is_scroll(event)) { + int step = event.type == EVENT_SCROLL_DOWN ? -1 : 1; + slider->value += step; + + if (slider->value > 100) slider->value = 100; + if (slider->value < 0) slider->value = 0; } - } else if (event_is_scroll(event)) { - int step = event.type == EVENT_SCROLL_DOWN ? -1 : 1; - slider->value += step; - - if (slider->value > 100) slider->value = 100; - if (slider->value < 0) slider->value = 0; - } else return; - - log_value_debug("Updated slider value", - "s:label", layout->block->label, - "i:old_value", value, - "i:new_value", slider->value); + } + + if (slider->value != value) { + log_value_debug("Updated slider value", + "s:label", layout->block->label, + "i:old_value", value, + "i:new_value", slider->value); + } } static void block_slider_init(block_t *block) @@ -215,11 +246,11 @@ static void block_slider_init(block_t *block) static void block_slider_clean(block_t *block) { block_slider_t *slider = (block_slider_t *)block; - gradient_free(&slider->bar_color); - gradient_free(&slider->line_color); - gradient_free(&slider->bg_color); - gradient_free(&slider->knob_color); - gradient_free(&slider->knob_line_color); + gradient_clean(&slider->bar_color); + gradient_clean(&slider->line_color); + gradient_clean(&slider->bg_color); + gradient_clean(&slider->knob_color); + gradient_clean(&slider->knob_line_color); } static int block_slider_validate(block_t *block, config_t *config) @@ -256,13 +287,8 @@ static bool block_slider_resolve(block_t *block, config_t *config) }; for (size_t i = 0; i < 3; i++) { - char *label = (char *)*actions[i]; - if (label == NULL) continue; - - if (!config_resolve_action(config, label, actions[i])) + if (!block_resolve_action(block, config, actions[i])) return false; - - free(label); } return true; |
