From fe3ed50e1da2bb4ced3172e86a3b244a9c3d4f1c Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Fri, 17 Nov 2023 17:48:03 +0100 Subject: Add buttons and update draw --- src/draw.c | 70 ++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 20 deletions(-) (limited to 'src/draw.c') diff --git a/src/draw.c b/src/draw.c index aed4da0..4362950 100644 --- a/src/draw.c +++ b/src/draw.c @@ -5,6 +5,7 @@ #include #include "draw.h" +#include "button.h" #include "log.h" // Idea: Either make a to_draw queue where we put things we schedule to redraw @@ -68,56 +69,85 @@ void draw_paint(Drawable *draw, Window *win) cairo_paint(cr); - cairo_set_line_width(cr, 1 * scale); + int line_w = 1 * scale; + cairo_set_line_width(cr, line_w); - for (int i = 0; i < 9; i++) { + int bx = 0; - PangoLayout *layout = pango_cairo_create_layout (cr); + for (GList *it = draw->btns; it; it = it->next) { + Button *btn = it->data; + + PangoLayout *layout = pango_cairo_create_layout(cr); pango_layout_set_font_description(layout, draw->desc); - int x = (height + cairo_get_line_width(cr) * scale * 2) * i; + int bwidth, bheight = height; + char *btn_text = btn->text; + char tmp[2] = { 0 }; + + if (btn->fixed_size) { + bwidth = height; + // Get only the first char + tmp[0] = btn->text[0]; + btn_text = tmp; + } + + pango_layout_set_text(layout, btn_text, -1); + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + + int text_w, text_h; + pango_layout_get_pixel_size(layout, &text_w, &text_h); + text_w = ceil(text_w / scale); + text_h = ceil(text_h / scale); + + if (!btn->fixed_size) { + bwidth = text_w + 2*radius; + } + + int text_x = bx + (bwidth / 2) - (text_w / 2); + int text_y = (bheight / 2) - (text_h / 2); // purple cairo_set_source_rgba(cr, 0.502, 0.168, 0.886, 1); - cairo_arc(cr, x + radius, radius, radius, 0 * degree, 360 * degree); + cairo_new_sub_path(cr); + cairo_arc(cr, bx + radius, radius, radius, 90 * degree, 270 * degree); + cairo_arc(cr, bx + bwidth - radius, radius, radius, 270 * degree, 450 * degree); + cairo_close_path(cr); cairo_fill(cr); cairo_set_source_rgba(cr, 0.8, 0.8, 0.8, 1); - cairo_arc(cr, x + radius, radius, radius - 1, 0 * degree, 360 * degree); + cairo_new_sub_path(cr); + cairo_arc(cr, bx + radius, radius, radius - line_w , 90 * degree, 270 * degree); + cairo_arc(cr, bx + bwidth - radius, radius, radius - line_w, 270 * degree, 450 * degree); + cairo_close_path(cr); cairo_stroke(cr); cairo_set_source_rgb(cr, 0.8, 0.8, 0.8); - char btn[] = { '1' + i, '\0' }; - pango_layout_set_text(layout, btn, -1); - - int text_w, text_h; - pango_layout_get_pixel_size(layout, &text_w, &text_h); - text_w = ceil(text_w / scale); - text_h = ceil(text_h / scale); - - int text_x = x + radius - (text_w / 2); - int text_y = radius - (text_h / 2); cairo_move_to(cr, text_x, text_y); pango_cairo_update_layout(cr, layout); pango_cairo_show_layout(cr, layout); g_object_unref(layout); + + int sep = 10 * scale; + bx += height + line_w * 2 + sep; } cairo_destroy(cr); - int x = draw->left_pad; - int y = draw->top_pad; - // TODO: Move these somewhere else - window_move(win, x, y); + window_move(win, draw->left_pad, draw->top_pad); window_resize(win, width0, draw->height); window_paint_surface(win, surface, width, height); cairo_surface_destroy(surface); } +void draw_set_buttons(Drawable *draw, GList *btns) +{ + draw->btns = btns; +} + void draw_destroy(Drawable *draw) { pango_font_description_free(draw->desc); -- cgit v1.2.3