seamus

commit 0eecc8581fafa9f733914ac2c6fc08a9bb01e0c4

Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>

ui: map enums, prep work for the library view/switching windows

Also some general clean up, code organization, etc

 include/seamus.h | 16 +++++++
 src/ui.c | 108 +++++++++++++++++++++++++++++++++++++++----------


diff --git a/include/seamus.h b/include/seamus.h
index 552f107a484c9c420670091f1babbbdad25d58a9..0e19c5c68b5c69f68b4780ca5d2f2c6c827c09f8 100644
--- a/include/seamus.h
+++ b/include/seamus.h
@@ -32,6 +32,22 @@ };
 
 enum window_type {
 	WINDOW_QUEUE,
+	WINDOW_LIBRARY,
+};
+
+enum key_code {
+	KEY_NONE,
+	KEY_QUIT,
+	KEY_SCROLL_DOWN,
+	KEY_SCROLL_UP,
+	KEY_ENTER,
+	KEY_PAGE_DOWN,
+	KEY_PAGE_UP,
+	KEY_END,
+	KEY_GOTO_END,
+	KEY_HOME,
+	KEY_GOTO_START,
+	KEY_SWITCH_MODE,
 };
 
 struct seamus_frontend {




diff --git a/src/ui.c b/src/ui.c
index 00f42e33bd84aeddf89d0ed8a616e237c3c3b241..a19d1cf7448db3368d882ba13c59658f4ee2649d 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -7,16 +7,19 @@
 #define QUEUE_START_LINE 4
 
 static int on_key_event(TickitTerm *tt, TickitEventFlags flags, void *_info, void *data);
+static enum key_code key_from_string(const char *str);
 static int toggle_playing_status(struct seamus_frontend *seamus);
 static int update_scroll_position(struct seamus_frontend *seamus, int direction);
 static int scroll_page(struct seamus_frontend *seamus, int direction);
 static int scroll_to_extremes(struct seamus_frontend *seamus, int home);
+static int switch_window(struct seamus_frontend *seamus);
 static int update_status(Tickit *t, TickitEventFlags flags, void *_info, void *data);
 static int update_main_window(Tickit *t, TickitEventFlags flags, void *_info, void *data);
 static int render_root(TickitWindow *win, TickitEventFlags flags, void *_info, void *data);
 static int render_status_window(TickitWindow *win, TickitEventFlags flags, void *_info, void *data);
 static int render_main_window(TickitWindow *win, TickitEventFlags flags, void *_info, void *data);
 static int render_queue(struct seamus_frontend *seamus, TickitRenderBuffer *render_buffer);
+static int render_library(struct seamus_frontend *seamus, TickitRenderBuffer *render_buffer);
 
 int
 tickit_init(struct seamus_frontend *s)
@@ -80,6 +83,23 @@
 	return 0;
 }
 
