diff --git a/src/screen_browser.c b/src/screen_browser.c
index a2204f9e92aa5da4afbe73eecd652614c68370c0..dd97bb22f0f91815dd1e8eda326db64f72ad6dfb 100644 (file)
--- a/src/screen_browser.c
+++ b/src/screen_browser.c
*/
#include "screen_browser.h"
+#include "screen_file.h"
+#include "screen_song.h"
+#include "screen_lyrics.h"
+#include "screen_message.h"
+#include "screen_find.h"
+#include "screen.h"
#include "i18n.h"
#include "options.h"
#include "charset.h"
#include "strfsong.h"
-#include "screen_utils.h"
#include "mpdclient.h"
#include "filelist.h"
#ifndef NCMPC_MINI
-/* clear the highlight flag for all items in the filelist */
-static void
-clear_highlights(struct filelist *fl)
-{
- guint i;
-
- for (i = 0; i < filelist_length(fl); ++i) {
- struct filelist_entry *entry = filelist_get(fl, i);
-
- entry->flags &= ~HIGHLIGHT;
- }
-}
-
-/* change the highlight flag for a song */
-static void
-set_highlight(struct filelist *fl, struct mpd_song *song, int highlight)
-{
- int i = filelist_find_song(fl, song);
- struct filelist_entry *entry;
-
- if (i < 0)
- return;
-
- entry = filelist_get(fl, i);
- if (highlight)
- entry->flags |= HIGHLIGHT;
- else
- entry->flags &= ~HIGHLIGHT;
-}
-
/* sync highlight flags with playlist */
void
-sync_highlights(struct mpdclient *c, struct filelist *fl)
+screen_browser_sync_highlights(struct filelist *fl,
+ const struct mpdclient_playlist *playlist)
{
guint i;
for (i = 0; i < filelist_length(fl); ++i) {
struct filelist_entry *entry = filelist_get(fl, i);
- struct mpd_entity *entity = entry->entity;
+ const struct mpd_entity *entity = entry->entity;
if (entity != NULL && mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) {
const struct mpd_song *song =
mpd_entity_get_song(entity);
- if (playlist_get_index_from_same_song(&c->playlist,
+ if (playlist_get_index_from_same_song(playlist,
song) >= 0)
entry->flags |= HIGHLIGHT;
else
}
}
-/* the playlist has been updated -> fix highlights */
-void
-browser_playlist_changed(struct screen_browser *browser, struct mpdclient *c,
- int event, gpointer data)
-{
- if (browser->filelist == NULL)
- return;
-
- switch(event) {
- case PLAYLIST_EVENT_CLEAR:
- clear_highlights(browser->filelist);
- break;
- case PLAYLIST_EVENT_ADD:
- set_highlight(browser->filelist, (struct mpd_song *) data, 1);
- break;
- case PLAYLIST_EVENT_DELETE:
- set_highlight(browser->filelist, (struct mpd_song *) data, 0);
- break;
- case PLAYLIST_EVENT_MOVE:
- break;
- default:
- sync_highlights(c, browser->filelist);
- break;
- }
-}
-
#endif
/* list_window callback */
const char *
browser_lw_callback(unsigned idx, bool *highlight, G_GNUC_UNUSED char **second_column, void *data)
{
- struct filelist *fl = (struct filelist *) data;
+ const struct filelist *fl = (const struct filelist *) data;
static char buf[BUFSIZE];
- struct filelist_entry *entry;
- struct mpd_entity *entity;
+ const struct filelist_entry *entry;
+ const struct mpd_entity *entity;
if (fl == NULL || idx >= filelist_length(fl))
return NULL;
@@ -175,11 +125,16 @@ browser_lw_callback(unsigned idx, bool *highlight, G_GNUC_UNUSED char **second_c
static bool
load_playlist(struct mpdclient *c, const struct mpd_playlist *playlist)
{
+ struct mpd_connection *connection = mpdclient_get_connection(c);
char *filename = utf8_to_locale(mpd_playlist_get_path(playlist));
- if (mpdclient_cmd_load_playlist(c, mpd_playlist_get_path(playlist)) == 0)
+ if (mpd_run_load(connection, mpd_playlist_get_path(playlist))) {
screen_status_printf(_("Loading playlist %s..."),
g_basename(filename));
+ c->events |= MPD_IDLE_QUEUE;
+ } else
+ mpdclient_handle_error(c);
+
g_free(filename);
return true;
}
static bool
enqueue_and_play(struct mpdclient *c, struct filelist_entry *entry)
{
+ struct mpd_connection *connection = mpdclient_get_connection(c);
const struct mpd_song *song = mpd_entity_get_song(entry->entity);
int id;
if (id < 0) {
char buf[BUFSIZE];
- id = mpd_run_add_id(c->connection, mpd_song_get_uri(song));
+ id = mpd_run_add_id(connection, mpd_song_get_uri(song));
if (id < 0) {
mpdclient_handle_error(c);
return false;
#endif
strfsong(buf, BUFSIZE, options.list_format, song);
screen_status_printf(_("Adding \'%s\' to playlist"), buf);
-#ifndef NCMPC_MINI
}
-#endif
- if (!mpd_run_play_id(c->connection, id)) {
+ if (!mpd_run_play_id(connection, id)) {
mpdclient_handle_error(c);
return false;
}
const struct mpd_directory *dir =
mpd_entity_get_directory(entry->entity);
- if (mpdclient_cmd_add_path(c, mpd_directory_get_path(dir)) == 0) {
+ if (mpdclient_cmd_add_path(c, mpd_directory_get_path(dir))) {
char *tmp = utf8_to_locale(mpd_directory_get_path(dir));
screen_status_printf(_("Adding \'%s\' to playlist"), tmp);
entry->flags |= HIGHLIGHT;
#endif
- if (mpdclient_cmd_add(c, song) == 0) {
+ if (mpdclient_cmd_add(c, song)) {
char buf[BUFSIZE];
strfsong(buf, BUFSIZE, options.list_format, song);
@@ -418,19 +372,12 @@ browser_handle_mouse_event(struct screen_browser *browser, struct mpdclient *c)
int row;
unsigned prev_selected = browser->lw->selected;
unsigned long bstate;
- int length;
-
- if (browser->filelist)
- length = filelist_length(browser->filelist);
- else
- length = 0;
if (screen_get_mouse_event(c, &bstate, &row) ||
- list_window_mouse(browser->lw, length, bstate, row))
+ list_window_mouse(browser->lw, bstate, row))
return 1;
- browser->lw->selected = browser->lw->start + row;
- list_window_check_selected(browser->lw, length);
+ list_window_set_cursor(browser->lw, browser->lw->start + row);
if( bstate & BUTTON1_CLICKED ) {
if (prev_selected == browser->lw->selected)
if (browser->filelist == NULL)
return false;
- switch (cmd) {
- case CMD_PLAY:
- browser_handle_enter(browser, c);
- return true;
-
- case CMD_SELECT:
- if (browser_handle_select(browser, c))
- /* continue and select next item... */
- cmd = CMD_LIST_NEXT;
-
- /* call list_window_cmd to go to the next item */
- break;
-
- case CMD_ADD:
- if (browser_handle_add(browser, c))
- /* continue and select next item... */
- cmd = CMD_LIST_NEXT;
-
- /* call list_window_cmd to go to the next item */
- break;
-
- case CMD_SELECT_ALL:
- browser_handle_select_all(browser, c);
+ if (list_window_cmd(browser->lw, cmd))
return true;
+ switch (cmd) {
case CMD_LIST_FIND:
case CMD_LIST_RFIND:
case CMD_LIST_FIND_NEXT:
case CMD_LIST_RFIND_NEXT:
- screen_find(browser->lw, filelist_length(browser->filelist),
- cmd, browser_lw_callback,
+ screen_find(browser->lw, cmd, browser_lw_callback,
browser->filelist);
return true;
case CMD_LIST_JUMP:
return true;
#endif
- case CMD_LOCATE:
- song = browser_get_selected_song(browser);
- if (song == NULL)
- return false;
-
- screen_file_goto_song(c, song);
- return true;
-
#ifdef ENABLE_LYRICS_SCREEN
case CMD_SCREEN_LYRICS:
song = browser_get_selected_song(browser);
break;
}
- if (list_window_cmd(browser->lw, filelist_length(browser->filelist),
- cmd))
+ if (!mpdclient_is_connected(c))
+ return false;
+
+ switch (cmd) {
+ case CMD_PLAY:
+ browser_handle_enter(browser, c);
return true;
+ case CMD_SELECT:
+ if (browser_handle_select(browser, c))
+ list_window_cmd(browser->lw, CMD_LIST_NEXT);
+ return true;
+
+ case CMD_ADD:
+ if (browser_handle_add(browser, c))
+ list_window_cmd(browser->lw, CMD_LIST_NEXT);
+ return true;
+
+ case CMD_SELECT_ALL:
+ browser_handle_select_all(browser, c);
+ return true;
+
+ case CMD_LOCATE:
+ song = browser_get_selected_song(browser);
+ if (song == NULL)
+ return false;
+
+ screen_file_goto_song(c, song);
+ return true;
+
+ default:
+ break;
+ }
+
return false;
}