Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>
ui: render a progress bar
src/ui.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++--------
diff --git a/src/ui.c b/src/ui.c index 26b29ebb0c898871729d4ee3cfb86cbc2314796d..4c8eb8aafc239a7a3bb344b70965704ff5a58535 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1,10 +1,11 @@ #include <assert.h> #include <stdio.h> +#include <string.h> #include "ui.h" #include "queue.h" #include "status.h" -#define QUEUE_START_LINE 4 +#define QUEUE_START_LINE 5 static int on_key_event(TickitTerm *tt, TickitEventFlags flags, void *_info, void *data); static enum key_code key_from_string(const char *str); @@ -39,9 +40,12 @@ } s->t = t; + int root_lines = tickit_window_lines(root); + int root_cols = tickit_window_cols(root); + TickitWindow *main_window = tickit_window_new(root, (TickitRect){ - .top = 2, .left = 2, .lines = tickit_window_lines(root) - 7, - .cols = tickit_window_cols(root) - 2 + .top = 2, .left = 2, .lines = root_lines - 9, + .cols = root_cols - 2 }, 0); if (!main_window) { @@ -50,8 +54,8 @@ return 1; } TickitWindow *status_window = tickit_window_new(root, (TickitRect){ - .top = tickit_window_lines(root) - 5, .left = 2, .lines = 5, - .cols = tickit_window_cols(root) - 2 + .top = root_lines - 7, .left = 2, .lines = 8, + .cols = root_cols - 2 }, 0); if (!status_window) { @@ -416,7 +420,6 @@ static int toggle_repeat(struct seamus_frontend *seamus) { - // TODO: Rig which next mode will it'll be if (!mpd_run_repeat(seamus->conn, !seamus->status->repeat)) { log_error("Failed to toggle repeat"); return 1; @@ -529,14 +532,52 @@ tickit_renderbuffer_eraserect(render_buffer, &info->rect); int r = fetch_current_status(seamus); + // Progress bar + if (seamus->status) { + int bar_width = tickit_window_cols(win); + if (bar_width > 60) bar_width = 40; + if (bar_width < 10) bar_width = 10; + + int filled = 0; + + if (seamus->status->total_time > 0) { + filled = (int) ((double)seamus->status->elapsed_time / + seamus->status->total_time * bar_width); + } + + if (filled > bar_width) { + filled = bar_width; + } + + tickit_renderbuffer_goto(render_buffer, 1, 0); + + tickit_renderbuffer_savepen(render_buffer); + + TickitPen *bar_pen = tickit_pen_new_attrs( + TICKIT_PEN_FG, 6, + 0); + + tickit_renderbuffer_setpen(render_buffer, bar_pen); + + for (int i = 0; i < filled; i++) { + tickit_renderbuffer_text(render_buffer, "\xe2\x96\x88"); + } + + for (int i = filled; i < bar_width; i++) { + tickit_renderbuffer_text(render_buffer, "\xe2\x96\x91"); + } + + tickit_renderbuffer_restore(render_buffer); + } + const char *pause_desc = seamus->status->state == MPD_STATE_PLAY ? "Pause" : "Play"; - /* → is U+2192 RIGHTWARDS ARROW; same printf/Unicode-table lookup as above */ + // → 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 row = 3; int col = 1; draw_button(render_buffer, row, col, "P", 0); @@ -561,25 +602,30 @@ if (r != 0) { log_fatal("We had some trouble"); - tickit_renderbuffer_goto(render_buffer, 4, 0); + tickit_renderbuffer_goto(render_buffer, 6, 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, 4, 0); + tickit_renderbuffer_goto(render_buffer, 6, 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);