X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_browser.c;h=c38ae9ea81490f539723a4e7e6dd2e8da0fc76d8;hb=655cd7831d0226c2e223280c61228be26f1bb8f8;hp=3b0fc00ccf2a5610880c06cde0ece8e8e93f4649;hpb=965afb83b0d1e2b9a3df90a9c5010b9af1756af1;p=ncmpc.git diff --git a/src/screen_browser.c b/src/screen_browser.c index 3b0fc00..c38ae9e 100644 --- a/src/screen_browser.c +++ b/src/screen_browser.c @@ -1,27 +1,28 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2009 The Music Player Daemon Project + * (c) 2004-2017 The Music Player Daemon Project * Project homepage: http://musicpd.org - + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ + */ +#include "config.h" #include "screen_browser.h" #include "screen_file.h" #include "screen_song.h" #include "screen_lyrics.h" -#include "screen_message.h" +#include "screen_status.h" #include "screen_find.h" #include "screen.h" #include "i18n.h" @@ -30,6 +31,9 @@ #include "strfsong.h" #include "mpdclient.h" #include "filelist.h" +#include "colors.h" +#include "paint.h" +#include "song_paint.h" #include @@ -41,8 +45,6 @@ #define HIGHLIGHT (0x01) #endif -static const char playlist_format[] = "*%s*"; - #ifndef NCMPC_MINI /* sync highlight flags with playlist */ @@ -50,9 +52,7 @@ void screen_browser_sync_highlights(struct filelist *fl, const struct mpdclient_playlist *playlist) { - guint i; - - for (i = 0; i < filelist_length(fl); ++i) { + for (unsigned i = 0; i < filelist_length(fl); ++i) { struct filelist_entry *entry = filelist_get(fl, i); const struct mpd_entity *entity = entry->entity; @@ -73,35 +73,27 @@ screen_browser_sync_highlights(struct filelist *fl, /* list_window callback */ static const char * -browser_lw_callback(unsigned idx, bool *highlight, G_GNUC_UNUSED char **second_column, void *data) +browser_lw_callback(unsigned idx, void *data) { const struct filelist *fl = (const struct filelist *) data; static char buf[BUFSIZE]; - const struct filelist_entry *entry; - const struct mpd_entity *entity; assert(fl != NULL); assert(idx < filelist_length(fl)); - entry = filelist_get(fl, idx); + const struct filelist_entry *entry = filelist_get(fl, idx); assert(entry != NULL); - entity = entry->entity; -#ifndef NCMPC_MINI - *highlight = (entry->flags & HIGHLIGHT) != 0; -#else - *highlight = false; -#endif + const struct mpd_entity *entity = entry->entity; if( entity == NULL ) - return "[..]"; + return ".."; if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_DIRECTORY) { const struct mpd_directory *dir = mpd_entity_get_directory(entity); char *directory = utf8_to_locale(g_basename(mpd_directory_get_path(dir))); - - g_snprintf(buf, BUFSIZE, "[%s]", directory); + g_strlcpy(buf, directory, sizeof(buf)); g_free(directory); return buf; } else if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) { @@ -114,7 +106,7 @@ browser_lw_callback(unsigned idx, bool *highlight, G_GNUC_UNUSED char **second_c mpd_entity_get_playlist(entity); char *filename = utf8_to_locale(g_basename(mpd_playlist_get_path(playlist))); - g_snprintf(buf, BUFSIZE, playlist_format, filename); + g_strlcpy(buf, filename, sizeof(buf)); g_free(filename); return buf; } @@ -126,16 +118,20 @@ 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 (connection == NULL) + return false; if (mpd_run_load(connection, mpd_playlist_get_path(playlist))) { + char *filename = utf8_to_locale(mpd_playlist_get_path(playlist)); screen_status_printf(_("Loading playlist %s..."), g_basename(filename)); + g_free(filename); + c->events |= MPD_IDLE_QUEUE; } else mpdclient_handle_error(c); - g_free(filename); return true; } @@ -143,6 +139,9 @@ static bool enqueue_and_play(struct mpdclient *c, struct filelist_entry *entry) { struct mpd_connection *connection = mpdclient_get_connection(c); + if (connection == NULL) + return false; + const struct mpd_song *song = mpd_entity_get_song(entry->entity); int id; @@ -166,7 +165,7 @@ enqueue_and_play(struct mpdclient *c, struct filelist_entry *entry) entry->flags |= HIGHLIGHT; #endif strfsong(buf, BUFSIZE, options.list_format, song); - screen_status_printf(_("Adding \'%s\' to playlist"), buf); + screen_status_printf(_("Adding \'%s\' to queue"), buf); } if (!mpd_run_play_id(connection, id)) { @@ -228,12 +227,10 @@ static bool browser_handle_enter(struct screen_browser *browser, struct mpdclient *c) { struct filelist_entry *entry = browser_get_selected_entry(browser); - struct mpd_entity *entity; - if (entry == NULL) return false; - entity = entry->entity; + struct mpd_entity *entity = entry->entity; if (entity == NULL) return false; @@ -246,7 +243,7 @@ browser_handle_enter(struct screen_browser *browser, struct mpdclient *c) static bool browser_select_entry(struct mpdclient *c, struct filelist_entry *entry, - G_GNUC_UNUSED gboolean toggle) + gcc_unused gboolean toggle) { assert(entry != NULL); assert(entry->entity != NULL); @@ -261,7 +258,7 @@ browser_select_entry(struct mpdclient *c, struct filelist_entry *entry, 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); + screen_status_printf(_("Adding \'%s\' to queue"), tmp); g_free(tmp); } @@ -286,7 +283,7 @@ browser_select_entry(struct mpdclient *c, struct filelist_entry *entry, char buf[BUFSIZE]; strfsong(buf, BUFSIZE, options.list_format, song); - screen_status_printf(_("Adding \'%s\' to playlist"), buf); + screen_status_printf(_("Adding \'%s\' to queue"), buf); } #ifndef NCMPC_MINI } else { @@ -310,13 +307,11 @@ static bool browser_handle_select(struct screen_browser *browser, struct mpdclient *c) { struct list_window_range range; - struct filelist_entry *entry; - bool success; + bool success = false; list_window_get_range(browser->lw, &range); for (unsigned i = range.start; i < range.end; ++i) { - entry = browser_get_index(browser, i); - + struct filelist_entry *entry = browser_get_index(browser, i); if (entry != NULL && entry->entity != NULL) success = browser_select_entry(c, entry, TRUE); } @@ -328,15 +323,14 @@ static bool browser_handle_add(struct screen_browser *browser, struct mpdclient *c) { struct list_window_range range; - struct filelist_entry *entry; - bool success; + bool success = false; list_window_get_range(browser->lw, &range); for (unsigned i = range.start; i < range.end; ++i) { - entry = browser_get_index(browser, i); - + struct filelist_entry *entry = browser_get_index(browser, i); if (entry != NULL && entry->entity != NULL) - success = browser_select_entry(c, entry, FALSE); + success = browser_select_entry(c, entry, FALSE) || + success; } return range.end == range.start + 1 && success; @@ -345,12 +339,10 @@ browser_handle_add(struct screen_browser *browser, struct mpdclient *c) static void browser_handle_select_all(struct screen_browser *browser, struct mpdclient *c) { - guint i; - if (browser->filelist == NULL) return; - for (i = 0; i < filelist_length(browser->filelist); ++i) { + for (unsigned i = 0; i < filelist_length(browser->filelist); ++i) { struct filelist_entry *entry = filelist_get(browser->filelist, i); if (entry != NULL && entry->entity != NULL) @@ -384,12 +376,14 @@ browser_handle_mouse_event(struct screen_browser *browser, struct mpdclient *c) } #endif +static void +screen_browser_paint_callback(WINDOW *w, unsigned i, unsigned y, + unsigned width, bool selected, const void *data); + bool browser_cmd(struct screen_browser *browser, struct mpdclient *c, command_t cmd) { - const struct mpd_song *song; - if (browser->filelist == NULL) return false; @@ -397,6 +391,10 @@ browser_cmd(struct screen_browser *browser, return true; switch (cmd) { +#if defined(ENABLE_SONG_SCREEN) || defined(ENABLE_LYRICS_SCREEN) + const struct mpd_song *song; +#endif + case CMD_LIST_FIND: case CMD_LIST_RFIND: case CMD_LIST_FIND_NEXT: @@ -405,8 +403,9 @@ browser_cmd(struct screen_browser *browser, browser->filelist); return true; case CMD_LIST_JUMP: - screen_jump(browser->lw, browser_lw_callback, - NULL, browser->filelist); + screen_jump(browser->lw, + browser_lw_callback, browser->filelist, + screen_browser_paint_callback, browser); return true; #ifdef HAVE_GETMOUSE @@ -446,6 +445,8 @@ browser_cmd(struct screen_browser *browser, return false; switch (cmd) { + const struct mpd_song *song; + case CMD_PLAY: browser_handle_enter(browser, c); return true; @@ -479,8 +480,86 @@ browser_cmd(struct screen_browser *browser, return false; } +void +screen_browser_paint_directory(WINDOW *w, unsigned width, + bool selected, const char *name) +{ + row_color(w, COLOR_DIRECTORY, selected); + + waddch(w, '['); + waddstr(w, name); + waddch(w, ']'); + + /* erase the unused space after the text */ + row_clear_to_eol(w, width, selected); +} + +static void +screen_browser_paint_playlist(WINDOW *w, unsigned width, + bool selected, const char *name) +{ + row_paint_text(w, width, COLOR_PLAYLIST, selected, name); +} + +static void +screen_browser_paint_callback(WINDOW *w, unsigned i, + unsigned y, unsigned width, + bool selected, const void *data) +{ + const struct screen_browser *browser = (const struct screen_browser *) data; + + assert(browser != NULL); + assert(browser->filelist != NULL); + assert(i < filelist_length(browser->filelist)); + + const struct filelist_entry *entry = filelist_get(browser->filelist, i); + assert(entry != NULL); + + const struct mpd_entity *entity = entry->entity; + if (entity == NULL) { + screen_browser_paint_directory(w, width, selected, ".."); + return; + } + +#ifndef NCMPC_MINI + const bool highlight = (entry->flags & HIGHLIGHT) != 0; +#else + const bool highlight = false; +#endif + + switch (mpd_entity_get_type(entity)) { + const struct mpd_directory *directory; + const struct mpd_playlist *playlist; + char *p; + + case MPD_ENTITY_TYPE_DIRECTORY: + directory = mpd_entity_get_directory(entity); + p = utf8_to_locale(g_basename(mpd_directory_get_path(directory))); + screen_browser_paint_directory(w, width, selected, p); + g_free(p); + break; + + case MPD_ENTITY_TYPE_SONG: + paint_song_row(w, y, width, selected, highlight, + mpd_entity_get_song(entity), NULL, browser->song_format); + break; + + case MPD_ENTITY_TYPE_PLAYLIST: + playlist = mpd_entity_get_playlist(entity); + p = utf8_to_locale(g_basename(mpd_playlist_get_path(playlist))); + screen_browser_paint_playlist(w, width, selected, p); + g_free(p); + break; + + default: + row_paint_text(w, width, highlight ? COLOR_LIST_BOLD : COLOR_LIST, + selected, ""); + } +} + void screen_browser_paint(const struct screen_browser *browser) { - list_window_paint(browser->lw, browser_lw_callback, browser->filelist); + list_window_paint2(browser->lw, screen_browser_paint_callback, + browser); }