use syntactic sugar
[ardour.git] / gtk2_ardour / export_channel_selector.h
index 0faf652bd8e8c726657daf522e22b3244c585c12..1be8ec3547e3776c8277f7386b3da08c0be3ffba 100644 (file)
 
 #include <list>
 
-#include <ardour/export_profile_manager.h>
+#include "ardour/export_profile_manager.h"
+
+#ifdef interface
+#undef interface
+#endif
 
-#include <gtkmm.h>
 #include <sigc++/signal.h>
 #include <boost/shared_ptr.hpp>
 
+#include <gtkmm/alignment.h>
+#include <gtkmm/box.h>
+#include <gtkmm/cellrenderercombo.h>
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/label.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/spinbutton.h>
+#include <gtkmm/treemodel.h>
+#include <gtkmm/treeview.h>
+
 namespace ARDOUR {
        class Session;
-       class ExportChannel;
        class ExportChannelConfiguration;
+       class RegionExportChannelFactory;
        class ExportHandler;
        class AudioPort;
        class IO;
+       class AudioRegion;
+       class AudioTrack;
 }
 
 class XMLNode;
 
-/// 
-class ExportChannelSelector : public Gtk::HBox {
-  private:
-
+class ExportChannelSelector : public Gtk::HBox, public ARDOUR::SessionHandlePtr
+{
+protected:
        typedef boost::shared_ptr<ARDOUR::ExportChannelConfiguration> ChannelConfigPtr;
-       
-       typedef boost::shared_ptr<ARDOUR::ExportHandler> HandlerPtr;
+       typedef std::list<ChannelConfigPtr> ChannelConfigList;
+       typedef boost::shared_ptr<ARDOUR::ExportProfileManager> ProfileManagerPtr;
 
-  public:
+       ProfileManagerPtr manager;
+
+public:
+       ExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager)
+               : SessionHandlePtr (session)
+               , manager (manager)
+       {}
+
+       virtual ~ExportChannelSelector () {}
+
+       virtual void sync_with_manager () = 0;
 
-       ExportChannelSelector ();
-       ~ExportChannelSelector ();
-       
-       void set_state (ARDOUR::ExportProfileManager::ChannelConfigStatePtr const state_, ARDOUR::Session * session_);
-       
        sigc::signal<void> CriticalSelectionChanged;
+};
 
-  private:
+class PortExportChannelSelector : public ExportChannelSelector
+{
+public:
+
+       PortExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager);
+       ~PortExportChannelSelector ();
+
+       void sync_with_manager ();
+
+private:
 
        void fill_route_list ();
        void update_channel_count ();
        void update_split_state ();
 
-       typedef boost::shared_ptr<ARDOUR::ExportChannel> ChannelPtr;
-       typedef std::list<ChannelPtr> CahnnelList;
+       typedef std::list<ARDOUR::ExportChannelPtr> CahnnelList;
 
-       ARDOUR::Session * session;
        ARDOUR::ExportProfileManager::ChannelConfigStatePtr state;
 
        /*** GUI stuff ***/
