Show an example filename in the main export dialog
authorSakari Bergen <sakari.bergen@beatwaves.net>
Sun, 29 Jan 2012 20:55:44 +0000 (20:55 +0000)
committerSakari Bergen <sakari.bergen@beatwaves.net>
Sun, 29 Jan 2012 20:55:44 +0000 (20:55 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11383 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/export_dialog.cc
gtk2_ardour/export_dialog.h
gtk2_ardour/export_file_notebook.cc
gtk2_ardour/export_file_notebook.h
gtk2_ardour/export_filename_selector.cc
gtk2_ardour/export_filename_selector.h
libs/ardour/ardour/export_profile_manager.h
libs/ardour/export_profile_manager.cc

index 3dea7ee1a676e65bcb34051c1afc56e990608e5b..9155595b8c5e1bf94fc89d34d2834caff5d4f611 100644 (file)
@@ -91,13 +91,13 @@ 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));
+       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 ();
+       update_warnings_and_example_filename ();
 }
 
 void
@@ -226,11 +226,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 */
 
@@ -263,7 +263,9 @@ ExportDialog::update_warnings ()
                }
        }
 
-       
+       /* Update example filename */
+
+       file_notebook->update_example_filenames();
 }
 
 void
index a720ec0b9c15d7a6d4a3613119a283dd80f6c0a4..ee0f7ce2691b9fd111d2569dc6e821a10779836d 100644 (file)
@@ -94,7 +94,7 @@ class ExportDialog : public ArdourDialog {
        void close_dialog ();
 
        void sync_with_manager ();
-       void update_warnings ();
+       void update_warnings_and_example_filename ();
        void show_conflicting_files ();
 
        void export_rt ();
index ef0c56f55cb39b7f5356aaec50743b87ba09e3a0..959bc42a2f22827260541107d4bf04eb3977eb3a 100644 (file)
 
 #include "ardour/export_format_specification.h"
 
+#include "pbd/filesystem.h"
+
 #include "gui_thread.h"
 #include "utils.h"
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace PBD;
 
 ExportFileNotebook::ExportFileNotebook () :
   page_counter (1)
@@ -88,6 +91,16 @@ ExportFileNotebook::sync_with_manager ()
        CriticalSelectionChanged ();
 }
 
+void
+ExportFileNotebook::update_example_filenames()
+{
+       int i = 0;
+       FilePage * page;
+       while ((page = dynamic_cast<FilePage *> (get_nth_page (i++)))) {
+               page->update_example_filename();
+       }
+}
+
 std::string
 ExportFileNotebook::get_nth_format_name (uint32_t n)
 {
@@ -203,8 +216,10 @@ ExportFileNotebook::FilePage::FilePage (Session * s, ManagerPtr profile_manager,
        format_selector.FormatRemoved.connect (sigc::mem_fun (*profile_manager, &ExportProfileManager::remove_format_profile));
        format_selector.NewFormat.connect (sigc::mem_fun (*profile_manager, &ExportProfileManager::get_new_format));
 
-       format_selector.CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportFileNotebook::FilePage::update_tab_label));
-       filename_selector.CriticalSelectionChanged.connect (CriticalSelectionChanged.make_slot());
+       format_selector.CriticalSelectionChanged.connect (
+               sigc::mem_fun (*this, &ExportFileNotebook::FilePage::critical_selection_changed));
+       filename_selector.CriticalSelectionChanged.connect (
+               sigc::mem_fun (*this, &ExportFileNotebook::FilePage::critical_selection_changed));
 
        /* Tab widget */
 
