aboutsummaryrefslogtreecommitdiff
path: root/src/blocks
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-11-22 01:44:04 +0100
committerFederico Angelilli <code@fedang.net>2024-11-22 01:44:04 +0100
commit713084a48649a7aa0c40ea6d6163f0def3dcd82c (patch)
treef26a79894dc0490c1a662c5eb634ad28397f8446 /src/blocks
parentb4d57d18b858824d0f5bde061d79c8f578630072 (diff)
Add slider knob
Diffstat (limited to 'src/blocks')
-rw-r--r--src/blocks/slider.c96
1 files changed, 87 insertions, 9 deletions
diff --git a/src/blocks/slider.c b/src/blocks/slider.c
index b01ddb7..f80c71b 100644
--- a/src/blocks/slider.c
+++ b/src/blocks/slider.c
@@ -7,6 +7,17 @@
#include "../format.h"
#include "../any_log.h"
+typedef enum {
+ KNOB_NONE,
+ KNOB_CIRCLE,
+ //KNOB_CAPSULE,
+ KNOB_TRIANGLE,
+ //KNOB_TRIANGLE_UP,
+ //KNOB_TRIANGLE_DOWN,
+ //KNOB_TRIANGLE_LEFT,
+ //KNOB_TRIANGLE_RIGHT,
+} block_slider_knob_t;
+
typedef struct {
block_spec_t block;
int value;
@@ -17,6 +28,13 @@ typedef struct {
gradient_t line_color;
gradient_t bg_color;
bool seekable;
+ block_slider_knob_t knob;
+ unsigned int knob_height;
+ unsigned int knob_line_width;
+ int knob_x_offset;
+ int knob_y_offset;
+ gradient_t knob_color;
+ gradient_t knob_line_color;
} block_slider_t;
static void block_slider_layout(block_t *block, layout_t *layout, layout_info_t info)
@@ -29,7 +47,7 @@ static void block_slider_render(layout_t *layout, cairo_t *cr)
{
block_slider_t *slider = (block_slider_t *)layout->block;
- const int radius = slider->height / 2;
+ int radius = slider->height / 2;
int bar_y = layout->y + (layout->height - slider->height) / 2;
int bar_x = layout->x + (layout->width - slider->width) / 2;
@@ -66,6 +84,51 @@ static void block_slider_render(layout_t *layout, cairo_t *cr)
cairo_set_line_width(cr, slider->line_width);
cairo_stroke(cr);
}
+
+ if (slider->knob == KNOB_NONE) return;
+
+ int knob_height = slider->knob_height != 0 ? slider->knob_height : slider->height;
+ int knob_radius = knob_height / 2;
+
+ const double sqrt3 = 1.7320508075688772;
+ int knob_width = slider->knob == KNOB_TRIANGLE
+ ? (knob_height * sqrt3) / 2.0
+ : knob_height;
+
+ // FIXME
+ int current = (slider->width - knob_width) * slider->value / 100.0;
+
+ int knob_x = bar_x + slider->knob_x_offset + current;
+ int knob_y = bar_y + slider->knob_y_offset + radius - knob_radius;
+
+ pattern = slider->knob_color.pattern;
+ if (pattern != NULL) {
+
+ if (slider->knob == KNOB_TRIANGLE)
+ render_triangle(cr, knob_x, knob_y, knob_width, knob_height);
+ else if (slider->knob == KNOB_CIRCLE)
+ render_capsule(cr, knob_x, knob_y, knob_width, knob_radius, knob_radius);
+
+ cairo_pattern_set_matrix(pattern, &matrix);
+ cairo_set_source(cr, pattern);
+ cairo_fill(cr);
+ }
+
+ pattern = slider->knob_line_color.pattern;
+ if (pattern != NULL) {
+ int line_radius = knob_radius - slider->knob_line_width / 2;
+
+ if (slider->knob == KNOB_TRIANGLE)
+ render_triangle(cr, knob_x, knob_y, knob_width, knob_height);
+ else if (slider->knob == KNOB_CIRCLE)
+ render_capsule(cr, knob_x, knob_y, knob_width, knob_radius, line_radius);
+
+
+ cairo_pattern_set_matrix(pattern, &matrix);
+ cairo_set_source(cr, pattern);
+ cairo_set_line_width(cr, slider->knob_line_width);
+ cairo_stroke(cr);
+ }
}
static void block_slider_event(layout_t *layout, event_t event)
@@ -127,16 +190,31 @@ static int block_slider_validate(block_t *block, const block_scheme_t *scheme)
return errors;
}
+static config_enum_t knob_shape_enum[] = {
+ { "none", KNOB_NONE },
+ { "circle", KNOB_CIRCLE },
+ //{ "capsule", KNOB_CAPSULE },
+ { "triangle", KNOB_TRIANGLE },
+ { 0 },
+};
+
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_INT, NULL, offsetof(block_slider_t, value) },
- { "seekable", CONFIG_BOOL, NULL, offsetof(block_slider_t, seekable) },
+ { "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_INT, NULL, offsetof(block_slider_t, value) },
+ { "seekable", CONFIG_BOOL, NULL, offsetof(block_slider_t, seekable) },
+ { "knob", CONFIG_ENUM, knob_shape_enum, offsetof(block_slider_t, knob) },
+ { "knob-height", CONFIG_UINT, NULL, offsetof(block_slider_t, knob_height) },
+ { "knob-line-width", CONFIG_UINT, NULL, offsetof(block_slider_t, knob_line_width) },
+ { "knob-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, knob_color) },
+ { "knob-line-color", CONFIG_GRADIENT, NULL, offsetof(block_slider_t, knob_line_color) },
+ { "knob-x-offset", CONFIG_INT, NULL, offsetof(block_slider_t, knob_x_offset) },
+ { "knob-y-offset", CONFIG_INT, NULL, offsetof(block_slider_t, knob_y_offset) },
{ 0 },
};