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