seamus

commit 6cc2aff94c4f1407182bcd412d15b2d03f2d9979

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);