aboutsummaryrefslogtreecommitdiff
path: root/src/blocks
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-21 01:11:11 +0100
committerFederico Angelilli <code@fedang.net>2024-11-21 02:13:16 +0100
commit3049e4b1e3e6b36812be84cf794b55b019380c63 (patch)
tree34aa50e8258074c8f8783ed7974e9be06787b059 /src/blocks
parent2976c25d8ccca3e102dc156eb7f212afedd4b8b8 (diff)
Add mouse scroll event
Diffstat (limited to 'src/blocks')
-rw-r--r--src/blocks/slider.c42
1 files changed, 26 insertions, 16 deletions
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 },
};