Optimize automation-event process splitting
[ardour.git] / gtk2_ardour / export_dialog.h
index 2831384cd3680fd05de3bc179dcc3f2f75a9796d..09385a4b846525dea47e85b444a68b9734191671 100644 (file)
@@ -1,5 +1,6 @@
 /*
-    Copyright (C) 1999-2002 Paul Davis 
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
 */
 
-#ifndef __ardour_export_dialog_h__
-#define __ardour_export_dialog_h__
+#ifndef __export_dialog_h__
+#define __export_dialog_h__
+
+#include <string>
+#include <boost/scoped_ptr.hpp>
 
-#include <gtkmm/alignment.h>
 #include <gtkmm/box.h>
-#include <gtkmm/table.h>
-#include <gtkmm/frame.h>
-#include <gtkmm/frame.h>
 #include <gtkmm/button.h>
+#include <gtkmm/label.h>
+#include <gtkmm/notebook.h>
 #include <gtkmm/progressbar.h>
-#include <gtkmm/scrolledwindow.h>
-#include <gtkmm/fileselection.h>
-#include <gtkmm/filechooser.h>
-#include <gtkmm/comboboxtext.h>
-#include <gtkmm/treeview.h>
-#include <gtkmm/liststore.h>
 
-#include <ardour/export.h>
-#include <ardour/location.h>
+#include "ardour/export_profile_manager.h"
 
+#include "public_editor.h"
+#include "export_timespan_selector.h"
+#include "export_channel_selector.h"
+#include "export_file_notebook.h"
+#include "export_preset_selector.h"
 #include "ardour_dialog.h"
-
-class PublicEditor;
+#include "soundcloud_export_selector.h"
 
 namespace ARDOUR {
-       class Session;
-       class AudioRegion;
-       class Port;
+       class ExportStatus;
+       class ExportHandler;
 }
 
