1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4
* Copyright (C) Philippe Rouquier 2005-2008 <bonfire-app@wanadoo.fr>
6
* brasero is free software: you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* brasero is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
* See the GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License along
17
* with this program. If not, see <http://www.gnu.org/licenses/>.
27
#include <glib/gi18n-lib.h>
29
#include <gdk/gdkkeysyms.h>
33
#include "eggtreemultidnd.h"
35
#include "burn-debug.h"
36
#include "brasero-app.h"
37
#include "brasero-disc.h"
38
#include "brasero-io.h"
39
#include "brasero-utils.h"
40
#include "brasero-video-disc.h"
41
#include "brasero-video-project.h"
42
#include "brasero-video-tree-model.h"
43
#include "brasero-multi-song-props.h"
44
#include "brasero-song-properties.h"
45
#include "brasero-session-cfg.h"
47
typedef struct _BraseroVideoDiscPrivate BraseroVideoDiscPrivate;
48
struct _BraseroVideoDiscPrivate
54
GtkUIManager *manager;
55
GtkActionGroup *disc_group;
62
#define BRASERO_VIDEO_DISC_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_VIDEO_DISC, BraseroVideoDiscPrivate))
65
brasero_video_disc_iface_disc_init (BraseroDiscIface *iface);
67
G_DEFINE_TYPE_WITH_CODE (BraseroVideoDisc,
70
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_DISC,
71
brasero_video_disc_iface_disc_init));
79
brasero_video_disc_edit_information_cb (GtkAction *action,
80
BraseroVideoDisc *disc);
82
brasero_video_disc_open_activated_cb (GtkAction *action,
83
BraseroVideoDisc *disc);
85
brasero_video_disc_delete_activated_cb (GtkAction *action,
86
BraseroVideoDisc *disc);
88
brasero_video_disc_paste_activated_cb (GtkAction *action,
89
BraseroVideoDisc *disc);
91
static GtkActionEntry entries[] = {
92
{"ContextualMenu", NULL, N_("Menu")},
93
{"OpenVideo", GTK_STOCK_OPEN, NULL, NULL, N_("Open the selected video"),
94
G_CALLBACK (brasero_video_disc_open_activated_cb)},
95
{"EditVideo", GTK_STOCK_PROPERTIES, N_("_Edit Information..."), NULL, N_("Edit the video information (start, end, author, ...)"),
96
G_CALLBACK (brasero_video_disc_edit_information_cb)},
97
{"DeleteVideo", GTK_STOCK_REMOVE, NULL, NULL, N_("Remove the selected videos from the project"),
98
G_CALLBACK (brasero_video_disc_delete_activated_cb)},
99
{"PasteVideo", GTK_STOCK_PASTE, NULL, NULL, N_("Add the files stored in the clipboard"),
100
G_CALLBACK (brasero_video_disc_paste_activated_cb)},
101
/* {"Split", "transform-crop-and-resize", N_("_Split Track..."), NULL, N_("Split the selected track"),
102
G_CALLBACK (brasero_video_disc_split_cb)} */
105
static const gchar *description = {
107
"<menubar name='menubar' >"
108
"<menu action='EditMenu'>"
109
/* "<placeholder name='EditPlaceholder'>"
110
"<menuitem action='Split'/>"
114
"<popup action='ContextMenu'>"
115
"<menuitem action='OpenVideo'/>"
116
"<menuitem action='DeleteVideo'/>"
118
"<menuitem action='PasteVideo'/>"
120
"<menuitem action='Split'/>"
122
"<menuitem action='EditVideo'/>"
124
/* "<toolbar name='Toolbar'>"
125
"<placeholder name='DiscButtonPlaceholder'>"
127
"<toolitem action='Split'/>"
134
TREE_MODEL_ROW = 150,
138
static GtkTargetEntry ntables_cd [] = {
139
{BRASERO_DND_TARGET_SELF_FILE_NODES, GTK_TARGET_SAME_WIDGET, TREE_MODEL_ROW},
140
{"text/uri-list", 0, TARGET_URIS_LIST}
142
static guint nb_targets_cd = sizeof (ntables_cd) / sizeof (ntables_cd[0]);
144
static GtkTargetEntry ntables_source [] = {
145
{BRASERO_DND_TARGET_SELF_FILE_NODES, GTK_TARGET_SAME_WIDGET, TREE_MODEL_ROW},
148
static guint nb_targets_source = sizeof (ntables_source) / sizeof (ntables_source[0]);
156
brasero_video_disc_name_editing_started_cb (GtkCellRenderer *renderer,
157
GtkCellEditable *editable,
159
BraseroVideoDisc *disc)
161
BraseroVideoDiscPrivate *priv;
163
priv = BRASERO_VIDEO_DISC_PRIVATE (disc);
168
brasero_video_disc_name_editing_canceled_cb (GtkCellRenderer *renderer,
169
BraseroVideoDisc *disc)
171
BraseroVideoDiscPrivate *priv;
173
priv = BRASERO_VIDEO_DISC_PRIVATE (disc);
178
brasero_video_disc_name_edited_cb (GtkCellRendererText *cellrenderertext,
181
BraseroVideoDisc *self)
183
BraseroVideoDiscPrivate *priv;
184
BraseroVideoProject *project;
185
BraseroVideoFile *file;
189
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
193
path = gtk_tree_path_new_from_string (path_string);
194
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
196
/* see if this is still a valid path. It can happen a user removes it
197
* while the name of the row is being edited */
198
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (project), &row, path)) {
199
gtk_tree_path_free (path);
203
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (project), path);
204
gtk_tree_path_free (path);
206
brasero_video_project_rename (project, file, text);
210
brasero_video_disc_vfs_activity_changed (BraseroVideoProject *project,
212
BraseroVideoDisc *self)
215
BraseroVideoDiscPrivate *priv;
217
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
219
if (!GTK_WIDGET (self)->window)
223
cursor = gdk_cursor_new (GDK_WATCH);
224
gdk_window_set_cursor (GTK_WIDGET (self)->window, cursor);
225
gdk_cursor_unref (cursor);
228
gdk_window_set_cursor (GTK_WIDGET (self)->window, NULL);
232
brasero_video_disc_directory_dialog (BraseroVideoProject *project,
234
BraseroVideoDisc *self)
239
dialog = brasero_app_dialog (brasero_app_get_default (),
240
_("Do you want to search for video files inside the directory?"),
242
GTK_MESSAGE_WARNING);
244
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
245
_("Directories cannot be added to video discs."));
247
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
248
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
249
_("_Search Directory"), GTK_RESPONSE_OK,
252
gtk_widget_show_all (dialog);
253
answer = gtk_dialog_run (GTK_DIALOG (dialog));
254
gtk_widget_destroy (dialog);
256
if (answer != GTK_RESPONSE_OK)
263
brasero_video_disc_unreadable_uri_dialog (BraseroVideoProject *project,
266
BraseroVideoDisc *self)
271
name = g_filename_display_basename (uri);
272
primary = g_strdup_printf (_("\"%s\" could not be opened."), name);
273
brasero_app_alert (brasero_app_get_default (),
282
brasero_video_disc_not_video_dialog (BraseroVideoProject *project,
284
BraseroVideoDisc *self)
289
BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
290
primary = g_strdup_printf (_("\"%s\" does not have a suitable type for video projects."), name);
291
brasero_app_alert (brasero_app_get_default (),
293
_("Please only add files with video contents"),
299
static BraseroDiscResult
300
brasero_video_disc_add_uri_real (BraseroVideoDisc *self,
305
GtkTreePath **path_return)
307
BraseroVideoFile *file;
308
BraseroVideoProject *project;
309
BraseroVideoDiscPrivate *priv;
310
BraseroVideoFile *sibling = NULL;
312
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
313
if (priv->reject_files)
314
return BRASERO_DISC_NOT_READY;
316
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
319
GtkTreePath *treepath;
321
treepath = gtk_tree_path_new ();
322
gtk_tree_path_append_index (treepath, pos);
323
sibling = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (project), treepath);
324
gtk_tree_path_free (treepath);
327
file = brasero_video_project_add_uri (project,
333
if (path_return && file)
334
*path_return = brasero_video_tree_model_file_to_path (BRASERO_VIDEO_TREE_MODEL (project), file);
336
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 1);
338
return BRASERO_DISC_OK;
341
static BraseroDiscResult
342
brasero_video_disc_add_uri (BraseroDisc *self,
345
BraseroVideoDiscPrivate *priv;
346
GtkTreePath *treepath = NULL;
347
BraseroDiscResult result;
349
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
350
result = brasero_video_disc_add_uri_real (BRASERO_VIDEO_DISC (self),
358
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->tree),
364
gtk_tree_path_free (treepath);
371
brasero_video_disc_delete_selected (BraseroDisc *self)
373
BraseroVideoDiscPrivate *priv;
374
GtkTreeSelection *selection;
379
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
381
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
383
selected = gtk_tree_selection_get_selected_rows (selection, &model);
384
selected = g_list_reverse (selected);
385
for (iter = selected; iter; iter = iter->next) {
386
BraseroVideoFile *file;
387
GtkTreePath *treepath;
389
treepath = iter->data;
391
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
392
gtk_tree_path_free (treepath);
397
brasero_video_project_remove_file (BRASERO_VIDEO_PROJECT (model), file);
399
g_list_free (selected);
403
brasero_video_disc_get_selected_uri (BraseroDisc *self,
408
GtkTreeSelection *selection;
409
BraseroVideoDiscPrivate *priv;
411
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
413
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
414
selected = gtk_tree_selection_get_selected_rows (selection, &model);
419
BraseroVideoFile *file;
420
GtkTreePath *treepath;
422
treepath = selected->data;
423
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
425
*uri = g_strdup (file->uri);
430
g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
431
g_list_free (selected);
437
brasero_video_disc_selection_changed_cb (GtkTreeSelection *selection,
438
BraseroVideoDisc *self)
440
brasero_disc_selection_changed (BRASERO_DISC (self));
444
brasero_video_disc_selection_function (GtkTreeSelection *selection,
446
GtkTreePath *treepath,
447
gboolean path_currently_selected,
450
BraseroVideoFile *file;
452
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
454
file->editable = !path_currently_selected;
465
brasero_video_disc_rename_songs (GtkTreeModel *model,
467
GtkTreePath *treepath,
468
const gchar *old_name,
469
const gchar *new_name)
471
BraseroVideoFile *file;
473
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
477
if (file->info->title)
478
g_free (file->info->title);
480
file->info->title = g_strdup (new_name);
485
brasero_video_disc_edit_song_properties_list (BraseroVideoDisc *self,
494
gchar *artist = NULL;
495
gchar *composer = NULL;
496
GtkResponseType result;
497
BraseroVideoDiscPrivate *priv;
499
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
501
if (!g_list_length (list))
504
model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree));
506
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
507
props = brasero_multi_song_props_new ();
508
brasero_multi_song_props_set_show_gap (BRASERO_MULTI_SONG_PROPS (props), FALSE);
510
gtk_window_set_transient_for (GTK_WINDOW (props),
511
GTK_WINDOW (toplevel));
512
gtk_window_set_modal (GTK_WINDOW (props), TRUE);
513
gtk_window_set_position (GTK_WINDOW (props),
514
GTK_WIN_POS_CENTER_ON_PARENT);
516
gtk_widget_show (GTK_WIDGET (props));
517
result = gtk_dialog_run (GTK_DIALOG (props));
518
gtk_widget_hide (GTK_WIDGET (props));
519
if (result != GTK_RESPONSE_ACCEPT)
522
brasero_multi_song_props_set_rename_callback (BRASERO_MULTI_SONG_PROPS (props),
523
gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree)),
524
BRASERO_VIDEO_TREE_MODEL_NAME,
525
brasero_video_disc_rename_songs);
527
brasero_multi_song_props_get_properties (BRASERO_MULTI_SONG_PROPS (props),
533
/* start by the end in case we add silences since then the next
534
* treepaths will be wrong */
535
copy = g_list_copy (list);
536
copy = g_list_reverse (copy);
538
for (item = copy; item; item = item->next) {
539
GtkTreePath *treepath;
540
BraseroVideoFile *file;
542
treepath = item->data;
543
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
548
g_free (file->info->artist);
549
file->info->artist = g_strdup (artist);
553
g_free (file->info->composer);
554
file->info->composer = g_strdup (composer);
558
file->info->isrc = isrc;
566
gtk_widget_destroy (props);
570
brasero_video_disc_edit_song_properties_file (BraseroVideoDisc *self,
571
BraseroVideoFile *file)
582
GtkResponseType result;
583
BraseroVideoDiscPrivate *priv;
585
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
587
model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree));
588
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
590
props = brasero_song_props_new ();
591
brasero_song_props_set_properties (BRASERO_SONG_PROPS (props),
595
file->info->composer,
597
file->end - file->start,
602
gtk_window_set_transient_for (GTK_WINDOW (props),
603
GTK_WINDOW (toplevel));
604
gtk_window_set_modal (GTK_WINDOW (props), TRUE);
605
gtk_window_set_position (GTK_WINDOW (props),
606
GTK_WIN_POS_CENTER_ON_PARENT);
608
gtk_widget_show (GTK_WIDGET (props));
609
result = gtk_dialog_run (GTK_DIALOG (props));
610
gtk_widget_hide (GTK_WIDGET (props));
611
if (result != GTK_RESPONSE_ACCEPT)
614
brasero_song_props_get_properties (BRASERO_SONG_PROPS (props),
624
if (file->info->title)
625
g_free (file->info->title);
627
file->info->title = title;
628
file->title_set = TRUE;
632
if (file->info->artist)
633
g_free (file->info->artist);
635
file->info->artist = artist;
636
file->artist_set = TRUE;
640
if (file->info->composer)
641
g_free (file->info->composer);
643
file->info->composer = composer;
644
file->composer_set = TRUE;
648
file->info->isrc = isrc;
649
file->isrc_set = TRUE;
652
brasero_video_project_resize_file (BRASERO_VIDEO_PROJECT (model), file, start, end);
656
gtk_widget_destroy (props);
660
brasero_video_disc_edit_information_cb (GtkAction *action,
661
BraseroVideoDisc *self)
665
GtkTreeSelection *selection;
666
BraseroVideoDiscPrivate *priv;
668
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
670
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
671
list = gtk_tree_selection_get_selected_rows (selection, &model);
676
if (g_list_length (list) == 1) {
677
BraseroVideoFile *file;
678
GtkTreePath *treepath;
680
treepath = list->data;
682
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
684
brasero_video_disc_edit_song_properties_file (self, file);
687
brasero_video_disc_edit_song_properties_list (self, list);
689
g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
694
brasero_video_disc_open_file (BraseroVideoDisc *self)
699
GtkTreePath *treepath;
700
GtkTreeSelection *selection;
701
BraseroVideoDiscPrivate *priv;
703
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
705
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
706
list = gtk_tree_selection_get_selected_rows (selection, &model);
708
for (item = list; item; item = item->next) {
709
BraseroVideoFile *file;
711
treepath = item->data;
712
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
713
gtk_tree_path_free (treepath);
719
uris = g_slist_prepend (uris, file->uri);
723
brasero_utils_launch_app (GTK_WIDGET (self), uris);
728
brasero_video_disc_open_activated_cb (GtkAction *action,
729
BraseroVideoDisc *self)
731
brasero_video_disc_open_file (self);
735
brasero_video_disc_clipboard_text_cb (GtkClipboard *clipboard,
737
BraseroVideoDisc *self)
745
array = g_uri_list_extract_uris (text);
748
if (**item != '\0') {
752
file = g_file_new_for_commandline_arg (*item);
753
uri = g_file_get_uri (file);
754
g_object_unref (file);
756
brasero_video_disc_add_uri_real (self,
771
brasero_video_disc_clipboard_targets_cb (GtkClipboard *clipboard,
774
BraseroVideoDisc *self)
776
if (brasero_clipboard_selection_may_have_uri (atoms, n_atoms))
777
gtk_clipboard_request_text (clipboard,
778
(GtkClipboardTextReceivedFunc) brasero_video_disc_clipboard_text_cb,
783
brasero_video_disc_paste_activated_cb (GtkAction *action,
784
BraseroVideoDisc *self)
786
GtkClipboard *clipboard;
788
clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
789
gtk_clipboard_request_targets (clipboard,
790
(GtkClipboardTargetsReceivedFunc) brasero_video_disc_clipboard_targets_cb,
795
brasero_video_disc_delete_activated_cb (GtkAction *action,
796
BraseroVideoDisc *self)
798
brasero_video_disc_delete_selected (BRASERO_DISC (self));
802
brasero_video_disc_button_pressed_cb (GtkTreeView *tree,
803
GdkEventButton *event,
804
BraseroVideoDisc *self)
806
GtkWidgetClass *widget_class;
807
BraseroVideoDiscPrivate *priv;
809
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
811
widget_class = GTK_WIDGET_GET_CLASS (tree);
813
if (event->button == 3) {
814
GtkTreeSelection *selection;
815
GtkTreePath *path = NULL;
818
gtk_tree_view_get_path_at_pos (tree,
826
selection = gtk_tree_view_get_selection (tree);
828
/* Don't update the selection if the right click was on one of
829
* the already selected rows */
830
if (!path || !gtk_tree_selection_path_is_selected (selection, path))
831
widget_class->button_press_event (GTK_WIDGET (tree), event);
833
widget = gtk_ui_manager_get_widget (priv->manager, "/ContextMenu/PasteAudio");
835
if (gtk_clipboard_wait_is_text_available (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)))
836
gtk_widget_set_sensitive (widget, TRUE);
838
gtk_widget_set_sensitive (widget, FALSE);
841
widget = gtk_ui_manager_get_widget (priv->manager,"/ContextMenu");
842
gtk_menu_popup (GTK_MENU (widget),
851
else if (event->button == 1) {
853
GtkTreePath *treepath = NULL;
855
result = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree),
863
/* we call the default handler for the treeview before everything else
864
* so it can update itself (paticularly its selection) before we have
866
widget_class->button_press_event (GTK_WIDGET (tree), event);
869
GtkTreeSelection *selection;
871
/* This is to deselect any row when selecting a
872
* row that cannot be selected or in an empty
874
selection = gtk_tree_view_get_selection (tree);
875
gtk_tree_selection_unselect_all (selection);
882
brasero_disc_selection_changed (BRASERO_DISC (self));
883
if (event->type == GDK_2BUTTON_PRESS) {
884
BraseroVideoFile *file;
887
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
888
file = brasero_video_tree_model_path_to_file (BRASERO_VIDEO_TREE_MODEL (model), treepath);
890
brasero_video_disc_edit_song_properties_file (self, file);
898
brasero_video_disc_add_ui (BraseroDisc *disc,
899
GtkUIManager *manager,
902
BraseroVideoDiscPrivate *priv;
903
GError *error = NULL;
906
priv = BRASERO_VIDEO_DISC_PRIVATE (disc);
909
g_object_unref (priv->message);
910
priv->message = NULL;
913
priv->message = message;
914
g_object_ref (message);
916
if (!priv->disc_group) {
917
priv->disc_group = gtk_action_group_new (BRASERO_DISC_ACTION);
918
gtk_action_group_set_translation_domain (priv->disc_group, GETTEXT_PACKAGE);
919
gtk_action_group_add_actions (priv->disc_group,
921
G_N_ELEMENTS (entries),
923
/* gtk_action_group_add_toggle_actions (priv->disc_group,
925
G_N_ELEMENTS (toggle_entries),
927
gtk_ui_manager_insert_action_group (manager,
932
merge_id = gtk_ui_manager_add_ui_from_string (manager,
937
BRASERO_BURN_LOG ("Adding ui elements failed: %s", error->message);
938
g_error_free (error);
942
priv->manager = manager;
943
g_object_ref (manager);
948
brasero_video_disc_rename_activated (BraseroVideoDisc *self)
950
BraseroVideoDiscPrivate *priv;
951
GtkTreeSelection *selection;
952
GtkTreeViewColumn *column;
953
GtkTreePath *treepath;
957
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
959
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
960
list = gtk_tree_selection_get_selected_rows (selection, &model);
962
for (; list; list = g_list_remove (list, treepath)) {
963
treepath = list->data;
965
gtk_widget_grab_focus (priv->tree);
966
column = gtk_tree_view_get_column (GTK_TREE_VIEW (priv->tree), 0);
967
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->tree),
973
gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->tree),
978
gtk_tree_path_free (treepath);
983
brasero_video_disc_key_released_cb (GtkTreeView *tree,
985
BraseroVideoDisc *self)
987
BraseroVideoDiscPrivate *priv;
989
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
993
if (event->keyval == GDK_KP_Delete || event->keyval == GDK_Delete) {
994
brasero_video_disc_delete_selected (BRASERO_DISC (self));
996
else if (event->keyval == GDK_F2)
997
brasero_video_disc_rename_activated (self);
1003
brasero_video_disc_row_deleted_cb (GtkTreeModel *model,
1005
BraseroVideoDisc *self)
1007
BraseroVideoProject *project;
1008
BraseroVideoDiscPrivate *priv;
1010
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1011
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1012
brasero_disc_contents_changed (BRASERO_DISC (self),
1013
brasero_video_project_get_file_num (BRASERO_VIDEO_PROJECT (model)));
1017
brasero_video_disc_row_inserted_cb (GtkTreeModel *model,
1020
BraseroVideoDisc *self)
1022
BraseroVideoProject *project;
1023
BraseroVideoDiscPrivate *priv;
1025
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1026
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1027
brasero_disc_contents_changed (BRASERO_DISC (self),
1028
brasero_video_project_get_file_num (BRASERO_VIDEO_PROJECT (model)));
1032
brasero_video_disc_row_changed_cb (GtkTreeModel *model,
1035
BraseroVideoDisc *self)
1037
BraseroVideoProject *project;
1038
BraseroVideoDiscPrivate *priv;
1040
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1041
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1042
brasero_disc_contents_changed (BRASERO_DISC (self),
1043
brasero_video_project_get_file_num (BRASERO_VIDEO_PROJECT (model)));
1047
brasero_video_disc_size_changed_cb (BraseroVideoProject *project,
1048
BraseroVideoDisc *self)
1050
brasero_disc_size_changed (BRASERO_DISC (self), brasero_video_project_get_size (project));
1054
brasero_video_disc_init (BraseroVideoDisc *object)
1056
BraseroVideoDiscPrivate *priv;
1057
GtkTreeSelection *selection;
1058
GtkTreeViewColumn *column;
1059
GtkCellRenderer *renderer;
1060
GtkTreeModel *model;
1064
priv = BRASERO_VIDEO_DISC_PRIVATE (object);
1066
/* the information displayed about how to use this tree */
1067
priv->notebook = brasero_disc_get_use_info_notebook ();
1068
gtk_widget_show (priv->notebook);
1069
gtk_box_pack_start (GTK_BOX (object), priv->notebook, TRUE, TRUE, 0);
1071
mainbox = gtk_vbox_new (FALSE, 12);
1072
gtk_widget_show (mainbox);
1073
gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), mainbox, NULL);
1074
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 0);
1077
model = GTK_TREE_MODEL (brasero_video_tree_model_new ());
1079
g_signal_connect (G_OBJECT (model),
1081
G_CALLBACK (brasero_video_disc_row_deleted_cb),
1083
g_signal_connect (G_OBJECT (model),
1085
G_CALLBACK (brasero_video_disc_row_inserted_cb),
1087
g_signal_connect (G_OBJECT (model),
1089
G_CALLBACK (brasero_video_disc_row_changed_cb),
1092
g_signal_connect (G_OBJECT (model),
1094
G_CALLBACK (brasero_video_disc_size_changed_cb),
1096
g_signal_connect (G_OBJECT (model),
1098
G_CALLBACK (brasero_video_disc_not_video_dialog),
1100
g_signal_connect (G_OBJECT (model),
1102
G_CALLBACK (brasero_video_disc_directory_dialog),
1104
g_signal_connect (G_OBJECT (model),
1106
G_CALLBACK (brasero_video_disc_unreadable_uri_dialog),
1108
g_signal_connect (G_OBJECT (model),
1110
G_CALLBACK (brasero_video_disc_vfs_activity_changed),
1113
priv->tree = gtk_tree_view_new_with_model (model);
1114
egg_tree_multi_drag_add_drag_support (GTK_TREE_VIEW (priv->tree));
1115
g_object_unref (G_OBJECT (model));
1116
gtk_widget_show (priv->tree);
1118
g_signal_connect (priv->tree,
1119
"button-press-event",
1120
G_CALLBACK (brasero_video_disc_button_pressed_cb),
1122
g_signal_connect (priv->tree,
1123
"key-release-event",
1124
G_CALLBACK (brasero_video_disc_key_released_cb),
1127
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (priv->tree), TRUE);
1128
gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (priv->tree), TRUE);
1131
column = gtk_tree_view_column_new ();
1132
gtk_tree_view_column_set_resizable (column, TRUE);
1133
gtk_tree_view_column_set_min_width (column, 200);
1135
renderer = gtk_cell_renderer_pixbuf_new ();
1136
gtk_tree_view_column_pack_start (column, renderer, FALSE);
1137
gtk_tree_view_column_add_attribute (column, renderer,
1138
"pixbuf", BRASERO_VIDEO_TREE_MODEL_MIME_ICON);
1140
renderer = gtk_cell_renderer_text_new ();
1141
g_signal_connect (G_OBJECT (renderer), "edited",
1142
G_CALLBACK (brasero_video_disc_name_edited_cb), object);
1143
g_signal_connect (G_OBJECT (renderer), "editing-started",
1144
G_CALLBACK (brasero_video_disc_name_editing_started_cb), object);
1145
g_signal_connect (G_OBJECT (renderer), "editing-canceled",
1146
G_CALLBACK (brasero_video_disc_name_editing_canceled_cb), object);
1148
g_object_set (G_OBJECT (renderer),
1149
"mode", GTK_CELL_RENDERER_MODE_EDITABLE,
1150
"ellipsize-set", TRUE,
1151
"ellipsize", PANGO_ELLIPSIZE_END,
1154
gtk_tree_view_column_pack_end (column, renderer, TRUE);
1155
gtk_tree_view_column_add_attribute (column, renderer,
1156
"markup", BRASERO_VIDEO_TREE_MODEL_NAME);
1157
gtk_tree_view_column_add_attribute (column, renderer,
1158
"editable", BRASERO_VIDEO_TREE_MODEL_EDITABLE);
1159
gtk_tree_view_column_set_title (column, _("Title"));
1160
g_object_set (G_OBJECT (column),
1164
gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree),
1167
gtk_tree_view_set_expander_column (GTK_TREE_VIEW (priv->tree),
1171
renderer = gtk_cell_renderer_text_new ();
1172
column = gtk_tree_view_column_new ();
1173
gtk_tree_view_column_pack_start (column, renderer, FALSE);
1175
gtk_tree_view_column_add_attribute (column, renderer,
1176
"text", BRASERO_VIDEO_TREE_MODEL_SIZE);
1177
gtk_tree_view_column_set_title (column, _("Size"));
1179
gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree), column);
1180
gtk_tree_view_column_set_resizable (column, TRUE);
1181
gtk_tree_view_column_set_expand (column, FALSE);
1184
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree));
1185
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
1186
g_signal_connect (selection,
1188
G_CALLBACK (brasero_video_disc_selection_changed_cb),
1190
gtk_tree_selection_set_select_function (selection,
1191
brasero_video_disc_selection_function,
1196
scroll = gtk_scrolled_window_new (NULL, NULL);
1197
gtk_widget_show (scroll);
1198
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll),
1200
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
1201
GTK_POLICY_AUTOMATIC,
1202
GTK_POLICY_AUTOMATIC);
1203
gtk_container_add (GTK_CONTAINER (scroll), priv->tree);
1204
gtk_box_pack_start (GTK_BOX (mainbox), scroll, TRUE, TRUE, 0);
1207
gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW
1209
ntables_cd, nb_targets_cd,
1213
gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (priv->tree),
1221
brasero_video_disc_reset_real (BraseroVideoDisc *self)
1223
BraseroVideoProject *project;
1224
BraseroVideoDiscPrivate *priv;
1226
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1227
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1228
brasero_video_project_reset (project);
1229
brasero_video_disc_vfs_activity_changed (project, FALSE, self);
1233
brasero_video_disc_clear (BraseroDisc *disc)
1235
BraseroVideoDiscPrivate *priv;
1237
priv = BRASERO_VIDEO_DISC_PRIVATE (disc);
1239
brasero_video_disc_reset_real (BRASERO_VIDEO_DISC (disc));
1241
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 0);
1242
brasero_disc_size_changed (disc, 0);
1246
brasero_video_disc_reset (BraseroDisc *disc)
1248
brasero_video_disc_reset_real (BRASERO_VIDEO_DISC (disc));
1252
brasero_video_disc_finalize (GObject *object)
1254
G_OBJECT_CLASS (brasero_video_disc_parent_class)->finalize (object);
1258
brasero_video_disc_get_property (GObject * object,
1263
BraseroVideoDiscPrivate *priv;
1265
priv = BRASERO_VIDEO_DISC_PRIVATE (object);
1268
case PROP_REJECT_FILE:
1269
g_value_set_boolean (value, priv->reject_files);
1272
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1278
brasero_video_disc_set_property (GObject * object,
1280
const GValue * value,
1283
BraseroVideoDiscPrivate *priv;
1285
priv = BRASERO_VIDEO_DISC_PRIVATE (object);
1288
case PROP_REJECT_FILE:
1289
priv->reject_files = g_value_get_boolean (value);
1292
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1297
static BraseroDiscResult
1298
brasero_video_disc_get_status (BraseroDisc *self,
1300
gchar **current_task)
1302
BraseroVideoProject *project;
1303
BraseroVideoDiscPrivate *priv;
1305
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1306
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1307
return brasero_video_project_get_status (project, remaining, current_task);
1311
brasero_video_disc_set_session_param (BraseroDisc *self,
1312
BraseroBurnSession *session)
1314
BraseroVideoDiscPrivate *priv;
1315
BraseroTrackType type;
1316
GtkTreeModel *model;
1319
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1321
type.type = BRASERO_TRACK_TYPE_AUDIO;
1322
type.subtype.audio_format = BRASERO_AUDIO_FORMAT_UNDEFINED|BRASERO_VIDEO_FORMAT_UNDEFINED;
1323
brasero_burn_session_set_input_type (session, &type);
1325
model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree));
1326
value = g_new0 (GValue, 1);
1327
g_value_init (value, G_TYPE_INT64);
1328
g_value_set_int64 (value, brasero_video_project_get_size (BRASERO_VIDEO_PROJECT (model)));
1329
brasero_burn_session_tag_add (session,
1330
BRASERO_AUDIO_TRACK_SIZE_TAG,
1332
return BRASERO_BURN_OK;
1336
brasero_video_disc_set_session_contents (BraseroDisc *self,
1337
BraseroBurnSession *session)
1339
GSList *tracks, *iter;
1340
BraseroVideoProject *project;
1341
BraseroVideoDiscPrivate *priv;
1343
priv = BRASERO_VIDEO_DISC_PRIVATE (self);
1344
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1345
tracks = brasero_video_project_get_contents (project, FALSE);
1348
return BRASERO_DISC_ERROR_EMPTY_SELECTION;
1350
for (iter = tracks; iter; iter = iter->next) {
1351
BraseroTrack *track;
1354
brasero_burn_session_add_track (session, track);
1356
/* It's good practice to unref the track afterwards as we don't
1357
* need it anymore. BraseroBurnSession refs it. */
1358
brasero_track_unref (track);
1361
g_slist_free (tracks);
1362
return BRASERO_DISC_OK;
1365
static BraseroDiscResult
1366
brasero_video_disc_get_track (BraseroDisc *disc,
1367
BraseroDiscTrack *disc_track)
1371
BraseroVideoProject *project;
1372
BraseroVideoDiscPrivate *priv;
1374
disc_track->type = BRASERO_PROJECT_TYPE_VIDEO;
1376
priv = BRASERO_VIDEO_DISC_PRIVATE (disc);
1377
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1378
tracks = brasero_video_project_get_contents (project, TRUE);
1380
for (iter = tracks; iter; iter = iter->next) {
1381
BraseroDiscSong *song;
1382
BraseroTrack *track;
1386
song = g_new0 (BraseroDiscSong, 1);
1387
song->uri = brasero_track_get_audio_source (track, TRUE);
1388
song->start = brasero_track_get_audio_start (track);
1389
song->end = brasero_track_get_audio_end (track);
1390
song->info = brasero_song_info_copy (brasero_track_get_audio_info (track));
1392
disc_track->contents.tracks = g_slist_append (disc_track->contents.tracks, song);
1395
g_slist_foreach (tracks, (GFunc) brasero_track_unref, NULL);
1396
g_slist_free (tracks);
1398
return BRASERO_DISC_OK;
1401
static BraseroDiscResult
1402
brasero_video_disc_load_track (BraseroDisc *disc,
1403
BraseroDiscTrack *track)
1406
BraseroVideoProject *project;
1407
BraseroVideoDiscPrivate *priv;
1409
g_return_val_if_fail (track->type == BRASERO_PROJECT_TYPE_VIDEO, FALSE);
1411
if (track->contents.tracks == NULL)
1412
return BRASERO_DISC_ERROR_EMPTY_SELECTION;
1414
priv = BRASERO_VIDEO_DISC_PRIVATE (disc);
1415
project = BRASERO_VIDEO_PROJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)));
1416
priv->loading = g_slist_length (track->contents.tracks);
1418
for (iter = track->contents.tracks; iter; iter = iter->next) {
1419
BraseroDiscSong *song;
1423
brasero_video_project_add_uri (BRASERO_VIDEO_PROJECT (project),
1430
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 1);
1432
return BRASERO_DISC_OK;
1436
brasero_video_disc_iface_disc_init (BraseroDiscIface *iface)
1438
iface->add_uri = brasero_video_disc_add_uri;
1439
iface->delete_selected = brasero_video_disc_delete_selected;
1440
iface->clear = brasero_video_disc_clear;
1441
iface->reset = brasero_video_disc_reset;
1443
iface->get_status = brasero_video_disc_get_status;
1444
iface->set_session_param = brasero_video_disc_set_session_param;
1445
iface->set_session_contents = brasero_video_disc_set_session_contents;
1447
iface->get_track = brasero_video_disc_get_track;
1448
iface->load_track = brasero_video_disc_load_track;
1450
iface->get_selected_uri = brasero_video_disc_get_selected_uri;
1451
iface->add_ui = brasero_video_disc_add_ui;
1455
brasero_video_disc_class_init (BraseroVideoDiscClass *klass)
1457
GObjectClass* object_class = G_OBJECT_CLASS (klass);
1459
g_type_class_add_private (klass, sizeof (BraseroVideoDiscPrivate));
1461
object_class->finalize = brasero_video_disc_finalize;
1462
object_class->set_property = brasero_video_disc_set_property;
1463
object_class->get_property = brasero_video_disc_get_property;
1465
g_object_class_install_property (object_class,
1467
g_param_spec_boolean
1469
"Whether it accepts files",
1470
"Whether it accepts files",
1472
G_PARAM_READWRITE));
1476
brasero_video_disc_new (void)
1478
return g_object_new (BRASERO_TYPE_VIDEO_DISC, NULL);