66
67
static void rb_shell_clipboard_set (RBShellClipboard *clipboard,
68
69
static gboolean rb_shell_clipboard_idle_poll_deletions (RBShellClipboard *clipboard);
70
static void rb_shell_clipboard_playlist_added_cb (RBPlaylistManager *mgr,
71
RBPlaylistSource *source,
72
RBShellClipboard *clipboard);
69
73
static void rb_shell_clipboard_entry_deleted_cb (RhythmDB *db,
70
74
RhythmDBEntry *entry,
71
75
RBShellClipboard *clipboard);
72
76
static void rb_shell_clipboard_entryview_changed_cb (RBEntryView *view,
73
77
RBShellClipboard *clipboard);
78
static void rb_shell_clipboard_entries_changed_cb (RBEntryView *view,
80
RBShellClipboard *clipboard);
81
static void rb_shell_clipboard_cmd_add_to_playlist_new (GtkAction *action,
82
RBShellClipboard *clipboard);
74
83
static void rb_shell_clipboard_cmd_add_song_to_queue (GtkAction *action,
75
84
RBShellClipboard *clipboard);
76
85
static void rb_shell_clipboard_cmd_song_info (GtkAction *action,
77
86
RBShellClipboard *clipboard);
78
87
static void rb_shell_clipboard_cmd_queue_song_info (GtkAction *action,
79
88
RBShellClipboard *clipboard);
89
static gboolean rebuild_playlist_menu (RBShellClipboard *clipboard);
81
91
struct RBShellClipboardPrivate
85
95
RBStaticPlaylistSource *queue_source;
96
RBPlaylistManager *playlist_manager;
87
99
GtkActionGroup *actiongroup;
100
guint playlist_menu_ui_id;
89
102
GHashTable *signal_hash;
91
104
GAsyncQueue *deleted_queue;
106
guint idle_deletion_id, idle_sync_id, idle_playlist_id;
126
141
{ "EditDelete", GTK_STOCK_REMOVE, N_("_Remove"), NULL,
127
142
N_("Remove selection"),
128
143
G_CALLBACK (rb_shell_clipboard_cmd_delete) },
129
{ "EditMovetoTrash", GTK_STOCK_DELETE, N_("_Move To Trash"), "<control>T",
144
{ "EditMovetoTrash", GTK_STOCK_DELETE, N_("_Move to Trash"), "<control>T",
130
145
N_("Move selection to the trash"),
131
146
G_CALLBACK (rb_shell_clipboard_cmd_move_to_trash) },
133
{ "AddToQueue", GTK_STOCK_ADD, N_("Add _to Play Queue"), "<control>T",
148
{ "EditPlaylistAdd", NULL, N_("Add to P_laylist") },
149
{ "EditPlaylistAddNew", GTK_STOCK_ADD, N_("_New Playlist..."), NULL,
150
N_("Add the selected songs to a new playlist"),
151
G_CALLBACK (rb_shell_clipboard_cmd_add_to_playlist_new) },
152
{ "AddToQueue", GTK_STOCK_ADD, N_("Add _to Play Queue"), NULL,
134
153
N_("Add the selected songs to the play queue"),
135
154
G_CALLBACK (rb_shell_clipboard_cmd_add_song_to_queue) },
136
155
{ "QueueDelete", GTK_STOCK_REMOVE, N_("Remove"), NULL,
300
rb_shell_clipboard_set_source_internal (RBShellClipboard *clipboard,
303
if (clipboard->priv->source != NULL) {
304
RBEntryView *songs = rb_source_get_entry_view (clipboard->priv->source);
307
g_signal_handlers_disconnect_by_func (G_OBJECT (songs),
308
G_CALLBACK (rb_shell_clipboard_entryview_changed_cb),
310
g_signal_handlers_disconnect_by_func (G_OBJECT (songs),
311
G_CALLBACK (rb_shell_clipboard_entries_changed_cb),
315
clipboard->priv->source = source;
316
rb_debug ("selected source %p", source);
318
rb_shell_clipboard_sync (clipboard);
320
if (clipboard->priv->source != NULL) {
321
RBEntryView *songs = rb_source_get_entry_view (clipboard->priv->source);
324
g_signal_connect_object (G_OBJECT (songs),
326
G_CALLBACK (rb_shell_clipboard_entryview_changed_cb),
328
g_signal_connect_object (G_OBJECT (songs),
330
G_CALLBACK (rb_shell_clipboard_entries_changed_cb),
332
g_signal_connect_object (G_OBJECT (songs),
334
G_CALLBACK (rb_shell_clipboard_entries_changed_cb),
336
g_signal_connect_object (G_OBJECT (songs),
338
G_CALLBACK (rb_shell_clipboard_entryview_changed_cb),
255
345
rb_shell_clipboard_set_property (GObject *object,
257
347
const GValue *value,
387
486
rb_debug ("syncing clipboard");
389
488
if (g_list_length (clipboard->priv->entries) > 0)
390
can_paste = rb_source_can_cut (clipboard->priv->source);
489
can_paste = rb_source_can_paste (clipboard->priv->source);
392
491
if (have_selection) {
393
492
can_cut = rb_source_can_cut (clipboard->priv->source);
394
493
can_delete = rb_source_can_delete (clipboard->priv->source);
395
494
can_copy = rb_source_can_copy (clipboard->priv->source);
396
495
can_move_to_trash = rb_source_can_move_to_trash (clipboard->priv->source);
397
497
if (clipboard->priv->queue_source)
398
498
can_add_to_queue = rb_source_can_add_to_queue (clipboard->priv->source);
401
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
501
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditCut");
403
502
g_object_set (G_OBJECT (action), "sensitive", can_cut, NULL);
404
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
504
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditDelete");
406
505
g_object_set (G_OBJECT (action), "sensitive", can_delete, NULL);
407
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
507
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditMovetoTrash");
409
508
g_object_set (G_OBJECT (action), "sensitive", can_move_to_trash, NULL);
410
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
510
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditCopy");
412
511
g_object_set (G_OBJECT (action), "sensitive", can_copy, NULL);
414
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
513
action = gtk_action_group_get_action (clipboard->priv->actiongroup,"EditPaste");
416
514
g_object_set (G_OBJECT (action), "sensitive", can_paste, NULL);
418
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
516
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditPlaylistAdd");
517
g_object_set (G_OBJECT (action), "sensitive", can_copy, NULL);
519
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "AddToQueue");
420
520
g_object_set (G_OBJECT (action), "sensitive", can_add_to_queue, NULL);
422
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
424
g_object_set (G_OBJECT (action), "sensitive", have_selection, NULL);
426
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
427
"QueueMusicProperties");
428
g_object_set (G_OBJECT (action), "sensitive", have_sidebar_selection, NULL);
429
action = gtk_action_group_get_action (clipboard->priv->actiongroup,
431
g_object_set (G_OBJECT (action), "sensitive", have_sidebar_selection, NULL);
522
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "MusicProperties");
523
g_object_set (G_OBJECT (action), "sensitive", have_selection, NULL);
525
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "QueueMusicProperties");
526
g_object_set (G_OBJECT (action), "sensitive", have_sidebar_selection, NULL);
528
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "QueueDelete");
529
g_object_set (G_OBJECT (action), "sensitive", have_sidebar_selection, NULL);
531
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditSelectAll");
532
g_object_set (G_OBJECT (action), "sensitive", can_select_all, NULL);
534
action = gtk_action_group_get_action (clipboard->priv->actiongroup, "EditSelectNone");
535
g_object_set (G_OBJECT (action), "sensitive", have_selection, NULL);
582
688
rb_shell_clipboard_entryview_changed_cb (RBEntryView *view,
583
689
RBShellClipboard *clipboard)
585
rb_debug ("entryview changed");
586
rb_shell_clipboard_sync (clipboard);
691
if (clipboard->priv->idle_sync_id == 0)
692
clipboard->priv->idle_sync_id = g_idle_add ((GSourceFunc) rb_shell_clipboard_sync,
694
rb_debug ("entryview changed");
698
rb_shell_clipboard_entries_changed_cb (RBEntryView *view,
700
RBShellClipboard *clipboard)
702
rb_debug ("entryview changed");
703
if (clipboard->priv->idle_sync_id == 0)
704
clipboard->priv->idle_sync_id = g_idle_add ((GSourceFunc) rb_shell_clipboard_sync,
709
rb_shell_clipboard_cmd_add_to_playlist_new (GtkAction *action,
710
RBShellClipboard *clipboard)
713
RBSource *playlist_source;
715
rb_debug ("add to new playlist");
717
entries = rb_source_copy (clipboard->priv->source);
718
playlist_source = rb_playlist_manager_new_playlist (clipboard->priv->playlist_manager,
720
rb_source_paste (playlist_source, entries);
721
g_list_free (entries);
612
747
rb_play_queue_source_sidebar_song_info (RB_PLAY_QUEUE_SOURCE (clipboard->priv->queue_source));
751
rb_shell_clipboard_playlist_add_cb (GtkAction *action,
752
RBShellClipboard *clipboard)
754
RBSource *playlist_source;
757
rb_debug ("add to exisintg playlist");
758
playlist_source = g_object_get_data (G_OBJECT (action), "playlist-source");
760
entries = rb_source_copy (clipboard->priv->source);
761
rb_source_paste (playlist_source, entries);
762
g_list_free (entries);
766
generate_action_name (RBStaticPlaylistSource *source,
767
RBShellClipboard *clipboard)
769
return g_strdup_printf ("AddToPlaylistClipboardAction%p", source);
773
rb_shell_clipboard_playlist_deleted_cb (RBStaticPlaylistSource *source,
774
RBShellClipboard *clipboard)
779
action_name = generate_action_name (source, clipboard);
780
action = gtk_action_group_get_action (clipboard->priv->actiongroup, action_name);
782
gtk_action_group_remove_action (clipboard->priv->actiongroup, action);
783
g_free (action_name);
784
g_object_unref (G_OBJECT (action));
786
/* this will update the menu */
787
if (clipboard->priv->idle_playlist_id == 0) {
788
clipboard->priv->idle_playlist_id =
789
g_idle_add ((GSourceFunc)rebuild_playlist_menu, clipboard);
794
rb_shell_clipboard_playlist_renamed_cb (RBStaticPlaylistSource *source,
796
RBShellClipboard *clipboard)
798
char *name, *action_name;
801
g_object_get (G_OBJECT (source), "name", &name, NULL);
803
action_name = generate_action_name (source, clipboard);
804
action = gtk_action_group_get_action (clipboard->priv->actiongroup, action_name);
806
g_free (action_name);
808
g_object_set (G_OBJECT (action), "label", name, NULL);
810
g_object_unref (G_OBJECT (action));
814
rb_shell_clipboard_playlist_visible_cb (RBStaticPlaylistSource *source,
816
RBShellClipboard *clipboard)
818
gboolean visible = FALSE;
822
g_object_get (G_OBJECT (source), "visibility", &visible, NULL);
824
action_name = generate_action_name (source, clipboard);
825
action = gtk_action_group_get_action (clipboard->priv->actiongroup, action_name);
827
g_free (action_name);
829
gtk_action_set_visible (action, visible);
830
g_object_unref (G_OBJECT (action));
834
add_playlist_to_menu (GtkTreeModel *model,
837
RBShellClipboard *clipboard)
839
RhythmDBEntryType entry_type, source_entry_type;
840
RBSource *source = NULL;
845
gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
846
RB_SOURCELIST_MODEL_COLUMN_SOURCE, &source, -1);
848
if (!RB_IS_STATIC_PLAYLIST_SOURCE (source))
850
entry_type = RHYTHMDB_ENTRY_TYPE_SONG;
851
g_object_get (G_OBJECT (source), "entry-type", &source_entry_type, NULL);
852
if (source_entry_type != entry_type)
855
action_name = generate_action_name (RB_STATIC_PLAYLIST_SOURCE (source), clipboard);
856
action = gtk_action_group_get_action (clipboard->priv->actiongroup, action_name);
857
if (action == NULL) {
860
g_object_get (G_OBJECT (source), "name", &name, NULL);
861
action = gtk_action_new (action_name, name, NULL, NULL);
862
gtk_action_group_add_action (clipboard->priv->actiongroup, action);
865
g_object_set_data (G_OBJECT (action), "playlist-source", source);
866
g_signal_connect_object (G_OBJECT (action),
867
"activate", G_CALLBACK (rb_shell_clipboard_playlist_add_cb),
870
g_signal_connect_object (G_OBJECT (source),
871
"deleted", G_CALLBACK (rb_shell_clipboard_playlist_deleted_cb),
873
g_signal_connect_object (G_OBJECT (source),
874
"notify::name", G_CALLBACK (rb_shell_clipboard_playlist_renamed_cb),
876
g_signal_connect_object (G_OBJECT (source),
877
"notify::visibility", G_CALLBACK (rb_shell_clipboard_playlist_visible_cb),
881
for (i = 0; i < num_playlist_menu_paths; i++) {
882
gtk_ui_manager_add_ui (clipboard->priv->ui_mgr, clipboard->priv->playlist_menu_ui_id,
883
playlist_menu_paths[i],
884
action_name, action_name,
885
GTK_UI_MANAGER_AUTO, FALSE);
892
rebuild_playlist_menu (RBShellClipboard *clipboard)
894
GtkTreeModel *model = NULL;
895
GObject *sourcelist = NULL;
897
if (clipboard->priv->playlist_menu_ui_id != 0) {
898
gtk_ui_manager_remove_ui (clipboard->priv->ui_mgr,
899
clipboard->priv->playlist_menu_ui_id);
901
clipboard->priv->playlist_menu_ui_id =
902
gtk_ui_manager_new_merge_id (clipboard->priv->ui_mgr);
905
g_object_get (G_OBJECT (clipboard->priv->playlist_manager), "sourcelist", &sourcelist, NULL);
906
g_object_get (sourcelist, "model", &model, NULL);
907
g_object_unref (sourcelist);
908
gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)add_playlist_to_menu, clipboard);
909
g_object_unref (G_OBJECT (model));
911
clipboard->priv->idle_playlist_id = 0;
916
rb_shell_clipboard_playlist_added_cb (RBPlaylistManager *mgr,
917
RBPlaylistSource *source,
918
RBShellClipboard *clipboard)
920
if (!RB_IS_STATIC_PLAYLIST_SOURCE (source))
923
if (clipboard->priv->idle_playlist_id == 0) {
924
clipboard->priv->idle_playlist_id =
925
g_idle_add ((GSourceFunc)rebuild_playlist_menu, clipboard);