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

Reply via email to