From 675083cae07451a5bfaca311c0a530b7afa799de Mon Sep 17 00:00:00 2001 From: QC Date: Sat, 23 Mar 2013 18:25:38 +0100 Subject: [PATCH] Add new gmpc-data-view (DOES NOT WORK COMPLETELY) --- src/Widgets/gmpc-data-view.vala | 105 +++++++++++++++++++--- src/browsers/playlist3-current-playlist-browser.c | 10 ++- src/vapi/gmpc.vapi | 6 +- src/vapi/libmpd.vapi | 2 + 4 files changed, 109 insertions(+), 14 deletions(-) diff --git a/src/Widgets/gmpc-data-view.vala b/src/Widgets/gmpc-data-view.vala index b2bff12d..c9d86a1f 100644 --- a/src/Widgets/gmpc-data-view.vala +++ b/src/Widgets/gmpc-data-view.vala @@ -1,7 +1,15 @@ using Gmpc; using Gtk; + + +/** + * List of columns. + * * List of column ids to show. + * * Name of each column + * * Default set of enabled columns. + */ const int NUM_COLS = 20; -const int[] col_ids = { +const int[] gmpc_data_view_col_ids = { Gmpc.MpdData.ColumnTypes.MARKUP, Gmpc.MpdData.ColumnTypes.SONG_ARTIST, /* album name */ Gmpc.MpdData.ColumnTypes.SONG_ALBUM, /* album name */ @@ -21,9 +29,9 @@ const int[] col_ids = { Gmpc.MpdData.ColumnTypes.SONG_ALBUMARTIST, Gmpc.MpdData.ColumnTypes.PATH_EXTENSION, /* Extension */ Gmpc.MpdData.ColumnTypes.PATH_DIRECTORY, /* Directory */ - Gmpc.MpdData.ColumnTypes.SONG_PRIORITY, + Gmpc.MpdData.ColumnTypes.SONG_PRIORITY }; -const string[] col_names = { +const string[] gmpc_data_view_col_names = { N_("Markup"), N_("Artist"), N_("Album"), @@ -46,7 +54,7 @@ const string[] col_names = { N_("Priority") }; -const bool[] col_enabled = { +const bool[] gmpc_data_view_col_enabled = { false,//"Markup", true, //"Artist", true,//"Album", @@ -70,7 +78,7 @@ const bool[] col_enabled = { }; -const int[] col_position = { +const int[] gmpc_data_view_col_position = { 14,//"Markup", 3, //"Artist", 2,//"Album", @@ -95,6 +103,7 @@ const int[] col_position = { public class Gmpc.DataView : Gtk.TreeView { + private Gtk.TreeViewColumn[] tree_columns = new Gtk.TreeViewColumn[NUM_COLS]; /** * If we are a play-queue we should treat the content. * slightly different. @@ -112,10 +121,22 @@ public class Gmpc.DataView : Gtk.TreeView /** * Construction function. */ - public DataView() + public DataView(string name) { + this.uid = name; // Connect row activated signal. this.row_activated.connect(__row_activated); + + this.set_rules_hint(true); + } + + + /** + * Deconstructor. + */ + ~DataView() + { + } @@ -127,9 +148,51 @@ public class Gmpc.DataView : Gtk.TreeView { for(int i = 0; i < NUM_COLS; i++) { Gtk.TreeViewColumn col = new Gtk.TreeViewColumn(); - col.set_title(col_names[i]); + col.set_data("id", i); + if(gmpc_data_view_col_ids[i] == Gmpc.MpdData.ColumnTypes.ICON_ID) + { + /** + * Picture. + */ + var renderer = new Gtk.CellRendererPixbuf(); + renderer.xalign = 0.0f; + // Set up column + col.pack_start(renderer, true); + col.set_attributes(renderer, "icon-name", Gmpc.MpdData.ColumnTypes.ICON_ID); + col.set_resizable(false); + col.set_fixed_width(20); + } else { + /** + * Text column + */ + col.set_title(gmpc_data_view_col_names[i]); + var renderer = new Gtk.CellRendererText(); + renderer.ellipsize = Pango.EllipsizeMode.END; + renderer.weight_set = true; + // Set up column + col.pack_start(renderer, true); + col.set_attributes(renderer, "text", gmpc_data_view_col_ids[i]); + col.set_resizable(true); + if(is_play_queue) { + // TODO fix this. + // col.set_cell_data_func(renderer, (Gtk.CellLayoutDataFunc)highlight_row_current_song_playing); + } + col.set_fixed_width(config.get_int_with_default(uid+"-colsize",gmpc_data_view_col_names[i], 200)); + } + col.set_sizing(Gtk.TreeViewColumnSizing.FIXED); + col.set_reorderable(true); - this.insert_column(col, col_position[i]); + // Fixed width. + int pos = config.get_int_with_default(uid+"-colpos", gmpc_data_view_col_names[i], gmpc_data_view_col_position[i]); + this.tree_columns[pos] = col; + } + // Add the columns (in right order) + for(int i = 0; i < NUM_COLS; i++) { + int id = this.tree_columns[i].get_data("id"); + if(config.get_bool_with_default(uid+"-colshow", gmpc_data_view_col_names[id], gmpc_data_view_col_enabled[id])) + { + this.insert_column(this.tree_columns[i], i); + } } } @@ -138,8 +201,30 @@ public class Gmpc.DataView : Gtk.TreeView /** * Internal functions. */ - private void __row_activated(Gtk.TreePath path, Gtk.TreeViewColumn col) + private void __row_activated (Gtk.TreePath path, Gtk.TreeViewColumn col) { - + Gtk.TreeIter iter; + Gtk.TreeModel? model = this.get_model(); + if(model != null) { + if(model.get_iter(out iter, path)) + { + if(is_play_queue) { + int song_id; + model.get(iter, Gmpc.MpdData.ColumnTypes.SONG_ID, out song_id); + MPD.Player.play_id(Gmpc.server, song_id); + } else { + string song_path; + model.get(iter, Gmpc.MpdData.ColumnTypes.PATH, out song_path); + MpdInteraction.play_path(song_path); + } + } + } + } + /** + * Check if current row is playing. + */ + private void highlight_row_current_song_playing(Gtk.TreeViewColumn col, Gtk.CellRenderer renderer, Gtk.TreeModel model, Gtk.TreeIter iter) + { + (renderer as Gtk.CellRendererText).weight = Pango.Weight.BOLD; } } diff --git a/src/browsers/playlist3-current-playlist-browser.c b/src/browsers/playlist3-current-playlist-browser.c index 5bcd65b1..8cdc91c9 100644 --- a/src/browsers/playlist3-current-playlist-browser.c +++ b/src/browsers/playlist3-current-playlist-browser.c @@ -354,7 +354,11 @@ static void pl3_current_playlist_browser_init(PlayQueuePlugin * self) self->priv->pl3_cp_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - tree = gmpc_mpddata_treeview_new(self->priv->uid, FALSE, GTK_TREE_MODEL(playlist)); + tree = gmpc_data_view_new(self->priv->uid);//gmpc_mpddata_treeview_new(self->priv->uid, FALSE, GTK_TREE_MODEL(playlist)); + gmpc_data_view_set_is_play_queue(GMPC_DATA_VIEW(tree), TRUE); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(playlist)); + + gmpc_data_view_populate(GMPC_DATA_VIEW(tree)); g_signal_connect(G_OBJECT(tree), "paste_before", G_CALLBACK(pl3_current_playlist_browser_paste_before_songs), self); g_signal_connect(G_OBJECT(tree), "paste_after", G_CALLBACK(pl3_current_playlist_browser_paste_after_songs), self); @@ -390,7 +394,7 @@ static void pl3_current_playlist_browser_init(PlayQueuePlugin * self) /* set up the tree */ gtk_tree_view_set_enable_search(GTK_TREE_VIEW(tree), FALSE); - gmpc_mpddata_treeview_enable_click_fix(GMPC_MPDDATA_TREEVIEW(tree)); + //gmpc_mpddata_treeview_enable_click_fix(GMPC_MPDDATA_TREEVIEW(tree)); /* setup signals */ g_signal_connect(G_OBJECT(tree), "row-activated", G_CALLBACK(pl3_current_playlist_browser_row_activated), self); g_signal_connect(G_OBJECT(tree), "button-release-event", @@ -794,7 +798,7 @@ static int pl3_current_playlist_browser_button_release_event(GtkTreeView * tree, } playlist_editor_right_mouse(menu, pl3_current_playlist_editor_add_to_playlist, self); - gmpc_mpddata_treeview_right_mouse_intergration(GMPC_MPDDATA_TREEVIEW(tree), GTK_MENU(menu)); + //gmpc_mpddata_treeview_right_mouse_intergration(GMPC_MPDDATA_TREEVIEW(tree), GTK_MENU(menu)); gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, event->time); return TRUE; diff --git a/src/vapi/gmpc.vapi b/src/vapi/gmpc.vapi index 81c69814..9c6a768b 100644 --- a/src/vapi/gmpc.vapi +++ b/src/vapi/gmpc.vapi @@ -309,6 +309,8 @@ namespace Gmpc { public int get_int(string @class, string key); [CCode (cname="cfg_get_single_value_as_int", cheader_filename="config1.h")] public bool get_bool(string @class, string key); + [CCode (cname="cfg_get_single_value_as_int_with_default", cheader_filename="config1.h")] + public bool get_bool_with_default(string @class, string key, bool value); [CCode (cname="cfg_set_single_value_as_string", cheader_filename="config1.h")] public void set_string(string @class, string key, string @value); [CCode (cname="cfg_set_single_value_as_int", cheader_filename="config1.h")] @@ -431,7 +433,8 @@ namespace Gmpc { [CCode (cname="", cprefix = "MPDDATA_MODEL_COL_", cheader_filename = "gmpc-mpddata-model.h")] public enum ColumnTypes { - MARKUP, + PATH, + MARKUP, SONG_ARTIST, SONG_ALBUM, /* album name */ SONG_TITLE, /* song title */ @@ -446,6 +449,7 @@ namespace Gmpc { SONG_DISC, /* disc */ SONG_COMMENT, /* comment */ ICON_ID, /* icon id */ + SONG_ID, SONG_POS, SONG_ALBUMARTIST, PATH_EXTENSION, /* Extension */ diff --git a/src/vapi/libmpd.vapi b/src/vapi/libmpd.vapi index 3e207f0d..518b43a0 100644 --- a/src/vapi/libmpd.vapi +++ b/src/vapi/libmpd.vapi @@ -239,6 +239,8 @@ namespace MPD { namespace Player { [CCode (cname="mpd_player_play")] public void play(MPD.Server server); + [CCode (cname="mpd_player_play_id")] + public void play_id (MPD.Server server, int song_id); public void next(MPD.Server server); public void prev(MPD.Server server); public void pause(MPD.Server server); -- 2.11.4.GIT