161 lines
4.3 KiB
C
161 lines
4.3 KiB
C
/*
|
|
* Copyright 2016 (c) Anna Schumaker.
|
|
*/
|
|
#include <core/audio.h>
|
|
#include <core/playlist.h>
|
|
#include <core/tempq.h>
|
|
#include <gui/builder.h>
|
|
#include <gui/model.h>
|
|
#include <gui/queue.h>
|
|
#include <gui/settings.h>
|
|
#include <gui/view.h>
|
|
|
|
static const gchar *QUEUE_SETTINGS[Q_MODEL_N_COLUMNS] = {
|
|
[Q_MODEL_TRACK_NR] = "gui.queue.track",
|
|
[Q_MODEL_TITLE] = "gui.queue.title",
|
|
[Q_MODEL_LENGTH] = "gui.queue.length",
|
|
[Q_MODEL_ARTIST] = "gui.queue.artist",
|
|
[Q_MODEL_ALBUM] = "gui.queue.album",
|
|
[Q_MODEL_YEAR] = "gui.queue.year",
|
|
[Q_MODEL_GENRE] = "gui.queue.genre",
|
|
[Q_MODEL_COUNT] = "gui.queue.count",
|
|
[Q_MODEL_LAST_PLAY] = "gui.queue.played",
|
|
[Q_MODEL_FILE_PATH] = "gui.queue.filepath",
|
|
};
|
|
|
|
static GtkTreeView *view_treeview = NULL;
|
|
static GtkTreeModelFilter *view_filter = NULL;
|
|
|
|
static inline GuiQueueModel *__view_filter_get_model()
|
|
{
|
|
if (view_filter == NULL)
|
|
return NULL;
|
|
return GUI_QUEUE_MODEL(gtk_tree_model_filter_get_model(view_filter));
|
|
}
|
|
|
|
static inline GtkTreePath *__view_filter_convert_path(GtkTreePath *orig)
|
|
{
|
|
return gtk_tree_model_filter_convert_path_to_child_path(view_filter, orig);
|
|
}
|
|
|
|
static struct track *__view_filter_get_track(GtkTreePath *orig)
|
|
{
|
|
GuiQueueModel *model = __view_filter_get_model();
|
|
GtkTreePath *real = __view_filter_convert_path(orig);
|
|
struct track *track = gui_queue_model_path_get_track(model, real);
|
|
|
|
gtk_tree_path_free(real);
|
|
return track;
|
|
}
|
|
|
|
static unsigned int __view_filter_get_index(GtkTreePath *orig)
|
|
{
|
|
GtkTreePath *real = __view_filter_convert_path(orig);
|
|
unsigned int ret = gtk_tree_path_get_indices(real)[0];
|
|
|
|
gtk_tree_path_free(real);
|
|
return ret;
|
|
}
|
|
|
|
void __view_row_activated(GtkTreeView *treeview, GtkTreePath *path,
|
|
GtkTreeViewColumn *col, gpointer data)
|
|
{
|
|
audio_load(__view_filter_get_track(path));
|
|
queue_selected(__view_filter_get_model()->gqm_queue,
|
|
gtk_tree_path_get_indices(path)[0]);
|
|
}
|
|
|
|
void __view_column_resized(GtkTreeViewColumn *col, GParamSpec *pspec,
|
|
gpointer data)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < Q_MODEL_N_COLUMNS; i++) {
|
|
if (col == gtk_tree_view_get_column(view_treeview, i)) {
|
|
gui_settings_set(QUEUE_SETTINGS[i],
|
|
gtk_tree_view_column_get_width(col));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void __view_add_to_queue(GtkTreeModel *model, GtkTreePath *path,
|
|
GtkTreeIter *iter, gpointer data)
|
|
{
|
|
queue_add(data, __view_filter_get_track(path));
|
|
}
|
|
|
|
static void __view_add_to_playlist(GtkTreeModel *model, GtkTreePath *path,
|
|
GtkTreeIter *iter, gpointer data)
|
|
{
|
|
playlist_add(GPOINTER_TO_UINT(data), __view_filter_get_track(path));
|
|
}
|
|
|
|
static void __view_delete_selection(GtkTreeSelection *selection)
|
|
{
|
|
struct queue * queue = __view_filter_get_model()->gqm_queue;
|
|
GList *rows = gtk_tree_selection_get_selected_rows(selection, NULL);
|
|
GList *cur = g_list_reverse(rows);
|
|
|
|
while (cur) {
|
|
queue_erase(queue, __view_filter_get_index(cur->data));
|
|
cur = g_list_next(cur);
|
|
}
|
|
|
|
g_list_free_full(rows, (GDestroyNotify) gtk_tree_path_free);
|
|
}
|
|
|
|
void __view_keypress(GtkTreeView *treeview, GdkEventKey *event, gpointer data)
|
|
{
|
|
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
|
|
unsigned int flags = 0;
|
|
struct queue *queue;
|
|
|
|
switch (event->keyval) {
|
|
case GDK_KEY_KP_0 ... GDK_KEY_KP_9:
|
|
event->keyval = (event->keyval - GDK_KEY_KP_0) + GDK_KEY_0;
|
|
case GDK_KEY_0 ... GDK_KEY_9:
|
|
queue = tempq_get(event->keyval - GDK_KEY_0);
|
|
if (queue)
|
|
gtk_tree_selection_selected_foreach(selection,
|
|
__view_add_to_queue, queue);
|
|
break;
|
|
case GDK_KEY_f:
|
|
gtk_tree_selection_selected_foreach(selection,
|
|
__view_add_to_playlist,
|
|
GUINT_TO_POINTER(PL_FAVORITED));
|
|
break;
|
|
case GDK_KEY_r:
|
|
flags = Q_RANDOM;
|
|
case GDK_KEY_q:
|
|
queue = tempq_alloc(flags);
|
|
gtk_tree_selection_selected_foreach(selection,
|
|
__view_add_to_queue, queue);
|
|
break;
|
|
case GDK_KEY_Delete:
|
|
__view_delete_selection(selection);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void gui_view_init()
|
|
{
|
|
GtkTreeViewColumn *col;
|
|
int i, pos;
|
|
|
|
view_treeview = GTK_TREE_VIEW(gui_builder_widget("o_treeview"));
|
|
|
|
for (i = 0; i < Q_MODEL_N_COLUMNS; i++) {
|
|
col = gtk_tree_view_get_column(view_treeview, i);
|
|
pos = gui_settings_get(QUEUE_SETTINGS[i]);
|
|
if (col && pos > 0)
|
|
gtk_tree_view_column_set_fixed_width(col, pos);
|
|
}
|
|
}
|
|
|
|
void gui_view_set_model(GtkTreeModelFilter *filter)
|
|
{
|
|
view_filter = filter;
|
|
gtk_tree_view_set_model(view_treeview, GTK_TREE_MODEL(filter));
|
|
}
|