diff --git a/src/screen_artist.c b/src/screen_artist.c
index 71be6f408603f67596307b2ac3cad59b47f2e786..03b4fed421ab69165d61a4776f750f389e834875 100644 (file)
--- a/src/screen_artist.c
+++ b/src/screen_artist.c
-/*
- * $Id$
- *
+/*
* (c) 2005 by Kalle Wallin <kaw@linux.se>
*
* This program is free software; you can redistribute it and/or modify
*
*/
-#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 */
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);
mode = LIST_ARTISTS;
}
metalist_length = g_list_length(metalist);
- browser.lw->clear = TRUE;
}
/* db updated */
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
}
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 *
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);
}
}
+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:
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:
update_metalist(c, g_strdup(artist), g_strdup(selected));
list_window_push_state(browser.lw_state, browser.lw);
}
+
+ artist_repaint();
break;
case LIST_SONGS:
/* 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;
list_window_pop_state(browser.lw_state, browser.lw);
break;
}
+
+ artist_repaint();
break;
case CMD_GO_ROOT_DIRECTORY:
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;
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;
/* 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;
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);
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;
}
.open = open,
.resize = resize,
.paint = paint,
- .update = update,
.cmd = artist_cmd,
.get_title = get_title,
};
-
-#endif /* ENABLE_ARTIST_SCREEN */