commit 96029fb57f2ffc65395d758ed9158d6c57fd19b7 Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> Date: Sat Oct 9 22:25:15 2010 +0100
New track exec command interface * track_command_iface.* * Plugins can register themselves with this interface to execute a function on the current selection of tracks * display_tracks.c * Tracks no longer directly editable. Maybe that edit plugin registers itself as a track exec command? * Track is double-clicked to execute a command. More than one comamand should display a menu of commands to execute. Menu is still TODO * media_player/plugin.c * First implementation of track command. Result is user double clicks a track and the track starts to play in the media player libgtkpod/Makefile.am | 1 + libgtkpod/gtkpod_app_iface.c | 37 +++ libgtkpod/gtkpod_app_iface.h | 7 + libgtkpod/track_command_iface.c | 52 ++++ libgtkpod/track_command_iface.h | 55 ++++ plugins/media_player/plugin.c | 9 + plugins/track_display/display_tracks.c | 301 +------------------- plugins/track_display/track_display_context_menu.c | 2 - 8 files changed, 172 insertions(+), 292 deletions(-) --- diff --git a/libgtkpod/Makefile.am b/libgtkpod/Makefile.am index 345b7c7..f49667c 100644 --- a/libgtkpod/Makefile.am +++ b/libgtkpod/Makefile.am @@ -1,6 +1,7 @@ lib_LTLIBRARIES = libgtkpod.la libgtkpod_la_SOURCES = gtkpod_app_iface.h gtkpod_app_iface.c \ + track_command_iface.h track_command_iface.c \ exporter_iface.h exporter_iface.c \ repository_editor_iface.h repository_editor_iface.c \ details_editor_iface.h details_editor_iface.c \ diff --git a/libgtkpod/gtkpod_app_iface.c b/libgtkpod/gtkpod_app_iface.c index 7c05285..fa0dc9e 100644 --- a/libgtkpod/gtkpod_app_iface.c +++ b/libgtkpod/gtkpod_app_iface.c @@ -563,3 +563,40 @@ void gtkpod_edit_photos(iTunesDB *itdb) { PhotoEditorInterface *editor_iface = PHOTO_EDITOR_GET_INTERFACE(gp_iface->photo_editor); editor_iface->edit_photos(itdb); } + +void gtkpod_register_track_command(TrackCommandInterface *command) { + g_return_if_fail(GTKPOD_IS_APP(gtkpod_app)); + GtkPodAppInterface *gp_iface = GTKPOD_APP_GET_INTERFACE (gtkpod_app); + gp_iface->track_commands = g_list_append(gp_iface->track_commands, command); +} + +void gtkpod_unregister_track_command(TrackCommandInterface *command) { + g_return_if_fail(GTKPOD_IS_APP(gtkpod_app)); + GtkPodAppInterface *gp_iface = GTKPOD_APP_GET_INTERFACE (gtkpod_app); + gp_iface->track_commands = g_list_remove(gp_iface->track_commands, command); +} + +void gtkpod_execute_track_command(GList *tracks) { + g_return_if_fail(GTKPOD_IS_APP(gtkpod_app)); + GtkPodAppInterface *gp_iface = GTKPOD_APP_GET_INTERFACE (gtkpod_app); + + if (!tracks) { + return; + } + + switch(g_list_length(gp_iface->track_commands)) { + case 0: + // Do nothing + break; + case 1: + ; + TrackCommandInterface *command = g_list_nth_data(gp_iface->track_commands, 0); + command->execute(tracks); + break; + default: + // Show menu + // TODO + // FIXME - seems cannot play the vixen files with the parantheses in + g_warning("Display context menu of options"); + } +} diff --git a/libgtkpod/gtkpod_app_iface.h b/libgtkpod/gtkpod_app_iface.h index 38cc2f9..7a077c0 100644 --- a/libgtkpod/gtkpod_app_iface.h +++ b/libgtkpod/gtkpod_app_iface.h @@ -41,6 +41,7 @@ #include "details_editor_iface.h" #include "lyrics_editor_iface.h" #include "photo_editor_iface.h" +#include "track_command_iface.h" #define GTKPOD_APP_ICON_STOCK_ID "gtkpod" @@ -136,6 +137,8 @@ struct _GtkPodAppInterface { LyricsEditor *lyrics_editor; /* Photo Editor */ PhotoEditor *photo_editor; + /* Track Commands */ + GList *track_commands; void (*itdb_updated)(GtkPodApp *obj, iTunesDB *oldItdb, iTunesDB *newItbd); void (*statusbar_message)(GtkPodApp *obj, gchar* message); @@ -228,6 +231,10 @@ void gtkpod_unregister_photo_editor(); gboolean gtkpod_has_photo_editor(); void gtkpod_edit_photos(iTunesDB *itdb); +void gtkpod_register_track_command(TrackCommandInterface *command); +void gtkpod_unregister_track_command(TrackCommandInterface *command); +void gtkpod_execute_track_command(GList *tracks); + GtkPodApp *gtkpod_app; guint gtkpod_app_signals[LAST_SIGNAL]; diff --git a/libgtkpod/track_command_iface.c b/libgtkpod/track_command_iface.c new file mode 100644 index 0000000..7053957 --- /dev/null +++ b/libgtkpod/track_command_iface.c @@ -0,0 +1,52 @@ +/* + | Copyright (C) 2002-2010 Jorg Schuler <jcsjcs at users sourceforge net> + | Paul Richardson <phantom_sf at users.sourceforge.net> + | Part of the gtkpod project. + | + | URL: http://www.gtkpod.org/ + | URL: http://gtkpod.sourceforge.net/ + | + | 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + | + | iTunes and iPod are trademarks of Apple + | + | This product is not supported/written/published by Apple! + | + */ +#ifdef HAVE_CONFIG_H + #include <config.h> +#endif + +#include "track_command_iface.h" + +static void track_command_base_init(TrackCommandInterface *klass) { + static gboolean initialized = FALSE; + + if (!initialized) { + klass->execute = NULL; + initialized = TRUE; + } +} + +GType track_command_get_type(void) { + static GType type = 0; + if (!type) { + static const GTypeInfo info = + { sizeof(TrackCommandInterface), (GBaseInitFunc) track_command_base_init, NULL, NULL, NULL, NULL, 0, 0, NULL }; + type = g_type_register_static(G_TYPE_INTERFACE, "TrackCommandInterface", &info, 0); + g_type_interface_add_prerequisite(type, G_TYPE_OBJECT); + } + return type; +} diff --git a/libgtkpod/track_command_iface.h b/libgtkpod/track_command_iface.h new file mode 100644 index 0000000..154fd5a --- /dev/null +++ b/libgtkpod/track_command_iface.h @@ -0,0 +1,55 @@ +/* + | Copyright (C) 2002-2010 Jorg Schuler <jcsjcs at users sourceforge net> + | Paul Richardson <phantom_sf at users.sourceforge.net> + | Part of the gtkpod project. + | + | URL: http://www.gtkpod.org/ + | URL: http://gtkpod.sourceforge.net/ + | + | 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + | + | iTunes and iPod are trademarks of Apple + | + | This product is not supported/written/published by Apple! + | + */ + +#ifndef TRACK_COMMAND_IFACE_H_ +#define TRACK_COMMAND_IFACE_H_ + +#ifdef HAVE_CONFIG_H + #include <config.h> +#endif + +#include <gtk/gtk.h> +#include "itdb.h" + +typedef struct _TrackCommand TrackCommand; +typedef struct _TrackCommandInterface TrackCommandInterface; + +struct _TrackCommandInterface { + GTypeInterface g_iface; + + void (*execute)(GList *tracks); +}; + +GType track_command_get_type(void); + +#define TRACK_COMMAND_TYPE (track_command_get_type ()) +#define TRACK_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRACK_COMMAND_TYPE, TrackCommand)) +#define TRACK_IS_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRACK_COMMAND_TYPE)) +#define TRACK_COMMAND_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), TRACK_COMMAND_TYPE, TrackCommandInterface)) + +#endif /* TRACK_COMMAND_IFACE_H_ */ diff --git a/plugins/media_player/plugin.c b/plugins/media_player/plugin.c index a763d24..9d2c477 100644 --- a/plugins/media_player/plugin.c +++ b/plugins/media_player/plugin.c @@ -84,6 +84,8 @@ static gboolean activate_plugin(AnjutaPlugin *plugin) { init_media_player(media_player_plugin->media_player_window); + gtkpod_register_track_command(TRACK_COMMAND_GET_INTERFACE(media_player_plugin)); + // Do not show all as video widget is initially invisible gtk_widget_show(media_player_plugin->media_player_window); anjuta_shell_add_widget(plugin->shell, media_player_plugin->media_player_window, "MediaPlayerPlugin", " Media Player", PLAYER_ICON_STOCK_ID, ANJUTA_SHELL_PLACEMENT_BOTTOM, NULL); @@ -98,6 +100,8 @@ static gboolean deactivate_plugin(AnjutaPlugin *plugin) { media_player_plugin = (MediaPlayerPlugin*) plugin; ui = anjuta_shell_get_ui(plugin->shell, NULL); + gtkpod_unregister_track_command(TRACK_COMMAND_GET_INTERFACE(media_player_plugin)); + /* Destroy the browser */ destroy_media_player(); @@ -160,7 +164,12 @@ static void media_player_plugin_class_init(GObjectClass *klass) { // iface->unmerge = ipreferences_unmerge; //} +static void track_command_iface_init(TrackCommandInterface *iface) { + iface->execute = media_player_play_tracks; +} + ANJUTA_PLUGIN_BEGIN (MediaPlayerPlugin, media_player_plugin); +ANJUTA_PLUGIN_ADD_INTERFACE(track_command, TRACK_COMMAND_TYPE); // ANJUTA_PLUGIN_ADD_INTERFACE(ipreferences, IANJUTA_TYPE_PREFERENCES); ANJUTA_PLUGIN_END; diff --git a/plugins/track_display/display_tracks.c b/plugins/track_display/display_tracks.c index f188da1..6effce2 100644 --- a/plugins/track_display/display_tracks.c +++ b/plugins/track_display/display_tracks.c @@ -47,6 +47,7 @@ #include "libgtkpod/misc.h" #include "libgtkpod/prefs.h" #include "libgtkpod/directories.h" +#include "libgtkpod/gtkpod_app_iface.h" #include "display_tracks.h" #include "rb_cell_renderer_rating.h" #include "sort_window.h" @@ -309,10 +310,6 @@ static void on_tm_dnd_get_uri_foreach(GtkTreeModel *tm, GtkTreePath *tp, GtkTree } } -static void tm_drag_begin(GtkWidget *widget, GdkDragContext *dc, gpointer user_data) { - tm_stop_editing(TRUE); -} - /* remove dragged playlist after successful MOVE */ static void tm_drag_data_delete(GtkWidget *widget, GdkDragContext *dc, gpointer user_data) { GtkTreeSelection *ts; @@ -785,160 +782,6 @@ static void tm_rating_edited(RBCellRendererRating *renderer, const gchar *path_s } } -/* Called when editable cell is being edited. Stores new data to the - track list. ID3 tags in the corresponding files are updated as - well, if activated in the pref settings */ -static void tm_cell_edited(GtkCellRendererText *renderer, const gchar *path_string, const gchar *new_text, gpointer data) { - GtkTreeModel *model; - GtkTreeSelection *selection; - TM_item column; - gboolean multi_edit; - gint sel_rows_num; - GList *row_list, *row_node, *first; - - column = (TM_item) g_object_get_data(G_OBJECT(renderer), "column"); - multi_edit = prefs_get_int("multi_edit"); - /* if (column == TM_COLUMN_TITLE) - multi_edit &= prefs_get_int("multi_edit_title"); */ - selection = gtk_tree_view_get_selection(track_treeview); - row_list = gtk_tree_selection_get_selected_rows(selection, &model); - - /* printf("tm_cell_edited: column: %d\n", column); */ - - sel_rows_num = g_list_length(row_list); - - /* block widgets and update display if multi-edit is active */ - if (multi_edit && (sel_rows_num > 1)) - block_widgets(); - - first = g_list_first(row_list); - - for (row_node = first; row_node && (multi_edit || (row_node == first)); row_node = g_list_next(row_node)) { - Track *track; - ExtraTrackData *etr; - gboolean changed = FALSE; - GtkTreeIter iter; - gchar *str; - - gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) row_node->data); - gtk_tree_model_get(model, &iter, READOUT_COL, &track, -1); - g_return_if_fail (track); - etr = track->userdata; - g_return_if_fail (etr); - - changed = FALSE; - - switch (column) { - case TM_COLUMN_TITLE: - case TM_COLUMN_ALBUM: - case TM_COLUMN_ALBUMARTIST: - case TM_COLUMN_ARTIST: - case TM_COLUMN_GENRE: - case TM_COLUMN_COMPOSER: - case TM_COLUMN_COMMENT: - case TM_COLUMN_FILETYPE: - case TM_COLUMN_GROUPING: - case TM_COLUMN_CATEGORY: - case TM_COLUMN_DESCRIPTION: - case TM_COLUMN_PODCASTURL: - case TM_COLUMN_PODCASTRSS: - case TM_COLUMN_SUBTITLE: - case TM_COLUMN_TRACK_NR: - case TM_COLUMN_TRACKLEN: - case TM_COLUMN_CD_NR: - case TM_COLUMN_YEAR: - case TM_COLUMN_PLAYCOUNT: - case TM_COLUMN_RATING: - case TM_COLUMN_TIME_ADDED: - case TM_COLUMN_TIME_PLAYED: - case TM_COLUMN_TIME_MODIFIED: - case TM_COLUMN_TIME_RELEASED: - case TM_COLUMN_VOLUME: - case TM_COLUMN_SOUNDCHECK: - case TM_COLUMN_BITRATE: - case TM_COLUMN_SAMPLERATE: - case TM_COLUMN_BPM: - case TM_COLUMN_MEDIA_TYPE: - case TM_COLUMN_TV_SHOW: - case TM_COLUMN_TV_EPISODE: - case TM_COLUMN_TV_NETWORK: - case TM_COLUMN_SEASON_NR: - case TM_COLUMN_EPISODE_NR: - case TM_COLUMN_SORT_TITLE: - case TM_COLUMN_SORT_ALBUM: - case TM_COLUMN_SORT_ALBUMARTIST: - case TM_COLUMN_SORT_COMPOSER: - case TM_COLUMN_SORT_TVSHOW: - case TM_COLUMN_SORT_ARTIST: - changed = track_set_text(track, new_text, TM_to_T(column)); - if (changed && (column == TM_COLUMN_TRACKLEN)) { /* be on the safe side and reset starttime, stoptime and - * filesize */ - gchar *path = get_file_name_from_source(track, SOURCE_PREFER_LOCAL); - track->starttime = 0; - track->stoptime = 0; - if (path) { - struct stat filestat; - stat(path, &filestat); - track->size = filestat.st_size; - } - } - /* redisplay some items to be on the safe side */ - switch (column) { - case TM_COLUMN_TRACK_NR: - case TM_COLUMN_CD_NR: - case TM_COLUMN_TRACKLEN: - case TM_COLUMN_TIME_ADDED: - case TM_COLUMN_TIME_PLAYED: - case TM_COLUMN_TIME_MODIFIED: - case TM_COLUMN_TIME_RELEASED: - str = track_get_text(track, TM_to_T(column)); - g_object_set(G_OBJECT (renderer), "text", str, NULL); - g_free(str); - break; - default: - break; - } - break; - case TM_COLUMN_IPOD_ID: - case TM_COLUMN_PC_PATH: - case TM_COLUMN_TRANSFERRED: - case TM_COLUMN_SIZE: - case TM_COLUMN_IPOD_PATH: - case TM_COLUMN_COMPILATION: - case TM_COLUMN_THUMB_PATH: - case TM_COLUMN_LYRICS: - case TM_NUM_COLUMNS: - /* These are not editable text fields */ - break; - } - /* printf (" changed: %d\n", changed); */ - if (changed) { - track->time_modified = time(NULL); - gtkpod_track_updated (track); /* notify playlist model... */ - data_changed(track->itdb); /* indicate that data has changed */ - - if (prefs_get_int("id3_write")) { - /* T_item tag_id;*/ - /* should we update all ID3 tags or just the one - changed? -- obsoleted in 0.71*/ - /* if (prefs_get_id3_writeall ()) tag_id = T_ALL; - else tag_id = TM_to_T (column);*/ - write_tags_to_file(track); - /* display possible duplicates that have been removed */ - gp_duplicate_remove(NULL, NULL); - } - } - while (widgets_blocked && gtk_events_pending()) - gtk_main_iteration(); - } - - if (multi_edit && (sel_rows_num > 1)) - release_widgets(); - - g_list_foreach(row_list, (GFunc) gtk_tree_path_free, NULL); - g_list_free(row_list); -} - static void update_text_column_layout(GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer, const gchar* text) { GtkWidget* tree_widget; PangoLayout* layout; @@ -1439,37 +1282,6 @@ tm_get_all_tracks(void) { return result; } -static void cell_renderer_stop_editing(GtkCellRenderer *renderer, gpointer user_data) { - gtk_cell_renderer_stop_editing (renderer, (gboolean) GPOINTER_TO_INT(user_data)); -} - -/* Stop editing. If @cancel is TRUE, the edited value will be - discarded (I have the feeling that the "discarding" part does not - work quite the way intended). */ -void tm_stop_editing(gboolean cancel) { - GtkTreeViewColumn *col; - - if (!track_treeview) - return; - - gtk_tree_view_get_cursor(track_treeview, NULL, &col); - if (col) { - GList *cells; - - /* Before removing the widget we set multi_edit to FALSE. That - way at most one entry will be changed (this also doesn't - seem to work the way intended) */ - gboolean me = prefs_get_int("multi_edit"); - prefs_set_int("multi_edit", FALSE); - - cells = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT (col)); - g_list_foreach(cells, (GFunc) cell_renderer_stop_editing, GINT_TO_POINTER((gint) cancel)); - g_list_free(cells); - - prefs_set_int("multi_edit", me); - } -} - /* Function to compare @tm_item of @track1 and @track2. Used by tm_data_compare_func() */ static gint tm_data_compare(Track *track1, Track *track2, TM_item tm_item) { @@ -1943,84 +1755,6 @@ void tm_sort(TM_item col, GtkSortType order) { } } -static void tm_setup_renderer(GtkCellRenderer *renderer) { - TM_item column; - column = (TM_item) g_object_get_data(G_OBJECT (renderer), "column"); - - g_return_if_fail ((column >= 0) && (column < TM_NUM_COLUMNS)); - - switch (column) { - case TM_COLUMN_TITLE: - case TM_COLUMN_ARTIST: - case TM_COLUMN_ALBUM: - case TM_COLUMN_GENRE: - case TM_COLUMN_COMPOSER: - case TM_COLUMN_COMMENT: - case TM_COLUMN_FILETYPE: - case TM_COLUMN_GROUPING: - case TM_COLUMN_CATEGORY: - case TM_COLUMN_DESCRIPTION: - case TM_COLUMN_PODCASTURL: - case TM_COLUMN_PODCASTRSS: - case TM_COLUMN_SUBTITLE: - case TM_COLUMN_TIME_PLAYED: - case TM_COLUMN_TIME_MODIFIED: - case TM_COLUMN_TIME_ADDED: - case TM_COLUMN_TIME_RELEASED: - case TM_COLUMN_TV_SHOW: - case TM_COLUMN_TV_EPISODE: - case TM_COLUMN_TV_NETWORK: - case TM_COLUMN_ALBUMARTIST: - case TM_COLUMN_SORT_ARTIST: - case TM_COLUMN_SORT_TITLE: - case TM_COLUMN_SORT_ALBUM: - case TM_COLUMN_SORT_ALBUMARTIST: - case TM_COLUMN_SORT_COMPOSER: - case TM_COLUMN_SORT_TVSHOW: - g_object_set(G_OBJECT (renderer), "editable", TRUE, "xalign", 0.0, NULL); - break; - case TM_COLUMN_MEDIA_TYPE: - g_object_set(G_OBJECT (renderer), "editable", FALSE, "xalign", 0.0, NULL); - break; - case TM_COLUMN_TRACK_NR: - case TM_COLUMN_CD_NR: - case TM_COLUMN_BITRATE: - case TM_COLUMN_SAMPLERATE: - case TM_COLUMN_BPM: - case TM_COLUMN_PLAYCOUNT: - case TM_COLUMN_YEAR: - case TM_COLUMN_VOLUME: - case TM_COLUMN_SOUNDCHECK: - case TM_COLUMN_TRACKLEN: - case TM_COLUMN_SEASON_NR: - case TM_COLUMN_EPISODE_NR: - g_object_set(G_OBJECT (renderer), "editable", TRUE, "xalign", 1.0, NULL); - break; - case TM_COLUMN_IPOD_ID: - case TM_COLUMN_SIZE: - g_object_set(G_OBJECT (renderer), "editable", FALSE, "xalign", 1.0, NULL); - break; - case TM_COLUMN_PC_PATH: - case TM_COLUMN_IPOD_PATH: - case TM_COLUMN_THUMB_PATH: - g_object_set(G_OBJECT (renderer), "editable", FALSE, "xalign", 0.0, NULL); - break; - case TM_COLUMN_LYRICS: - g_object_set(G_OBJECT (renderer), "activatable", TRUE, NULL); - break; - case TM_COLUMN_TRANSFERRED: - g_object_set(G_OBJECT (renderer), "activatable", FALSE, NULL); - break; - case TM_COLUMN_COMPILATION: - g_object_set(G_OBJECT (renderer), "activatable", TRUE, NULL); - break; - case TM_COLUMN_RATING: - break; - case TM_NUM_COLUMNS: - g_return_if_reached(); - } -} - /* Adds the columns to our track_treeview */ static GtkTreeViewColumn *tm_add_column(TM_item tm_item, gint pos) { GtkTreeModel *model = gtk_tree_view_get_model(track_treeview); @@ -2102,7 +1836,7 @@ static GtkTreeViewColumn *tm_add_column(TM_item tm_item, gint pos) { text = _("ID"); break; case TM_COLUMN_TRANSFERRED: - text = _("Trnsfrd"); + text = _("Transferred"); renderer = gtk_cell_renderer_toggle_new(); cell_data_func = tm_cell_data_toggle_func; break; @@ -2159,18 +1893,13 @@ static GtkTreeViewColumn *tm_add_column(TM_item tm_item, gint pos) { G_CALLBACK (tm_rating_edited), NULL); } else { - /* text renderer -- editable/not editable is done in - tm_cell_data_func() */ + /* text renderer */ renderer = gtk_cell_renderer_text_new(); - g_signal_connect (G_OBJECT (renderer), "edited", - G_CALLBACK (tm_cell_edited), model); } } g_object_set_data(G_OBJECT (renderer), "column", (gint *) tm_item); - tm_setup_renderer(renderer); - gtk_tree_view_column_set_title(col, text); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(col, renderer, cell_data_func, NULL, NULL); @@ -2241,6 +1970,11 @@ static gboolean tm_button_press_event(GtkWidget *w, GdkEventButton *e, gpointer return (FALSE); } +static void tm_row_activated_event(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { + GList *tracks = tm_get_selected_tracks(); + gtkpod_execute_track_command(tracks); +} + static gboolean tm_selection_changed_cb(gpointer data) { GtkTreeView *treeview = GTK_TREE_VIEW (data); GtkTreePath *path; @@ -2300,28 +2034,12 @@ static void tm_create_treeview(void) { NULL); tm_add_columns(); - /* gtk_drag_source_set (GTK_WIDGET (track_treeview), GDK_BUTTON1_MASK, */ - /* tm_drag_types, TGNR (tm_drag_types), */ - /* GDK_ACTION_COPY|GDK_ACTION_MOVE); */ - /* gtk_tree_view_enable_model_drag_dest(track_treeview, tm_drop_types, */ - /* TGNR (tm_drop_types), */ - /* GDK_ACTION_COPY|GDK_ACTION_MOVE); */ - /* /\* need the gtk_drag_dest_set() with no actions ("0") so that the */ - /* data_received callback gets the correct info value. This is most */ - /* likely a bug... *\/ */ - /* gtk_drag_dest_set_target_list (GTK_WIDGET (track_treeview), */ - /* gtk_target_list_new (tm_drop_types, */ - /* TGNR (tm_drop_types))); */ gtk_drag_source_set(GTK_WIDGET (track_treeview), GDK_BUTTON1_MASK, tm_drag_types, TGNR (tm_drag_types), GDK_ACTION_COPY | GDK_ACTION_MOVE); gtk_drag_dest_set(GTK_WIDGET (track_treeview), 0, tm_drop_types, TGNR (tm_drop_types), GDK_ACTION_COPY | GDK_ACTION_MOVE); - g_signal_connect ((gpointer) track_treeview, "drag-begin", - G_CALLBACK (tm_drag_begin), - NULL); - g_signal_connect ((gpointer) track_treeview, "drag-data-delete", G_CALLBACK (tm_drag_data_delete), NULL); @@ -2356,6 +2074,9 @@ static void tm_create_treeview(void) { g_signal_connect ((gpointer) track_treeview, "button-press-event", G_CALLBACK (tm_button_press_event), NULL); + g_signal_connect ((gpointer) track_treeview, "row-activated", + G_CALLBACK (tm_row_activated_event), + NULL); g_signal_connect (G_OBJECT (model), "sort-column-changed", G_CALLBACK (tm_sort_column_changed), (gpointer)0); diff --git a/plugins/track_display/track_display_context_menu.c b/plugins/track_display/track_display_context_menu.c index 9166325..61de20b 100644 --- a/plugins/track_display/track_display_context_menu.c +++ b/plugins/track_display/track_display_context_menu.c @@ -137,8 +137,6 @@ void tm_context_menu_init(void) { if (widgets_blocked) return; - tm_stop_editing(TRUE); - GtkWidget *menu = NULL; Playlist *pl; ------------------------------------------------------------------------------ Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today. http://p.sf.net/sfu/beautyoftheweb _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2