418
419
gtk_action_set_sensitive (action, FALSE);
422
brasero_project_data_icon_error (BraseroProject *project,
426
brasero_app_alert (brasero_app_get_default (),
427
/* Translators: this is a picture not
429
C_("picture", "Please select another image."),
422
/********************************** help ***************************************/
424
brasero_utils_disc_find_tree_view_in_container (GtkContainer *container)
429
children = gtk_container_get_children (container);
430
for (iter = children; iter; iter = iter->next) {
434
if (GTK_IS_TREE_VIEW (widget)) {
435
g_list_free (children);
439
if (GTK_IS_CONTAINER (widget)) {
440
widget = brasero_utils_disc_find_tree_view_in_container (GTK_CONTAINER (widget));
442
g_list_free (children);
447
g_list_free (children);
453
brasero_utils_disc_find_tree_view (BraseroDisc *widget)
455
return brasero_utils_disc_find_tree_view_in_container (GTK_CONTAINER (widget));
459
brasero_utils_disc_hide_use_info_leave_cb (GtkWidget *widget,
460
GdkDragContext *drag_context,
462
BraseroProject *project)
464
GtkWidget *other_widget;
466
other_widget = brasero_utils_disc_find_tree_view (project->priv->current);
470
g_signal_emit_by_name (other_widget,
477
brasero_utils_disc_hide_use_info_drop_cb (GtkWidget *widget,
478
GdkDragContext *drag_context,
482
BraseroProject *project)
484
GdkAtom target = GDK_NONE;
485
GtkWidget *other_widget;
487
/* here the treeview is not realized so we'll have a warning message
488
* if we ever try to forward the event */
489
other_widget = brasero_utils_disc_find_tree_view (project->priv->current);
493
target = gtk_drag_dest_find_target (other_widget,
495
gtk_drag_dest_get_target_list (GTK_WIDGET (other_widget)));
497
if (target != GDK_NONE) {
498
gboolean return_value = FALSE;
500
/* It's necessary to make sure the treeview
501
* is realized already before sending the
503
gtk_widget_realize (other_widget);
505
/* The widget must be realized to receive such events. */
506
g_signal_emit_by_name (other_widget,
520
brasero_utils_disc_hide_use_info_data_received_cb (GtkWidget *widget,
521
GdkDragContext *drag_context,
524
GtkSelectionData *data,
527
BraseroProject *project)
529
GtkWidget *other_widget;
531
other_widget = brasero_utils_disc_find_tree_view (project->priv->current);
535
g_signal_emit_by_name (other_widget,
536
"drag-data-received",
546
brasero_utils_disc_hide_use_info_motion_cb (GtkWidget *widget,
547
GdkDragContext *drag_context,
551
GtkNotebook *notebook)
557
brasero_utils_disc_hide_use_info_button_cb (GtkWidget *widget,
558
GdkEventButton *event,
559
BraseroProject *project)
561
GtkWidget *other_widget;
564
if (event->button != 3)
567
other_widget = brasero_utils_disc_find_tree_view (project->priv->current);
571
g_signal_emit_by_name (other_widget,
572
"button-press-event",
580
brasero_utils_disc_style_changed_cb (GtkWidget *widget,
582
GtkWidget *event_box)
584
/* The widget (a treeview here) needs to be realized to get proper style */
585
gtk_widget_realize (widget);
586
gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, &widget->style->base[GTK_STATE_NORMAL]);
590
brasero_utils_disc_realized_cb (GtkWidget *event_box,
593
/* The widget (a treeview here) needs to be realized to get proper style */
594
gtk_widget_realize (textview);
595
gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, &textview->style->base[GTK_STATE_NORMAL]);
597
g_signal_handlers_disconnect_by_func (textview,
598
brasero_utils_disc_style_changed_cb,
600
g_signal_connect (textview,
602
G_CALLBACK (brasero_utils_disc_style_changed_cb),
607
brasero_disc_get_use_info_notebook (BraseroProject *project)
614
GtkWidget *alignment;
615
GtkTextBuffer *buffer;
616
GtkWidget *event_box;
618
notebook = gtk_notebook_new ();
619
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE);
620
gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE);
622
frame = gtk_frame_new (NULL);
623
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
624
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
628
/* Now this event box must be 'transparent' to have the same background
629
* color as a treeview */
630
event_box = gtk_event_box_new ();
631
gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), TRUE);
632
gtk_event_box_set_above_child (GTK_EVENT_BOX (event_box), TRUE);
633
gtk_drag_dest_set (event_box,
634
GTK_DEST_DEFAULT_MOTION,
640
/* the following signals need to be forwarded to the widget underneath */
641
g_signal_connect (event_box,
643
G_CALLBACK (brasero_utils_disc_hide_use_info_motion_cb),
645
g_signal_connect (event_box,
647
G_CALLBACK (brasero_utils_disc_hide_use_info_leave_cb),
649
g_signal_connect (event_box,
651
G_CALLBACK (brasero_utils_disc_hide_use_info_drop_cb),
653
g_signal_connect (event_box,
654
"button-press-event",
655
G_CALLBACK (brasero_utils_disc_hide_use_info_button_cb),
657
g_signal_connect (event_box,
658
"drag-data-received",
659
G_CALLBACK (brasero_utils_disc_hide_use_info_data_received_cb),
662
gtk_container_add (GTK_CONTAINER (frame), event_box);
664
/* The alignment to set properly the position of the GtkTextView */
665
alignment = gtk_alignment_new (0.5, 0.3, 0.0, 0.0);
666
gtk_widget_show (alignment);
667
gtk_container_add (GTK_CONTAINER (event_box), alignment);
669
/* The TreeView for the message */
670
buffer = gtk_text_buffer_new (NULL);
671
gtk_text_buffer_create_tag (buffer, "Title",
673
"justification", GTK_JUSTIFY_LEFT,
674
"foreground", "grey50",
677
gtk_text_buffer_create_tag (buffer, "TextBody",
678
"justification", GTK_JUSTIFY_LEFT,
679
"foreground", "grey50",
682
gtk_text_buffer_get_start_iter (buffer, &iter);
684
/* Translators: this messages will appear as a list of possible
686
* To add/remove files you can:
687
* * perform action one
688
* * perform action two
689
* The full message will be showed in the main area of an empty
690
* project, suggesting users how to add and remove items to project.
691
* You simply have to translate messages in the best form
692
* for a list of actions. */
693
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("To add files to this project you can:"), -1, "Title", NULL);
694
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
696
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("click the \"Add\" button to show a selection dialog"), -1, "TextBody", NULL);
697
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
698
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("select files in the selection pane and click the \"Add\" button"), -1, "TextBody", NULL);
699
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
700
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("drag files in this area from the selection pane or from the file manager"), -1, "TextBody", NULL);
701
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
702
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("double click on files in the selection pane"), -1, "TextBody", NULL);
703
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
704
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("copy files (from file manager for example) and paste in this area"), -1, "TextBody", NULL);
705
gtk_text_buffer_insert (buffer, &iter, "\n\n\n", -1);
707
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("To remove files from this project you can:"), -1, "Title", NULL);
708
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
710
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("click on the \"Remove\" button to remove selected items in this area"), -1, "TextBody", NULL);
711
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
712
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("select items in this area, and choose \"Remove\" from context menu"), -1, "TextBody", NULL);
713
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, "\n\t* ", -1, "TextBody", NULL);
714
gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, _("select items in this area, and press \"Delete\" key"), -1, "TextBody", NULL);
716
textview = gtk_text_view_new_with_buffer (buffer);
717
gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE);
718
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview), FALSE);
720
gtk_drag_dest_set (textview,
721
GTK_DEST_DEFAULT_MOTION,
727
/* the following signals need to be forwarded to the widget underneath */
728
g_signal_connect (textview,
730
G_CALLBACK (brasero_utils_disc_hide_use_info_motion_cb),
732
g_signal_connect (textview,
734
G_CALLBACK (brasero_utils_disc_hide_use_info_leave_cb),
736
g_signal_connect (textview,
738
G_CALLBACK (brasero_utils_disc_hide_use_info_drop_cb),
740
g_signal_connect (textview,
741
"button-press-event",
742
G_CALLBACK (brasero_utils_disc_hide_use_info_button_cb),
744
g_signal_connect (textview,
745
"drag-data-received",
746
G_CALLBACK (brasero_utils_disc_hide_use_info_data_received_cb),
749
gtk_container_add (GTK_CONTAINER (alignment), textview);
751
g_signal_connect (event_box,
753
G_CALLBACK (brasero_utils_disc_realized_cb),
756
chain = g_list_prepend (NULL, event_box);
757
gtk_container_set_focus_chain (GTK_CONTAINER (frame), chain);
760
chain = g_list_prepend (NULL, alignment);
761
gtk_container_set_focus_chain (GTK_CONTAINER (event_box), chain);
764
chain = g_list_prepend (NULL, textview);
765
gtk_container_set_focus_chain (GTK_CONTAINER (alignment), chain);
768
gtk_widget_show_all (notebook);
772
/********************************** size ***************************************/
775
brasero_project_get_sectors_string (gint64 sectors,
776
gboolean time_format)
781
size_bytes = sectors * GST_SECOND / 75;
782
return brasero_units_get_time_string (size_bytes, TRUE, FALSE);
434
brasero_app_alert (brasero_app_get_default (),
435
/* Translators: this is a picture not
437
C_("picture", "Please select another image."),
444
brasero_project_icon_changed_cb (BraseroDisc *disc,
445
BraseroProject *project)
447
GError *error = NULL;
451
icon = brasero_data_disc_get_scaled_icon_path (BRASERO_DATA_DISC (project->priv->current));
453
gtk_image_set_from_icon_name (GTK_IMAGE (project->priv->icon_img),
455
GTK_ICON_SIZE_LARGE_TOOLBAR);
459
/* Load and convert (48x48) the image into a pixbuf */
460
pixbuf = gdk_pixbuf_new_from_file_at_scale (icon,
468
gtk_image_set_from_icon_name (GTK_IMAGE (project->priv->icon_img),
470
GTK_ICON_SIZE_LARGE_TOOLBAR);
471
brasero_project_data_icon_error (project, error);
472
g_error_free (error);
476
gtk_image_set_from_pixbuf (GTK_IMAGE (project->priv->icon_img), pixbuf);
477
g_object_unref (pixbuf);
481
brasero_project_icon_button_clicked (GtkWidget *button,
482
BraseroProject *project)
484
GtkFileFilter *filter;
485
GError *error = NULL;
490
if (!BRASERO_IS_DATA_DISC (project->priv->current))
493
chooser = gtk_file_chooser_dialog_new (_("Medium Icon"),
494
GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (project))),
495
GTK_FILE_CHOOSER_ACTION_OPEN,
496
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
497
GTK_STOCK_OK, GTK_RESPONSE_OK,
500
filter = gtk_file_filter_new ();
501
gtk_file_filter_set_name (filter, _("All files"));
502
gtk_file_filter_add_pattern (filter, "*");
503
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
505
filter = gtk_file_filter_new ();
506
/* Translators: this is an image, a picture, not a "Disc Image" */
507
gtk_file_filter_set_name (filter, C_("picture", "Image files"));
508
gtk_file_filter_add_mime_type (filter, "image/*");
509
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
511
gtk_widget_show (chooser);
512
res = gtk_dialog_run (GTK_DIALOG (chooser));
513
if (res != GTK_RESPONSE_OK) {
514
gtk_widget_destroy (chooser);
518
path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
519
gtk_widget_destroy (chooser);
521
if (!brasero_data_disc_set_icon_path (BRASERO_DATA_DISC (project->priv->current), path, &error)) {
523
brasero_project_data_icon_error (project, error);
524
g_error_free (error);
785
size_bytes = sectors * 2048;
786
return g_format_size_for_display (size_bytes);
791
brasero_project_update_project_size (BraseroProject *project)
798
status = brasero_app_get_statusbar2 (brasero_app_get_default ());
800
if (!project->priv->status_ctx)
801
project->priv->status_ctx = gtk_statusbar_get_context_id (GTK_STATUSBAR (status),
804
gtk_statusbar_pop (GTK_STATUSBAR (status), project->priv->status_ctx);
806
brasero_burn_session_get_size (BRASERO_BURN_SESSION (project->priv->session),
810
string = brasero_project_get_sectors_string (sectors, !BRASERO_IS_DATA_DISC (project->priv->current));
811
size_str = g_strdup_printf (_("Project estimated size: %s"), string);
815
gtk_statusbar_push (GTK_STATUSBAR (status), project->priv->status_ctx, size_str);
820
brasero_project_update_controls (BraseroProject *project)
824
brasero_project_set_remove_button_state (project);
825
brasero_project_set_add_button_state (project);
827
action = gtk_action_group_get_action (project->priv->project_group, "DeleteAll");
828
gtk_action_set_sensitive (action, (project->priv->empty == FALSE));
832
brasero_project_modified (BraseroProject *project)
836
brasero_project_update_controls (project);
837
brasero_project_update_project_size (project);
839
/* the state of the following depends on the existence of an opened project */
840
action = gtk_action_group_get_action (project->priv->project_group, "Save");
841
gtk_action_set_sensitive (action, TRUE);
842
project->priv->modified = TRUE;
846
brasero_project_track_removed (BraseroBurnSession *session,
848
guint former_position,
849
BraseroProject *project)
851
brasero_project_modified (project);
855
brasero_project_track_changed (BraseroBurnSession *session,
857
BraseroProject *project)
859
brasero_project_modified (project);
863
brasero_project_track_added (BraseroBurnSession *session,
865
BraseroProject *project)
867
brasero_project_modified (project);
871
brasero_project_message_response_span_cb (BraseroDiscMessage *message,
872
GtkResponseType response,
873
BraseroProject *project)
875
if (response == GTK_RESPONSE_OK)
876
brasero_session_span_start (BRASERO_SESSION_SPAN (project->priv->session));
880
brasero_project_message_response_overburn_cb (BraseroDiscMessage *message,
881
GtkResponseType response,
882
BraseroProject *project)
884
if (response == GTK_RESPONSE_OK)
885
brasero_session_cfg_add_flags (project->priv->session, BRASERO_BURN_FLAG_OVERBURN);
889
brasero_project_is_valid (BraseroSessionCfg *session,
890
BraseroProject *project)
892
BraseroSessionError valid;
893
BraseroStatus *status;
898
/* Update the cursor */
899
status = brasero_status_new ();
900
brasero_burn_session_get_status (BRASERO_BURN_SESSION (session), status);
902
window = gtk_widget_get_window (GTK_WIDGET (project));
904
if (brasero_status_get_result (status) == BRASERO_BURN_NOT_READY) {
905
cursor = gdk_cursor_new (GDK_WATCH);
906
gdk_window_set_cursor (window, cursor);
907
gdk_cursor_unref (cursor);
910
gdk_window_set_cursor (window, NULL);
913
brasero_status_free (status);
915
valid = brasero_session_cfg_get_error (project->priv->session);
917
/* Update burn button state */
918
action = gtk_action_group_get_action (project->priv->project_group, "Burn");
919
gtk_action_set_sensitive (action, BRASERO_SESSION_IS_VALID (valid));
920
gtk_widget_set_sensitive (project->priv->burn, BRASERO_SESSION_IS_VALID (valid));
922
/* FIXME: update option button state as well */
924
/* Clean any message */
925
brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message),
926
BRASERO_NOTIFY_CONTEXT_SIZE);
928
if (valid == BRASERO_SESSION_INSUFFICIENT_SPACE) {
929
project->priv->oversized = TRUE;
931
/* Here there is an alternative: we may be able to span the data
932
* across multiple media. So try that. */
933
if (brasero_session_span_possible (BRASERO_SESSION_SPAN (project->priv->session)) == BRASERO_BURN_RETRY) {
936
message = brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
937
_("Would you like to burn the selection of files across several media?"),
938
_("The size of the project is too large for the disc even with the overburn option."),
940
BRASERO_NOTIFY_CONTEXT_SIZE);
941
brasero_notify_button_add (BRASERO_NOTIFY (project->priv->message),
942
BRASERO_DISC_MESSAGE (message),
943
_("_Burn Several Discs"),
944
_("Burn the selection of files across several media"),
947
g_signal_connect (message,
949
G_CALLBACK (brasero_project_message_response_span_cb),
953
brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
954
_("Please choose another CD or DVD or insert a new one."),
955
_("The size of the project is too large for the disc even with the overburn option."),
957
BRASERO_NOTIFY_CONTEXT_SIZE);
959
else if (valid == BRASERO_SESSION_OVERBURN_NECESSARY) {
962
project->priv->oversized = TRUE;
963
message = brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
964
_("Would you like to burn beyond the disc reported capacity?"),
965
_("The size of the project is too large for the disc and you must remove files from the project otherwise."
966
"\nYou may want to use this option if you're using 90 or 100 min CD-R(W) which cannot be properly recognised and therefore need overburn option."
967
"\nNOTE: This option might cause failure."),
969
BRASERO_NOTIFY_CONTEXT_SIZE);
970
brasero_notify_button_add (BRASERO_NOTIFY (project->priv->message),
971
BRASERO_DISC_MESSAGE (message),
973
_("Burn beyond the disc reported capacity"),
976
g_signal_connect (message,
978
G_CALLBACK (brasero_project_message_response_overburn_cb),
981
else if (valid == BRASERO_SESSION_EMPTY) {
982
project->priv->empty = TRUE;
983
gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->help), 1);
985
else if (valid == BRASERO_SESSION_NO_OUTPUT) {
986
brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
987
_("Please insert a recordable CD or DVD."),
988
_("There is no recordable disc inserted."),
990
BRASERO_NOTIFY_CONTEXT_SIZE);
992
else if (valid == BRASERO_SESSION_NO_CD_TEXT) {
993
brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
994
_("No track information (artist, title, ...) will be written to the disc."),
995
_("This is not supported by the current active burning backend."),
997
BRASERO_NOTIFY_CONTEXT_SIZE);
999
else if (valid == BRASERO_SESSION_NOT_SUPPORTED) {
1000
brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
1001
_("Please replace the disc with a supported CD or DVD."),
1002
_("It is not possible to write with the current set of plugins."),
1004
BRASERO_NOTIFY_CONTEXT_SIZE);
1006
else if (brasero_burn_session_is_dest_file (BRASERO_BURN_SESSION (project->priv->session))
1007
&& brasero_medium_selection_get_media_num (BRASERO_MEDIUM_SELECTION (project->priv->selection)) == 1) {
1008
/* The user may have forgotten to insert a disc so remind him of that if
1009
* there aren't any other possibility in the selection */
1010
brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
1011
_("Please insert a recordable CD or DVD if you don't want to write to an image file."),
1014
BRASERO_NOTIFY_CONTEXT_SIZE);
1017
if (BRASERO_SESSION_IS_VALID (valid) || valid == BRASERO_SESSION_NOT_READY)
1018
gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->help), 0);
1020
if (BRASERO_SESSION_IS_VALID (valid)) {
1021
project->priv->empty = FALSE;
1022
project->priv->oversized = FALSE;
531
1027
brasero_project_init (BraseroProject *obj)
1029
GtkSizeGroup *name_size_group;
533
1030
GtkSizeGroup *size_group;
534
1031
GtkWidget *alignment;
1032
GtkWidget *selector;
540
1035
obj->priv = g_new0 (BraseroProjectPrivate, 1);
858
/******************** useful function to wait when burning/saving **************/
860
_wait_for_ready_state (GtkWidget *dialog)
862
gchar *current_task = NULL;
863
GtkProgressBar *progress;
864
BraseroDiscResult status;
865
BraseroProject *project;
869
project = g_object_get_data (G_OBJECT (dialog), "Project");
870
if (project->priv->oversized
871
|| !project->priv->current
872
|| !project->priv->project_status) {
873
gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
877
progress = g_object_get_data (G_OBJECT (dialog), "ProgressBar");
878
initial = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "Remaining"));
879
status = brasero_disc_get_status (project->priv->current, &remaining, ¤t_task);
880
if (status == BRASERO_DISC_NOT_READY || status == BRASERO_DISC_LOADING) {
884
if (initial <= 0 || remaining <= 0)
885
gtk_progress_bar_pulse (progress);
887
gtk_progress_bar_set_fraction (progress, (gdouble) ((gdouble) (initial - remaining) / (gdouble) initial));
890
GtkWidget *current_action;
892
current_action = g_object_get_data (G_OBJECT (dialog), "CurrentAction");
893
string = g_strdup_printf ("<i>%s</i>", current_task);
894
g_free (current_task);
896
gtk_label_set_markup (GTK_LABEL (current_action), string);
900
string = brasero_project_get_sectors_string (project->priv->sectors,
901
!BRASERO_IS_DATA_DISC (project->priv->current));
903
size_str = g_strdup_printf (_("Project estimated size: %s"), string);
906
gtk_progress_bar_set_text (progress, size_str);
912
gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
916
static BraseroDiscResult
917
brasero_project_check_status (BraseroProject *project,
927
BraseroDiscResult result;
928
GtkWidget *current_action;
931
result = brasero_disc_get_status (disc, &remaining, ¤t_task);
932
if (result != BRASERO_DISC_NOT_READY && result != BRASERO_DISC_LOADING)
935
/* we are not ready to create tracks presumably because
936
* data or audio has not finished to explore a directory
937
* or get the metadata of a song or a film */
939
/* This dialog can run as a standalone window when run from nautilus
940
* to burn burn:// URI contents. */
941
dialog = brasero_app_dialog (brasero_app_get_default (),
942
_("Please wait until the estimation of the project size is completed."),
946
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
947
_("All files from the project need to be analysed to complete this operation."));
949
gtk_window_set_title (GTK_WINDOW (dialog), _("Project Size Estimation"));
951
box = gtk_vbox_new (FALSE, 4);
952
gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->vbox),
958
progress = gtk_progress_bar_new ();
959
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress), " ");
960
gtk_box_pack_start (GTK_BOX (box),
969
string = g_strdup_printf ("<i>%s</i>", current_task);
970
g_free (current_task);
972
current_action = gtk_label_new (string);
976
current_action = gtk_label_new ("");
978
gtk_label_set_use_markup (GTK_LABEL (current_action), TRUE);
979
gtk_misc_set_alignment (GTK_MISC (current_action), 0.0, 0.5);
980
gtk_box_pack_start (GTK_BOX (box),
986
gtk_widget_show_all (dialog);
987
gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progress));
989
g_object_set_data (G_OBJECT (dialog), "CurrentAction", current_action);
990
g_object_set_data (G_OBJECT (dialog), "ProgressBar", progress);
991
g_object_set_data (G_OBJECT (dialog), "Remaining", GINT_TO_POINTER (remaining));
992
g_object_set_data (G_OBJECT (dialog), "Project", project);
994
id = g_timeout_add (100,
995
(GSourceFunc) _wait_for_ready_state,
998
project->priv->project_status = dialog;
999
answer = gtk_dialog_run (GTK_DIALOG (dialog));
1000
g_source_remove (id);
1002
gtk_widget_destroy (dialog);
1004
if (!project->priv->project_status)
1005
return BRASERO_DISC_CANCELLED;
1007
project->priv->project_status = NULL;
1009
if (answer != GTK_RESPONSE_OK)
1010
return BRASERO_DISC_CANCELLED;
1011
else if (project->priv->oversized)
1012
return BRASERO_DISC_ERROR_SIZE;
1014
return brasero_disc_get_status (disc, NULL, NULL);
1017
/******************************** burning **************************************/
1019
1242
brasero_project_no_song_dialog (BraseroProject *project)
1021
1244
brasero_app_alert (brasero_app_get_default (),
1022
1245
_("Please add songs to the project."),
1023
_("The project is empty"),
1246
_("There are no songs to write to disc"),
1024
1247
GTK_MESSAGE_WARNING);
1318
brasero_project_drive_properties (BraseroProject *project)
1320
BraseroTrackType *track_type;
1321
GtkWidget *medium_prop;
1322
GtkResponseType answer;
1323
BraseroDrive *drive;
1324
gchar *display_name;
1333
drive = brasero_burn_session_get_burner (BRASERO_BURN_SESSION (project->priv->session));
1334
display_name = brasero_drive_get_display_name (drive);
1335
header = g_strdup_printf (_("Properties of %s"), display_name);
1336
g_free (display_name);
1338
dialog = gtk_dialog_new_with_buttons (header,
1341
GTK_DIALOG_NO_SEPARATOR|
1342
GTK_DIALOG_DESTROY_WITH_PARENT,
1343
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1347
brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
1349
button = brasero_utils_make_button (_("_Burn"),
1351
"media-optical-burn",
1352
GTK_ICON_SIZE_BUTTON);
1353
gtk_widget_show (button);
1354
gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
1358
box = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
1360
track_type = brasero_track_type_new ();
1362
brasero_burn_session_get_input_type (BRASERO_BURN_SESSION (project->priv->session), track_type);
1363
if (brasero_track_type_get_has_stream (track_type)
1364
&& BRASERO_STREAM_FORMAT_HAS_VIDEO (brasero_track_type_get_stream_format (track_type))) {
1365
/* Special case for video project */
1366
options = brasero_video_options_new (BRASERO_BURN_SESSION (project->priv->session));
1367
gtk_widget_show (options);
1369
string = g_strdup_printf ("<b>%s</b>", _("Video Options"));
1370
options = brasero_utils_pack_properties (string,
1374
gtk_box_pack_start (GTK_BOX (box), options, FALSE, TRUE, 0);
1377
brasero_track_type_free (track_type);
1379
medium_prop = brasero_drive_properties_new (project->priv->session);
1380
gtk_widget_show (medium_prop);
1381
gtk_box_pack_start (GTK_BOX (box), medium_prop, TRUE, TRUE, 0);
1383
/* launch the dialog */
1384
answer = gtk_dialog_run (GTK_DIALOG (dialog));
1385
gtk_widget_destroy (dialog);
1387
return (answer == GTK_RESPONSE_OK);
1391
brasero_project_image_properties (BraseroProject *project)
1393
GtkResponseType answer;
1398
dialog = brasero_image_properties_new ();
1400
brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
1401
gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
1402
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
1404
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
1406
button = brasero_utils_make_button (_("_Burn"),
1408
"media-optical-burn",
1409
GTK_ICON_SIZE_BUTTON);
1410
gtk_widget_show (button);
1411
gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
1415
GTK_WIDGET_SET_FLAGS (button,
1416
GTK_WIDGET_FLAGS (button)|
1419
brasero_image_properties_set_session (BRASERO_IMAGE_PROPERTIES (dialog), project->priv->session);
1421
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
1422
gtk_widget_show_all (dialog);
1424
/* launch the dialog */
1425
answer = gtk_dialog_run (GTK_DIALOG (dialog));
1426
gtk_widget_destroy (dialog);
1428
return (answer == GTK_RESPONSE_OK);
1058
1432
brasero_project_burn (BraseroProject *project)
1060
BraseroSessionCfg *session;
1061
BraseroDiscResult result;
1065
result = brasero_project_check_status (project, project->priv->current);
1066
if (result == BRASERO_DISC_CANCELLED)
1069
if (result == BRASERO_DISC_ERROR_SIZE)
1072
if (result == BRASERO_DISC_ERROR_EMPTY_SELECTION) {
1073
if (BRASERO_IS_AUDIO_DISC (project->priv->current))
1074
brasero_project_no_song_dialog (project);
1076
brasero_project_no_file_dialog (project);
1081
if (result != BRASERO_DISC_OK)
1434
gboolean res = FALSE;
1435
BraseroDisc *current_disc;
1437
if (!brasero_burn_session_is_dest_file (BRASERO_BURN_SESSION (project->priv->session)))
1438
res = brasero_project_drive_properties (project);
1440
res = brasero_project_image_properties (project);
1084
1445
project->priv->is_burning = 1;
1447
/* This is to avoid having the settings being wrongly reflected or changed */
1448
current_disc = project->priv->current;
1449
brasero_disc_set_session_contents (current_disc, NULL);
1450
project->priv->current = NULL;
1452
brasero_dest_selection_set_session (BRASERO_DEST_SELECTION (project->priv->selection), NULL);
1454
brasero_project_setup_session (project, BRASERO_BURN_SESSION (project->priv->session));
1086
1456
/* This is to stop the preview widget from playing */
1087
1457
brasero_uri_container_uri_selected (BRASERO_URI_CONTAINER (project));
1089
/* setup, show, and run options dialog */
1090
session = brasero_session_cfg_new ();
1091
brasero_disc_set_session_contents (project->priv->current, BRASERO_BURN_SESSION (session));
1092
dialog = brasero_burn_options_new (session);
1094
brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
1096
result = gtk_dialog_run (GTK_DIALOG (dialog));
1097
if (result != GTK_RESPONSE_OK) {
1098
g_object_unref (session);
1099
gtk_widget_destroy (dialog);
1103
gtk_widget_destroy (dialog);
1105
brasero_project_setup_session (project, BRASERO_BURN_SESSION (session));
1107
1459
/* now setup the burn dialog */
1108
success = brasero_app_burn (brasero_app_get_default (), BRASERO_BURN_SESSION (session));
1110
project->priv->burnt = success;
1111
g_object_unref (session);
1460
if (brasero_app_burn (brasero_app_get_default (), BRASERO_BURN_SESSION (project->priv->session)))
1461
project->priv->burnt = TRUE;
1463
/* empty the stack of temporary tracks */
1464
while (brasero_burn_session_pop_tracks (BRASERO_BURN_SESSION (project->priv->session)) == BRASERO_BURN_RETRY);
1466
project->priv->current = current_disc;
1467
brasero_disc_set_session_contents (current_disc, BRASERO_BURN_SESSION (project->priv->session));
1469
brasero_dest_selection_set_session (BRASERO_DEST_SELECTION (project->priv->selection),
1470
BRASERO_BURN_SESSION (project->priv->session));
1115
1472
project->priv->is_burning = 0;
1151
1502
project->priv->project_status = NULL;
1154
gtk_image_set_from_icon_name (GTK_IMAGE (project->priv->icon_img),
1156
GTK_ICON_SIZE_LARGE_TOOLBAR);
1158
if (project->priv->current)
1159
brasero_disc_reset (project->priv->current);
1505
if (project->priv->current) {
1506
brasero_disc_set_session_contents (project->priv->current, NULL);
1507
project->priv->current = NULL;
1161
1510
if (project->priv->chooser) {
1162
1511
gtk_widget_destroy (project->priv->chooser);
1163
1512
project->priv->chooser = NULL;
1515
if (project->priv->project) {
1516
g_free (project->priv->project);
1517
project->priv->project = NULL;
1520
if (project->priv->cover) {
1521
g_free (project->priv->cover);
1522
project->priv->cover = NULL;
1525
/* remove the buttons from the "toolbar" */
1526
if (project->priv->merge_id > 0)
1527
gtk_ui_manager_remove_ui (project->priv->manager,
1528
project->priv->merge_id);
1166
1530
project->priv->empty = 1;
1167
1531
project->priv->burnt = 0;
1168
project->priv->merging = 0;
1169
1532
project->priv->modified = 0;
1171
if (project->priv->project) {
1172
g_free (project->priv->project);
1173
project->priv->project = NULL;
1176
if (project->priv->cover) {
1177
g_free (project->priv->cover);
1178
project->priv->cover = NULL;
1181
client = gconf_client_get_default ();
1183
/* remove the buttons from the "toolbar" */
1184
if (project->priv->merge_id)
1185
gtk_ui_manager_remove_ui (project->priv->manager,
1186
project->priv->merge_id);
1534
if (project->priv->session) {
1535
g_signal_handlers_disconnect_by_func (project->priv->session,
1536
brasero_project_is_valid,
1538
g_signal_handlers_disconnect_by_func (project->priv->session,
1539
brasero_project_track_added,
1541
g_signal_handlers_disconnect_by_func (project->priv->session,
1542
brasero_project_track_changed,
1544
g_signal_handlers_disconnect_by_func (project->priv->session,
1545
brasero_project_track_removed,
1548
/* unref session to force it to remove all temporary files */
1549
g_object_unref (project->priv->session);
1550
project->priv->session = NULL;
1553
brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_SIZE);
1554
brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_LOADING);
1555
brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_MULTISESSION);
1559
brasero_project_new_session (BraseroProject *project)
1561
if (project->priv->session)
1562
brasero_project_reset (project);
1564
project->priv->session = brasero_session_cfg_new ();
1566
/* NOTE: "is-valid" is emitted whenever there is a change in the
1567
* contents of the session. So no need to connect to track-added, ... */
1568
g_signal_connect (project->priv->session,
1570
G_CALLBACK (brasero_project_is_valid),
1572
g_signal_connect (project->priv->session,
1574
G_CALLBACK (brasero_project_track_added),
1576
g_signal_connect (project->priv->session,
1578
G_CALLBACK (brasero_project_track_changed),
1580
g_signal_connect (project->priv->session,
1582
G_CALLBACK (brasero_project_track_removed),
1585
brasero_dest_selection_set_session (BRASERO_DEST_SELECTION (project->priv->selection),
1586
BRASERO_BURN_SESSION (project->priv->session));
1587
brasero_project_name_set_session (BRASERO_PROJECT_NAME (project->priv->name_display),
1588
BRASERO_BURN_SESSION (project->priv->session));
1592
brasero_project_switch (BraseroProject *project, BraseroProjectType type)
1188
1596
if (type == BRASERO_PROJECT_TYPE_AUDIO) {
1189
gtk_widget_hide (project->priv->button_img);
1190
1597
project->priv->current = BRASERO_DISC (project->priv->audio);
1191
project->priv->merge_id = brasero_disc_add_ui (project->priv->current,
1192
project->priv->manager,
1193
project->priv->message);
1195
1598
gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->discs), 0);
1196
brasero_project_update_project_size (project, 0);
1599
brasero_medium_selection_show_media_type (BRASERO_MEDIUM_SELECTION (project->priv->selection),
1600
BRASERO_MEDIA_TYPE_WRITABLE);
1198
1602
else if (type == BRASERO_PROJECT_TYPE_DATA) {
1199
gtk_widget_show (project->priv->button_img);
1200
1603
project->priv->current = BRASERO_DISC (project->priv->data);
1201
project->priv->merge_id = brasero_disc_add_ui (project->priv->current,
1202
project->priv->manager,
1203
project->priv->message);
1205
1604
gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->discs), 1);
1206
brasero_project_update_project_size (project, 0);
1605
brasero_medium_selection_show_media_type (BRASERO_MEDIUM_SELECTION (project->priv->selection),
1606
BRASERO_MEDIA_TYPE_WRITABLE|
1607
BRASERO_MEDIA_TYPE_FILE);
1208
1609
else if (type == BRASERO_PROJECT_TYPE_VIDEO) {
1209
gtk_widget_hide (project->priv->button_img);
1210
1610
project->priv->current = BRASERO_DISC (project->priv->video);
1211
project->priv->merge_id = brasero_disc_add_ui (project->priv->current,
1212
project->priv->manager,
1213
project->priv->message);
1215
1611
gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->discs), 2);
1216
brasero_project_update_project_size (project, 0);
1612
brasero_medium_selection_show_media_type (BRASERO_MEDIUM_SELECTION (project->priv->selection),
1613
BRASERO_MEDIA_TYPE_WRITABLE|
1614
BRASERO_MEDIA_TYPE_FILE);
1617
brasero_dest_selection_choose_best (BRASERO_DEST_SELECTION (project->priv->selection));
1619
if (project->priv->current) {
1620
project->priv->merge_id = brasero_disc_add_ui (project->priv->current,
1621
project->priv->manager,
1622
project->priv->message);
1623
brasero_disc_set_session_contents (project->priv->current,
1624
BRASERO_BURN_SESSION (project->priv->session));
1219
1627
brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_SIZE);
1855
2201
gtk_action_set_sensitive (action, FALSE);
2204
static BraseroProjectType
2205
brasero_project_get_session_type (BraseroProject *project)
2207
BraseroTrackType *session_type;
2208
BraseroProjectType type;
2210
session_type = brasero_track_type_new ();
2211
brasero_burn_session_get_input_type (BRASERO_BURN_SESSION (project->priv->session), session_type);
2213
if (brasero_track_type_get_has_stream (session_type)) {
2214
if (BRASERO_STREAM_FORMAT_HAS_VIDEO (brasero_track_type_get_stream_format (session_type)))
2215
type = BRASERO_PROJECT_TYPE_VIDEO;
2217
type = BRASERO_PROJECT_TYPE_AUDIO;
2219
else if (brasero_track_type_get_has_data (session_type))
2220
type = BRASERO_PROJECT_TYPE_DATA;
2222
type = BRASERO_PROJECT_TYPE_INVALID;
2224
brasero_track_type_free (session_type);
1858
2229
/******************************* Projects **************************************/
1859
2230
BraseroProjectType
1860
brasero_project_open_project (BraseroProject *project,
1861
BraseroDiscTrack *track,
1862
const gchar *uri) /* escaped */
2231
brasero_project_open_project_real (BraseroProject *project,
2232
const gchar *uri, /* escaped */
1864
2237
BraseroProjectType type;
1867
return BRASERO_PROJECT_TYPE_INVALID;
1869
brasero_project_update_project_size (project, 0);
1871
if (track->type == BRASERO_PROJECT_TYPE_AUDIO)
1872
type = BRASERO_PROJECT_TYPE_AUDIO;
1873
else if (track->type == BRASERO_PROJECT_TYPE_DATA)
1874
type = BRASERO_PROJECT_TYPE_DATA;
1875
else if (track->type == BRASERO_PROJECT_TYPE_VIDEO)
1876
type = BRASERO_PROJECT_TYPE_VIDEO;
2239
brasero_project_new_session (project);
2241
#ifdef BUILD_PLAYLIST
2244
if (!brasero_project_open_audio_playlist_project (uri, BRASERO_BURN_SESSION (project->priv->session), warn_user))
2245
return BRASERO_PROJECT_TYPE_INVALID;
2251
if (!brasero_project_open_project_xml (uri, BRASERO_BURN_SESSION (project->priv->session), warn_user))
1878
2252
return BRASERO_PROJECT_TYPE_INVALID;
2254
type = brasero_project_get_session_type (project);
2255
if (type == BRASERO_PROJECT_TYPE_INVALID)
1880
2258
brasero_project_switch (project, type);
2260
if (brasero_burn_session_get_label (BRASERO_BURN_SESSION (project->priv->session))) {
1883
2261
g_signal_handlers_block_by_func (project->priv->name_display,
1884
2262
brasero_project_name_changed_cb,
1886
gtk_entry_set_text (GTK_ENTRY (project->priv->name_display), track->label);
2264
gtk_entry_set_text (GTK_ENTRY (project->priv->name_display),
2265
brasero_burn_session_get_label (BRASERO_BURN_SESSION (project->priv->session)));
1887
2266
g_signal_handlers_unblock_by_func (project->priv->name_display,
1888
2267
brasero_project_name_changed_cb,
2272
brasero_burn_session_tag_lookup (BRASERO_BURN_SESSION (project->priv->session),
1893
2276
if (project->priv->cover)
1894
2277
g_free (project->priv->cover);
1896
project->priv->cover = g_strdup (track->cover);
2279
project->priv->cover = g_strdup (g_value_get_string (value));
1899
brasero_disc_load_track (project->priv->current, track);
1900
2282
project->priv->modified = 0;
2288
brasero_project_open_project (BraseroProject *project,
2290
gboolean playlist) /* escaped */
2292
BraseroProjectType type;
2294
type = brasero_project_open_project_real (project, uri, playlist, TRUE);
2295
if (type != BRASERO_PROJECT_TYPE_INVALID && uri)
1903
2296
brasero_project_set_uri (project, uri, type);
1908
2301
BraseroProjectType
1909
brasero_project_load_session (BraseroProject *project, const gchar *uri)
2302
brasero_project_load_session (BraseroProject *project,
1911
BraseroDiscTrack *track = NULL;
1912
BraseroProjectType type;
1914
if (!brasero_project_open_project_xml (uri, &track, FALSE))
1915
return BRASERO_PROJECT_TYPE_INVALID;
1917
if (track->type == BRASERO_PROJECT_TYPE_AUDIO)
1918
type = BRASERO_PROJECT_TYPE_AUDIO;
1919
else if (track->type == BRASERO_PROJECT_TYPE_DATA)
1920
type = BRASERO_PROJECT_TYPE_DATA;
1921
else if (track->type == BRASERO_PROJECT_TYPE_VIDEO)
1922
type = BRASERO_PROJECT_TYPE_VIDEO;
1924
brasero_track_free (track);
1925
return BRASERO_PROJECT_TYPE_INVALID;
1928
brasero_project_switch (project, type);
1930
g_signal_handlers_block_by_func (project->priv->name_display,
1931
brasero_project_name_changed_cb,
1933
gtk_entry_set_text (GTK_ENTRY (project->priv->name_display), (gchar *) track->label);
1934
g_signal_handlers_unblock_by_func (project->priv->name_display,
1935
brasero_project_name_changed_cb,
1938
brasero_disc_load_track (project->priv->current, track);
1939
brasero_track_free (track);
1941
project->priv->modified = 0;
2305
return brasero_project_open_project_real (project, uri, FALSE, FALSE);
1946
2308
/******************************** save project *********************************/
2002
2364
static gboolean
2003
_save_audio_track_xml (xmlTextWriter *project,
2004
BraseroDiscTrack *track)
2009
for (iter = track->contents.tracks; iter; iter = iter->next) {
2010
BraseroDiscSong *song;
2011
BraseroStreamInfo *info;
2020
escaped = (unsigned char *) g_uri_escape_string (song->uri, NULL, FALSE);
2021
success = xmlTextWriterWriteElement (project,
2032
silence = g_strdup_printf ("%"G_GINT64_FORMAT, song->gap);
2033
success = xmlTextWriterWriteElement (project,
2034
(xmlChar *) "silence",
2035
(xmlChar *) silence);
2042
if (song->end > 0) {
2043
/* start of the song */
2044
start = g_strdup_printf ("%"G_GINT64_FORMAT, song->start);
2045
success = xmlTextWriterWriteElement (project,
2046
(xmlChar *) "start",
2053
/* end of the song */
2054
end = g_strdup_printf ("%"G_GINT64_FORMAT, song->end);
2055
success = xmlTextWriterWriteElement (project,
2068
escaped = (unsigned char *) g_uri_escape_string (info->title, NULL, FALSE);
2069
success = xmlTextWriterWriteElement (project,
2070
(xmlChar *) "title",
2079
escaped = (unsigned char *) g_uri_escape_string (info->artist, NULL, FALSE);
2080
success = xmlTextWriterWriteElement (project,
2081
(xmlChar *) "artist",
2089
if (info->composer) {
2090
escaped = (unsigned char *) g_uri_escape_string (info->composer, NULL, FALSE);
2091
success = xmlTextWriterWriteElement (project,
2092
(xmlChar *) "composer",
2101
isrc = g_strdup_printf ("%d", info->isrc);
2102
success = xmlTextWriterWriteElement (project,
2116
_save_data_track_xml (xmlTextWriter *project,
2117
BraseroDiscTrack *track)
2123
BraseroGraftPt *graft;
2125
if (track->contents.data.icon) {
2126
/* Write the icon if any */
2127
success = xmlTextWriterWriteElement (project, (xmlChar *) "icon", (xmlChar *) track->contents.data.icon);
2132
for (grafts = track->contents.data.grafts; grafts; grafts = grafts->next) {
2133
graft = grafts->data;
2135
success = xmlTextWriterStartElement (project, (xmlChar *) "graft");
2139
success = xmlTextWriterWriteElement (project, (xmlChar *) "path", (xmlChar *) graft->path);
2146
escaped = (unsigned char *) g_uri_escape_string (graft->uri, NULL, FALSE);
2147
success = xmlTextWriterWriteElement (project, (xmlChar *) "uri", escaped);
2153
success = xmlTextWriterEndElement (project); /* graft */
2158
/* save excluded uris */
2159
for (iter = track->contents.data.excluded; iter; iter = iter->next) {
2162
escaped = xmlURIEscapeStr ((xmlChar *) iter->data, NULL);
2163
success = xmlTextWriterWriteElement (project, (xmlChar *) "excluded", (xmlChar *) escaped);
2169
/* save restored uris */
2170
for (iter = track->contents.data.restored; iter; iter = iter->next) {
2172
success = xmlTextWriterWriteElement (project, (xmlChar *) "restored", (xmlChar *) uri);
2177
/* NOTE: we don't write symlinks and unreadable they are useless */
2182
brasero_project_save_project_xml (BraseroProject *proj,
2184
BraseroDiscTrack *track,
2185
gboolean use_dialog)
2187
xmlTextWriter *project;
2192
path = g_filename_from_uri (uri, NULL, NULL);
2196
project = xmlNewTextWriterFilename (path, 0);
2201
brasero_project_not_saved_dialog (proj);
2206
xmlTextWriterSetIndent (project, 1);
2207
xmlTextWriterSetIndentString (project, (xmlChar *) "\t");
2209
success = xmlTextWriterStartDocument (project,
2216
success = xmlTextWriterStartElement (project, (xmlChar *) "braseroproject");
2220
/* write the name of the version */
2221
success = xmlTextWriterWriteElement (project,
2222
(xmlChar *) "version",
2223
(xmlChar *) BRASERO_PROJECT_VERSION);
2227
success = xmlTextWriterWriteElement (project,
2228
(xmlChar *) "label",
2229
(xmlChar *) gtk_entry_get_text (GTK_ENTRY (proj->priv->name_display)));
2233
if (proj->priv->cover) {
2236
escaped = g_uri_escape_string (proj->priv->cover, NULL, FALSE);
2237
success = xmlTextWriterWriteElement (project,
2238
(xmlChar *) "cover",
2239
(xmlChar *) escaped);
2246
success = xmlTextWriterStartElement (project, (xmlChar *) "track");
2250
if (track->type == BRASERO_PROJECT_TYPE_AUDIO) {
2251
success = xmlTextWriterStartElement (project, (xmlChar *) "audio");
2255
retval = _save_audio_track_xml (project, track);
2259
success = xmlTextWriterEndElement (project); /* audio */
2263
else if (track->type == BRASERO_PROJECT_TYPE_DATA) {
2264
success = xmlTextWriterStartElement (project, (xmlChar *) "data");
2268
retval = _save_data_track_xml (project, track);
2272
success = xmlTextWriterEndElement (project); /* data */
2276
else if (track->type == BRASERO_PROJECT_TYPE_VIDEO) {
2277
success = xmlTextWriterStartElement (project, (xmlChar *) "video");
2281
retval = _save_audio_track_xml (project, track);
2285
success = xmlTextWriterEndElement (project); /* audio */
2292
success = xmlTextWriterEndElement (project); /* track */
2296
success = xmlTextWriterEndElement (project); /* braseroproject */
2300
xmlTextWriterEndDocument (project);
2301
xmlFreeTextWriter (project);
2307
xmlTextWriterEndDocument (project);
2308
xmlFreeTextWriter (project);
2314
brasero_project_not_saved_dialog (proj);
2320
brasero_project_save_audio_project_plain_text (BraseroProject *proj,
2322
BraseroDiscTrack *track,
2323
gboolean use_dialog)
2331
path = g_filename_from_uri (uri, NULL, NULL);
2335
file = fopen (path, "w+");
2339
brasero_project_not_saved_dialog (proj);
2345
title = gtk_entry_get_text (GTK_ENTRY (proj->priv->name_display));
2346
written = fwrite (title, strlen (title), 1, file);
2350
written = fwrite ("\n", 1, 1, file);
2354
for (iter = track->contents.tracks; iter; iter = iter->next) {
2355
BraseroDiscSong *song;
2356
BraseroStreamInfo *info;
2362
written = fwrite (info->title, 1, strlen (info->title), file);
2363
if (written != strlen (info->title))
2366
time = brasero_units_get_time_string (song->end - song->start, TRUE, FALSE);
2368
written = fwrite ("\t", 1, 1, file);
2372
written = fwrite (time, 1, strlen (time), file);
2373
if (written != strlen (time)) {
2383
written = fwrite ("\t", 1, 1, file);
2387
/* Translators: %s is an artist */
2388
string = g_strdup_printf (" by %s", info->artist);
2389
written = fwrite (string, 1, strlen (string), file);
2390
if (written != strlen (string)) {
2397
written = fwrite ("\n(", 1, 2, file);
2401
written = fwrite (song->uri, 1, strlen (song->uri), file);
2402
if (written != strlen (song->uri))
2405
written = fwrite (")", 1, 1, file);
2409
written = fwrite ("\n\n", 1, 2, file);
2421
brasero_project_not_saved_dialog (proj);
2426
#ifdef BUILD_PLAYLIST
2429
brasero_project_save_audio_playlist_entry (GtkTreeModel *model,
2433
gboolean *custom_title,
2436
gtk_tree_model_get (model, iter,
2444
brasero_project_save_audio_project_playlist (BraseroProject *proj,
2446
BraseroProjectSave type,
2447
BraseroDiscTrack *track,
2448
gboolean use_dialog)
2450
TotemPlParserType pl_type;
2451
TotemPlParser *parser;
2452
GtkListStore *model;
2458
path = g_filename_from_uri (uri, NULL, NULL);
2462
parser = totem_pl_parser_new ();
2464
/* create and populate treemodel */
2465
model = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
2466
for (iter = track->contents.tracks; iter; iter = iter->next) {
2467
BraseroDiscSong *song;
2468
BraseroStreamInfo *info;
2473
gtk_list_store_append (model, &t_iter);
2474
gtk_list_store_set (model, &t_iter,
2482
case BRASERO_PROJECT_SAVE_PLAYLIST_M3U:
2483
pl_type = TOTEM_PL_PARSER_M3U;
2485
case BRASERO_PROJECT_SAVE_PLAYLIST_XSPF:
2486
pl_type = TOTEM_PL_PARSER_XSPF;
2488
case BRASERO_PROJECT_SAVE_PLAYLIST_IRIVER_PLA:
2489
pl_type = TOTEM_PL_PARSER_IRIVER_PLA;
2492
case BRASERO_PROJECT_SAVE_PLAYLIST_PLS:
2494
pl_type = TOTEM_PL_PARSER_PLS;
2498
result = totem_pl_parser_write_with_title (parser,
2499
GTK_TREE_MODEL (model),
2500
brasero_project_save_audio_playlist_entry,
2502
gtk_entry_get_text (GTK_ENTRY (proj->priv->name_display)),
2506
if (!result && use_dialog)
2507
brasero_project_not_saved_dialog (proj);
2510
brasero_project_add_to_recents (proj, uri, FALSE);
2512
g_object_unref (model);
2513
g_object_unref (parser);
2522
2365
brasero_project_save_project_real (BraseroProject *project,
2523
2366
const gchar *uri,
2524
2367
BraseroProjectSave save_type)
2526
2369
BraseroDiscResult result;
2527
2370
BraseroProjectType type;
2528
BraseroDiscTrack track;
2530
2372
g_return_val_if_fail (uri != NULL || project->priv->project != NULL, FALSE);
2532
result = brasero_project_check_status (project, project->priv->current);
2533
if (result != BRASERO_DISC_OK)
2374
result = brasero_project_check_status (project);
2375
if (result != BRASERO_BURN_OK)
2536
bzero (&track, sizeof (track));
2538
result = brasero_disc_get_track (project->priv->current, &track);
2539
2378
if (result == BRASERO_DISC_ERROR_EMPTY_SELECTION) {
2540
2379
if (BRASERO_IS_AUDIO_DISC (project->priv->current))
2541
2380
brasero_project_no_song_dialog (project);