+static enum key_code
+key_from_string(const char *str)
+{
+	if (strcmp(str, "q") == 0) return KEY_QUIT;
+	if (strcmp(str, "j") == 0 || strcmp(str, "Down") == 0) return KEY_SCROLL_DOWN;
+	if (strcmp(str, "k") == 0 || strcmp(str, "Up") == 0) return KEY_SCROLL_UP;
+	if (strcmp(str, "Enter") == 0) return KEY_ENTER;
+	if (strcmp(str, "PageDown") == 0) return KEY_PAGE_DOWN;
+	if (strcmp(str, "PageUp") == 0) return KEY_PAGE_UP;
+	if (strcmp(str, "End") == 0) return KEY_END;
+	if (strcmp(str, "G") == 0) return KEY_GOTO_END;
+	if (strcmp(str, "Home") == 0) return KEY_HOME;
+	if (strcmp(str, "g") == 0) return KEY_GOTO_START;
+	if (strcmp(str, "Tab") == 0) return KEY_SWITCH_MODE;
+	return KEY_NONE;
+}
+
 static int
 on_key_event(TickitTerm *tt, TickitEventFlags flags, void *_info, void *data)
 {
@@ -88,44 +108,58 @@ 	(void)flags;
 	TickitKeyEventInfo *info = _info;
 
 	struct seamus_frontend *seamus = (struct seamus_frontend*) data;
-	const char *key_pressed = info->str;
-
-	// TODO: Replace those with enums
-	if (strcmp(key_pressed, "q") == 0) {
-		tickit_window_close(seamus->main_window);
-		tickit_window_close(seamus->status_window);
+	enum key_code key = key_from_string(info->str);
 
+	switch (key) {
+	case KEY_QUIT:
 		tickit_stop(seamus->t);
-	} else if (strcmp(key_pressed, "j") == 0 || strcmp(key_pressed, "Down") == 0) {
+		return 1;
+
+	case KEY_SCROLL_DOWN:
 		log_info("Scroll down");
-
 		update_scroll_position(seamus, +1);
-	} else if (strcmp(key_pressed, "k") == 0 || strcmp(key_pressed, "Up") == 0) {
+		break;
+
+	case KEY_SCROLL_UP:
 		log_info("Scroll up");
+		update_scroll_position(seamus, -1);
+		break;
 
-		update_scroll_position(seamus, -1);
-	} else if (strcmp(key_pressed, "Enter") == 0) {
+	case KEY_ENTER:
 		log_info("Pressed enter");
+		toggle_playing_status(seamus);
+		break;
 
-		toggle_playing_status(seamus);
-	} else if (strcmp(key_pressed, "PageDown") == 0) {
+	case KEY_PAGE_DOWN:
 		log_info("Page down");
-
 		scroll_page(seamus, +1);
-	} else if (strcmp(key_pressed, "PageUp") == 0) {
-		log_info("Page up");
+		break;
 
+	case KEY_PAGE_UP:
+		log_info("Page up");
 		scroll_page(seamus, -1);
-	} else if (strcmp(key_pressed, "End") == 0 || (strcmp(key_pressed, "G") == 0)) {
-		log_info("Go to end");
+		break;
 
+	case KEY_END:
+	case KEY_GOTO_END:
+		log_info("Go to end");
 		scroll_to_extremes(seamus, 0);
-	} else if (strcmp(key_pressed, "Home") == 0 || strcmp(key_pressed, "g") == 0) {
-		log_info("Go to start");
+		break;
 
+	case KEY_HOME:
+	case KEY_GOTO_START:
+		log_info("Go to start");
 		scroll_to_extremes(seamus, 1);
-	} else {
-		log_info("Pressed something else %s", key_pressed);
+		break;
+
+	case KEY_SWITCH_MODE:
+		switch_window(seamus);
+		break;
+
+	case KEY_NONE:
+	default:
+		log_info("Pressed something else %s", info->str);
+		break;
 	}
 
 	return 1;
@@ -235,6 +269,17 @@ 	return 0;
 }
 
 static int
+switch_window(struct seamus_frontend *seamus)
+{
+	seamus->current_window++;
+	if (seamus->current_window > WINDOW_LIBRARY)
+		seamus->current_window = WINDOW_QUEUE;
+
+	tickit_window_expose(seamus->main_window, NULL);
+	return 0;
+}
+
+static int
 update_status(Tickit *t, TickitEventFlags flags, void *_info, void *data)
 {
 	(void)flags;
@@ -371,7 +416,14 @@ 			fetch_current_queue(seamus);
 		}
 
 		log_info("Rendering queue again");
-		render_queue(seamus, render_buffer);
+		switch (seamus->current_window) {
+		case WINDOW_QUEUE:
+			render_queue(seamus, render_buffer);
+			break;
+		case WINDOW_LIBRARY:
+			render_library(seamus, render_buffer);
+			break;
+		}
 	}
 
 	return 1;
@@ -428,6 +480,16 @@ 		}
 
 		free(song_str);
 	}
+
+	return 0;
+}
+
+static int
+render_library(struct seamus_frontend *seamus, TickitRenderBuffer *render_buffer)
+{
+	(void)seamus;
+	tickit_renderbuffer_goto(render_buffer, QUEUE_START_LINE, 0);
+	tickit_renderbuffer_text(render_buffer, "Library — not yet implemented");
 
 	return 0;
 }