X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_dialog.cc;h=a64acd16801af3c2ec619e39ce1ea44bc75fba59;hb=4c42a77441e74356cd909d994e270d1e1314aad4;hp=d60e5753c4c6300f17e7f3c82753541ac496181e;hpb=455058835e2fc1794803a56de94d01cbf52998c5;p=ardour.git diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc index d60e5753c4..a64acd1680 100644 --- a/gtk2_ardour/export_dialog.cc +++ b/gtk2_ardour/export_dialog.cc @@ -21,24 +21,30 @@ #include -#include "pbd/filesystem.h" +#include +#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, ARDOUR::ExportProfileManager::ExportType type) + : ArdourDialog (title) + , type (type) + , 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 () @@ -57,7 +63,8 @@ ExportDialog::set_session (ARDOUR::Session* s) handler = _session->get_export_handler (); status = _session->get_export_status (); - profile_manager.reset (new ExportProfileManager (*_session)); + + profile_manager.reset (new ExportProfileManager (*_session, type)); /* Possibly init stuff in derived classes */ @@ -85,13 +92,11 @@ ExportDialog::set_session (ARDOUR::Session* s) /* 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 (abort_connection, invalidator (*this), boost::bind (&ExportDialog::notify_errors, this), gui_context()); + 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)); - update_warnings (); + update_warnings_and_example_filename (); } void @@ -116,22 +121,18 @@ ExportDialog::init () /* 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); - // Realtime export is disabled for now, as it will most probably not work - //rt_export_button = add_button (_("Realtime Export"), RESPONSE_RT); - //fast_export_button = add_button (_("Fast Export"), RESPONSE_FAST); - fast_export_button = add_button (_("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! */ @@ -139,6 +140,12 @@ ExportDialog::init () progress_widget.hide_all(); } +void +ExportDialog::expanded_changed () +{ + set_resizable(advanced->get_expanded()); +} + void ExportDialog::init_gui () { @@ -147,32 +154,48 @@ ExportDialog::init_gui () preset_align->set_padding (0, 12, 0, 0); get_vbox()->pack_start (*preset_align, false, false, 0); - Gtk::VBox* advanced_vbox = Gtk::manage (new Gtk::VBox()); - advanced_vbox->set_spacing (12); - advanced_vbox->set_border_width (12); + 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); - advanced_vbox->pack_start (*timespan_label, false, false, 0); - advanced_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); - advanced_vbox->pack_start (*channels_label, false, false, 0); - advanced_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, false, false, 0); get_vbox()->pack_start (progress_widget, false, false, 0); - Gtk::Expander* advanced = Gtk::manage (new Gtk::Expander (_("Advanced options"))); - advanced->add (*advanced_vbox); + 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, false, false); + get_vbox()->pack_start (*advanced, true, true); Pango::AttrList bold; Pango::Attribute b = Pango::Attribute::create_attr_weight (Pango::WEIGHT_BOLD); @@ -195,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(); } @@ -220,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 */ @@ -234,28 +257,31 @@ 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 @@ -275,18 +301,10 @@ ExportDialog::show_conflicting_files () } void -ExportDialog::export_rt () -{ - profile_manager->prepare_for_export (); - handler->do_export (true); - show_progress (); -} - -void -ExportDialog::export_fw () +ExportDialog::do_export () { profile_manager->prepare_for_export (); - handler->do_export (false); + handler->do_export (); show_progress (); } @@ -296,8 +314,7 @@ 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(); @@ -306,6 +323,7 @@ ExportDialog::show_progress () progress_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ExportDialog::progress_timeout), 100); gtk_main_iteration (); + while (status->running) { if (gtk_events_pending()) { gtk_main_iteration (); @@ -313,45 +331,53 @@ ExportDialog::show_progress () usleep (10000); } } - + if (!status->aborted()) { - status->finish (); + + NagScreen* ns = NagScreen::maybe_nag (_("export")); + + if (ns) { + ns->nag (); + delete ns; + } + } else { + notify_errors (); } + + 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); + + if (progress < previous_progress) { + // Work around gtk bug + progress_bar.hide(); + progress_bar.show(); } + previous_progress = progress; - progress_bar.set_fraction (status->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 + ""; @@ -363,7 +389,7 @@ ExportDialog::add_error (Glib::ustring const & text) } void -ExportDialog::add_warning (Glib::ustring const & text) +ExportDialog::add_warning (string const & text) { if (warn_string.empty()) { warn_string = _("Warning: ") + text + ""; @@ -376,8 +402,8 @@ ExportDialog::add_warning (Glib::ustring const & text) /*** 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"), ExportProfileManager::RangeExport), range_id (range_id) {} @@ -391,7 +417,7 @@ ExportRangeDialog::init_components () } ExportSelectionDialog::ExportSelectionDialog (PublicEditor & editor) : - ExportDialog (editor, _("Export Selection")) + ExportDialog (editor, _("Export Selection"), ExportProfileManager::SelectionExport) {} void @@ -404,7 +430,7 @@ ExportSelectionDialog::init_components () } ExportRegionDialog::ExportRegionDialog (PublicEditor & editor, ARDOUR::AudioRegion const & region, ARDOUR::AudioTrack & track) : - ExportDialog (editor, _("Export Region")), + ExportDialog (editor, _("Export Region"), ExportProfileManager::RegionExport), region (region), track (track) {} @@ -420,10 +446,25 @@ ExportRegionDialog::init_gui () 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)); file_notebook.reset (new ExportFileNotebook ()); } + +StemExportDialog::StemExportDialog (PublicEditor & editor) + : ExportDialog(editor, _("Stem Export"), ExportProfileManager::StemExport) +{ + +} + +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 ()); +}