diff options
| author | Federico Angelilli <code@fedang.net> | 2024-11-20 12:15:20 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-11-20 12:15:20 +0100 |
| commit | 2fd774e1c718f6654d34bc6a472ab180d3c8239d (patch) | |
| tree | 6fbc4f8f326dba6ccdb84c4e5d8913f92edd11b8 | |
| parent | eb370ad9065ce222c1bfd6ae0576b9a0f6b3de22 (diff) | |
Start working on slider block
| -rw-r--r-- | comet.conf | 15 | ||||
| -rw-r--r-- | src/block.c | 2 | ||||
| -rw-r--r-- | src/block.h | 4 | ||||
| -rw-r--r-- | src/blocks/slider.c | 128 | ||||
| -rw-r--r-- | src/event.c | 2 |
5 files changed, 147 insertions, 4 deletions
@@ -6,7 +6,7 @@ height = 40 background = #abc - blocks = date, perf, try2 + blocks = date, perf, try2, sl [jib] sus = false @@ -65,3 +65,16 @@ line-color = #fff, #000 line-width = 4 text-color = #fff + +[block.sl] + type = slider + bar-value = 10 + color = #18baf2 + bar-width = 100 + bar-height = 10 + bar-color = #afafaf + bar-line-color = #000 + bar-line-width = 2 + bar-bg-color = #fff + + diff --git a/src/block.c b/src/block.c index 25f24cd..e7cb72d 100644 --- a/src/block.c +++ b/src/block.c @@ -11,6 +11,7 @@ extern const block_scheme_t block_ram_scheme; extern const block_scheme_t block_fs_scheme; extern const block_scheme_t block_date_scheme; extern const block_scheme_t block_script_scheme; +extern const block_scheme_t block_slider_scheme; const block_scheme_t *block_schemes[] = { &block_text_scheme, @@ -19,6 +20,7 @@ const block_scheme_t *block_schemes[] = { &block_fs_scheme, &block_date_scheme, &block_script_scheme, + &block_slider_scheme, NULL, }; diff --git a/src/block.h b/src/block.h index dc1f975..715c017 100644 --- a/src/block.h +++ b/src/block.h @@ -44,7 +44,7 @@ typedef void (*block_render_t)(layout_t *layout, cairo_t *cr); // Triggered when an event is directed towards the block // -typedef void (*block_event_t)(block_t *block, event_t event); +typedef void (*block_event_t)(layout_t *layout, event_t event); // The block struct // @@ -87,7 +87,7 @@ typedef struct { block_t block; block_layout_t layout_fn; block_render_t render_fn; - block_event_t event_fn; + block_event_t event_fn; } block_spec_t; // Called to allocate a block with its default state diff --git a/src/blocks/slider.c b/src/blocks/slider.c new file mode 100644 index 0000000..708fdca --- /dev/null +++ b/src/blocks/slider.c @@ -0,0 +1,128 @@ +#include <string.h> +#include <stdio.h> +#include <assert.h> +#include <stdlib.h> + +#include "../block.h" +#include "../format.h" +#include "../any_log.h" + +typedef struct { + block_spec_t block; + unsigned int value; + unsigned int height; + unsigned int width; + unsigned int line_width; + gradient_t bar_color; + gradient_t line_color; + gradient_t bg_color; +} block_slider_t; + +static void block_slider_layout(block_t *block, layout_t *layout, layout_info_t info) +{ + block_slider_t *slider = (block_slider_t *)block; + layout->width = info.height + slider->width; +} + +static void block_slider_render(layout_t *layout, cairo_t *cr) +{ + block_slider_t *slider = (block_slider_t *)layout->block; + + int bar_y = layout->y + (layout->height - slider->height) / 2; + int bar_x = layout->x + layout->height / 2; + + cairo_matrix_t matrix; + cairo_matrix_init_scale(&matrix, 1.0 / slider->width, 1.0); + cairo_matrix_translate(&matrix, -bar_x, 0.0); + + cairo_pattern_t *pattern = slider->bg_color.pattern; + if (pattern != NULL) { + cairo_rectangle(cr, bar_x, bar_y, slider->width, slider->height); + + cairo_pattern_set_matrix(pattern, &matrix); + cairo_set_source(cr, pattern); + cairo_fill(cr); + } + + pattern = slider->bar_color.pattern; + if (pattern != NULL) { + cairo_rectangle(cr, bar_x, bar_y, slider->width * (slider->value / 100.0), slider->height); + + cairo_pattern_set_matrix(pattern, &matrix); + cairo_set_source(cr, pattern); + cairo_fill(cr); + } + + pattern = slider->line_color.pattern; + if (pattern != NULL) { + cairo_rectangle(cr, bar_x, bar_y, slider->width, slider->height); + + cairo_pattern_set_matrix(pattern, &matrix); + cairo_set_source(cr, pattern); + cairo_set_line_width(cr, slider->line_width); + cairo_stroke(cr); + } +} + +static void block_slider_event(layout_t *layout, event_t event) +{ + block_slider_t *slider = (block_slider_t *)layout->block; + + int bar_x = layout->x + layout->height / 2; + int bar_y = layout->y + (layout->height - slider->height) / 2; + + log_value_debug("Clicked slider", + "i:bar_x", bar_x, + "i:bar_y", bar_y, + "i:bar_width", slider->width, + "i:bar_height", slider->height, + "i:value", slider->value); +} + +static void block_slider_init(block_t *block, const block_scheme_t *scheme) +{ + block->type = BLOCK_SPEC; + + block_spec_t *spec = (block_spec_t *)block; + spec->layout_fn = block_slider_layout; + spec->render_fn = block_slider_render; + spec->event_fn = block_slider_event; +} + +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); +} + +static int block_slider_validate(block_t *block, const block_scheme_t *scheme) +{ + //block_slider_t *slider = (block_slider_t *)block; + int errors = 0; + // TODO + + return errors; +} + +static const config_entry_t block_slider_entries[] = { + // TODO: Ugly names + { "bar-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, bar_color) }, + { "bar-line-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, line_color) }, + { "bar-bg-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, bg_color) }, + { "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) }, + { 0 }, +}; + +const block_scheme_t block_slider_scheme = { + .name = "slider", + .entries = block_slider_entries, + .size = sizeof(block_slider_t), + .init_fn = block_slider_init, + .clean_fn = block_slider_clean, + .validate_fn = block_slider_validate, +}; diff --git a/src/event.c b/src/event.c index 1aaf603..65e3628 100644 --- a/src/event.c +++ b/src/event.c @@ -48,7 +48,7 @@ static bool event_click(layout_t *layout, event_t event) "b:callback", event_fn != NULL); if (event_fn != NULL) { - event_fn(layout->block, event); + event_fn(layout, event); log_trace("Completed event callback"); } |
