/* * Copyright 2016 (c) Anna Schumaker. */ #include #include #include #include #include #include #include #include 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)); }