summaryrefslogtreecommitdiff
path: root/src/gtkui/ui_playlist_widget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkui/ui_playlist_widget.cc')
-rw-r--r--src/gtkui/ui_playlist_widget.cc121
1 files changed, 51 insertions, 70 deletions
diff --git a/src/gtkui/ui_playlist_widget.cc b/src/gtkui/ui_playlist_widget.cc
index 9307c6f..b2cf40b 100644
--- a/src/gtkui/ui_playlist_widget.cc
+++ b/src/gtkui/ui_playlist_widget.cc
@@ -32,7 +32,6 @@
#include <libaudgui/list.h>
#include "gtkui.h"
-#include "playlist_util.h"
#include "ui_playlist_widget.h"
static const GType pw_col_types[PW_COLS] =
@@ -50,7 +49,8 @@ static const GType pw_col_types[PW_COLS] =
G_TYPE_STRING, // path
G_TYPE_STRING, // file name
G_TYPE_STRING, // custom title
- G_TYPE_STRING // bitrate
+ G_TYPE_STRING, // bitrate
+ G_TYPE_STRING // comment
};
static const int pw_col_min_widths[PW_COLS] = {
@@ -67,7 +67,8 @@ static const int pw_col_min_widths[PW_COLS] = {
10, // path
10, // file name
10, // custom title
- 3 // bitrate
+ 3, // bitrate
+ 10 // comment
};
static const bool pw_col_label[PW_COLS] = {
@@ -84,13 +85,18 @@ static const bool pw_col_label[PW_COLS] = {
true, // path
true, // file name
true, // custom title
- false // bitrate
+ false, // bitrate
+ true // comment
};
-struct PlaylistWidgetData {
- int list;
+struct PlaylistWidgetData
+{
+ Playlist list;
int popup_pos = -1;
QueuedFunc popup_timer;
+
+ void show_popup ()
+ { audgui_infopopup_show (list, popup_pos); }
};
static void set_int_from_tuple (GValue * value, const Tuple & tuple, Tuple::Field field)
@@ -107,9 +113,9 @@ static void set_string_from_tuple (GValue * value, const Tuple & tuple, Tuple::F
g_value_set_string (value, tuple.get_str (field));
}
-static void set_queued (GValue * value, int list, int row)
+static void set_queued (GValue * value, Playlist list, int row)
{
- int q = aud_playlist_queue_find_entry (list, row);
+ int q = list.queue_find_entry (row);
if (q < 0)
g_value_set_string (value, "");
else
@@ -129,29 +135,14 @@ static void get_value (void * user, int row, int column, GValue * value)
{
PlaylistWidgetData * data = (PlaylistWidgetData *) user;
g_return_if_fail (column >= 0 && column < pw_num_cols);
- g_return_if_fail (row >= 0 && row < aud_playlist_entry_count (data->list));
+ g_return_if_fail (row >= 0 && row < data->list.n_entries ());
column = pw_cols[column];
Tuple tuple;
- switch (column)
- {
- case PW_COL_TITLE:
- case PW_COL_ARTIST:
- case PW_COL_ALBUM:
- case PW_COL_YEAR:
- case PW_COL_ALBUM_ARTIST:
- case PW_COL_TRACK:
- case PW_COL_GENRE:
- case PW_COL_LENGTH:
- case PW_COL_FILENAME:
- case PW_COL_PATH:
- case PW_COL_CUSTOM:
- case PW_COL_BITRATE:
- tuple = aud_playlist_entry_get_tuple (data->list, row, Playlist::NoWait);
- break;
- }
+ if (column != PW_COL_NUMBER && column != PW_COL_QUEUED)
+ tuple = data->list.entry_tuple (row, Playlist::NoWait);
switch (column)
{
@@ -197,34 +188,37 @@ static void get_value (void * user, int row, int column, GValue * value)
case PW_COL_BITRATE:
set_int_from_tuple (value, tuple, Tuple::Bitrate);
break;
+ case PW_COL_COMMENT:
+ set_string_from_tuple (value, tuple, Tuple::Comment);
+ break;
}
}
static bool get_selected (void * user, int row)
{
- return aud_playlist_entry_get_selected (((PlaylistWidgetData *) user)->list, row);
+ return ((PlaylistWidgetData *) user)->list.entry_selected (row);
}
static void set_selected (void * user, int row, bool selected)
{
- aud_playlist_entry_set_selected (((PlaylistWidgetData *) user)->list, row, selected);
+ ((PlaylistWidgetData *) user)->list.select_entry (row, selected);
}
static void select_all (void * user, bool selected)
{
- aud_playlist_select_all (((PlaylistWidgetData *) user)->list, selected);
+ ((PlaylistWidgetData *) user)->list.select_all (selected);
}
static void focus_change (void * user, int row)
{
- aud_playlist_set_focus (((PlaylistWidgetData *) user)->list, row);
+ ((PlaylistWidgetData *) user)->list.set_focus (row);
}
static void activate_row (void * user, int row)
{
- int list = ((PlaylistWidgetData *) user)->list;
- aud_playlist_set_position (list, row);
- aud_playlist_play (list);
+ auto list = ((PlaylistWidgetData *) user)->list;
+ list.set_position (row);
+ list.start_playback ();
}
static void right_click (void * user, GdkEventButton * event)
@@ -234,16 +228,16 @@ static void right_click (void * user, GdkEventButton * event)
static void shift_rows (void * user, int row, int before)
{
- int list = ((PlaylistWidgetData *) user)->list;
+ auto list = ((PlaylistWidgetData *) user)->list;
/* Adjust the shift amount so that the selected entry closest to the
* destination ends up at the destination. */
if (before > row)
- before -= playlist_count_selected_in_range (list, row, before - row);
+ before -= list.n_selected (row, before - row);
else
- before += playlist_count_selected_in_range (list, before, row - before);
+ before += list.n_selected (before, row - before);
- aud_playlist_shift (list, row, before - row);
+ list.shift_entries (row, before - row);
}
static void popup_hide (PlaylistWidgetData * data)
@@ -258,13 +252,9 @@ static void popup_trigger (PlaylistWidgetData * data, int pos)
{
audgui_infopopup_hide ();
- auto show_cb = [] (void * data_) {
- auto data = (PlaylistWidgetData *) data_;
- audgui_infopopup_show (data->list, data->popup_pos);
- };
-
data->popup_pos = pos;
- data->popup_timer.queue (aud_get_int (nullptr, "filepopup_delay") * 100, show_cb, data);
+ data->popup_timer.queue (aud_get_int (nullptr, "filepopup_delay") * 100,
+ aud::obj_member<PlaylistWidgetData, & PlaylistWidgetData::show_popup>, data);
}
static void mouse_motion (void * user, GdkEventMotion * event, int row)
@@ -288,14 +278,14 @@ static void mouse_leave (void * user, GdkEventMotion * event, int row)
static Index<char> get_data (void * user)
{
- int playlist = ((PlaylistWidgetData *) user)->list;
+ auto playlist = ((PlaylistWidgetData *) user)->list;
return audgui_urilist_create_from_selected (playlist);
}
// length is ignored; GtkSelectionData null-terminates the data for us
static void receive_data (void * user, int row, const char * data, int /*length*/)
{
- int playlist = ((PlaylistWidgetData *) user)->list;
+ auto playlist = ((PlaylistWidgetData *) user)->list;
audgui_urilist_insert (playlist, row, data);
}
@@ -330,8 +320,8 @@ static gboolean search_cb (GtkTreeModel * model, int column, const char * search
if (keys.len ())
{
- int list = ((PlaylistWidgetData *) user)->list;
- Tuple tuple = aud_playlist_entry_get_tuple (list, row);
+ auto list = ((PlaylistWidgetData *) user)->list;
+ Tuple tuple = list.entry_tuple (row);
String strings[3] = {
tuple.get_str (Tuple::Title),
@@ -361,13 +351,13 @@ static void destroy_cb (PlaylistWidgetData * data)
delete data;
}
-GtkWidget * ui_playlist_widget_new (int playlist)
+GtkWidget * ui_playlist_widget_new (Playlist playlist)
{
PlaylistWidgetData * data = new PlaylistWidgetData;
data->list = playlist;
GtkWidget * list = audgui_list_new (& callbacks, data,
- aud_playlist_entry_count (playlist));
+ playlist.n_entries ());
gtk_tree_view_set_headers_visible ((GtkTreeView *) list,
aud_get_bool ("gtkui", "playlist_headers"));
@@ -390,26 +380,17 @@ GtkWidget * ui_playlist_widget_new (int playlist)
return list;
}
-int ui_playlist_widget_get_playlist (GtkWidget * widget)
-{
- PlaylistWidgetData * data = (PlaylistWidgetData *) audgui_list_get_user (widget);
- g_return_val_if_fail (data, -1);
- return data->list;
-}
-
-void ui_playlist_widget_set_playlist (GtkWidget * widget, int list)
+void ui_playlist_widget_update (GtkWidget * widget)
{
PlaylistWidgetData * data = (PlaylistWidgetData *) audgui_list_get_user (widget);
g_return_if_fail (data);
- data->list = list;
-}
-void ui_playlist_widget_update (GtkWidget * widget, const Playlist::Update & update)
-{
- PlaylistWidgetData * data = (PlaylistWidgetData *) audgui_list_get_user (widget);
- g_return_if_fail (data);
+ auto update = data->list.update_detail ();
+
+ if (update.level == Playlist::NoUpdate)
+ return;
- int entries = aud_playlist_entry_count (data->list);
+ int entries = data->list.n_entries ();
int changed = entries - update.before - update.after;
if (update.level == Playlist::Structure)
@@ -422,9 +403,8 @@ void ui_playlist_widget_update (GtkWidget * widget, const Playlist::Update & upd
/* scroll to end of playlist if entries were added there
(but not if a newly added entry is playing) */
- if (entries > old_entries && ! update.after &&
- aud_playlist_get_focus (data->list) < old_entries)
- aud_playlist_set_focus (data->list, entries - 1);
+ if (entries > old_entries && ! update.after && data->list.get_focus () < old_entries)
+ data->list.set_focus (entries - 1);
ui_playlist_widget_scroll (widget);
}
@@ -433,16 +413,17 @@ void ui_playlist_widget_update (GtkWidget * widget, const Playlist::Update & upd
if (update.queue_changed)
{
- for (int i = aud_playlist_queue_count (data->list); i --; )
+ for (int i = data->list.n_queued (); i --; )
{
- int entry = aud_playlist_queue_get_entry (data->list, i);
+ int entry = data->list.queue_get_entry (i);
if (entry < update.before || entry >= entries - update.after)
audgui_list_update_rows (widget, entry, 1);
}
}
audgui_list_update_selection (widget, update.before, changed);
- audgui_list_set_focus (widget, aud_playlist_get_focus (data->list));
+ audgui_list_set_highlight (widget, data->list.get_position ());
+ audgui_list_set_focus (widget, data->list.get_focus ());
}
void ui_playlist_widget_scroll (GtkWidget * widget)