96
82
BRASERO_PLAYLIST_NB_COL,
101
static void brasero_playlist_beagle_hit_added_cb (BeagleQuery *query,
102
BeagleHitsAddedResponse *response,
103
BraseroPlaylist *playlist);
104
static void brasero_playlist_beagle_hit_substracted_cb (BeagleQuery *query,
105
BeagleHitsSubtractedResponse *response,
106
BraseroPlaylist *playlist);
107
static void brasero_playlist_beagle_finished_cb (BeagleQuery *query,
108
BeagleFinishedResponse *response,
109
BraseroPlaylist *playlist);
112
static void brasero_playlist_drag_data_get_cb (GtkTreeView *tree,
113
GdkDragContext *drag_context,
114
GtkSelectionData *selection_data,
117
BraseroPlaylist *playlist);
118
static void brasero_playlist_add_cb (GtkButton *button,
119
BraseroPlaylist *playlist);
120
static void brasero_playlist_remove_cb (GtkButton *button,
121
BraseroPlaylist *playlist);
122
static void brasero_playlist_add_uri_playlist (BraseroPlaylist *playlist,
125
static void brasero_playlist_search_playlists_rhythmbox (BraseroPlaylist *playlist);
126
static void brasero_playlist_increase_activity_counter (BraseroPlaylist *playlist);
127
static void brasero_playlist_decrease_activity_counter (BraseroPlaylist *playlist);
128
static void brasero_playlist_row_activated_cb (GtkTreeView *tree,
130
GtkTreeViewColumn *column,
131
BraseroPlaylist *playlist);
132
static void brasero_playlist_selection_changed_cb (GtkTreeSelection *
136
static gchar **brasero_playlist_get_selected_uris_real (BraseroPlaylist *playlist);
139
brasero_playlist_get_selected_uris (BraseroURIContainer *container);
141
brasero_playlist_get_selected_uri (BraseroURIContainer *container);
144
brasero_playlist_get_proportion (BraseroLayoutObject *object,
156
92
static guint nb_ntables = sizeof (ntables) / sizeof (ntables[0]);
158
static GObjectClass *parent_class = NULL;
94
static void brasero_playlist_iface_uri_container_init (BraseroURIContainerIFace *iface);
95
static void brasero_playlist_iface_layout_object_init (BraseroLayoutObjectIFace *iface);
97
G_DEFINE_TYPE_WITH_CODE (BraseroPlaylist,
100
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_URI_CONTAINER,
101
brasero_playlist_iface_uri_container_init)
102
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_LAYOUT_OBJECT,
103
brasero_playlist_iface_layout_object_init));
160
105
#define BRASERO_PLAYLIST_SPACING 6
163
brasero_playlist_get_type ()
165
static GType type = 0;
168
static const GTypeInfo our_info = {
169
sizeof (BraseroPlaylistClass),
172
(GClassInitFunc) brasero_playlist_class_init,
175
sizeof (BraseroPlaylist),
177
(GInstanceInitFunc) brasero_playlist_init,
180
static const GInterfaceInfo uri_container_info =
182
(GInterfaceInitFunc) brasero_playlist_iface_uri_container_init,
186
static const GInterfaceInfo layout_object_info =
188
(GInterfaceInitFunc) brasero_playlist_iface_layout_object_init,
193
type = g_type_register_static (GTK_TYPE_VBOX,
197
g_type_add_interface_static (type,
198
BRASERO_TYPE_URI_CONTAINER,
199
&uri_container_info);
200
g_type_add_interface_static (type,
201
BRASERO_TYPE_LAYOUT_OBJECT,
202
&layout_object_info);
209
brasero_playlist_class_init (BraseroPlaylistClass *klass)
211
GObjectClass *object_class = G_OBJECT_CLASS (klass);
212
GtkObjectClass *gtkobject_class = GTK_OBJECT_CLASS (klass);
214
parent_class = g_type_class_peek_parent (klass);
215
object_class->finalize = brasero_playlist_finalize;
216
gtkobject_class->destroy = brasero_playlist_destroy;
220
brasero_playlist_iface_uri_container_init (BraseroURIContainerIFace *iface)
222
iface->get_selected_uri = brasero_playlist_get_selected_uri;
223
iface->get_selected_uris = brasero_playlist_get_selected_uris;
227
brasero_playlist_iface_layout_object_init (BraseroLayoutObjectIFace *iface)
229
iface->get_proportion = brasero_playlist_get_proportion;
233
108
brasero_playlist_get_proportion (BraseroLayoutObject *object,
238
113
GtkRequisition requisition;
240
gtk_widget_size_request (BRASERO_PLAYLIST (object)->priv->button_add->parent,
115
gtk_widget_get_preferred_size (gtk_widget_get_parent (BRASERO_PLAYLIST (object)->priv->button_add),
242
117
(*footer) = requisition.height + BRASERO_PLAYLIST_SPACING;
246
brasero_playlist_init (BraseroPlaylist *obj)
248
GtkWidget *hbox, *scroll;
249
GtkTreeStore *store = NULL;
250
GtkCellRenderer *renderer;
251
GtkTreeViewColumn *column;
253
obj->priv = g_new0 (BraseroPlaylistPrivate, 1);
254
gtk_box_set_spacing (GTK_BOX (obj), BRASERO_PLAYLIST_SPACING);
256
hbox = gtk_hbox_new (FALSE, 8);
257
gtk_widget_show (hbox);
259
obj->priv->button_add = gtk_button_new_from_stock (GTK_STOCK_ADD);
260
gtk_widget_show (obj->priv->button_add);
261
gtk_box_pack_end (GTK_BOX (hbox),
262
obj->priv->button_add,
266
g_signal_connect (G_OBJECT (obj->priv->button_add),
268
G_CALLBACK (brasero_playlist_add_cb),
271
obj->priv->button_remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
272
gtk_widget_show (obj->priv->button_remove);
273
gtk_box_pack_end (GTK_BOX (hbox),
274
obj->priv->button_remove,
278
g_signal_connect (G_OBJECT (obj->priv->button_remove),
280
G_CALLBACK (brasero_playlist_remove_cb),
283
gtk_box_pack_end (GTK_BOX (obj), hbox, FALSE, FALSE, 0);
285
store = gtk_tree_store_new (BRASERO_PLAYLIST_NB_COL,
293
obj->priv->tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
294
egg_tree_multi_drag_add_drag_support (GTK_TREE_VIEW (obj->priv->tree));
296
gtk_tree_view_set_enable_tree_lines (GTK_TREE_VIEW (obj->priv->tree), TRUE);
297
gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (obj->priv->tree), TRUE);
298
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (obj->priv->tree), TRUE);
299
gtk_tree_view_set_enable_search (GTK_TREE_VIEW (obj->priv->tree), TRUE);
300
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (obj->priv->tree), TRUE);
301
gtk_tree_view_set_expander_column (GTK_TREE_VIEW (obj->priv->tree),
302
BRASERO_PLAYLIST_DISPLAY_COL);
304
renderer = gtk_cell_renderer_text_new ();
305
column = gtk_tree_view_column_new_with_attributes (_("Playlists"),
307
BRASERO_PLAYLIST_DISPLAY_COL,
309
gtk_tree_view_column_set_sort_column_id (column,
310
BRASERO_PLAYLIST_DISPLAY_COL);
311
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
313
gtk_tree_view_column_set_expand (column, TRUE);
315
renderer = gtk_cell_renderer_text_new ();
316
column = gtk_tree_view_column_new_with_attributes (_("Number of Songs"),
318
BRASERO_PLAYLIST_NB_SONGS_COL,
320
gtk_tree_view_column_set_sort_column_id (column,
321
BRASERO_PLAYLIST_NB_SONGS_COL);
322
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
325
renderer = gtk_cell_renderer_text_new ();
326
column = gtk_tree_view_column_new_with_attributes (_("Length"),
328
BRASERO_PLAYLIST_LEN_COL,
330
gtk_tree_view_column_set_sort_column_id (column,
331
BRASERO_PLAYLIST_LEN_COL);
332
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
335
renderer = gtk_cell_renderer_text_new ();
336
column = gtk_tree_view_column_new_with_attributes (_("Genre"), renderer,
338
BRASERO_PLAYLIST_GENRE_COL,
340
gtk_tree_view_column_set_sort_column_id (column,
341
BRASERO_PLAYLIST_GENRE_COL);
342
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
345
gtk_tree_view_set_search_column (GTK_TREE_VIEW (obj->priv->tree),
346
BRASERO_PLAYLIST_DISPLAY_COL);
347
gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (obj->priv->tree),
348
GDK_BUTTON1_MASK, ntables,
353
g_signal_connect (G_OBJECT (obj->priv->tree), "drag_data_get",
354
G_CALLBACK (brasero_playlist_drag_data_get_cb),
357
g_signal_connect (G_OBJECT (obj->priv->tree), "row_activated",
358
G_CALLBACK (brasero_playlist_row_activated_cb),
361
g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (obj->priv->tree))),
363
G_CALLBACK (brasero_playlist_selection_changed_cb),
366
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (obj->priv->tree)),
367
GTK_SELECTION_MULTIPLE);
369
scroll = gtk_scrolled_window_new (NULL, NULL);
370
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
371
GTK_POLICY_AUTOMATIC,
372
GTK_POLICY_AUTOMATIC);
373
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll),
376
gtk_container_add (GTK_CONTAINER (scroll), obj->priv->tree);
377
gtk_box_pack_start (GTK_BOX (obj), scroll, TRUE, TRUE, 0);
381
121
brasero_playlist_increase_activity_counter (BraseroPlaylist *playlist)
383
if (!GTK_WIDGET (playlist->priv->tree)->window)
125
window = gtk_widget_get_window (GTK_WIDGET (playlist->priv->tree));
386
129
if (playlist->priv->activity_counter == 0) {
387
130
GdkCursor *cursor;
389
132
cursor = gdk_cursor_new (GDK_WATCH);
390
gdk_window_set_cursor (GTK_WIDGET (playlist->priv->tree)->window,
133
gdk_window_set_cursor (window,
392
gdk_cursor_unref (cursor);
135
g_object_unref (cursor);
394
137
playlist->priv->activity_counter++;
398
141
brasero_playlist_decrease_activity_counter (BraseroPlaylist *playlist)
400
145
if (playlist->priv->activity_counter > 0)
401
146
playlist->priv->activity_counter--;
403
if (!GTK_WIDGET (playlist->priv->tree)->window)
148
window = gtk_widget_get_window (GTK_WIDGET (playlist->priv->tree));
406
152
if (playlist->priv->activity_counter == 0)
407
gdk_window_set_cursor (GTK_WIDGET (playlist->priv->tree)->window,
412
brasero_playlist_destroy (GtkObject *object)
414
BraseroPlaylist *playlist = BRASERO_PLAYLIST (object);
418
if (playlist->priv->id) {
419
g_source_remove (playlist->priv->id);
420
playlist->priv->id = 0;
423
if (playlist->priv->client) {
424
g_object_unref (playlist->priv->client);
425
playlist->priv->client = NULL;
428
if (playlist->priv->query) {
429
g_object_unref (playlist->priv->query);
430
playlist->priv->query = NULL;
435
/* NOTE: we must do it here since cancel could call brasero_playlist_end
436
* itself calling decrease_activity_counter. In finalize the latter will
437
* raise problems since the GdkWindow has been destroyed */
438
if (playlist->priv->parse_type) {
439
brasero_io_cancel_by_base (playlist->priv->parse_type);
440
g_free (playlist->priv->parse_type);
441
playlist->priv->parse_type = NULL;
444
if (GTK_OBJECT_CLASS (parent_class)->destroy)
445
GTK_OBJECT_CLASS (parent_class)->destroy (object);
449
brasero_playlist_finalize (GObject *object)
451
BraseroPlaylist *cobj;
453
cobj = BRASERO_PLAYLIST (object);
457
G_OBJECT_CLASS (parent_class)->finalize (object);
153
gdk_window_set_cursor (window, NULL);
157
brasero_playlist_search_playlists_rhythmbox (BraseroPlaylist *playlist)
161
manager = rb_playlist_manager_new ();
162
lists = rb_playlist_manager_get_playlists (manager);
167
brasero_playlist_search (BraseroPlaylist *playlist)
169
const gchar* mimes [] = {"audio/x-ms-asx",
172
"audio/x-mp3-playlist",
175
brasero_search_engine_new_query (playlist->priv->engine, NULL);
176
brasero_search_engine_set_query_mime (playlist->priv->engine, mimes);
177
brasero_search_engine_start_query (playlist->priv->engine);
178
brasero_playlist_increase_activity_counter (playlist);
463
182
brasero_playlist_try_again (BraseroPlaylist *playlist)
465
playlist->priv->client = beagle_client_new (NULL);
466
if (!playlist->priv->client)
184
if (!brasero_search_engine_is_available (playlist->priv->engine))
187
brasero_playlist_search (playlist);
469
189
playlist->priv->id = 0;
474
brasero_playlist_start_beagle_search (BraseroPlaylist *playlist)
194
brasero_playlist_start_search (BraseroPlaylist *playlist)
476
playlist->priv->client = beagle_client_new (NULL);
477
if(playlist->priv->client) {
478
GError *error = NULL;
479
BeagleQueryPartOr *or_part;
480
BeagleQueryPartHuman *type;
481
BeagleQueryPartProperty *filetype;
483
playlist->priv->query = beagle_query_new ();
485
g_signal_connect (G_OBJECT (playlist->priv->query), "hits-added",
486
G_CALLBACK (brasero_playlist_beagle_hit_added_cb),
488
g_signal_connect (G_OBJECT (playlist->priv->query), "hits-subtracted",
489
G_CALLBACK (brasero_playlist_beagle_hit_substracted_cb),
491
g_signal_connect (G_OBJECT (playlist->priv->query), "finished",
492
G_CALLBACK (brasero_playlist_beagle_finished_cb),
495
type = beagle_query_part_human_new ();
496
beagle_query_part_human_set_string (type, "type:File");
497
beagle_query_add_part (playlist->priv->query, BEAGLE_QUERY_PART (type));
499
or_part = beagle_query_part_or_new ();
501
filetype = beagle_query_part_property_new ();
502
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
503
beagle_query_part_property_set_key (filetype, "beagle:MimeType");
504
beagle_query_part_property_set_value (filetype, "audio/x-ms-asx");
505
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
507
filetype = beagle_query_part_property_new ();
508
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
509
beagle_query_part_property_set_key (filetype, "beagle:MimeType");
510
beagle_query_part_property_set_value (filetype, "audio/x-mpegurl");
511
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
513
filetype = beagle_query_part_property_new ();
514
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
515
beagle_query_part_property_set_key (filetype, "beagle:MimeType");
516
beagle_query_part_property_set_value (filetype, "audio/x-scpls");
517
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
519
filetype = beagle_query_part_property_new ();
520
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
521
beagle_query_part_property_set_key (filetype, "beagle:FileType");
522
beagle_query_part_property_set_value (filetype, "audio/x-mp3-playlist");
523
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
525
beagle_query_add_part (playlist->priv->query, BEAGLE_QUERY_PART (or_part));
527
brasero_playlist_increase_activity_counter (playlist);
528
beagle_client_send_request_async (playlist->priv->client,
529
BEAGLE_REQUEST (playlist->priv->query),
532
g_warning ("Could not connect to beagle : %s\n",
534
g_error_free (error);
196
if (!playlist->priv->engine)
199
if (!brasero_search_engine_is_available (playlist->priv->engine)) {
538
200
/* we will retry in 10 seconds */
539
201
playlist->priv->id = g_timeout_add_seconds (10,
540
202
(GSourceFunc) brasero_playlist_try_again,
548
brasero_playlist_start_beagle_search (BraseroPlaylist *playlist)
553
#endif /* BUILD_SEARCH */
207
brasero_playlist_search (playlist);
556
brasero_playlist_expose_event_cb (GtkWidget *widget,
211
brasero_playlist_draw_cb (GtkWidget *widget,
560
215
BraseroPlaylist *playlist = BRASERO_PLAYLIST (widget);
563
218
* is if they become apparent. That will avoid overhead */
564
219
if (!playlist->priv->searched) {
565
220
playlist->priv->searched = 1;
566
brasero_playlist_start_beagle_search (playlist);
221
brasero_playlist_start_search (playlist);
567
222
brasero_playlist_search_playlists_rhythmbox (playlist);
574
brasero_playlist_new ()
576
BraseroPlaylist *obj;
578
obj = BRASERO_PLAYLIST (g_object_new (BRASERO_TYPE_PLAYLIST, NULL));
580
g_signal_connect (obj,
582
G_CALLBACK (brasero_playlist_expose_event_cb),
585
return GTK_WIDGET (obj);
589
brasero_playlist_get_selected_uris (BraseroURIContainer *container)
591
BraseroPlaylist *playlist;
593
playlist = BRASERO_PLAYLIST (container);
594
return brasero_playlist_get_selected_uris_real (playlist);
598
brasero_playlist_get_selected_uri (BraseroURIContainer *container)
600
BraseroPlaylist *playlist;
604
playlist = BRASERO_PLAYLIST (container);
605
uris = brasero_playlist_get_selected_uris_real (playlist);
608
uri = g_strdup (uris [0]);
617
brasero_playlist_unselect_all (BraseroPlaylist *playlist)
619
GtkTreeSelection *selection;
621
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (playlist->priv->tree));
622
gtk_tree_selection_unselect_all (selection);
626
brasero_playlist_add_cb (GtkButton *button, BraseroPlaylist *playlist)
628
GtkWidget *dialog, *toplevel;
633
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (playlist));
634
if (!GTK_WIDGET_TOPLEVEL (toplevel))
637
dialog = gtk_file_chooser_dialog_new (_("Select Playlist"),
638
GTK_WINDOW (toplevel),
639
GTK_FILE_CHOOSER_ACTION_OPEN,
640
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
641
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
644
gtk_dialog_set_default_response (GTK_DIALOG (dialog),
645
GTK_RESPONSE_ACCEPT);
646
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE);
647
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
648
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog),
651
gtk_widget_show_all (dialog);
652
result = gtk_dialog_run (GTK_DIALOG (dialog));
653
if (result == GTK_RESPONSE_CANCEL) {
654
gtk_widget_destroy (dialog);
658
uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog));
659
gtk_widget_destroy (dialog);
661
for (iter = uris; iter; iter = iter->next) {
663
brasero_playlist_add_uri_playlist (playlist, uri, FALSE);
670
brasero_playlist_remove_cb (GtkButton *button, BraseroPlaylist *playlist)
672
GtkTreeSelection *selection;
679
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (playlist->priv->tree));
680
rows = gtk_tree_selection_get_selected_rows (selection, &model);
685
/* we just remove the lists removing particular songs would be a nonsense */
686
/* we must reverse the list otherwise the last paths wouldn't be valid */
687
for (iter = g_list_last (rows); iter; iter = iter->prev) {
689
valid = gtk_tree_model_get_iter (model, &row, path);
690
gtk_tree_path_free (path);
692
if (valid == FALSE) /* if we remove the whole list it could happen that we try to remove twice a song */
695
if (gtk_tree_model_iter_has_child (model, &row)) {
698
/* we remove the songs if it's a list */
699
gtk_tree_model_iter_children (model, &child, &row);
700
while (gtk_tree_store_remove (GTK_TREE_STORE (model), &child) == TRUE);
701
gtk_tree_store_remove (GTK_TREE_STORE (model),
710
229
brasero_playlist_get_selected_uris_real (BraseroPlaylist *playlist)
292
brasero_playlist_get_selected_uris (BraseroURIContainer *container)
294
BraseroPlaylist *playlist;
296
playlist = BRASERO_PLAYLIST (container);
297
return brasero_playlist_get_selected_uris_real (playlist);
301
brasero_playlist_get_selected_uri (BraseroURIContainer *container)
303
BraseroPlaylist *playlist;
307
playlist = BRASERO_PLAYLIST (container);
308
uris = brasero_playlist_get_selected_uris_real (playlist);
311
uri = g_strdup (uris [0]);
320
brasero_playlist_remove_cb (GtkButton *button, BraseroPlaylist *playlist)
322
GtkTreeSelection *selection;
329
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (playlist->priv->tree));
330
rows = gtk_tree_selection_get_selected_rows (selection, &model);
335
/* we just remove the lists removing particular songs would be a nonsense */
336
/* we must reverse the list otherwise the last paths wouldn't be valid */
337
for (iter = g_list_last (rows); iter; iter = iter->prev) {
339
valid = gtk_tree_model_get_iter (model, &row, path);
340
gtk_tree_path_free (path);
342
if (valid == FALSE) /* if we remove the whole list it could happen that we try to remove twice a song */
345
if (gtk_tree_model_iter_has_child (model, &row)) {
348
/* we remove the songs if it's a list */
349
gtk_tree_model_iter_children (model, &child, &row);
350
while (gtk_tree_store_remove (GTK_TREE_STORE (model), &child) == TRUE);
351
gtk_tree_store_remove (GTK_TREE_STORE (model),
773
360
brasero_playlist_drag_data_get_cb (GtkTreeView *tree,
774
361
GdkDragContext *drag_context,
986
brasero_playlist_search_playlists_rhythmbox (BraseroPlaylist *playlist)
573
brasero_playlist_add_cb (GtkButton *button, BraseroPlaylist *playlist)
990
manager = rb_playlist_manager_new ();
991
lists = rb_playlist_manager_get_playlists (manager);
575
GtkWidget *dialog, *toplevel;
580
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (playlist));
581
if (!gtk_widget_is_toplevel (toplevel))
584
dialog = gtk_file_chooser_dialog_new (_("Select Playlist"),
585
GTK_WINDOW (toplevel),
586
GTK_FILE_CHOOSER_ACTION_OPEN,
587
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
588
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
591
gtk_dialog_set_default_response (GTK_DIALOG (dialog),
592
GTK_RESPONSE_ACCEPT);
593
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE);
594
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
595
gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dialog),
598
gtk_widget_show_all (dialog);
599
result = gtk_dialog_run (GTK_DIALOG (dialog));
600
if (result == GTK_RESPONSE_CANCEL) {
601
gtk_widget_destroy (dialog);
605
uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog));
606
gtk_widget_destroy (dialog);
608
for (iter = uris; iter; iter = iter->next) {
610
brasero_playlist_add_uri_playlist (playlist, uri, FALSE);
998
brasero_playlist_beagle_hit_added_cb (BeagleQuery *query,
999
BeagleHitsAddedResponse *response,
1000
BraseroPlaylist *playlist)
617
brasero_playlist_search_hit_added_cb (BraseroSearchEngine *engine,
619
BraseroPlaylist *playlist)
1002
GSList *list, *iter;
1004
621
const char *uri;
1006
list = beagle_hits_added_response_get_hits (response);
1007
for (iter = list; iter; iter = iter->next) {
1009
uri = beagle_hit_get_uri (hit);
1010
brasero_playlist_add_uri_playlist (playlist, uri, TRUE);
623
uri = brasero_search_engine_uri_from_hit (engine, hit);
624
brasero_playlist_add_uri_playlist (playlist, uri, TRUE);
1012
625
brasero_playlist_decrease_activity_counter (playlist);
1016
brasero_playlist_beagle_hit_substracted_cb (BeagleQuery *query,
1017
BeagleHitsSubtractedResponse *response,
1018
BraseroPlaylist *playlist)
629
brasero_playlist_search_hit_substracted_cb (BraseroSearchEngine *engine,
631
BraseroPlaylist *playlist)
1020
GSList *list, *iter;
1024
633
GtkTreeModel *model;
1025
634
GtkTreeIter row;
1027
637
model = gtk_tree_view_get_model (GTK_TREE_VIEW (playlist->priv->tree));
1029
list = beagle_hits_subtracted_response_get_uris (response);
1030
for (iter = list; iter; iter = iter->next) {
1033
if (!gtk_tree_model_get_iter_first (model, &row))
1037
gtk_tree_model_get (model, &row,
1038
BRASERO_PLAYLIST_URI_COL, &row_uri,
1041
if (!strcmp (row_uri, uri)) {
1042
gtk_tree_store_remove (GTK_TREE_STORE (model), &row);
638
uri = brasero_search_engine_uri_from_hit (engine, hit);
640
if (!gtk_tree_model_get_iter_first (model, &row))
646
gtk_tree_model_get (model, &row,
647
BRASERO_PLAYLIST_URI_COL, &row_uri,
650
if (!strcmp (row_uri, uri)) {
651
gtk_tree_store_remove (GTK_TREE_STORE (model), &row);
1046
652
g_free (row_uri);
1047
} while (gtk_tree_model_iter_next (model, &row));
657
} while (gtk_tree_model_iter_next (model, &row));
1052
brasero_playlist_beagle_finished_cb (BeagleQuery *query,
1053
BeagleFinishedResponse *response,
1054
BraseroPlaylist *playlist)
661
brasero_playlist_search_finished_cb (BraseroSearchEngine *engine,
662
BraseroPlaylist *playlist)
1056
664
brasero_playlist_decrease_activity_counter (playlist);
1059
#endif /* BUILD_SEARCH */
668
brasero_playlist_search_error_cb (BraseroSearchEngine *engine,
669
BraseroPlaylist *playlist)
1062
675
brasero_playlist_row_activated_cb (GtkTreeView *tree,
1074
687
brasero_uri_container_uri_selected (BRASERO_URI_CONTAINER (playlist));
1077
#endif /* BUILD_PLAYLIST */
691
brasero_playlist_init (BraseroPlaylist *obj)
693
GtkWidget *hbox, *scroll;
694
GtkTreeStore *store = NULL;
695
GtkCellRenderer *renderer;
696
GtkTreeViewColumn *column;
698
obj->priv = g_new0 (BraseroPlaylistPrivate, 1);
699
gtk_box_set_spacing (GTK_BOX (obj), BRASERO_PLAYLIST_SPACING);
701
hbox = gtk_hbox_new (FALSE, 8);
702
gtk_widget_show (hbox);
704
obj->priv->button_add = gtk_button_new_from_stock (GTK_STOCK_ADD);
705
gtk_widget_show (obj->priv->button_add);
706
gtk_box_pack_end (GTK_BOX (hbox),
707
obj->priv->button_add,
711
g_signal_connect (G_OBJECT (obj->priv->button_add),
713
G_CALLBACK (brasero_playlist_add_cb),
716
obj->priv->button_remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
717
gtk_widget_show (obj->priv->button_remove);
718
gtk_box_pack_end (GTK_BOX (hbox),
719
obj->priv->button_remove,
723
g_signal_connect (G_OBJECT (obj->priv->button_remove),
725
G_CALLBACK (brasero_playlist_remove_cb),
728
gtk_box_pack_end (GTK_BOX (obj), hbox, FALSE, FALSE, 0);
730
store = gtk_tree_store_new (BRASERO_PLAYLIST_NB_COL,
738
obj->priv->tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
739
egg_tree_multi_drag_add_drag_support (GTK_TREE_VIEW (obj->priv->tree));
741
gtk_tree_view_set_enable_tree_lines (GTK_TREE_VIEW (obj->priv->tree), TRUE);
742
gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (obj->priv->tree), TRUE);
743
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (obj->priv->tree), TRUE);
744
gtk_tree_view_set_enable_search (GTK_TREE_VIEW (obj->priv->tree), TRUE);
745
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (obj->priv->tree), TRUE);
746
gtk_tree_view_set_expander_column (GTK_TREE_VIEW (obj->priv->tree),
747
BRASERO_PLAYLIST_DISPLAY_COL);
749
renderer = gtk_cell_renderer_text_new ();
750
column = gtk_tree_view_column_new_with_attributes (_("Playlists"),
752
BRASERO_PLAYLIST_DISPLAY_COL,
754
gtk_tree_view_column_set_sort_column_id (column,
755
BRASERO_PLAYLIST_DISPLAY_COL);
756
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
758
gtk_tree_view_column_set_expand (column, TRUE);
760
renderer = gtk_cell_renderer_text_new ();
761
column = gtk_tree_view_column_new_with_attributes (_("Number of Songs"),
763
BRASERO_PLAYLIST_NB_SONGS_COL,
765
gtk_tree_view_column_set_sort_column_id (column,
766
BRASERO_PLAYLIST_NB_SONGS_COL);
767
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
770
renderer = gtk_cell_renderer_text_new ();
771
column = gtk_tree_view_column_new_with_attributes (_("Length"),
773
BRASERO_PLAYLIST_LEN_COL,
775
gtk_tree_view_column_set_sort_column_id (column,
776
BRASERO_PLAYLIST_LEN_COL);
777
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
780
renderer = gtk_cell_renderer_text_new ();
781
column = gtk_tree_view_column_new_with_attributes (_("Genre"), renderer,
783
BRASERO_PLAYLIST_GENRE_COL,
785
gtk_tree_view_column_set_sort_column_id (column,
786
BRASERO_PLAYLIST_GENRE_COL);
787
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
790
gtk_tree_view_set_search_column (GTK_TREE_VIEW (obj->priv->tree),
791
BRASERO_PLAYLIST_DISPLAY_COL);
792
gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (obj->priv->tree),
793
GDK_BUTTON1_MASK, ntables,
798
g_signal_connect (G_OBJECT (obj->priv->tree), "drag_data_get",
799
G_CALLBACK (brasero_playlist_drag_data_get_cb),
802
g_signal_connect (G_OBJECT (obj->priv->tree), "row_activated",
803
G_CALLBACK (brasero_playlist_row_activated_cb),
806
g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (obj->priv->tree))),
808
G_CALLBACK (brasero_playlist_selection_changed_cb),
811
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (obj->priv->tree)),
812
GTK_SELECTION_MULTIPLE);
814
scroll = gtk_scrolled_window_new (NULL, NULL);
815
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
816
GTK_POLICY_AUTOMATIC,
817
GTK_POLICY_AUTOMATIC);
818
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll),
821
gtk_container_add (GTK_CONTAINER (scroll), obj->priv->tree);
822
gtk_box_pack_start (GTK_BOX (obj), scroll, TRUE, TRUE, 0);
824
obj->priv->engine = brasero_search_engine_new_default ();
825
if (!obj->priv->engine)
828
g_signal_connect (G_OBJECT (obj->priv->engine), "hit-added",
829
G_CALLBACK (brasero_playlist_search_hit_added_cb),
831
g_signal_connect (G_OBJECT (obj->priv->engine), "hit-removed",
832
G_CALLBACK (brasero_playlist_search_hit_substracted_cb),
834
g_signal_connect (G_OBJECT (obj->priv->engine), "search-finished",
835
G_CALLBACK (brasero_playlist_search_finished_cb),
837
g_signal_connect (G_OBJECT (obj->priv->engine), "search-error",
838
G_CALLBACK (brasero_playlist_search_error_cb),
843
brasero_playlist_destroy (GtkWidget *object)
845
BraseroPlaylist *playlist = BRASERO_PLAYLIST (object);
847
if (playlist->priv->id) {
848
g_source_remove (playlist->priv->id);
849
playlist->priv->id = 0;
852
if (playlist->priv->engine) {
853
g_object_unref (playlist->priv->engine);
854
playlist->priv->engine = NULL;
857
/* NOTE: we must do it here since cancel could call brasero_playlist_end
858
* itself calling decrease_activity_counter. In finalize the latter will
859
* raise problems since the GdkWindow has been destroyed */
860
if (playlist->priv->parse_type) {
861
brasero_io_cancel_by_base (playlist->priv->parse_type);
862
brasero_io_job_base_free (playlist->priv->parse_type);
863
playlist->priv->parse_type = NULL;
866
if (GTK_WIDGET_CLASS (brasero_playlist_parent_class)->destroy)
867
GTK_WIDGET_CLASS (brasero_playlist_parent_class)->destroy (object);
871
brasero_playlist_finalize (GObject *object)
873
BraseroPlaylist *cobj;
875
cobj = BRASERO_PLAYLIST (object);
879
G_OBJECT_CLASS (brasero_playlist_parent_class)->finalize (object);
883
brasero_playlist_class_init (BraseroPlaylistClass *klass)
885
GObjectClass *object_class = G_OBJECT_CLASS (klass);
886
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
888
object_class->finalize = brasero_playlist_finalize;
889
widget_class->destroy = brasero_playlist_destroy;
893
brasero_playlist_iface_uri_container_init (BraseroURIContainerIFace *iface)
895
iface->get_selected_uri = brasero_playlist_get_selected_uri;
896
iface->get_selected_uris = brasero_playlist_get_selected_uris;
900
brasero_playlist_iface_layout_object_init (BraseroLayoutObjectIFace *iface)
902
iface->get_proportion = brasero_playlist_get_proportion;
906
brasero_playlist_new ()
908
BraseroPlaylist *obj;
910
obj = BRASERO_PLAYLIST (g_object_new (BRASERO_TYPE_PLAYLIST, NULL));
912
g_signal_connect (obj,
914
G_CALLBACK (brasero_playlist_draw_cb),
917
return GTK_WIDGET (obj);