-class ExportDialog : public ArdourDialog
+class ExportTimespanSelector;
+class ExportChannelSelector;
+
+class ExportDialog : public ArdourDialog, public PBD::ScopedConnectionList
 {
-  public:
-       ExportDialog (PublicEditor&);
+public:
+
+       ExportDialog (PublicEditor & editor, std::string title, ARDOUR::ExportProfileManager::ExportType type);
        ~ExportDialog ();
 
-       void connect_to_session (ARDOUR::Session*);
-       virtual void set_range (nframes_t start, nframes_t end);
-       void start_export ();
+       void set_session (ARDOUR::Session* s);
 
-       virtual Gtk::FileChooserAction browse_action() const { return Gtk::FILE_CHOOSER_ACTION_SAVE; }
+       /* Responses */
 
-  protected:
-       ARDOUR::AudioExportSpecification spec;
-       Gtk::Frame  file_frame;
+       enum Responses {
+               RESPONSE_RT,
+               RESPONSE_FAST,
+               RESPONSE_CANCEL
+       };
 
-    struct ExportModelColumns : public Gtk::TreeModel::ColumnRecord
-       {
-       public:
-         Gtk::TreeModelColumn<std::string>     output;
-         Gtk::TreeModelColumn<bool>            left;
-         Gtk::TreeModelColumn<bool>            right;
-         Gtk::TreeModelColumn<ARDOUR::Port*>   port;
+protected:
 
-         ExportModelColumns() { add(output); add(left); add(right); add(port);}
-       };
+       void on_response (int response_id) {
+               Gtk::Dialog::on_response (response_id);
+       }
+
+       typedef boost::shared_ptr<ARDOUR::ExportHandler> HandlerPtr;
+       typedef boost::shared_ptr<ARDOUR::ExportProfileManager> ManagerPtr;
+
+       ARDOUR::ExportProfileManager::ExportType type;
+       HandlerPtr      handler;
+       ManagerPtr      profile_manager;
+
+       // initializes GUI layout
+       virtual void init_gui ();
+
+       // Must initialize all the shared_ptrs below
+       virtual void init_components ();
+
+       boost::scoped_ptr<ExportPresetSelector>   preset_selector;
+       boost::scoped_ptr<ExportTimespanSelector> timespan_selector;
+       boost::scoped_ptr<ExportChannelSelector>  channel_selector;
+       boost::scoped_ptr<ExportFileNotebook>     file_notebook;
+
+       boost::shared_ptr<SoundcloudExportSelector> soundcloud_selector;
+
+       Gtk::VBox                                 warning_widget;
+       Gtk::VBox                                 progress_widget;
+
+       /*** GUI components ***/
+       Gtk::Notebook export_notebook;
+
+private:
+
+       void init ();
+
+       void notify_errors (bool force = false);
+       void close_dialog ();
+
+       void sync_with_manager ();
+       void update_warnings_and_example_filename ();
+       void show_conflicting_files ();
 
-       ExportModelColumns exp_cols;
-       
-       // These methods are intended to be used in constructors of subclasses
-       void do_not_allow_track_and_master_selection();
-       void do_not_allow_channel_count_selection();
-       void do_not_allow_export_cd_markers(); 
-       
-       // Checks the given filename for validity when export gets started.
-       // Export will interrupt when this method returns 'false'.
-       // Method is responsible for informing user.
-       virtual bool is_filepath_valid(string &filepath);
-
-       // Gets called from within do_export. Is responsible for exporting the
-       // audio data. spec has already been filled with user input before calling
-       // this method. The dialog will be closed after this function exited.
-       virtual void export_audio_data() = 0;
-
-       virtual bool wants_dir() { return false; }
-       
-       // reads the user input and fills spec with the according values
-       // filepath: complete path to the target file, including filename
-       void initSpec(string &filepath);
-
-       void set_progress_fraction(double progress) {
-                       progress_bar.set_fraction (progress); }
-       
-       ARDOUR::Session& getSession() { return *session; };
-       string get_selected_header_format() {
-               return header_format_combo.get_active_text(); };
-       string get_selected_file_name() { return file_entry.get_text(); };
-       
-  private:
-       PublicEditor&    editor;
-       ARDOUR::Session* session;
-    bool       track_and_master_selection_allowed;
-       bool    channel_count_selection_allowed;
-       bool    export_cd_markers_allowed;
-    
-       Gtk::VBox   track_vpacker;
-       Gtk::HBox   hpacker;
-
-       Gtk::Table  format_table;
-       Gtk::Frame  format_frame;
-
-       Gtk::Label  cue_file_label;
-       Gtk::ComboBoxText cue_file_combo;
-       
-       Gtk::Label  channel_count_label;
-       Gtk::ComboBoxText channel_count_combo;
-
-       Gtk::Label  header_format_label;
-       Gtk::ComboBoxText header_format_combo;
-
-       Gtk::Label  bitdepth_format_label;
-       Gtk::ComboBoxText bitdepth_format_combo;
-
-       Gtk::Label  endian_format_label;
-       Gtk::ComboBoxText endian_format_combo;
-       
-       Gtk::Label  sample_rate_label;
-       Gtk::ComboBoxText sample_rate_combo;
-
-       Gtk::Label  src_quality_label;
-       Gtk::ComboBoxText src_quality_combo;
-
-       Gtk::Label  dither_type_label;
-       Gtk::ComboBoxText dither_type_combo;
-
-       Gtk::CheckButton cuefile_only_checkbox;
-
-       Gtk::Entry  file_entry;
-       Gtk::HBox   file_hbox;
-       Gtk::Button file_browse_button;
-
-       Gtk::Button* ok_button;
-       Gtk::Button* cancel_button;
-       Gtk::Label  cancel_label;
-       Gtk::ProgressBar progress_bar;
-       Gtk::ScrolledWindow track_scroll;
-       Gtk::ScrolledWindow master_scroll;
-       Gtk::Button         track_selector_button;
-       Gtk::TreeView  track_selector;
-       Glib::RefPtr<Gtk::ListStore> track_list;
-       Gtk::TreeView  master_selector;
-       Glib::RefPtr<Gtk::ListStore> master_list;
-
-       static void *_thread (void *arg);
-       // sets the export progress in the progress bar
-       virtual gint progress_timeout ();
-       sigc::connection progress_connection;
-       void build_window ();
-       void end_dialog();
-       void header_chosen ();
-       void channels_chosen ();
-       void bitdepth_chosen ();
-       void sample_rate_chosen ();
-       void cue_file_type_chosen();
-
-       void fill_lists();
-       void write_track_and_master_selection_to_spec();
-
-    void do_export_cd_markers (const string& path, const string& cuefile_type);
-       void export_cue_file (ARDOUR::Locations::LocationList& locations, const string& path);
-       void export_toc_file (ARDOUR::Locations::LocationList& locations, const string& path);
        void do_export ();
-       gint window_closed (GdkEventAny *ignored);
 
-       void track_selector_button_click ();
+       void update_realtime_selection ();
+       void parameter_changed (std::string const&);
+
+       void show_progress ();
+       gint progress_timeout ();
+
+       typedef boost::shared_ptr<ARDOUR::ExportStatus> StatusPtr;
+
+       PublicEditor &  editor;
+       StatusPtr       status;
+
+
+
+       /* Warning area */
+
+       Gtk::HBox           warn_hbox;
+       Gtk::Label          warn_label;
+       std::string         warn_string;
+
+       Gtk::HBox           list_files_hbox;
+       Gtk::Label          list_files_label;
+       Gtk::Button         list_files_button;
+       std::string         list_files_string;
+
+       void add_error (std::string const & text);
+       void add_warning (std::string const & text);
+
+       /* Progress bar */
 
-       void browse ();
+       Gtk::ProgressBar        progress_bar;
+       sigc::connection        progress_connection;
 
-       void set_state();
-       void save_state();
+       float previous_progress; // Needed for gtk bug workaround
+
+       void soundcloud_upload_progress(double total, double now, std::string title);
+
+       /* Buttons */
+
+       Gtk::Button *           cancel_button;
+       Gtk::Button *           export_button;
+
+};
+
+class ExportRangeDialog : public ExportDialog
+{
+  public:
+       ExportRangeDialog (PublicEditor & editor, std::string range_id);
+
+  private:
+       void init_components ();
+
+       std::string range_id;
+};
+
+class ExportSelectionDialog : public ExportDialog
+{
+  public:
+       ExportSelectionDialog (PublicEditor & editor);
+
+  private:
+       void init_components ();
+};
+
+class ExportRegionDialog : public ExportDialog
+{
+  public:
+       ExportRegionDialog (PublicEditor & editor, ARDOUR::AudioRegion const & region, ARDOUR::AudioTrack & track);
+
+  private:
+       void init_gui ();
+       void init_components ();
+
+       ARDOUR::AudioRegion const & region;
+       ARDOUR::AudioTrack & track;
+};
+
+class StemExportDialog : public ExportDialog
+{
+  public:
+       StemExportDialog (PublicEditor & editor);
+
+  private:
+       void init_components ();
 };
 
-#endif // __ardour_export_dialog_h__
+#endif /* __ardour_export_dialog_h__ */