From 1b6cd08ecf47335728a38cade6da554e46f1bee6 Mon Sep 17 00:00:00 2001 From: Qball Cow Date: Thu, 2 May 2013 17:54:35 +0200 Subject: [PATCH] Remove Gmpc.MpdData.Treeview, TODO: Playlist editor needs last functions implemented. --- src/Makefile.am | 6 +- src/Widgets/gmpc-data-view.vala | 51 +- src/Widgets/gmpc-metadata-similarsongs.vala | 2 +- src/browsers/playlist3-current-playlist-browser.c | 5 +- src/browsers/playlist3-file-browser.c | 3 +- src/browsers/playlist3-find2-browser.c | 3 +- src/browsers/playlist3-playlist-editor.c | 39 +- src/gmpc-mpddata-treeview.gob | 1156 --------------------- src/main.c | 1 - 9 files changed, 58 insertions(+), 1208 deletions(-) delete mode 100644 src/gmpc-mpddata-treeview.gob diff --git a/src/Makefile.am b/src/Makefile.am index 711e9826..c7ff49b6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -93,8 +93,8 @@ gmpc_SOURCES=\ vala/gmpc-connection.vala\ vala/gmpc-easy-command.vala\ vala/gmpc-favorites.vala\ - vala/gmpc-mpddata-treeview-tooltip.vala\ vala/gmpc-plugin.vala\ + vala/gmpc-mpddata-treeview-tooltip.vala\ vala/gmpc-url-fetching-gui.vala\ vala/gmpc-metadata-editwindow.vala\ vala/gmpc-paned-size-group.vala\ @@ -225,7 +225,6 @@ endif nodist_gmpcinclude_HEADERS=\ gmpc-mpddata-model.h\ gmpc-mpddata-model-sort.h\ - gmpc-mpddata-treeview.h\ gmpc-metaimage.h\ gmpc-meta-text-view.h @@ -306,8 +305,7 @@ gmpc_GOBFILES = \ gmpc-meta-text-view.gob\ gmpc-mpddata-model.gob\ gmpc-mpddata-model-playlist.gob\ - gmpc-mpddata-model-sort.gob\ - gmpc-mpddata-treeview.gob + gmpc-mpddata-model-sort.gob gmpc_GOBSTAMPFILES=\ $(gmpc_GOBFILES:.gob=.gob.stamp) diff --git a/src/Widgets/gmpc-data-view.vala b/src/Widgets/gmpc-data-view.vala index f3870946..8004cd3b 100644 --- a/src/Widgets/gmpc-data-view.vala +++ b/src/Widgets/gmpc-data-view.vala @@ -109,13 +109,36 @@ const int[] gmpc_data_view_col_position = { public class Gmpc.DataView : Gtk.TreeView { + public enum ViewType { + SONG_LIST, + PLAY_QUEUE, + PLAYLIST + } + private Gtk.TreeViewColumn[] tree_columns = new Gtk.TreeViewColumn[NUM_COLS]; /** * If we are a play-queue we should treat the content. * slightly different. * e.g. add-replace will be play-crop */ - public bool is_play_queue {get; set; default=false;} + public ViewType view_mode {get; set;default=ViewType.SONG_LIST;} + /** + * If we 'view' a playlist, we need to know the name of the play queue. + * This can be set here. + */ + private string __playlist_name = null; + public string playlist_name { + get{ + return __playlist_name; + } + set{ + if(view_mode == ViewType.PLAYLIST) { + __playlist_name = value; + }else { + error("Cannot set playlist name on non-playlist view."); + } + } + } /** * The name of the treeview. @@ -127,10 +150,10 @@ public class Gmpc.DataView : Gtk.TreeView /** * Construction function. */ - public DataView(string name, bool play_queue = false) + public DataView(string name, ViewType mode = ViewType.SONG_LIST) { log(log_domain, LogLevelFlags.LEVEL_INFO, "Constructing dataview: "+name); - this.is_play_queue = play_queue; + this.view_mode = mode; this.uid = name; // Connect row activated signal. this.row_activated.connect(__row_activated); @@ -151,7 +174,8 @@ public class Gmpc.DataView : Gtk.TreeView // Update the sorting when it changed. this.notify["model"].connect((source) => { - if(this.model is Gtk.TreeSortable && !is_play_queue) { + // Only the SONG_LIST is sortable. + if(this.model is Gtk.TreeSortable && view_mode == ViewType.SONG_LIST) { int sort_column = config.get_int_with_default(uid, "sort-column", Gmpc.MpdData.ColumnTypes.COL_ICON_ID); Gtk.SortType sort_order = (Gtk.SortType)config.get_int_with_default(uid, @@ -205,9 +229,8 @@ public class Gmpc.DataView : Gtk.TreeView } } - if(is_play_queue) + if(view_mode == ViewType.PLAY_QUEUE || view_mode == ViewType.PLAYLIST) { - // Add play if there is one selected row. if(selected_rows > 0) { var item = new Gtk.ImageMenuItem.from_stock(Gtk.Stock.REMOVE,null); item.activate.connect((source)=>{ @@ -235,7 +258,7 @@ public class Gmpc.DataView : Gtk.TreeView item.activate.connect((source)=>{ selected_songs_raise_priority();}); menu.append(item); - if(is_play_queue) { + if(view_mode == ViewType.PLAY_QUEUE) { item = new Gtk.MenuItem.with_label(_("Dequeue")); item.activate.connect((source)=>{ selected_songs_remove_priority();}); menu.append(item); @@ -247,7 +270,7 @@ public class Gmpc.DataView : Gtk.TreeView Gtk.MenuItem item; item = new Gtk.SeparatorMenuItem(); menu.append(item); - if(is_play_queue) { + if(view_mode == ViewType.PLAY_QUEUE) { item = new Gtk.ImageMenuItem.from_stock(Gtk.Stock.CUT, null); item.activate.connect((source)=>{ selected_songs_paste_queue_cut();}); menu.append(item); @@ -257,7 +280,7 @@ public class Gmpc.DataView : Gtk.TreeView item.activate.connect((source)=>{ selected_songs_paste_queue_copy();}); menu.append(item); - if(is_play_queue && paste_queue != null) { + if(view_mode == ViewType.PLAY_QUEUE && paste_queue != null) { item = new Gtk.ImageMenuItem.with_label(_("Paste before")); (item as Gtk.ImageMenuItem).set_image(new Image.from_stock(Gtk.Stock.PASTE, Gtk.IconSize.MENU)); item.activate.connect((source)=>{ selected_songs_paste_before();}); @@ -413,7 +436,7 @@ public class Gmpc.DataView : Gtk.TreeView var renderer = new Gtk.CellRendererText(); renderer.ellipsize = Pango.EllipsizeMode.END; // Set up column - if(is_play_queue) { + if(view_mode == ViewType.PLAY_QUEUE) { renderer.weight_set = true; renderer.style_set = true; col.set_cell_data_func(renderer, highlight_row_current_song_playing); @@ -431,7 +454,7 @@ public class Gmpc.DataView : Gtk.TreeView col.set_reorderable(true); // Sorting. - if(!is_play_queue) { + if(view_mode == ViewType.SONG_LIST) { col.set_sort_indicator(true); col.set_sort_column_id(gmpc_data_view_col_ids[i]); } @@ -468,7 +491,7 @@ public class Gmpc.DataView : Gtk.TreeView if(!model.get_iter(out iter, path)) return; model.get(iter, Gmpc.MpdData.ColumnTypes.ROW_TYPE, out row_type); - if(is_play_queue) { + if(view_mode == ViewType.PLAY_QUEUE) { /* If we are play-queue, play the selected song. */ int song_id; model.get(iter, Gmpc.MpdData.ColumnTypes.COL_SONG_ID, out song_id); @@ -625,7 +648,7 @@ public class Gmpc.DataView : Gtk.TreeView } // Commands specific to play_queue - if(is_play_queue) + if(view_mode == ViewType.PLAY_QUEUE) { if(__key_press_event_callback_play_queue(event)) return true; } @@ -764,7 +787,7 @@ public class Gmpc.DataView : Gtk.TreeView Gtk.TreeIter iter; if(model.get_iter(out iter, path)) { - if(is_play_queue) { + if(view_mode == ViewType.PLAY_QUEUE) { int song_id; model.get(iter, Gmpc.MpdData.ColumnTypes.COL_SONG_ID, out song_id); if(song_id >= 0){ diff --git a/src/Widgets/gmpc-metadata-similarsongs.vala b/src/Widgets/gmpc-metadata-similarsongs.vala index 3a1364cd..1ed982d1 100644 --- a/src/Widgets/gmpc-metadata-similarsongs.vala +++ b/src/Widgets/gmpc-metadata-similarsongs.vala @@ -165,7 +165,7 @@ public class Gmpc.MetaData.Widgets.SimilarSongs : Gtk.Alignment var model = new Gmpc.MpdData.Model(); item.remove_duplicate_songs(); model.set_mpd_data((owned)item); - Gmpc.DataView tree = new Gmpc.DataView("similar-song", false); + Gmpc.DataView tree = new Gmpc.DataView("similar-song", Gmpc.DataView.ViewType.SONG_LIST); tree.set_model(model); this.add(tree); diff --git a/src/browsers/playlist3-current-playlist-browser.c b/src/browsers/playlist3-current-playlist-browser.c index 3fa9d430..4a65008a 100644 --- a/src/browsers/playlist3-current-playlist-browser.c +++ b/src/browsers/playlist3-current-playlist-browser.c @@ -342,14 +342,15 @@ static void pl3_current_playlist_browser_init(PlayQueuePlugin * self) self->priv->pl3_cp_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - tree = gmpc_data_view_new(self->priv->uid, TRUE); + tree = gmpc_data_view_new(self->priv->uid, + GMPC_DATA_VIEW_VIEW_TYPE_PLAY_QUEUE); gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(playlist)); /* Enable this for this model only */ - gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(tree), gmt_targetentries, 1, GDK_ACTION_DEFAULT|GDK_ACTION_MOVE|GDK_ACTION_COPY); + //gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(tree), gmt_targetentries, 1, GDK_ACTION_DEFAULT|GDK_ACTION_MOVE|GDK_ACTION_COPY); /* filter */ self->priv->mod_fill = (GtkTreeModel *) gmpc_mpddata_model_new(); diff --git a/src/browsers/playlist3-file-browser.c b/src/browsers/playlist3-file-browser.c index 58db6fc5..d2f506ca 100644 --- a/src/browsers/playlist3-file-browser.c +++ b/src/browsers/playlist3-file-browser.c @@ -208,7 +208,8 @@ static void pl3_file_browser_init(void) gtk_paned_add1(GTK_PANED(pl3_fb_vbox), sw); /* set up the tree */ - pl3_fb_tree = gmpc_data_view_new("file-browser", FALSE); + pl3_fb_tree = gmpc_data_view_new("file-browser", + GMPC_DATA_VIEW_VIEW_TYPE_SONG_LIST); gtk_tree_view_set_model(GTK_TREE_VIEW(pl3_fb_tree), GTK_TREE_MODEL(pl3_fb_store2)); /* setup signals */ // This is to handle everything the tree-view does not handle by default. diff --git a/src/browsers/playlist3-find2-browser.c b/src/browsers/playlist3-find2-browser.c index 484192b6..6f3e5e4f 100644 --- a/src/browsers/playlist3-find2-browser.c +++ b/src/browsers/playlist3-find2-browser.c @@ -178,7 +178,8 @@ static void pl3_find2_browser_init(void) /* Column */ /* set up the tree */ - pl3_find2_tree = (GtkWidget *)gmpc_data_view_new("find2-browser",FALSE); + pl3_find2_tree = (GtkWidget *)gmpc_data_view_new("find2-browser", + GMPC_DATA_VIEW_VIEW_TYPE_SONG_LIST); /* setup signals */ g_signal_connect(G_OBJECT(pl3_find2_tree), "key-press-event", G_CALLBACK(pl3_find2_browser_playlist_key_press), NULL); diff --git a/src/browsers/playlist3-playlist-editor.c b/src/browsers/playlist3-playlist-editor.c index c140a394..db95e0c3 100644 --- a/src/browsers/playlist3-playlist-editor.c +++ b/src/browsers/playlist3-playlist-editor.c @@ -219,6 +219,7 @@ static void playlist_editor_browser_playlist_editor_selected(GtkTreeModel * mode if (pl_path) { gtk_widget_set_sensitive(playlist_editor_browser, FALSE); + gmpc_data_view_set_playlist_name(GTK_TREE_VIEW(playlist_editor_song_tree),pl_path); gmpc_mpddata_model_set_mpd_data(GMPC_MPDDATA_MODEL(playlist_editor_list_store), NULL); gmpc_mpddata_model_sort_set_playlist(GMPC_MPDDATA_MODEL_SORT(playlist_editor_list_store), pl_path); mpd_async_request(__playlist_editor_async_callback, NULL, __playlist_editor_async_function, g_strdup(pl_path)); @@ -751,8 +752,8 @@ static gboolean playlist_editor_key_released(GtkTreeView * tree, GdkEventButton gtk_image_new_from_icon_name("add-url", GTK_ICON_SIZE_MENU)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gmpc_mpddata_treeview_right_mouse_intergration(GMPC_MPDDATA_TREEVIEW(tree), GTK_MENU(menu)); - g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(playlist_editor_list_add_url), tree); + //gmpc_mpddata_treeview_right_mouse_intergration(GMPC_MPDDATA_TREEVIEW(tree), GTK_MENU(menu)); + //g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(playlist_editor_list_add_url), tree); gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, button->time); @@ -1003,22 +1004,6 @@ static void playlist_editor_paste_before_songs(GtkTreeView * tree, GList * paste } } -static void playlist_editor_row_activated(GtkTreeView * tree, GtkTreePath * path, GtkTreeViewColumn * column, - gpointer user_data) -{ - GtkTreeModel *model = gtk_tree_view_get_model(tree); - GtkTreeIter iter; - if (gtk_tree_model_get_iter(model, &iter, path)) - { - mpd_Song *song; - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_MPDSONG, &song, -1); - if (song->file) - { - play_path(song->file); - } - } -} - static void playlist_editor_browser_init(void) { GtkCellRenderer *renderer = NULL; @@ -1076,22 +1061,20 @@ static void playlist_editor_browser_init(void) gmpc_mpddata_model_disable_image(GMPC_MPDDATA_MODEL(playlist_editor_list_store)); g_signal_connect(G_OBJECT(playlist_editor_list_store), "playtime_changed", G_CALLBACK(playtime_changed), NULL); - playlist_editor_song_tree = tree = - gmpc_mpddata_treeview_new("playlist-browser", FALSE, GTK_TREE_MODEL(playlist_editor_list_store)); - gmpc_mpddata_treeview_enable_click_fix(GMPC_MPDDATA_TREEVIEW(playlist_editor_song_tree)); + playlist_editor_song_tree = tree = gmpc_data_view_new("playlist-browser", + GMPC_DATA_VIEW_VIEW_TYPE_PLAYLIST); + gtk_tree_view_set_model(GMPC_MPDDATA_MODEL(tree), GTK_TREE_MODEL(playlist_editor_list_store)); /* Copy paste routines */ - g_signal_connect(G_OBJECT(tree), "cut", G_CALLBACK(playlist_editor_cut_songs), NULL); - g_signal_connect(G_OBJECT(tree), "paste-after", G_CALLBACK(playlist_editor_paste_after_songs), NULL); - g_signal_connect(G_OBJECT(tree), "paste-before", G_CALLBACK(playlist_editor_paste_before_songs), NULL); - - g_signal_connect(G_OBJECT(tree), "row-activated", G_CALLBACK(playlist_editor_row_activated), NULL); +// g_signal_connect(G_OBJECT(tree), "cut", G_CALLBACK(playlist_editor_cut_songs), NULL); + // g_signal_connect(G_OBJECT(tree), "paste-after", G_CALLBACK(playlist_editor_paste_after_songs), NULL); +// g_signal_connect(G_OBJECT(tree), "paste-before", G_CALLBACK(playlist_editor_paste_before_songs), NULL); gtk_container_add(GTK_CONTAINER(sw), tree); gtk_tree_view_set_reorderable(GTK_TREE_VIEW(tree), TRUE); - g_signal_connect(G_OBJECT(tree), "button-release-event", G_CALLBACK(playlist_editor_key_released), NULL); - g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK(playlist_editor_key_pressed), NULL); + // g_signal_connect(G_OBJECT(tree), "button-release-event", G_CALLBACK(playlist_editor_key_released), NULL); + // g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK(playlist_editor_key_pressed), NULL); g_object_ref_sink(playlist_editor_browser); gtk_widget_show_all(playlist_editor_browser); diff --git a/src/gmpc-mpddata-treeview.gob b/src/gmpc-mpddata-treeview.gob deleted file mode 100644 index 7681dd73..00000000 --- a/src/gmpc-mpddata-treeview.gob +++ /dev/null @@ -1,1156 +0,0 @@ -/* Gnome Music Player Client (GMPC) - * Copyright (C) 2004-2012 Qball Cow - * Project homepage: http://gmpclient.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. -*/ - -requires 2.0.0 - -%ht{ -#include -#include -%} -%privateheader{ -#include "main.h" -#include "config.h" -#include -#include "gmpc-mpddata-model.h" -#include "eggcolumnchooserdialog.h" -#include "gmpc-mpddata-model-playlist.h" -#include "gmpc-metaimage.h" -%} - -%h{ - -#define NUM_COLS 20 -#define MOUSE_OFFSET 10 -#define ENABLE_GRADIENT_LOOK 1 -#define BACKGROUND_OPACITY 0.92 -#define BOTTOM_GRADIENT_HEIGHT 30 - - -enum { - DND_SONG -}; -extern GtkTargetEntry gmt_targetentries[]; -%} - - -%{ -GtkTargetEntry gmt_targetentries[] = -{ - { (gchar *)"GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_APP , DND_SONG} -}; -static int col_ids[NUM_COLS] = { - MPDDATA_MODEL_COL_MARKUP, - MPDDATA_MODEL_COL_SONG_ARTIST, /* album name */ - MPDDATA_MODEL_COL_SONG_ALBUM, /* album name */ - MPDDATA_MODEL_COL_SONG_TITLE, /* song title */ - MPDDATA_MODEL_COL_SONG_TITLEFILE, /* song title */ - MPDDATA_MODEL_COL_SONG_GENRE, /* song genre */ - MPDDATA_MODEL_COL_SONG_TRACK, /* song track */ - MPDDATA_MODEL_COL_SONG_NAME, /* stream name */ - MPDDATA_MODEL_COL_SONG_COMPOSER, /* composer name */ - MPDDATA_MODEL_COL_SONG_PERFORMER, /* performer */ - MPDDATA_MODEL_COL_SONG_DATE, /* date */ - MPDDATA_MODEL_COL_SONG_LENGTH_FORMAT, /* length formatted */ - MPDDATA_MODEL_COL_SONG_DISC, /* disc */ - MPDDATA_MODEL_COL_SONG_COMMENT, /* comment */ - MPDDATA_MODEL_COL_ICON_ID, /* icon id */ - MPDDATA_MODEL_COL_SONG_POS, - MPDDATA_MODEL_COL_SONG_ALBUMARTIST, - MPDDATA_MODEL_COL_PATH_EXTENSION, /* Extension */ - MPDDATA_MODEL_COL_PATH_DIRECTORY, /* Directory */ - MPDDATA_MODEL_COL_SONG_PRIORITY, -}; -static const gchar *col_names[NUM_COLS] = { - N_("Markup"), - N_("Artist"), - N_("Album"), - N_("Title"), - N_("File"), - N_("Genre"), - N_("Track"), - N_("Name"), - N_("Composer"), - N_("Performer"), - N_("Date"), - N_("Duration"), - N_("Disc"), - N_("Comment"), - N_("Icon Id"), - N_("Position"), - N_("AlbumArtist"), - N_("Extension"), - N_("Directory"), - N_("Priority") -}; - -static gint col_enabled[NUM_COLS] = { - FALSE,//"Markup", - TRUE, //"Artist", - TRUE,//"Album", - TRUE,//"Title", - FALSE,//"File", - FALSE,//"Genre", - FALSE,//"Track", - FALSE,//"Name", - FALSE,//"Composer", - FALSE,//"Performer", - FALSE,//"Date", - FALSE,//"Duration", - FALSE,//"Disc", - FALSE,//"Comment", - TRUE,//"Icon Id" - FALSE,//"Position" - FALSE,//"AlbumArtist" - FALSE,//Extension - FALSE,//Directory - FALSE//Priority - -}; -static gint col_position[NUM_COLS] = { - 14,//"Markup", - 3, //"Artist", - 2,//"Album", - 1,//"Title", - 4,//"File", - 5,//"Genre", - 6,//"Track", - 7,//"Name", - 8,//"Composer", - 9,//"Performer", - 10,//"Date", - 11,//"Duration", - 12,//"Disc", - 13,//"Comment", - 0,//"Icon Id" - 15, // "Position" - 18, // "AlbumArtist" - 16,// Extension - 17, // Directory - 19 -}; - -//extern GList *paste_queue = NULL; -#define LOG_DOMAIN "MpdData.TreeView" -%} - -class Gmpc:MpdData:Treeview from Gtk:Tree:View { - private gchar *name = {NULL} destroywith g_free; - private gboolean do_sort = {TRUE}; - private GtkTreeViewColumn *columns[NUM_COLS]; - /* Tooltip */ - private GtkWidget *tooltip_window = {NULL}; - private GtkWidget *tw_image = {NULL}; - private GtkWidget *tw_title = {NULL}; - private GtkWidget *tw_artist = {NULL}; - private GtkWidget *tw_album = {NULL}; - private GtkWidget *tw_genre = {NULL}; - private GtkWidget *tw_date = {NULL}; - private GtkWidget *tw_length = {NULL}; - private gchar *file = NULL; - - private gboolean pressed = FALSE; - - - - - - - public - GtkWidget * new (const char *name (check null), gboolean sort, Gtk:Tree:Model *model (check type null)) - { - Self *self = GET_NEW; - self->_priv->name = g_strdup(name); - self->_priv->do_sort = sort; - - gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(self), TRUE); - gtk_tree_view_set_model(GTK_TREE_VIEW(self), model); - /* init the tree */ - self_do_init(self); - /* set tooltip */ - self_enable_tooltip(self); - g_signal_connect(G_OBJECT(self), "key-release-event", G_CALLBACK(self_paste_key_release_event), NULL); - - - - gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(self), GDK_BUTTON1_MASK, gmt_targetentries, 1, GDK_ACTION_COPY); - return (GtkWidget *)self; - } - private - void do_init (self) - { - int i=0; - gchar *conf_size,*conf_opt = g_strdup_printf("%s-colpos", self->_priv->name); - GtkTreeViewColumn *col = NULL; - for(i = 0;i< NUM_COLS;i++) - { - int conf_pos = cfg_get_single_value_as_int_with_default(config, conf_opt,col_names[i], col_position[i]); - col = self_add_column(self,col_names[i],col_ids[i],conf_pos); - g_object_set_data(G_OBJECT(col), "id",GINT_TO_POINTER(i)); - } - q_free(conf_opt); - conf_opt = g_strdup_printf("%s-colshow", self->_priv->name); - conf_size = g_strdup_printf("%s-colsize", self->_priv->name); - for(i = 0;i< NUM_COLS;i++) - { - int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(self->_priv->columns[i]), "id")); - int col_size= cfg_get_single_value_as_int_with_default(config, conf_size,col_names[id], 200); - int col_show= cfg_get_single_value_as_int_with_default(config, conf_opt,col_names[id], col_enabled[id]); - gtk_tree_view_column_set_visible(self->_priv->columns[i],col_show); - gtk_tree_view_append_column(GTK_TREE_VIEW(self), self->_priv->columns[i]); - /* don't set the icon column */ - if(col_ids[id]!= MPDDATA_MODEL_COL_ICON_ID) - gtk_tree_view_column_set_fixed_width(self->_priv->columns[i], col_size); - - g_signal_connect_swapped(G_OBJECT(self->_priv->columns[i]), "notify::width", G_CALLBACK(self_column_width), self); - } - /* set the last column small, to stop weird grows */ - //for(i=NUM_COLS-1; i>=0 && !gtk_tree_view_column_get_visible(self->_priv->columns[i]);i--); - //gtk_tree_view_column_set_fixed_width(self->_priv->columns[i], 150); - - q_free(conf_opt); - q_free(conf_size); - - /* */ - gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(self)), GTK_SELECTION_MULTIPLE); - gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(self), TRUE); - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(self), TRUE); - - if(self->_priv->do_sort) - { - int sort_col = cfg_get_single_value_as_int_with_default(config, self->_priv->name, "sort-column",MPDDATA_MODEL_COL_SONG_TITLE); - int sort_order = cfg_get_single_value_as_int_with_default(config, self->_priv->name, "sort-order", GTK_SORT_ASCENDING); - if(((sort_col < MPDDATA_MODEL_N_COLUMNS && sort_col >= 0) || sort_col == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID )&& (sort_order == GTK_SORT_ASCENDING || sort_order == GTK_SORT_DESCENDING)) { - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(self))),sort_col, sort_order); - } - } - } - - /** - * Save Column Setup - */ - private - void - save_column_setup (self) - { - int i=0; - GList *iter,*cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(self)); - gchar *conf_pos = NULL; - gchar *conf_show = NULL; - - i = g_list_length(cols); - - if(i != NUM_COLS) - { - g_list_free(cols); - return; - } - conf_pos = g_strdup_printf("%s-colpos", self->_priv->name); - conf_show = g_strdup_printf("%s-colshow", self->_priv->name); - // conf_size = g_strdup_printf("%s-colsize", self->_priv->name); - i=0; - for(iter = cols; iter; iter = g_list_next(iter)) - { - GtkTreeViewColumn *column = iter->data; - int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "id")); - cfg_set_single_value_as_int(config, conf_pos, col_names[id], i); - cfg_set_single_value_as_int(config, conf_show, col_names[id], gtk_tree_view_column_get_visible(column)); - /* only save width on > 0 columns */ - //if(gtk_tree_view_column_get_width(column) > 0) - // cfg_set_single_value_as_int(config, conf_size, col_names[id], gtk_tree_view_column_get_width(column)); - i++; - } - q_free(conf_pos); - q_free(conf_show); - // q_free(conf_size); - g_list_free(cols); - - if(self->_priv->do_sort) - { - int sort_col; - GtkSortType sort_order; - gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(self))), &sort_col, &sort_order); - cfg_set_single_value_as_int(config, self->_priv->name, "sort-column",sort_col); - cfg_set_single_value_as_int(config, self->_priv->name, "sort-order", sort_order); - } - } - - override (G:Object) - void - dispose (G:Object *obj) - { - Self *self = GMPC_MPDDATA_TREEVIEW(obj); - self_save_column_setup(self); - PARENT_HANDLER(obj); - } - private - void - highlight_row (GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gpointer data) - { - - if(GMPC_IS_MPDDATA_MODEL_PLAYLIST(tree_model) && gmpc_mpddata_model_playlist_is_current_song(tree_model, iter)) - g_object_set(G_OBJECT(cell), "weight", 800,NULL); - else - g_object_set(G_OBJECT(cell), "weight", 400,NULL); - - } - private - void - column_width(self, GParamSpec *argc, GtkTreeViewColumn *column) - { - if(self->_priv->pressed) - { - int width = gtk_tree_view_column_get_width(column); - int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "id")); - gchar *conf_size = g_strdup_printf("%s-colsize", self->_priv->name); - int w = cfg_get_single_value_as_int(config, conf_size, col_names[id]); - if(w != width) - { - cfg_set_single_value_as_int(config, conf_size, col_names[id],width); - } - q_free(conf_size); - } - } - - private - GtkTreeViewColumn * - add_column(self, const char *columnname, int valuerow, int position) - { - GtkCellRenderer *renderer; - GtkTreeViewColumn *column = NULL; - GValue value = {0,}; - - if(valuerow == MPDDATA_MODEL_COL_ICON_ID) - { - renderer = gtk_cell_renderer_pixbuf_new(); - g_value_init(&value, G_TYPE_FLOAT); - g_value_set_float(&value, 0.0); - g_object_set_property(G_OBJECT(renderer), "xalign", &value); - - column = gtk_tree_view_column_new (); - gtk_tree_view_column_pack_start (column, renderer, TRUE); - gtk_tree_view_column_set_attributes (column,renderer,"icon-name", MPDDATA_MODEL_COL_ICON_ID,NULL); - - gtk_tree_view_column_set_resizable(column, FALSE); - gtk_tree_view_column_set_fixed_width(column, 20); - } - else{ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes (_(columnname), renderer, - "text", valuerow,NULL); - g_value_init(&value, G_TYPE_INT); - g_value_set_int(&value, PANGO_ELLIPSIZE_END); - g_object_set_property(G_OBJECT(renderer), "ellipsize", &value); - gtk_tree_view_column_set_resizable(column, TRUE); - if(GMPC_IS_MPDDATA_MODEL_PLAYLIST(gtk_tree_view_get_model(GTK_TREE_VIEW(self)))) - { - g_object_set(G_OBJECT(renderer), "weight-set", TRUE, NULL); - gtk_tree_view_column_set_cell_data_func (column,renderer,self_highlight_row, NULL, NULL); - } - - } - gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_reorderable(column, TRUE); - - self->_priv->columns[position] = column; - - if(self->_priv->do_sort) - { - gtk_tree_view_column_set_sort_column_id(column,valuerow); - gtk_tree_view_column_set_sort_indicator(column, TRUE); - } - - return column; - } - /** - * Opens a column editor - */ - public - void - edit_columns(self) - { - GtkWidget *dialog = egg_column_chooser_dialog_new(GTK_TREE_VIEW(self)); - gtk_widget_show_all(dialog); - gtk_dialog_run(GTK_DIALOG(dialog)); - self_save_column_setup(self); - } - - override (G:Object) - void - finalize(G:Object *obj) - { - Self *self = SELF(obj); - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(obj)); - if(model) - { - gtk_tree_view_set_model(GTK_TREE_VIEW(obj),NULL); - g_object_unref(model); - } - if(self->_priv->tooltip_window) - { - gtk_widget_destroy(self->_priv->tooltip_window); - self->_priv->tooltip_window = NULL; - } - if(self->_priv->file) - { - g_free(self->_priv->file); - self->_priv->file = NULL; - } - PARENT_HANDLER(obj); - } - - /**** - * TREEVIEW POPUP - */ - private gboolean query_tooltip(self, - gint x, gint y, - gboolean keyboard_tip, - GtkTooltip *tooltip, - gpointer data) - { - GtkTreeView *treeview = GTK_TREE_VIEW(self); - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); - GtkTreeIter iter; - GtkTreePath *path = NULL; - mpd_Song *song = NULL; - int show = FALSE; - - if(!cfg_get_single_value_as_int_with_default(config, "GmpcTreeView", "show-tooltip", TRUE)) - return FALSE; - if (!gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW(treeview), &x, &y, - keyboard_tip, - &model, &path, &iter)) - return FALSE; - - - gtk_tree_model_get(model, &iter,MPDDATA_MODEL_COL_MPDSONG, &song, -1); - if(song) - { - show = TRUE; - /* makes it look a bit nicer */ - if(self->_priv->file && song->file && strcmp(self->_priv->file, song->file)) - { - show = FALSE; - g_free(self->_priv->file);self->_priv->file = NULL; - } - else if(!(self->_priv->file && song->file && strcmp(self->_priv->file, song->file) == 0)) - { - gchar *temp; - - gmpc_metaimage_update_cover_from_song(GMPC_METAIMAGE(self->_priv->tw_image), song); - if(self->_priv->file) - g_free(self->_priv->file); - self->_priv->file = NULL; - if(song->file) - self->_priv->file = g_strdup(song->file); - - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_SONG_TITLE, &temp, -1); - gtk_label_set_text(GTK_LABEL(self->_priv->tw_title), temp); - g_free(temp); - - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_SONG_ARTIST,&temp, -1); - gtk_label_set_text(GTK_LABEL(self->_priv->tw_artist), temp); - g_free(temp); - - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_SONG_ALBUM, &temp, -1); - gtk_label_set_text(GTK_LABEL(self->_priv->tw_album), temp); - g_free(temp); - - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_SONG_GENRE, &temp, -1); - gtk_label_set_text(GTK_LABEL(self->_priv->tw_genre), temp); - g_free(temp); - - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_SONG_DATE, &temp, -1); - gtk_label_set_text(GTK_LABEL(self->_priv->tw_date), temp); - g_free(temp); - - gtk_tree_model_get(model, &iter, MPDDATA_MODEL_COL_SONG_LENGTH_FORMAT, &temp, -1); - gtk_label_set_text(GTK_LABEL(self->_priv->tw_length), temp); - g_free(temp); - - - - } - } - gtk_tree_path_free(path); - return show; - } - - - private - gboolean - tooltip_draw (GtkWidget *widget, cairo_t *context,gpointer data) - { - int stripe_x = 1; - int stripe_y = 1; - GtkAllocation allocation; - GdkColor color; - GtkStyle *style = gtk_widget_get_style(widget); - GdkColor *background_color = &style->base[GTK_STATE_NORMAL]; - cairo_surface_t *surface; - cairo_t *cr; - GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(widget)); - gtk_widget_get_allocation(widget, &allocation); - int stripe_height = allocation.height;// 128+8; -#ifdef ENABLE_GRADIENT_LOOK - cairo_pattern_t *gradient; - double r, g, b; - int gradient_y = allocation.height - BOTTOM_GRADIENT_HEIGHT; -#endif - - - - cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); - surface = cairo_surface_create_similar(cairo_get_target(context), - CAIRO_CONTENT_COLOR_ALPHA, - allocation.width, - allocation.height); - cr = cairo_create(surface); - - - - - if (gdk_screen_is_composited(screen)) - { - cairo_set_source_rgba(cr, - background_color->red / 65535.0, - background_color->green / 65535.0, - background_color->blue / 65535.0, - BACKGROUND_OPACITY); - } - else - { - gdk_cairo_set_source_color(cr, background_color); - } - - cairo_rectangle(cr, 0, 0, - allocation.width, - allocation.height); - cairo_fill(cr); - -#ifdef ENABLE_GRADIENT_LOOK - /* Add a very subtle gradient to the bottom of the notification */ - gradient = cairo_pattern_create_linear(0, gradient_y, 0, - allocation.height); - cairo_pattern_add_color_stop_rgba(gradient, 0, 0, 0, 0, 0); - cairo_pattern_add_color_stop_rgba(gradient, 1, 0, 0, 0, 0.15); - cairo_rectangle(cr, 0, gradient_y, allocation.width, - BOTTOM_GRADIENT_HEIGHT); - cairo_set_source(cr, gradient); - cairo_fill(cr); - cairo_pattern_destroy(gradient); -#endif - - cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0); - cairo_set_line_width(cr, 1.0); - cairo_rectangle(cr, 0.5, 0.5,allocation.width - 0.5, allocation.height - 0.5); - cairo_stroke(cr); - - - color = style->bg[GTK_STATE_SELECTED]; - - cairo_rectangle(cr, stripe_x, stripe_y, 160, stripe_height); - -#ifdef ENABLE_GRADIENT_LOOK - r = color.red / 65535.0; - g = color.green / 65535.0; - b = color.blue / 65535.0; - - gradient = cairo_pattern_create_linear(stripe_x, 0, 160, 0); - cairo_pattern_add_color_stop_rgba(gradient, 0, r, g, b, 1); - cairo_pattern_add_color_stop_rgba(gradient, 1, r, g, b, 0); - cairo_set_source(cr, gradient); - cairo_fill(cr); - cairo_pattern_destroy(gradient); -#else - gdk_cairo_set_source_color(cr, &color); - cairo_fill(cr); -#endif - - cairo_destroy(cr); - cairo_set_source_surface(context, surface, 0, 0); - cairo_paint(context); - cairo_surface_destroy(surface); - - return FALSE;//GTK_WIDGET_CLASS(parent_class)->expose_event(widget, event); - } - - private void enable_tooltip(self) - { - gchar *markup = NULL; - GdkScreen *screen; -// GdkColormap *colormap; - GtkWidget *treeview = GTK_WIDGET(self); - GtkWidget *table = gtk_table_new(6,2, FALSE); - GtkWidget *vbox = gtk_hbox_new(FALSE, 0); - GtkWidget *label,*ali; - GtkSizeGroup *group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - self->_priv->tooltip_window = gtk_window_new(GTK_WINDOW_POPUP); - screen = gtk_window_get_screen(GTK_WINDOW(self->_priv->tooltip_window)); -/* - //colormap = gdk_screen_get_rgba_colormap(screen); - - if (colormap != NULL && gdk_screen_is_composited(screen)) - { - gtk_widget_set_colormap(self->_priv->tooltip_window, colormap); - } -*/ - - gtk_widget_set_size_request(GTK_WIDGET(self->_priv->tooltip_window), 3*128,-1); - - gtk_widget_set_app_paintable(self->_priv->tooltip_window, TRUE); - g_signal_connect(G_OBJECT(self->_priv->tooltip_window), "draw", G_CALLBACK(self_tooltip_draw), self); - - gtk_container_add(GTK_CONTAINER(self->_priv->tooltip_window), vbox); - self->_priv->tw_image = gmpc_metaimage_new(META_ALBUM_ART); - - ali = gtk_alignment_new(0.0f, 0.0f, 0.0f, 0.0f); - gtk_alignment_set_padding(GTK_ALIGNMENT(ali), 4,4,4,4); - gtk_container_add(GTK_CONTAINER(ali), self->_priv->tw_image); - gmpc_metaimage_set_size(GMPC_METAIMAGE(self->_priv->tw_image), 128); - - gtk_box_pack_start(GTK_BOX(vbox), ali, FALSE, FALSE, 0); - - gtk_table_set_row_spacings(GTK_TABLE(table), 6); - gtk_table_set_col_spacings(GTK_TABLE(table), 6); - /* set layout up */ - gtk_container_set_border_width(GTK_CONTAINER(vbox),1); - gtk_container_set_border_width(GTK_CONTAINER(table), 6); - - label = gtk_label_new(""); - gtk_size_group_add_widget(group, label); - markup = g_markup_printf_escaped("%s:", _("Title")); - gtk_label_set_markup(GTK_LABEL(label), markup); - g_free(markup); - gtk_misc_set_alignment(GTK_MISC(label), 1.0,0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1,0,1,GTK_FILL, GTK_FILL,0,0); - self->_priv->tw_title = gtk_label_new("n/a"); - gtk_misc_set_alignment(GTK_MISC(self->_priv->tw_title), 0.0,0.5); - gtk_label_set_ellipsize(GTK_LABEL(self->_priv->tw_title), PANGO_ELLIPSIZE_END); - gtk_table_attach(GTK_TABLE(table), self->_priv->tw_title, 1,2,0,1,GTK_EXPAND|GTK_FILL, GTK_FILL,0,0); - - - label = gtk_label_new(""); - gtk_size_group_add_widget(group, label); - markup = g_markup_printf_escaped("%s:", _("Artist")); - gtk_label_set_markup(GTK_LABEL(label),markup); - g_free(markup); - gtk_misc_set_alignment(GTK_MISC(label), 1.0,0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1,1,2,GTK_FILL, GTK_FILL,0,0); - self->_priv->tw_artist = gtk_label_new("n/a"); - gtk_misc_set_alignment(GTK_MISC(self->_priv->tw_artist), 0.0,0.5); - gtk_label_set_ellipsize(GTK_LABEL(self->_priv->tw_artist),PANGO_ELLIPSIZE_END); - gtk_table_attach(GTK_TABLE(table), self->_priv->tw_artist, 1,2,1,2,GTK_EXPAND|GTK_FILL, GTK_FILL,0,0); - - - - label = gtk_label_new(""); - gtk_size_group_add_widget(group, label); - markup = g_markup_printf_escaped("%s:", _("Album")); - gtk_label_set_markup(GTK_LABEL(label),markup); - g_free(markup); - gtk_misc_set_alignment(GTK_MISC(label), 1.0,0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1,2,3,GTK_FILL, GTK_FILL,0,0); - self->_priv->tw_album = gtk_label_new("n/a"); - gtk_misc_set_alignment(GTK_MISC(self->_priv->tw_album), 0.0,0.5); - gtk_label_set_ellipsize(GTK_LABEL(self->_priv->tw_album),PANGO_ELLIPSIZE_END); - gtk_table_attach(GTK_TABLE(table), self->_priv->tw_album, 1,2,2,3,GTK_EXPAND|GTK_FILL, GTK_FILL,0,0); - - label = gtk_label_new(""); - gtk_size_group_add_widget(group, label); - markup = g_markup_printf_escaped("%s:", _("Genre")); - gtk_label_set_markup(GTK_LABEL(label), markup); - g_free(markup); - gtk_misc_set_alignment(GTK_MISC(label), 1.0,0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1,3,4,GTK_FILL, GTK_FILL,0,0); - self->_priv->tw_genre = gtk_label_new("n/a"); - gtk_misc_set_alignment(GTK_MISC(self->_priv->tw_genre), 0.0,0.5); - gtk_label_set_ellipsize(GTK_LABEL(self->_priv->tw_genre),PANGO_ELLIPSIZE_END); - gtk_table_attach(GTK_TABLE(table), self->_priv->tw_genre, 1,2,3,4,GTK_EXPAND|GTK_FILL, GTK_FILL,0,0); - - label = gtk_label_new(""); - gtk_size_group_add_widget(group, label); - markup = g_markup_printf_escaped("%s:", _("Date")); - gtk_label_set_markup(GTK_LABEL(label), markup); - g_free(markup); - gtk_misc_set_alignment(GTK_MISC(label), 1.0,0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1,4,5,GTK_FILL, GTK_FILL,0,0); - self->_priv->tw_date = gtk_label_new("n/a"); - gtk_misc_set_alignment(GTK_MISC(self->_priv->tw_date), 0.0,0.5); - gtk_label_set_ellipsize(GTK_LABEL(self->_priv->tw_date),PANGO_ELLIPSIZE_END); - gtk_table_attach(GTK_TABLE(table), self->_priv->tw_date, 1,2,4,5,GTK_EXPAND|GTK_FILL, GTK_FILL,0,0); - - label = gtk_label_new(""); - gtk_size_group_add_widget(group, label); - markup = g_markup_printf_escaped("%s:", _("Duration")); - gtk_label_set_markup(GTK_LABEL(label), markup); - g_free(markup); - gtk_misc_set_alignment(GTK_MISC(label), 1.0,0.5); - gtk_table_attach(GTK_TABLE(table), label, 0,1,5,6,GTK_FILL, GTK_FILL,0,0); - self->_priv->tw_length = gtk_label_new("n/a"); - gtk_misc_set_alignment(GTK_MISC(self->_priv->tw_length), 0.0,0.5); - gtk_label_set_ellipsize(GTK_LABEL(self->_priv->tw_length),PANGO_ELLIPSIZE_END); - gtk_table_attach(GTK_TABLE(table), self->_priv->tw_length, 1,2,5,6,GTK_EXPAND|GTK_FILL, GTK_FILL,0,0); - - - - - g_object_unref(group); - - gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); - - - - g_signal_connect(G_OBJECT(treeview), - "query-tooltip", - G_CALLBACK(self_query_tooltip), - NULL); - gtk_widget_set_tooltip_window(treeview, GTK_WINDOW(self->_priv->tooltip_window)); - gtk_widget_show_all(vbox); - } - - - - - - /** - * Right mouse click behaviour fix - */ - private - gboolean click_fix (self, GdkEventButton *event) - { - GtkTreePath *path = NULL; - self->_priv->pressed = TRUE; - if(event->button == 3 && event->window != NULL && gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(self), event->x, event->y,&path,NULL,NULL,NULL)) - { - GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - if(gtk_tree_selection_path_is_selected(sel, path)) - { - gtk_tree_path_free(path); - return TRUE; - - } - } - if(path) { - gtk_tree_path_free(path); - } - return FALSE; - } - - private - gboolean click_released (self, GdkEventButton *event) - { - self->_priv->pressed = FALSE; - return FALSE; - } - public - void - enable_click_fix(self) - { - g_signal_connect(G_OBJECT(self), "button-press-event", G_CALLBACK(self_click_fix), NULL); - - g_signal_connect(G_OBJECT(self), "button-release-event", G_CALLBACK(self_click_released), NULL); - } - /** - * Copy paste stuff - */ - signal last NONE (POINTER) - void - paste_before(self, GList *items) - { - } - - signal last NONE (POINTER) - void - paste_after(self, const GList *items) - { - } - signal last NONE (NONE) - void - cut(self) - { - } - - private void insert_selected_rows(self,gboolean replace) - { - GtkTreeModel *model = NULL; - GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - GList *iter, *list = gtk_tree_selection_get_selected_rows(selection, &model); - int added = 0; - for(iter = g_list_first(list); iter != NULL; iter = g_list_next(iter)) - { - gchar *name; - gint type; - GtkTreeIter titer; - GtkTreePath *path = iter->data; - gtk_tree_model_get_iter(model, &titer, path); - gtk_tree_model_get(model, &titer, MPDDATA_MODEL_COL_PATH, &name, MPDDATA_MODEL_ROW_TYPE, &type, -1); - if (type == MPD_DATA_TYPE_SONG || type == MPD_DATA_TYPE_DIRECTORY) { - /* add them to the add list */ - mpd_playlist_queue_add(connection, name); - added++; - } else if (type == MPD_DATA_TYPE_PLAYLIST) { - mpd_playlist_queue_load(connection, name); - added++; - } - } - if(replace && added > 0) { - mpd_playlist_clear(connection); - } - mpd_playlist_queue_commit(connection); - if(replace && added > 0) { - mpd_player_play(connection); - } - g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); - g_list_free (list); - } - /** - * This will add selected songs. (only songs) - * with priority. If song has an song-id, it only changes priority. - */ - public void insert_selected_rows_with_priority(self) - { - GtkTreeModel *model = NULL; - GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - GList *iter, *list = gtk_tree_selection_get_selected_rows(selection, &model); - int priority = 255; - int sel_rows = gtk_tree_selection_count_selected_rows(selection); - - // Max count. - if(sel_rows >= 254) { - playlist3_show_error_message(_("You can only queue 254 songs at the time."), - ERROR_WARNING); - return ; - } - for(iter = g_list_first(list); iter != NULL; iter = g_list_next(iter)) - { - int id; - gchar *name = NULL; - gint type; - GtkTreeIter titer; - GtkTreePath *path = iter->data; - gtk_tree_model_get_iter(model, &titer, path); - gtk_tree_model_get(model, &titer, - MPDDATA_MODEL_COL_PATH, &name, - MPDDATA_MODEL_COL_SONG_ID, &id, - MPDDATA_MODEL_ROW_TYPE, &type, -1); - if (type == MPD_DATA_TYPE_SONG ) { - /* add them to the add list */ - if(id < 0){ - id = mpd_playlist_add_get_id(connection, name); - } - if(id >= 0) { - mpd_playlist_set_priority(connection, id, priority--); - } - } - g_free(name); - } - g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); - g_list_free (list); - } - - private - int - paste_key_release_event(self, GdkEventKey *event,gpointer data) - { - if(event->keyval == GDK_KEY_q && (event->state&GDK_MOD1_MASK) > 0) { - if(mpd_check_connected(connection) && - mpd_server_check_command_allowed(connection, "prioid") == - MPD_SERVER_COMMAND_ALLOWED) - { - self_insert_selected_rows_with_priority(self); - return TRUE; - } - } - else if(event->keyval == GDK_KEY_Insert || event->keyval == GDK_KEY_KP_Insert) { - if(mpd_check_connected(connection)) - { - self_insert_selected_rows(self,((event->state & GDK_CONTROL_MASK) > 0)); - return TRUE; - } - - } - if(event->keyval == GDK_KEY_Menu) { - GdkEventButton bevent; - gboolean value = FALSE; - bevent.window = NULL; - bevent.button = 3; - bevent.time = event->time; - g_signal_emit_by_name(self, "button-press-event", &bevent, &value,NULL); - if(!value){ - g_signal_emit_by_name(self, "button-release-event", &bevent, &value,NULL); - } - - return TRUE; - } - if (event->keyval == GDK_KEY_c && event->state&GDK_CONTROL_MASK) - { - self_paste_copy_songs(self, NULL); - return TRUE; - } - if(paste_queue ) - { - if(g_signal_has_handler_pending(G_OBJECT(self), object_signals[PASTE_BEFORE_SIGNAL], 0, TRUE)) - { - if (event->keyval == GDK_KEY_b && event->state&GDK_CONTROL_MASK) - { - self_paste_paste_before_songs(self, NULL); - return TRUE; - - } - } - - if(g_signal_has_handler_pending(G_OBJECT(self), object_signals[PASTE_AFTER_SIGNAL], 0, TRUE)) - { - if (event->keyval == GDK_KEY_v && event->state&GDK_CONTROL_MASK) - { - self_paste_paste_after_songs(self, NULL); - return TRUE; - } - } - } - - if (gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection(GTK_TREE_VIEW(self))) > 0) - { - if(g_signal_has_handler_pending(G_OBJECT(self), object_signals[CUT_SIGNAL], 0, TRUE)) - { - if (event->keyval == GDK_KEY_x && event->state&GDK_CONTROL_MASK) - { - self_paste_cut_songs(self, NULL); - return TRUE; - } - } - } - return FALSE; - } - private - void - paste_cut_songs(self, GtkMenuItem *item) - { - self_paste_copy_songs(self, item); - self_cut(self); - } - private - void - paste_paste_after_songs(self, GtkMenuItem *menuitem) - { - self_paste_after(self, g_list_first(paste_queue)); - /* free old entries - g_list_foreach(paste_queue, (GFunc)g_free, NULL); - g_list_free(paste_queue); - paste_queue = NULL; - */ - } - - private - void - paste_paste_before_songs(self, GtkMenuItem *menuitem) - { - self_paste_before(self, g_list_first(paste_queue)); - /* free old entries - g_list_foreach(paste_queue, (GFunc)g_free, NULL); - g_list_free(paste_queue); - paste_queue = NULL; - */ - } - - private - void - paste_copy_songs(self, GtkMenuItem *menitem) - { - GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(self)); - /* free old entries */ - g_list_foreach(paste_queue, (GFunc)g_free, NULL); - g_list_free(paste_queue); - paste_queue = NULL; - /* check if where connected */ - /* see if there is a row selected */ - if (gtk_tree_selection_count_selected_rows (selection) > 0) - { - GList *list = NULL, *llist = NULL; - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(self)); - /* start a command list */ - /* grab the selected songs */ - list = gtk_tree_selection_get_selected_rows (selection, &model); - /* grab the last song that is selected */ - llist = g_list_last (list); - /* remove every selected song one by one */ - do{ - GtkTreeIter iter; - gtk_tree_model_get_iter (model, &iter,(GtkTreePath *) llist->data); - /* Trick that avoids roundtrip to mpd */ - { - char *path = NULL; - int type = 0; - /* this one allready has the pos. */ - gtk_tree_model_get (model, &iter, - MPDDATA_MODEL_ROW_TYPE,&type, - MPDDATA_MODEL_COL_PATH, &path, - -1); - g_log(LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Copying song, into queue: %s\n", path); - if(type == MPD_DATA_TYPE_SONG) { - paste_queue = g_list_prepend(paste_queue, path); - } else if (type == MPD_DATA_TYPE_DIRECTORY) { - MpdData *data = mpd_database_get_directory_recursive(connection, path); - for(;data; data= mpd_data_get_next(data)){ - if(data->type == MPD_DATA_TYPE_SONG) { - paste_queue = g_list_prepend(paste_queue, g_strdup(data->song->file)); - } - } - g_free(path); - } else if (type == MPD_DATA_TYPE_PLAYLIST) { - MpdData *data = mpd_database_get_playlist_content(connection, path); - for(;data; data= mpd_data_get_next(data)){ - if(data->type == MPD_DATA_TYPE_SONG) { - paste_queue = g_list_prepend(paste_queue, g_strdup(data->song->file)); - } - } - g_free(path); - } - } - } while ((llist = g_list_previous (llist))); - /* free list */ - g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); - g_list_free (list); - } - paste_queue = g_list_reverse(paste_queue); - } - - public - int - right_mouse_intergration(self, GtkMenu *menu) - { - int retv = 0; - int i; - GtkWidget *menu_item; - GtkTreeSelection *selection = NULL; - GtkWidget *submenu = gtk_menu_new(); - for(i=0; i< num_plugins;i++) - { - if(gmpc_plugin_get_enabled(plugins[i])) - { - retv += gmpc_plugin_browser_song_list_option_menu(plugins[i],self, GTK_MENU(submenu)); - } - } - /* If no submenu item was added, destroy the submenu */ - if(!retv) gtk_widget_destroy(submenu); - else{ - GList *temp = gtk_container_get_children(GTK_CONTAINER(menu)); - if(temp){ - menu_item = gtk_separator_menu_item_new(); - g_list_free(temp); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - } - /* Add a tools menu item with the previously generated menu as submenu */ - menu_item = gtk_menu_item_new_with_label(_("Tools")); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - } - - - /** - * Paste integration - */ - - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - if(selection && gtk_tree_selection_count_selected_rows(selection)) - { - GList *temp = gtk_container_get_children(GTK_CONTAINER(menu)); - if(temp){ - menu_item = gtk_separator_menu_item_new(); - g_list_free(temp); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - } - - menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - g_signal_connect_swapped(G_OBJECT(menu_item), "activate", G_CALLBACK(self_paste_copy_songs), self); - retv++; - } - if(paste_queue ) - { - if(g_signal_has_handler_pending(G_OBJECT(self), object_signals[PASTE_BEFORE_SIGNAL], 0, TRUE)) - { - menu_item = gtk_image_menu_item_new_with_label(_("Paste before")); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), - gtk_image_new_from_stock(GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU)); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - g_signal_connect_swapped(G_OBJECT(menu_item), "activate", G_CALLBACK(self_paste_paste_before_songs), self); - retv++; - } - if(g_signal_has_handler_pending(G_OBJECT(self), object_signals[PASTE_AFTER_SIGNAL], 0, TRUE)) - { - menu_item = gtk_image_menu_item_new_with_label(_("Paste after")); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), - gtk_image_new_from_stock(GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU)); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - g_signal_connect_swapped(G_OBJECT(menu_item), "activate", G_CALLBACK(self_paste_paste_after_songs), self); - retv++; - } - } - - if (gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection(GTK_TREE_VIEW(self))) > 0) - { - if(g_signal_has_handler_pending(G_OBJECT(self), object_signals[CUT_SIGNAL], 0, TRUE)) - { - menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT,NULL); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), - gtk_image_new_from_stock(GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU)); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - g_signal_connect_swapped(G_OBJECT(menu_item), "activate", G_CALLBACK(self_paste_cut_songs), self); - retv++; - } - } - - { - GList *temp = gtk_container_get_children(GTK_CONTAINER(menu)); - if(temp){ - menu_item = gtk_separator_menu_item_new(); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - g_list_free(temp); - retv++; - } - } - /** Edit column */ - menu_item = gtk_image_menu_item_new_with_label(_("Edit Columns")); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU)); - g_signal_connect_swapped(G_OBJECT(menu_item), "activate", G_CALLBACK(self_edit_columns), self); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - retv++; - - return retv; - } - - public - void - cleanup(void) - { - if(paste_queue) - { - g_list_foreach(paste_queue, (GFunc)g_free, NULL); - g_list_free(paste_queue); - } - paste_queue = NULL; - } -} - -/* vim: set noexpandtab ts=4 sw=4 sts=4 tw=120: */ diff --git a/src/main.c b/src/main.c index 19e1bbd4..659d3e5c 100644 --- a/src/main.c +++ b/src/main.c @@ -657,7 +657,6 @@ int main(int argc, char **argv) initGenericErrorDefaultFunc((xmlGenericErrorFunc *) NULL); xmlCleanupParser(); /* cleanup */ - gmpc_mpddata_treeview_cleanup(); g_log(LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Quit....\n"); return retv; -- 2.11.4.GIT