Code

screen_artist: moved code to artist_lw_cmd()
[ncmpc.git] / src / screen_artist.c
index 71be6f408603f67596307b2ac3cad59b47f2e786..03b4fed421ab69165d61a4776f750f389e834875 100644 (file)
@@ -1,6 +1,4 @@
-/* 
- * $Id$
- *
+/*
  * (c) 2005 by Kalle Wallin <kaw@linux.se>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -18,9 +16,6 @@
  *
  */
 
-#include "config.h"
-
-#ifndef DISABLE_ARTIST_SCREEN
 #include "ncmpc.h"
 #include "options.h"
 #include "support.h"
@@ -82,11 +77,30 @@ artist_lw_callback(unsigned idx, mpd_unused int *highlight, mpd_unused void *dat
        return buf;
 }
 
+static void
+paint(mpdclient_t *c);
+
+static void
+artist_repaint(void)
+{
+       paint(NULL);
+       wrefresh(browser.lw->w);
+}
+
+static void
+artist_repaint_if_active(void)
+{
+       if (screen_is_visible(&screen_artist))
+               artist_repaint();
+}
+
 /* the playlist have been updated -> fix highlights */
 static void
 playlist_changed_callback(mpdclient_t *c, int event, gpointer data)
 {
        browser_playlist_changed(&browser, c, event, data);
+
+       artist_repaint_if_active();
 }
 
 /* fetch artists/albums/songs from mpd */
@@ -121,6 +135,9 @@ update_metalist(mpdclient_t *c, char *m_artist, char *m_album)
                                mpdclient_filelist_search_utf8(c, TRUE,
                                                               MPD_TABLE_ALBUM,
                                                               album);
+               if (browser.filelist == NULL)
+                       browser.filelist = filelist_new(NULL);
+
                /* add a dummy entry for ".." */
                filelist_prepend(browser.filelist, NULL);
 
@@ -149,7 +166,6 @@ update_metalist(mpdclient_t *c, char *m_artist, char *m_album)
                mode = LIST_ARTISTS;
        }
        metalist_length = g_list_length(metalist);
-       browser.lw->clear = TRUE;
 }
 
 /* db updated */
@@ -159,13 +175,13 @@ browse_callback(mpdclient_t *c, int event, mpd_unused gpointer data)
        switch(event) {
        case BROWSE_DB_UPDATED:
                D("screen_artist.c> browse_callback() [BROWSE_DB_UPDATED]\n");
-               browser.lw->clear = 1;
-               browser.lw->repaint = 1;
                update_metalist(c, g_strdup(artist), g_strdup(album));
                break;
        default:
                break;
        }
+
+       artist_repaint_if_active();
 }
 
 static void
@@ -213,35 +229,17 @@ resize(int cols, int rows)
 }
 
 static void
-paint(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c)
+paint(mpd_unused mpdclient_t *c)
 {
-       browser.lw->clear = 1;
-
        if (browser.filelist) {
                list_window_paint(browser.lw, browser_lw_callback,
                                  browser.filelist);
-               browser.filelist->updated = FALSE;
        } else if (metalist) {
                list_window_paint(browser.lw, artist_lw_callback, metalist);
        } else {
                wmove(browser.lw->w, 0, 0);
                wclrtobot(browser.lw->w);
        }
-
-       wnoutrefresh(browser.lw->w);
-}
-
-static void
-update(screen_t *screen, mpdclient_t *c)
-{
-       if (browser.filelist && !browser.filelist->updated)
-               list_window_paint(browser.lw, browser_lw_callback,
-                                 browser.filelist);
-       else if (metalist)
-               list_window_paint(browser.lw, artist_lw_callback, metalist);
-       else
-               paint(screen, c);
-       wnoutrefresh(browser.lw->w);
 }
 
 static const char *
@@ -272,6 +270,8 @@ add_query(mpdclient_t *c, int table, char *_filter)
        char *str;
        mpdclient_filelist_t *addlist;
 
+       assert(filter != NULL);
+
        str = utf8_to_locale(_filter);
        if (table== MPD_TABLE_ALBUM)
                screen_status_printf("Adding album %s...", str);
@@ -286,10 +286,35 @@ add_query(mpdclient_t *c, int table, char *_filter)
        }
 }
 
