Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>
ui: draw boxes around each button and fix padding on the status bar
src/ui.c | 114 +++++++++++++++++++++++++++++++++++----------------------
diff --git a/src/ui.c b/src/ui.c index 775735aaf43dc7e3085479bd7fa3981b24072367..70f2e6d27a4e24dd90690c8c97c7d77af5b143b1 100644 --- a/src/ui.c +++ b/src/ui.c @@ -41,12 +41,12 @@ s->t = t; TickitWindow *main_window = tickit_window_new(root, (TickitRect){ - .top = 2, .left = 2, .lines = tickit_window_lines(root) - 6, + .top = 2, .left = 2, .lines = tickit_window_lines(root) - 7, .cols = tickit_window_cols(root) - 2 }, 0); TickitWindow *status_window = tickit_window_new(root, (TickitRect){ - .top = tickit_window_lines(root) - 5 + 2, .left = 2, .lines = 5, + .top = tickit_window_lines(root) - 5, .left = 2, .lines = 5, .cols = tickit_window_cols(root) - 2 }, 0); @@ -458,6 +458,50 @@ return 1; } +static void +draw_button(TickitRenderBuffer *rb, int row, int col, const char *label, int active) +{ + TickitPen *pen = tickit_pen_new_attrs( + TICKIT_PEN_BG, active ? 2 : 8, + TICKIT_PEN_FG, 15, + TICKIT_PEN_BOLD, 1, + 0 + ); + + /* + * Box-drawing characters from Unicode block U+2500-U+257F. + * To produce the same UTF-8 bytes for a character, + * spit that into either python or coreutils: + * + * printf '\u250C' | xxd | head -c9 => "e2 94 8c" + * + * Or use python: python3 -c "print('\u250c'.encode('utf-8').hex())" + * Or look up in any Unicode table under "Box Drawing" + * + * ┌───┐ (U+250C + U+2500×3 + U+2510) + * │ P │ (U+2502 + <interior> + U+2502) + * └───┘ (U+2514 + U+2500×3 + U+2518) + */ + + tickit_renderbuffer_goto(rb, row, col); + tickit_renderbuffer_text(rb, "\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90"); + + tickit_renderbuffer_goto(rb, row + 1, col); + tickit_renderbuffer_text(rb, "\xe2\x94\x82"); + + tickit_renderbuffer_savepen(rb); + tickit_renderbuffer_setpen(rb, pen); + tickit_renderbuffer_text(rb, " "); + tickit_renderbuffer_text(rb, label); + tickit_renderbuffer_text(rb, " "); + tickit_renderbuffer_restore(rb); + + tickit_renderbuffer_text(rb, "\xe2\x94\x82"); + + tickit_renderbuffer_goto(rb, row + 2, col); + tickit_renderbuffer_text(rb, "\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98"); +} + static int render_status_window(TickitWindow *win, TickitEventFlags flags, void *_info, void *data) { @@ -471,77 +515,57 @@ tickit_renderbuffer_eraserect(render_buffer, &info->rect); int r = fetch_current_status(seamus); - TickitPen *btn_pen = tickit_pen_new_attrs( - TICKIT_PEN_BG, 8, - TICKIT_PEN_FG, 15, - TICKIT_PEN_BOLD, 1, - 0 - ); + const char *pause_desc = + seamus->status->state == MPD_STATE_PLAY ? "Pause" : "Play"; - TickitPen *btn_active_pen = tickit_pen_new_attrs( - TICKIT_PEN_BG, 2, - TICKIT_PEN_FG, 15, - TICKIT_PEN_BOLD, 1, - 0 - ); + /* → is U+2192 RIGHTWARDS ARROW; same printf/Unicode-table lookup as above */ + const char *repeat_desc = + seamus->status->repeat ? "\xe2\x86\x92off" : "\xe2\x86\x92on"; + int row = 0; int col = 1; - tickit_renderbuffer_savepen(render_buffer); - tickit_renderbuffer_setpen(render_buffer, btn_pen); - tickit_renderbuffer_goto(render_buffer, 0, col); - tickit_renderbuffer_text(render_buffer, "[P]"); - tickit_renderbuffer_restore(render_buffer); - col += 5; + draw_button(render_buffer, row, col, "P", 0); + tickit_renderbuffer_goto(render_buffer, row + 3, col + 1); + tickit_renderbuffer_text(render_buffer, pause_desc); + col += 7; - tickit_renderbuffer_savepen(render_buffer); - tickit_renderbuffer_setpen(render_buffer, btn_pen); - tickit_renderbuffer_goto(render_buffer, 0, col); - tickit_renderbuffer_text(render_buffer, "[S]"); - tickit_renderbuffer_restore(render_buffer); - col += 5; + draw_button(render_buffer, row, col, "S", 0); + tickit_renderbuffer_goto(render_buffer, row + 3, col + 1); + tickit_renderbuffer_text(render_buffer, "Stop"); + col += 7; - tickit_renderbuffer_savepen(render_buffer); - tickit_renderbuffer_setpen(render_buffer, btn_pen); - tickit_renderbuffer_goto(render_buffer, 0, col); - tickit_renderbuffer_text(render_buffer, "[N]"); - tickit_renderbuffer_restore(render_buffer); - col += 5; + draw_button(render_buffer, row, col, "N", 0); + tickit_renderbuffer_goto(render_buffer, row + 3, col + 1); + tickit_renderbuffer_text(render_buffer, "Next"); + col += 7; - TickitPen *r_pen = seamus->status->repeat ? btn_active_pen : btn_pen; - tickit_renderbuffer_savepen(render_buffer); - tickit_renderbuffer_setpen(render_buffer, r_pen); - tickit_renderbuffer_goto(render_buffer, 0, col); - tickit_renderbuffer_text(render_buffer, "[R]"); - tickit_renderbuffer_restore(render_buffer); + draw_button(render_buffer, row, col, "R", seamus->status->repeat); + tickit_renderbuffer_goto(render_buffer, row + 3, col + 1); + tickit_renderbuffer_text(render_buffer, repeat_desc); if (r != 0) { log_fatal("We had some trouble"); - tickit_renderbuffer_goto(render_buffer, 1, 0); + tickit_renderbuffer_goto(render_buffer, 4, 0); { tickit_renderbuffer_savepen(render_buffer); - TickitPen *pen = tickit_pen_new_attrs( TICKIT_PEN_FG, 1, TICKIT_PEN_BOLD, 1, 0); - tickit_renderbuffer_setpen(render_buffer, pen); tickit_renderbuffer_text(render_buffer, "We had some error fetching the status"); tickit_renderbuffer_restore(render_buffer); } - } else { - tickit_renderbuffer_goto(render_buffer, 1, 0); + tickit_renderbuffer_goto(render_buffer, 4, 0); { tickit_renderbuffer_savepen(render_buffer); - TickitPen *pen = tickit_pen_new_attrs( TICKIT_PEN_FG, 4, TICKIT_PEN_BOLD, 1, 0); - tickit_renderbuffer_setpen(render_buffer, pen); tickit_renderbuffer_text(render_buffer, seamus->status->description); tickit_renderbuffer_restore(render_buffer);