From 3049e4b1e3e6b36812be84cf794b55b019380c63 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Thu, 21 Nov 2024 01:11:11 +0100 Subject: Add mouse scroll event --- src/blocks/slider.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) (limited to 'src/blocks') diff --git a/src/blocks/slider.c b/src/blocks/slider.c index 82d6140..b01ddb7 100644 --- a/src/blocks/slider.c +++ b/src/blocks/slider.c @@ -9,7 +9,7 @@ typedef struct { block_spec_t block; - unsigned int value; + int value; unsigned int height; unsigned int width; unsigned int line_width; @@ -71,24 +71,30 @@ static void block_slider_render(layout_t *layout, cairo_t *cr) static void block_slider_event(layout_t *layout, event_t event) { block_slider_t *slider = (block_slider_t *)layout->block; + int value = slider->value; if (!slider->seekable) return; - int bar_y = layout->y + (layout->height - slider->height) / 2; - int bar_x = layout->x + (layout->width - slider->width) / 2; + 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; - 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); + 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; + } + } else if (event_is_scroll(event)) { + int step = event.type == EVENT_SCROLL_DOWN ? -1 : 1; + slider->value += step; - log_value_debug("Updated slider value", - "i:event_x", event.x, - "i:bar_x", bar_x, - "i:bar_width", slider->width, - "i:old_value", slider->value, - "i:new_value", value); - - slider->value = value; + if (slider->value > 100) slider->value = 100; + if (slider->value < 0) slider->value = 0; } + + 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, const block_scheme_t *scheme) @@ -110,9 +116,13 @@ static void block_slider_clean(block_t *block) static int block_slider_validate(block_t *block, const block_scheme_t *scheme) { - //block_slider_t *slider = (block_slider_t *)block; + block_slider_t *slider = (block_slider_t *)block; int errors = 0; - // TODO + + if (slider->value < 0 || slider->value > 100) { + log_error("Block '%s' requires '%s' to be between 0 and 100", block->label, "bar-value"); + errors++; + } return errors; } @@ -125,7 +135,7 @@ static const config_entry_t block_slider_entries[] = { { "bar-height", CONFIG_UINT, NULL, offsetof(block_slider_t, height) }, { "bar-width", CONFIG_UINT, NULL, offsetof(block_slider_t, width) }, { "bar-line-width", CONFIG_UINT, NULL, offsetof(block_slider_t, line_width) }, - { "bar-value", CONFIG_UINT, NULL, offsetof(block_slider_t, value) }, + { "bar-value", CONFIG_INT, NULL, offsetof(block_slider_t, value) }, { "seekable", CONFIG_BOOL, NULL, offsetof(block_slider_t, seekable) }, { 0 }, }; -- cgit v1.2.3