@@ -216,6 +231,7 @@ ExportFileNotebook::FilePage::FilePage (Session * s, ManagerPtr profile_manager,
        tab_widget.pack_end (tab_close_alignment, false, false, 0);
        tab_widget.show_all_children ();
        update_tab_label ();
+       update_example_filename();
 
        /* Done */
 
@@ -251,5 +267,27 @@ void
 ExportFileNotebook::FilePage::update_tab_label ()
 {
        tab_label.set_text (string_compose ("Format %1: %2", tab_number, get_format_name()));
+}
+
+void
+ExportFileNotebook::FilePage::update_example_filename()
+{
+       if (profile_manager) {
+               std::string example = profile_manager->get_sample_filename_for_format (
+                       filename_state->filename, format_state->format);
+               if (example != "") {
+                       sys::path path(example);
+                       filename_selector.set_example_filename(path.leaf());
+               } else {
+                       filename_selector.set_example_filename("");
+               }
+       }
+}
+
+void
+ExportFileNotebook::FilePage::critical_selection_changed ()
+{
+       update_tab_label();
+       update_example_filename();
        CriticalSelectionChanged();
 }
index 9f357ab1d548f01537acef0aa231509184f7c08c..5555828e98e5a6dc1e35759fa39038dd8050efb4 100644 (file)
@@ -39,6 +39,8 @@ class ExportFileNotebook : public Gtk::Notebook, public ARDOUR::SessionHandlePtr
        void set_session_and_manager (ARDOUR::Session * s, boost::shared_ptr<ARDOUR::ExportProfileManager> manager);
        void sync_with_manager ();
 
+       void update_example_filenames();
+
        std::string get_nth_format_name (uint32_t n);
 
        sigc::signal<void> CriticalSelectionChanged;
@@ -79,6 +81,8 @@ class ExportFileNotebook : public Gtk::Notebook, public ARDOUR::SessionHandlePtr
                void set_remove_sensitive (bool value);
                std::string get_format_name () const;
 
+               void update_example_filename();
+
                ARDOUR::ExportProfileManager::FormatStatePtr   get_format_state () const { return format_state; }
                ARDOUR::ExportProfileManager::FilenameStatePtr get_filename_state () const { return filename_state; }
 
@@ -87,6 +91,7 @@ class ExportFileNotebook : public Gtk::Notebook, public ARDOUR::SessionHandlePtr
          private:
                void save_format_to_manager (FormatPtr format);
                void update_tab_label ();
+               void critical_selection_changed ();
 
                ARDOUR::ExportProfileManager::FormatStatePtr   format_state;
                ARDOUR::ExportProfileManager::FilenameStatePtr filename_state;
index 789b7eb435f948e11c5a4cb470e5010f0a52280c..e2d360984c84054c1f8f4a6cf11b60ae7ea3a553 100644 (file)
@@ -38,11 +38,14 @@ ExportFilenameSelector::ExportFilenameSelector () :
        revision_checkbox (_("Revision:")),
 
        path_label (_("Folder:"), Gtk::ALIGN_LEFT),
-       browse_button (_("Browse"))
+       browse_button (_("Browse")),
+
+       example_filename_label ("", Gtk::ALIGN_LEFT)
 {
        pack_start (include_label, false, false, 6);
        pack_start (include_hbox, false, false, 0);
        pack_start (path_hbox, false, false, 12);
+       pack_start (example_filename_label, false, false, 0);
 
        include_hbox.pack_start (label_label, false, false, 3);
        include_hbox.pack_start (label_entry, false, false, 3);
@@ -204,6 +207,17 @@ ExportFilenameSelector::set_state (ARDOUR::ExportProfileManager::FilenameStatePt
 
 }
 
+void
+ExportFilenameSelector::set_example_filename (std::string filename)
+{
+       if (filename == "") {
+               example_filename_label.set_text (_("Sorry, no example filename can be shown at the moment"));
+       } else {
+               example_filename_label.set_text (string_compose(_("Example filename: \"%1\""),
+                                                               filename));
+       }
+}
+
 void
 ExportFilenameSelector::update_label ()
 {
index 8522f79b20c4589179abb7b1801c4a253032aed4..f6f75514380d789f6fe7d50746c5520461f91c14 100644 (file)
@@ -37,6 +37,7 @@ class ExportFilenameSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
        ~ExportFilenameSelector ();
 
        void set_state (ARDOUR::ExportProfileManager::FilenameStatePtr state_, ARDOUR::Session * session_);
+       void set_example_filename (std::string filename);
 
        /* Compatibility with other elements */
 
@@ -80,6 +81,7 @@ class ExportFilenameSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
        Gtk::Label        path_label;
        Gtk::Entry        path_entry;
        Gtk::Button       browse_button;
+       Gtk::Label        example_filename_label;
 
        /* Date combo */
 
index c0d2bb1dd8c7448c8f76744ec206dd7e64238837..f73085e5ba69ba269f407531f4657448e03f1000 100644 (file)
@@ -232,6 +232,8 @@ class ExportProfileManager
        FilenameStatePtr duplicate_filename_state (FilenameStatePtr state);
        void remove_filename_state (FilenameStatePtr state);
 
+       std::string get_sample_filename_for_format (ExportFilenamePtr filename, ExportFormatSpecPtr format);
+
   private:
 
        FilenameStateList filenames;
@@ -261,6 +263,10 @@ class ExportProfileManager
 
  /* Utilities */
 
+       void build_filenames(std::list<std::string> & result, ExportFilenamePtr filename,
+                            TimespanListPtr timespans, ExportChannelConfigPtr channel_config,
+                            ExportFormatSpecPtr format);
+
        /* Element state lists should never be empty, this is used to check them */
        template<typename T>
        std::list<T> const &
index af1209fde3dbfd2999fb708dba2c04168bd695bc..c644687f59beeb3110768f61b3a0ec2cba5659af 100644 (file)
@@ -711,6 +711,19 @@ ExportProfileManager::remove_filename_state (FilenameStatePtr state)
        }
 }
 
+std::string
+ExportProfileManager::get_sample_filename_for_format (ExportFilenamePtr filename, ExportFormatSpecPtr format)
+{
+       if (channel_configs.empty()) { return ""; }
+
+       std::list<string> filenames;
+       build_filenames (filenames, filename, timespans.front()->timespans,
+                        channel_configs.front()->config, format);
+
+       if (filenames.empty()) { return ""; }
+       return filenames.front();
+}
+
 bool
 ExportProfileManager::init_filenames (XMLNodeList nodes)
 {
@@ -815,34 +828,17 @@ ExportProfileManager::check_config (boost::shared_ptr<Warnings> warnings,
 
 //     filename->include_timespan = (timespans->size() > 1); Disabled for now...
 
-       for (std::list<ExportTimespanPtr>::iterator timespan_it = timespans->begin(); timespan_it != timespans->end(); ++timespan_it) {
-               filename->set_timespan (*timespan_it);
-
-               if (channel_config->get_split()) {
-                       filename->include_channel = true;
-
-                       for (uint32_t chan = 1; chan <= channel_config->get_n_chans(); ++chan) {
-                               filename->set_channel (chan);
+       std::list<string> paths;
+       build_filenames(paths, filename, timespans, channel_config, format);
 
-                               string path = filename->get_path (format);
+       for (std::list<string>::const_iterator path_it = paths.begin(); path_it != paths.end(); ++path_it) {
 
-                               if (sys::exists (sys::path (path))) {
-                                       warnings->conflicting_filenames.push_back (path);
-                               }
-                       }
+               string path = *path_it;
 
-               } else {
-                       filename->include_channel = false;
-                       string path = filename->get_path (format);
-
-                       if (sys::exists (sys::path (path))) {
-                               warnings->conflicting_filenames.push_back (path);
-                       }
+               if (sys::exists (sys::path (path))) {
+                       warnings->conflicting_filenames.push_back (path);
                }
 
-               // TODO check what happens with split channel configs...
-               string path = filename->get_path (format);
-
                if (format->with_toc()) {
                        string marker_file = handler->get_cd_marker_filename(path, CDMarkerTOC);
                        if (sys::exists (sys::path (marker_file))) {
@@ -882,4 +878,28 @@ ExportProfileManager::check_sndfile_format (ExportFormatSpecPtr format, unsigned
        return (sf_format_check (&sf_info) == SF_TRUE ? true : false);
 }
 
+void
+ExportProfileManager::build_filenames(std::list<std::string> & result, ExportFilenamePtr filename,
+                                      TimespanListPtr timespans, ExportChannelConfigPtr channel_config,
+                                      ExportFormatSpecPtr format)
+{
+       for (std::list<ExportTimespanPtr>::iterator timespan_it = timespans->begin();
+            timespan_it != timespans->end(); ++timespan_it) {
+               filename->set_timespan (*timespan_it);
+
+               if (channel_config->get_split()) {
+                       filename->include_channel = true;
+
+                       for (uint32_t chan = 1; chan <= channel_config->get_n_chans(); ++chan) {
+                               filename->set_channel (chan);
+                               result.push_back(filename->get_path (format));
+                       }
+
+               } else {
+                       filename->include_channel = false;
+                       result.push_back(filename->get_path (format));
+               }
+       }
+}
+
 }; // namespace ARDOUR