* the parent directory, and at the end, there's the item "All tracks"
* to view the tracks of all albums.
*/
-static void
-paint_album_callback(WINDOW *w, unsigned i,
- gcc_unused unsigned y, unsigned width,
- bool selected, const void *data)
+void
+AlbumListPage::PaintListItem(WINDOW *w, unsigned i,
+ gcc_unused unsigned y, unsigned width,
+ bool selected) const
{
- const auto &list = *(const std::vector<std::string> *)data;
const char *p;
char *q = nullptr;
if (i == 0)
p = "..";
- else if (i == list.size() + 1)
+ else if (i == album_list.size() + 1)
p = _("All tracks");
else
- p = q = utf8_to_locale(list[i - 1].c_str());
+ p = q = utf8_to_locale(album_list[i - 1].c_str());
screen_browser_paint_directory(w, width, selected, p);
g_free(q);
void
AlbumListPage::Paint() const
{
- lw.Paint(paint_album_callback, &album_list);
+ lw.Paint(*this);
}
const char *
case CMD_LIST_JUMP:
screen_jump(screen, &lw,
AlbumListCallback, &album_list,
- paint_album_callback, &album_list);
+ this);
SetDirty();
return true;
#define NCMPC_ALBUM_LIST_PAGE_HXX
#include "ListPage.hxx"
+#include "ListRenderer.hxx"
#include <vector>
#include <string>
class ScreenManager;
-class AlbumListPage final : public ListPage {
+class AlbumListPage final : public ListPage, ListRenderer {
ScreenManager &screen;
std::vector<std::string> album_list;
std::string artist;
void Update(struct mpdclient &c, unsigned events) override;
bool OnCommand(struct mpdclient &c, command_t cmd) override;
const char *GetTitle(char *s, size_t size) const override;
+
+ /* virtual methods from class ListRenderer */
+ void PaintListItem(WINDOW *w, unsigned i, unsigned y, unsigned width,
+ bool selected) const override;
};
#endif
LoadArtistList(c);
}
-/**
- * Paint one item in the artist list.
- */
-static void
-paint_artist_callback(WINDOW *w, unsigned i,
- gcc_unused unsigned y, unsigned width,
- bool selected, const void *data)
+void
+ArtistListPage::PaintListItem(WINDOW *w, unsigned i,
+ gcc_unused unsigned y, unsigned width,
+ bool selected) const
{
- const auto &list = *(const std::vector<std::string> *)data;
screen_browser_paint_directory(w, width, selected,
- Utf8ToLocale(list[i].c_str()).c_str());
+ Utf8ToLocale(artist_list[i].c_str()).c_str());
}
void
ArtistListPage::Paint() const
{
- lw.Paint(paint_artist_callback, &artist_list);
+ lw.Paint(*this);
}
const char *
case CMD_LIST_JUMP:
screen_jump(screen, &lw,
screen_artist_lw_callback, &artist_list,
- paint_artist_callback, &artist_list);
+ this);
SetDirty();
return true;
#define NCMPC_ARTIST_LIST_PAGE_HXX
#include "ListPage.hxx"
+#include "ListRenderer.hxx"
#include <vector>
#include <string>
class ScreenManager;
-class ArtistListPage final : public ListPage {
+class ArtistListPage final : public ListPage, ListRenderer {
ScreenManager &screen;
std::vector<std::string> artist_list;
void Update(struct mpdclient &c, unsigned events) override;
bool OnCommand(struct mpdclient &c, command_t cmd) override;
const char *GetTitle(char *s, size_t size) const override;
+
+ /* virtual methods from class ListRenderer */
+ void PaintListItem(WINDOW *w, unsigned i, unsigned y, unsigned width,
+ bool selected) const override;
};
#endif
--- /dev/null
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2018 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.
+ */
+
+#ifndef LIST_RENDERER_HXX
+#define LIST_RENDERER_HXX
+
+#include "ncmpc_curses.h"
+
+class ListRenderer {
+public:
+ virtual void PaintListItem(WINDOW *w, unsigned i,
+ unsigned y, unsigned width,
+ bool selected) const = 0;
+};
+
+#endif
*/
#include "ListWindow.hxx"
+#include "ListRenderer.hxx"
#include "config.h"
#include "options.hxx"
#include "charset.hxx"
}
void
-ListWindow::Paint(list_window_paint_callback_t paint_callback,
- const void *callback_data) const
+ListWindow::Paint(const ListRenderer &renderer) const
{
bool show_cursor = !hide_cursor &&
(!options.hardware_cursor || range_selection);
bool is_selected = show_cursor &&
range.Contains(start + i);
- paint_callback(w, start + i, i, size.width,
- is_selected, callback_data);
+ renderer.PaintListItem(w, start + i, i, size.width,
+ is_selected);
}
if (options.hardware_cursor && selected >= start &&
#include "ncmpc_curses.h"
#include "Size.hxx"
+class ListRenderer;
+
typedef const char *
(*list_window_callback_fn_t)(unsigned i, void *data);
-typedef void
-(*list_window_paint_callback_t)(WINDOW *w, unsigned i,
- unsigned y, unsigned width,
- bool selected,
- const void *data);
-
/**
* The bounds of a range selection, see list_window_get_range().
*/
void Paint(list_window_callback_fn_t callback,
void *callback_data) const;
- void Paint(list_window_paint_callback_t paint_callback,
- const void *callback_data) const;
+ void Paint(const ListRenderer &renderer) const;
/** perform basic list window commands (movement) */
bool HandleCommand(command_t cmd);
case CMD_LIST_JUMP:
screen_jump(screen, &lw,
browser_lw_callback, filelist,
- PaintRow, this);
+ this);
SetDirty();
return true;
}
void
-FileListPage::PaintRow(WINDOW *w, unsigned i,
- unsigned y, unsigned width,
- bool selected, const void *data)
+FileListPage::PaintListItem(WINDOW *w, unsigned i,
+ unsigned y, unsigned width,
+ bool selected) const
{
- const auto &page = *(const FileListPage *) data;
+ assert(filelist != nullptr);
+ assert(i < filelist->size());
- assert(page.filelist != nullptr);
- assert(i < page.filelist->size());
-
- const auto &entry = (*page.filelist)[i];
+ const auto &entry = (*filelist)[i];
const struct mpd_entity *entity = entry.entity;
if (entity == nullptr) {
screen_browser_paint_directory(w, width, selected, "..");
case MPD_ENTITY_TYPE_SONG:
paint_song_row(w, y, width, selected, highlight,
mpd_entity_get_song(entity), nullptr,
- page.song_format);
+ song_format);
break;
case MPD_ENTITY_TYPE_PLAYLIST:
void
FileListPage::Paint() const
{
- lw.Paint(PaintRow, this);
+ lw.Paint(*this);
}
#include "config.h"
#include "ncmpc_curses.h"
#include "ListPage.hxx"
+#include "ListRenderer.hxx"
struct mpdclient;
struct MpdQueue;
class FileList;
struct FileListEntry;
-class FileListPage : public ListPage {
+class FileListPage : public ListPage, ListRenderer {
protected:
ScreenManager &screen;
unsigned y, unsigned width,
bool selected, const void *data);
+ /* virtual methods from class ListRenderer */
+ void PaintListItem(WINDOW *w, unsigned i,
+ unsigned y, unsigned width,
+ bool selected) const final;
+
public:
/* virtual methods from class Page */
void Paint() const override;
void
screen_jump(ScreenManager &screen, ListWindow *lw,
list_window_callback_fn_t callback_fn, void *callback_data,
- list_window_paint_callback_t paint_callback, void *paint_data)
+ const ListRenderer *renderer)
{
constexpr size_t WRLN_MAX_LINE_SIZE = 1024;
int key = 65;
lw->Jump(callback_fn, callback_data, search_str);
/* repaint the list_window */
- if (paint_callback != nullptr)
- lw->Paint(paint_callback, paint_data);
+ if (renderer != nullptr)
+ lw->Paint(*renderer);
else
lw->Paint(callback_fn, callback_data);
wrefresh(lw->w);
#include "ListWindow.hxx"
class ScreenManager;
+class ListRenderer;
/**
* query user for a string and find it in a list window
void
screen_jump(ScreenManager &screen, ListWindow *lw,
list_window_callback_fn_t callback_fn, void *callback_data,
- list_window_paint_callback_t paint_callback, void *paint_data);
+ const ListRenderer *renderer);
#endif
#include "screen_help.hxx"
#include "screen_interface.hxx"
#include "ListPage.hxx"
+#include "ListRenderer.hxx"
#include "screen_find.hxx"
#include "paint.hxx"
#include "charset.hxx"
#endif
};
-class HelpPage final : public ListPage {
+class HelpPage final : public ListPage, ListRenderer {
ScreenManager &screen;
public:
}
public:
+ /* virtual methods from class ListRenderer */
+ void PaintListItem(WINDOW *w, unsigned i,
+ unsigned y, unsigned width,
+ bool selected) const override;
+
/* virtual methods from class Page */
void Paint() const override;
bool OnCommand(struct mpdclient &c, command_t cmd) override;
return new HelpPage(screen, w, size);
}
-static void
-screen_help_paint_callback(WINDOW *w, unsigned i,
- unsigned y, unsigned width,
- gcc_unused bool selected,
- gcc_unused const void *data)
+void
+HelpPage::PaintListItem(WINDOW *w, unsigned i,
+ unsigned y, unsigned width,
+ gcc_unused bool selected) const
{
const struct help_text_row *row = &help_text[i];
void
HelpPage::Paint() const
{
- lw.Paint(screen_help_paint_callback, nullptr);
+ lw.Paint(*this);
}
bool
#include "screen_outputs.hxx"
#include "screen_interface.hxx"
#include "ListPage.hxx"
+#include "ListRenderer.hxx"
#include "screen_status.hxx"
#include "paint.hxx"
#include "i18n.h"
}
};
-class OutputsPage final : public ListPage {
+class OutputsPage final : public ListPage, ListRenderer {
std::vector<std::unique_ptr<struct mpd_output, OutputDeleter>> items;
public:
void Update(struct mpdclient &c, unsigned events) override;
bool OnCommand(struct mpdclient &c, command_t cmd) override;
const char *GetTitle(char *s, size_t size) const override;
+
+ /* virtual methods from class ListRenderer */
+ void PaintListItem(WINDOW *w, unsigned i, unsigned y, unsigned width,
+ bool selected) const override;
};
bool
return _("Outputs");
}
-static void
-screen_outputs_paint_callback(WINDOW *w, unsigned i,
- gcc_unused unsigned y, unsigned width,
- bool selected, const void *data)
+void
+OutputsPage::PaintListItem(WINDOW *w, unsigned i,
+ gcc_unused unsigned y, unsigned width,
+ bool selected) const
{
- const auto &items = *(const std::vector<std::unique_ptr<struct mpd_output, OutputDeleter>> *)data;
assert(i < items.size());
const auto *output = items[i].get();
void
OutputsPage::Paint() const
{
- lw.Paint(screen_outputs_paint_callback, &items);
+ lw.Paint(*this);
}
void
#include "screen_queue.hxx"
#include "screen_interface.hxx"
#include "ListPage.hxx"
+#include "ListRenderer.hxx"
#include "screen_file.hxx"
#include "screen_status.hxx"
#include "screen_find.hxx"
#define MAX_SONG_LENGTH 512
-class QueuePage final : public ListPage {
+class QueuePage final : public ListPage, ListRenderer {
ScreenManager &screen;
#ifndef NCMPC_MINI
bool OnSongChange(const struct mpd_status *status);
static gboolean OnHideCursorTimer(gpointer data);
- static void PaintRow(WINDOW *w, unsigned i,
- unsigned y, unsigned width,
- bool selected, const void *data);
+
+ /* virtual methods from class ListRenderer */
+ void PaintListItem(WINDOW *w, unsigned i,
+ unsigned y, unsigned width,
+ bool selected) const override;
public:
/* virtual methods from class Page */
}
void
-QueuePage::PaintRow(WINDOW *w, unsigned i, unsigned y, unsigned width,
- bool selected, const void *data)
+QueuePage::PaintListItem(WINDOW *w, unsigned i, unsigned y, unsigned width,
+ bool selected) const
{
- const auto &q = *(const QueuePage *)data;
- assert(q.playlist != nullptr);
- assert(i < q.playlist->size());
- const auto &song = (*q.playlist)[i];
+ assert(playlist != nullptr);
+ assert(i < playlist->size());
+ const auto &song = (*playlist)[i];
class hscroll *row_hscroll = nullptr;
#ifndef NCMPC_MINI
- row_hscroll = selected && options.scroll && q.lw.selected == i
- ? &q.hscroll : nullptr;
+ row_hscroll = selected && options.scroll && lw.selected == i
+ ? &hscroll : nullptr;
#endif
paint_song_row(w, y, width, selected,
- (int)mpd_song_get_id(&song) == q.current_song_id,
+ (int)mpd_song_get_id(&song) == current_song_id,
&song, row_hscroll, options.list_format);
}
hscroll.Clear();
#endif
- lw.Paint(PaintRow, this);
+ lw.Paint(*this);
}
void
return true;
case CMD_LIST_JUMP:
screen_jump(screen, &lw, screen_queue_lw_callback, &c.playlist,
- nullptr, nullptr);
+ this);
SaveSelection();
SetDirty();
return true;