+static int
+artist_lw_cmd(command_t cmd)
+{
+       switch (mode) {
+       case LIST_ARTISTS:
+       case LIST_ALBUMS:
+               return list_window_cmd(browser.lw, metalist_length, cmd);
+
+       case LIST_SONGS:
+               return list_window_cmd(browser.lw,
+                                      filelist_length(browser.filelist),
+                                      cmd);
+       }
+
+       assert(0);
+       return 0;
+}
+
 static int
 artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
 {
        char *selected;
+       int ret;
+
+       if (artist_lw_cmd(cmd)) {
+               artist_repaint();
+               wrefresh(browser.lw->w);
+               return 1;
+       }
 
        switch(cmd) {
        case CMD_PLAY:
@@ -299,6 +324,9 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                                                            browser.lw->selected);
                        update_metalist(c, g_strdup(selected), NULL);
                        list_window_push_state(browser.lw_state, browser.lw);
+
+                       list_window_paint(browser.lw, artist_lw_callback, metalist);
+                       wrefresh(browser.lw->w);
                        break;
 
                case LIST_ALBUMS:
@@ -320,6 +348,8 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                                update_metalist(c, g_strdup(artist), g_strdup(selected));
                                list_window_push_state(browser.lw_state, browser.lw);
                        }
+
+                       artist_repaint();
                        break;
 
                case LIST_SONGS:
@@ -331,6 +361,9 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                                /* restore previous list window state */
                                list_window_pop_state(browser.lw_state,
                                                      browser.lw);
+
+                               list_window_paint(browser.lw, artist_lw_callback, metalist);
+                               wrefresh(browser.lw->w);
                        } else
                                browser_handle_enter(&browser, c);
                        break;
@@ -359,6 +392,8 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                        list_window_pop_state(browser.lw_state, browser.lw);
                        break;
                }
+
+               artist_repaint();
                break;
 
        case CMD_GO_ROOT_DIRECTORY:
@@ -374,13 +409,19 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                        while(list_window_pop_state(browser.lw_state, browser.lw));
                        break;
                }
+
+               artist_repaint();
                break;
 
        case CMD_SELECT:
+       case CMD_ADD:
                switch(mode) {
                case LIST_ARTISTS:
                        selected = g_list_nth_data(metalist,
                                                   browser.lw->selected);
+                       if (selected == NULL)
+                               return 1;
+
                        add_query(c, MPD_TABLE_ARTIST, selected);
                        cmd = CMD_LIST_NEXT; /* continue and select next item... */
                        break;
@@ -392,13 +433,19 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                        else if (browser.lw->selected > 0) {
                                selected = g_list_nth_data(metalist,
                                                           browser.lw->selected);
+                               if (selected == NULL)
+                                       return 1;
+
                                add_query(c, MPD_TABLE_ALBUM, selected);
                                cmd = CMD_LIST_NEXT; /* continue and select next item... */
                        }
                        break;
 
                case LIST_SONGS:
-                       if (browser_handle_select(&browser, c) == 0)
+                       ret = cmd == CMD_SELECT
+                               ? browser_handle_select(&browser, c)
+                               : browser_handle_add(&browser, c);
+                       if (ret == 0)
                                /* continue and select next item... */
                                cmd = CMD_LIST_NEXT;
                        break;
@@ -407,9 +454,6 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
 
                /* continue and update... */
        case CMD_SCREEN_UPDATE:
-               screen->painted = 0;
-               browser.lw->clear = 1;
-               browser.lw->repaint = 1;
                update_metalist(c, g_strdup(artist), g_strdup(album));
                screen_status_printf(_("Screen updated!"));
                return 0;
@@ -419,17 +463,20 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
        case CMD_LIST_FIND_NEXT:
        case CMD_LIST_RFIND_NEXT:
                if (browser.filelist)
-                       return screen_find(screen,
-                                          browser.lw, filelist_length(browser.filelist),
-                                          cmd, browser_lw_callback,
-                                          browser.filelist);
+                       screen_find(screen,
+                                   browser.lw, filelist_length(browser.filelist),
+                                   cmd, browser_lw_callback,
+                                   browser.filelist);
                else if (metalist)
-                       return screen_find(screen,
-                                          browser.lw, metalist_length,
-                                          cmd, artist_lw_callback, metalist);
+                       screen_find(screen,
+                                   browser.lw, metalist_length,
+                                   cmd, artist_lw_callback, metalist);
                else
                        return 1;
 
+               artist_repaint();
+               return 1;
+
        case CMD_MOUSE_EVENT:
                return browser_handle_mouse_event(&browser, c);
 
@@ -437,11 +484,6 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
                break;
        }
 
-       if (browser.filelist)
-               return list_window_cmd(browser.lw, filelist_length(browser.filelist), cmd);
-       else if (metalist)
-               return list_window_cmd(browser.lw, metalist_length, cmd);
-
        return 0;
 }
 
@@ -451,9 +493,6 @@ const struct screen_functions screen_artist = {
        .open = open,
        .resize = resize,
        .paint = paint,
-       .update = update,
        .cmd = artist_cmd,
        .get_title = get_title,
 };
-
-#endif /* ENABLE_ARTIST_SCREEN */