X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_dialog.cc;h=9d707678cf3048ed49b99ebfca10ebb2a970c452;hb=082461f108b0778327dec9d92704c15622ac3a86;hp=fd39aca3355e105b1303a408cfa48a155bfcf17b;hpb=3b89d9eaa03406a5e03648f47734211f09b89d62;p=ardour.git diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc index fd39aca335..9d707678cf 100644 --- a/gtk2_ardour/export_dialog.cc +++ b/gtk2_ardour/export_dialog.cc @@ -18,25 +18,31 @@ */ -#include "export_dialog.h" #include -#include "pbd/filesystem.h" - +#include "ardour/audioregion.h" #include "ardour/export_status.h" #include "ardour/export_handler.h" +#include "export_dialog.h" +#include "gui_thread.h" +#include "nag.h" + +#include "i18n.h" + using namespace ARDOUR; using namespace PBD; +using std::string; -ExportDialog::ExportDialog (PublicEditor & editor, Glib::ustring title) : - ArdourDialog (title), - editor (editor), +ExportDialog::ExportDialog (PublicEditor & editor, std::string title, std::string xml_node_name) + : ArdourDialog (title) + , xml_node_name (xml_node_name) + , editor (editor) - warn_label ("", Gtk::ALIGN_LEFT), - list_files_label (_("Some already existing files will be overwritten."), Gtk::ALIGN_RIGHT), - list_files_button (_("List files")) + , warn_label ("", Gtk::ALIGN_LEFT) + , list_files_label (_("Some already existing files will be overwritten."), Gtk::ALIGN_RIGHT) + , list_files_button (_("List files")) { } ExportDialog::~ExportDialog () @@ -45,46 +51,52 @@ ExportDialog::~ExportDialog () void ExportDialog::set_session (ARDOUR::Session* s) { - session = s; - + SessionHandlePtr::set_session (s); + + if (!_session) { + return; + } + /* Init handler and profile manager */ - - handler = session->get_export_handler (); - status = session->get_export_status (); - profile_manager.reset (new ExportProfileManager (*session)); - + + handler = _session->get_export_handler (); + status = _session->get_export_status (); + + profile_manager.reset (new ExportProfileManager (*_session, xml_node_name)); + /* Possibly init stuff in derived classes */ - + init (); - - /* Rest of session related initialization */ - + + /* Rest of _session related initialization */ + preset_selector->set_manager (profile_manager); - file_notebook->set_session_and_manager (session, profile_manager); - + file_notebook->set_session_and_manager (_session, profile_manager); + /* Hand on selection range to profile manager */ - + TimeSelection const & time (editor.get_selection().time); if (!time.empty()) { profile_manager->set_selection_range (time.front().start, time.front().end); } else { profile_manager->set_selection_range (); } - + /* Load states */ - + profile_manager->load_profile (); sync_with_manager (); - + /* Warnings */ - + preset_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::sync_with_manager)); - timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - status->Aborting.connect (sigc::mem_fun (*this, &ExportDialog::notify_errors)); - - update_warnings (); + timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); + channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); + file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); + + status->Aborting.connect (abort_connection, invalidator (*this), boost::bind (&ExportDialog::notify_errors, this), gui_context()); + + update_warnings_and_example_filename (); } void @@ -94,42 +106,46 @@ ExportDialog::init () init_gui (); /* warnings */ - + warning_widget.pack_start (warn_hbox, true, true, 6); warning_widget.pack_end (list_files_hbox, false, false, 0); - + warn_hbox.pack_start (warn_label, true, true, 16); warn_label.set_use_markup (true); - + list_files_hbox.pack_end (list_files_button, false, false, 6); list_files_hbox.pack_end (list_files_label, false, false, 6); list_files_label.set_use_markup (true); - + list_files_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::show_conflicting_files)); - + /* Progress indicators */ - - progress_widget.pack_start (progress_label, false, false, 6); + progress_widget.pack_start (progress_bar, false, false, 6); - + /* Buttons */ - + cancel_button = add_button (Gtk::Stock::CANCEL, RESPONSE_CANCEL); - rt_export_button = add_button (_("Realtime Export"), RESPONSE_RT); - fast_export_button = add_button (_("Fast Export"), RESPONSE_FAST); - + export_button = add_button (_("Export"), RESPONSE_FAST); + set_default_response (RESPONSE_FAST); + list_files_button.set_name ("PaddedButton"); - + cancel_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::close_dialog)); - rt_export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::export_rt)); - fast_export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::export_fw)); - + export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::do_export)); + /* Done! */ - + show_all_children (); progress_widget.hide_all(); } +void +ExportDialog::expanded_changed () +{ + set_resizable(advanced->get_expanded()); +} + void ExportDialog::init_gui () { @@ -137,29 +153,54 @@ ExportDialog::init_gui () preset_align->add (*preset_selector); preset_align->set_padding (0, 12, 0, 0); get_vbox()->pack_start (*preset_align, false, false, 0); - + + Gtk::VPaned * advanced_paned = Gtk::manage (new Gtk::VPaned()); + + Gtk::VBox* timespan_vbox = Gtk::manage (new Gtk::VBox()); + timespan_vbox->set_spacing (12); + timespan_vbox->set_border_width (12); + Gtk::Alignment * timespan_align = Gtk::manage (new Gtk::Alignment()); timespan_label = Gtk::manage (new Gtk::Label (_("Time Span"), Gtk::ALIGN_LEFT)); timespan_align->add (*timespan_selector); - timespan_align->set_padding (0, 12, 18, 0); - get_vbox()->pack_start (*timespan_label, false, false, 0); - get_vbox()->pack_start (*timespan_align, false, false, 0); - + timespan_align->set_padding (0, 0, 18, 0); + timespan_vbox->pack_start (*timespan_label, false, false, 0); + timespan_vbox->pack_start (*timespan_align, true, true, 0); + advanced_paned->pack1(*timespan_vbox, true, false); + + Gtk::VBox* channels_vbox = Gtk::manage (new Gtk::VBox()); + channels_vbox->set_spacing (12); + channels_vbox->set_border_width (12); + Gtk::Alignment * channels_align = Gtk::manage (new Gtk::Alignment()); channels_label = Gtk::manage (new Gtk::Label (_("Channels"), Gtk::ALIGN_LEFT)); channels_align->add (*channel_selector); channels_align->set_padding (0, 12, 18, 0); - get_vbox()->pack_start (*channels_label, false, false, 0); - get_vbox()->pack_start (*channels_align, false, false, 0); - + channels_vbox->pack_start (*channels_label, false, false, 0); + channels_vbox->pack_start (*channels_align, true, true, 0); + advanced_paned->pack2(*channels_vbox, channel_selector_is_expandable(), false); + get_vbox()->pack_start (*file_notebook, false, false, 0); - get_vbox()->pack_start (warning_widget, true, true, 0); - get_vbox()->pack_start (progress_widget, true, true, 0); - + get_vbox()->pack_start (warning_widget, false, false, 0); + get_vbox()->pack_start (progress_widget, false, false, 0); + + advanced = Gtk::manage (new Gtk::Expander (_("Time span and channel options"))); + advanced->property_expanded().signal_changed().connect( + sigc::mem_fun(*this, &ExportDialog::expanded_changed)); + advanced->add (*advanced_paned); + + if (channel_selector_is_expandable()) { + advanced_sizegroup = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_VERTICAL); + advanced_sizegroup->add_widget(*timespan_selector); + advanced_sizegroup->add_widget(*channel_selector); + } + + get_vbox()->pack_start (*advanced, true, true); + Pango::AttrList bold; Pango::Attribute b = Pango::Attribute::create_attr_weight (Pango::WEIGHT_BOLD); bold.insert (b); - + timespan_label->set_attributes (bold); channels_label->set_attributes (bold); } @@ -168,8 +209,8 @@ void ExportDialog::init_components () { preset_selector.reset (new ExportPresetSelector ()); - timespan_selector.reset (new ExportTimespanSelectorMultiple (session, profile_manager)); - channel_selector.reset (new PortExportChannelSelector (session, profile_manager)); + timespan_selector.reset (new ExportTimespanSelectorMultiple (_session, profile_manager)); + channel_selector.reset (new PortExportChannelSelector (_session, profile_manager)); file_notebook.reset (new ExportFileNotebook ()); } @@ -177,7 +218,7 @@ void ExportDialog::notify_errors () { if (status->errors()) { - Glib::ustring txt = _("Export has been aborted due to an error!\nSee the Log for details."); + std::string txt = _("Export has been aborted due to an error!\nSee the Log for details."); Gtk::MessageDialog msg (txt, false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msg.run(); } @@ -189,10 +230,10 @@ ExportDialog::close_dialog () if (status->running) { status->abort(); } - + hide_all (); set_modal (false); - + } void @@ -202,11 +243,11 @@ ExportDialog::sync_with_manager () channel_selector->sync_with_manager(); file_notebook->sync_with_manager (); - update_warnings (); + update_warnings_and_example_filename (); } void -ExportDialog::update_warnings () +ExportDialog::update_warnings_and_example_filename () { /* Reset state */ @@ -215,60 +256,55 @@ ExportDialog::update_warnings () list_files_hbox.hide (); list_files_string = ""; - - fast_export_button->set_sensitive (true); - rt_export_button->set_sensitive (true); + + export_button->set_sensitive (true); /* Add new warnings */ boost::shared_ptr warnings = profile_manager->get_warnings(); - for (std::list::iterator it = warnings->errors.begin(); it != warnings->errors.end(); ++it) { + for (std::list::iterator it = warnings->errors.begin(); it != warnings->errors.end(); ++it) { add_error (*it); } - for (std::list::iterator it = warnings->warnings.begin(); it != warnings->warnings.end(); ++it) { + for (std::list::iterator it = warnings->warnings.begin(); it != warnings->warnings.end(); ++it) { add_warning (*it); } if (!warnings->conflicting_filenames.empty()) { list_files_hbox.show (); - for (std::list::iterator it = warnings->conflicting_filenames.begin(); it != warnings->conflicting_filenames.end(); ++it) { - Glib::ustring::size_type pos = it->find_last_of ("/"); - list_files_string += "\n" + it->substr (0, pos + 1) + "" + it->substr (pos + 1) + ""; + for (std::list::iterator it = warnings->conflicting_filenames.begin(); it != warnings->conflicting_filenames.end(); ++it) { + string::size_type pos = it->find_last_of ("/"); + list_files_string += it->substr (0, pos + 1) + "" + it->substr (pos + 1) + "\n"; } } + + /* Update example filename */ + + file_notebook->update_example_filenames(); } void ExportDialog::show_conflicting_files () { ArdourDialog dialog (_("Files that will be overwritten"), true); - + Gtk::Label label ("", Gtk::ALIGN_LEFT); label.set_use_markup (true); label.set_markup (list_files_string); - + dialog.get_vbox()->pack_start (label); dialog.add_button (Gtk::Stock::OK, 0); dialog.show_all_children (); - - dialog.run(); -} -void -ExportDialog::export_rt () -{ - profile_manager->prepare_for_export (); - handler->do_export (true); - show_progress (); + dialog.run(); } void -ExportDialog::export_fw () +ExportDialog::do_export () { profile_manager->prepare_for_export (); - handler->do_export (false); + handler->do_export (); show_progress (); } @@ -278,15 +314,14 @@ ExportDialog::show_progress () status->running = true; cancel_button->set_label (_("Stop Export")); - rt_export_button->set_sensitive (false); - fast_export_button->set_sensitive (false); + export_button->set_sensitive (false); progress_bar.set_fraction (0.0); warning_widget.hide_all(); progress_widget.show (); progress_widget.show_all_children (); - progress_connection = Glib::signal_timeout().connect (mem_fun(*this, &ExportDialog::progress_timeout), 100); - + progress_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ExportDialog::progress_timeout), 100); + gtk_main_iteration (); while (status->running) { if (gtk_events_pending()) { @@ -295,67 +330,77 @@ ExportDialog::show_progress () usleep (10000); } } + + if (!status->aborted()) { + + NagScreen* ns = NagScreen::maybe_nag (_("export")); + + if (ns) { + ns->nag (); + delete ns; + } + + status->finish (); + } } gint ExportDialog::progress_timeout () { - switch (status->stage) { - case export_None: - progress_label.set_text (""); - break; - case export_ReadTimespan: - progress_label.set_text (string_compose (_("Reading timespan %1 of %2"), status->timespan, status->total_timespans)); - break; - case export_PostProcess: - progress_label.set_text (string_compose (_("Processing file %2 of %3 (%1) from timespan %4 of %5"), - file_notebook->get_nth_format_name (status->format), - status->format, status->total_formats, - status->timespan, status->total_timespans)); - break; - case export_Write: - progress_label.set_text (string_compose (_("Encoding file %2 of %3 (%1) from timespan %4 of %5"), - file_notebook->get_nth_format_name (status->format), - status->format, status->total_formats, - status->timespan, status->total_timespans)); - break; + std::string status_text; + float progress = 0.0; + if (status->normalizing) { + status_text = string_compose (_("Normalizing '%3' (timespan %1 of %2)"), + status->timespan, status->total_timespans, status->timespan_name); + progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles; + } else { + status_text = string_compose (_("Exporting '%3' (timespan %1 of %2)"), + status->timespan, status->total_timespans, status->timespan_name); + progress = ((float) status->processed_frames_current_timespan) / status->total_frames_current_timespan; } + progress_bar.set_text (status_text); - progress_bar.set_fraction (status->progress); + if (progress < previous_progress) { + // Work around gtk bug + progress_bar.hide(); + progress_bar.show(); + } + previous_progress = progress; + + progress_bar.set_fraction (progress); return TRUE; } void -ExportDialog::add_error (Glib::ustring const & text) +ExportDialog::add_error (string const & text) { - fast_export_button->set_sensitive (false); - rt_export_button->set_sensitive (false); - + export_button->set_sensitive (false); + if (warn_string.empty()) { warn_string = _("Error: ") + text + ""; } else { warn_string = _("Error: ") + text + "\n" + warn_string; } - + warn_label.set_markup (warn_string); } void -ExportDialog::add_warning (Glib::ustring const & text) +ExportDialog::add_warning (string const & text) { if (warn_string.empty()) { warn_string = _("Warning: ") + text + ""; } else { warn_string = warn_string + _("\nWarning: ") + text + ""; } - + warn_label.set_markup (warn_string); } /*** Dialog specializations ***/ -ExportRangeDialog::ExportRangeDialog (PublicEditor & editor, Glib::ustring range_id) : - ExportDialog (editor, _("Export Range")), +ExportRangeDialog::ExportRangeDialog (PublicEditor & editor, string range_id) : + ExportDialog (editor, _("Export Range"), X_("RangeExportProfile")), range_id (range_id) {} @@ -363,26 +408,26 @@ void ExportRangeDialog::init_components () { preset_selector.reset (new ExportPresetSelector ()); - timespan_selector.reset (new ExportTimespanSelectorSingle (session, profile_manager, range_id)); - channel_selector.reset (new PortExportChannelSelector (session, profile_manager)); + timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, range_id)); + channel_selector.reset (new PortExportChannelSelector (_session, profile_manager)); file_notebook.reset (new ExportFileNotebook ()); } ExportSelectionDialog::ExportSelectionDialog (PublicEditor & editor) : - ExportDialog (editor, _("Export Selection")) + ExportDialog (editor, _("Export Selection"), X_("SelectionExportProfile")) {} void ExportSelectionDialog::init_components () { preset_selector.reset (new ExportPresetSelector ()); - timespan_selector.reset (new ExportTimespanSelectorSingle (session, profile_manager, X_("selection"))); - channel_selector.reset (new PortExportChannelSelector (session, profile_manager)); + timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, X_("selection"))); + channel_selector.reset (new PortExportChannelSelector (_session, profile_manager)); file_notebook.reset (new ExportFileNotebook ()); } ExportRegionDialog::ExportRegionDialog (PublicEditor & editor, ARDOUR::AudioRegion const & region, ARDOUR::AudioTrack & track) : - ExportDialog (editor, _("Export Region")), + ExportDialog (editor, _("Export Region"), X_("RegionExportProfile")), region (region), track (track) {} @@ -391,17 +436,32 @@ void ExportRegionDialog::init_gui () { ExportDialog::init_gui (); - + channels_label->set_text (_("Source")); } void ExportRegionDialog::init_components () { - Glib::ustring loc_id = profile_manager->set_single_range (region.position(), region.position() + region.length(), region.name()); + string loc_id = profile_manager->set_single_range (region.position(), region.position() + region.length(), region.name()); preset_selector.reset (new ExportPresetSelector ()); - timespan_selector.reset (new ExportTimespanSelectorSingle (session, profile_manager, loc_id)); - channel_selector.reset (new RegionExportChannelSelector (session, profile_manager, region, track)); + timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, loc_id)); + channel_selector.reset (new RegionExportChannelSelector (_session, profile_manager, region, track)); + file_notebook.reset (new ExportFileNotebook ()); +} + +StemExportDialog::StemExportDialog (PublicEditor & editor) + : ExportDialog(editor, _("Stem Export"), X_("StemExportProfile")) +{ + +} + +void +StemExportDialog::init_components () +{ + preset_selector.reset (new ExportPresetSelector ()); + timespan_selector.reset (new ExportTimespanSelectorMultiple (_session, profile_manager)); + channel_selector.reset (new TrackExportChannelSelector (_session, profile_manager)); file_notebook.reset (new ExportFileNotebook ()); }