@@ -77,105 +105,185 @@ class ExportChannelSelector : public Gtk::HBox {
        Gtk::Label        channels_label;
        Gtk::SpinButton   channels_spinbutton;
        Gtk::CheckButton  split_checkbox;
-       
+
        /* Column record for channel selector view */
-       
+
        class RouteCols : public Gtk::TreeModelColumnRecord
        {
-         public:
-       
+       public:
+
                struct Channel;
-       
+
                RouteCols () : n_channels (0)
-                       { add (selected); add (name); add (io); add (port_list_col); }
-       
+               { add (selected); add (name); add (io); add (port_list_col); }
+
                void add_channels (uint32_t chans);
                uint32_t n_channels;
-               
+
                /* Channel count starts from one! */
-               
+
                Channel & get_channel (uint32_t channel);
-       
+
                /* Static columns */
-       
+
                Gtk::TreeModelColumn<bool>           selected;
-               Gtk::TreeModelColumn<Glib::ustring>  name;
+               Gtk::TreeModelColumn<std::string>  name;
                Gtk::TreeModelColumn<ARDOUR::IO *>   io;
-               
+
                /* Combo list column (shared by all channels) */
-               
+
                typedef Gtk::TreeModelColumn<Glib::RefPtr<Gtk::ListStore> > ComboCol;
                ComboCol                             port_list_col;
-               
-               /* Channel struct, that represents the selected port and it's name */
-               
+
+               /* Channel struct, that represents the selected port and its name */
+
                struct Channel {
-                 public:
+               public:
                        Channel (RouteCols & cols) { cols.add (port); cols.add (label); }
-                       
-                       Gtk::TreeModelColumn<ARDOUR::AudioPort *>  port;
-                       Gtk::TreeModelColumn<Glib::ustring>        label;
+
+                       Gtk::TreeModelColumn<boost::weak_ptr<ARDOUR::AudioPort> > port;
+                       Gtk::TreeModelColumn<std::string> label;
                };
                std::list<Channel> channels;
-               
+
                /* List of available ports
                 * Note: We need only one list of selectable ports per route,
                 * so the list is kept in the column record
                 */
-               
+
                /* Column record for selecting ports for a channel from a route */
-               
+
                class PortCols : public Gtk::TreeModel::ColumnRecord
                {
-                 public:
-                       PortCols () { add (selected); add(port); add(label); }
-                       
-                       Gtk::TreeModelColumn<bool>                  selected;  // not used ATM
-                       Gtk::TreeModelColumn<ARDOUR::AudioPort *>   port;
-                       Gtk::TreeModelColumn<Glib::ustring>         label;
+               public:
+                       PortCols () { add(selected); add(port); add(label); }
+
+                       Gtk::TreeModelColumn<bool> selected;  // not used ATM
+                       Gtk::TreeModelColumn<boost::weak_ptr<ARDOUR::AudioPort> > port;
+                       Gtk::TreeModelColumn<std::string> label;
                };
                PortCols port_cols;
        };
-       
+
        /* Channels view */
-       
-       class ChannelTreeView : public Gtk::TreeView {
-         public:
-       
+
+       class ChannelTreeView : public Gtk::TreeView
+       {
+       public:
+
                ChannelTreeView (uint32_t max_channels);
                void set_config (ChannelConfigPtr c);
-       
+
                /* Routes have to be added before adding channels */
-               
+
                void clear_routes () { route_list->clear (); }
                void add_route (ARDOUR::IO * route);
                void set_channel_count (uint32_t channels);
-               
+
                sigc::signal<void> CriticalSelectionChanged;
-               
-         private:
-       
+
+       private:
+
                ChannelConfigPtr config;
                void update_config ();
-       
+
                /* Signal handlers for selections changes in the view */
-       
-               void update_toggle_selection (Glib::ustring const & path);
-               void update_selection_text (Glib::ustring const & path, Glib::ustring const & new_text, uint32_t channel);
-               
+
+               void update_toggle_selection (std::string const & path);
+               void update_selection_text (std::string const & path, std::string const & new_text, uint32_t channel);
+
                RouteCols                     route_cols;
                Glib::RefPtr<Gtk::ListStore>  route_list;
-               
+
                uint32_t                      static_columns;
                uint32_t                      n_channels;
        };
-       
+
        uint32_t                     max_channels;
-       
+
        Gtk::ScrolledWindow          channel_scroller;
        Gtk::Alignment               channel_alignment;
        ChannelTreeView              channel_view;
 
 };
 
+class RegionExportChannelSelector : public ExportChannelSelector
+{
+public:
+       RegionExportChannelSelector (ARDOUR::Session * session,
+                                    ProfileManagerPtr manager,
+                                    ARDOUR::AudioRegion const & region,
+                                    ARDOUR::AudioTrack & track);
+
+       virtual void sync_with_manager ();
+
+private:
+
+       void handle_selection ();
+
+       ARDOUR::ExportProfileManager::ChannelConfigStatePtr state;
+       boost::shared_ptr<ARDOUR::RegionExportChannelFactory> factory;
+       ARDOUR::AudioRegion const & region;
+       ARDOUR::AudioTrack & track;
+
+       uint32_t region_chans;
+       uint32_t track_chans;
+
+       /*** GUI components ***/
+
+       Gtk::VBox             vbox;
+
+       Gtk::RadioButtonGroup type_group;
+       Gtk::RadioButton      raw_button;
+       Gtk::RadioButton      fades_button;
+       Gtk::RadioButton      processed_button;
+};
+
+class TrackExportChannelSelector : public ExportChannelSelector
+{
+  public:
+       TrackExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager);
+
+       virtual void sync_with_manager ();
+
+       bool track_output () const { return track_output_button.get_active(); }
+
+  private:
+
+       void fill_list();
+       void add_track (boost::shared_ptr<ARDOUR::Route> route);
+       void update_config();
+       ChannelConfigList configs;
+
+       Gtk::VBox main_layout;
+
+       struct TrackCols : public Gtk::TreeModelColumnRecord
+       {
+         public:
+               Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> > route;
+               Gtk::TreeModelColumn<std::string>     label;
+               Gtk::TreeModelColumn<bool>            selected;
+               Gtk::TreeModelColumn<uint32_t>        order_key;
+
+               TrackCols () { add (route); add(label); add(selected); add(order_key); }
+       };
+       TrackCols                    track_cols;
+
+       Glib::RefPtr<Gtk::ListStore> track_list;
+       Gtk::TreeView                track_view;
+
+       Gtk::ScrolledWindow          track_scroller;
+
+       Gtk::HBox                    options_box;
+       Gtk::CheckButton             track_output_button;
+       Gtk::Button                  select_tracks_button;
+       Gtk::Button                  select_busses_button;
+       Gtk::Button                  select_none_button;
+       void select_tracks ();
+       void select_busses ();
+       void select_none ();
+
+       void track_outputs_selected ();
+};
+
 #endif /* __export_channel_selector_h__ */