Fix crash when closing session, recursive mon-section removal
[ardour.git] / gtk2_ardour / transport_masters_dialog.h
index 752aec1dad1dafa417be4e064f18c55ff0400f82..0030493f4757c0378de62260b7d7c75239948e35 100644 (file)
 #include <string>
 
 #include <gtkmm/button.h>
+#include <gtkmm/eventbox.h>
 #include <gtkmm/radiobutton.h>
 #include <gtkmm/label.h>
 #include <gtkmm/table.h>
+#include <gtkmm/entry.h>
 #include <gtkmm/treestore.h>
 
 #include "ardour_window.h"
@@ -39,6 +41,8 @@ namespace ARDOUR {
        class TransportMaster;
 }
 
+class FloatingTextEntry;
+
 class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 {
   public:
@@ -46,6 +50,7 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
        ~TransportMastersWidget ();
 
        void update (ARDOUR::samplepos_t);
+       void set_transport_master (boost::shared_ptr<ARDOUR::TransportMaster>);
 
   protected:
        void on_map ();
@@ -53,7 +58,24 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 
   private:
 
+       struct AddTransportMasterDialog : public ArdourDialog {
+         public:
+               AddTransportMasterDialog ();
+               std::string get_name () const;
+               ARDOUR::SyncSource get_type () const;
+
+         private:
+               Gtk::Label name_label;
+               Gtk::Label type_label;
+               Gtk::HBox name_hbox;
+               Gtk::HBox type_hbox;
+               Gtk::Entry name_entry;
+               Gtk::ComboBoxText type_combo;
+       };
+
        struct Row : sigc::trackable, PBD::ScopedConnectionList {
+               TransportMastersWidget& parent;
+               Gtk::EventBox label_box;
                Gtk::Label label;
                Gtk::Label type;
                Gtk::Label format;
@@ -68,6 +90,9 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
                Gtk::CheckButton fr2997_button;
                Gtk::Button request_options;
                Gtk::Menu* request_option_menu;
+               Gtk::Button remove_button;
+               FloatingTextEntry* name_editor;
+               samplepos_t save_when;
 
                void build_request_options();
 
@@ -75,7 +100,7 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 
                void update (ARDOUR::Session*, ARDOUR::samplepos_t);
 
-               Row ();
+               Row (TransportMastersWidget& parent);
 
                struct PortColumns : public Gtk::TreeModel::ColumnRecord {
                        PortColumns() {
@@ -99,6 +124,10 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
                void connection_handler ();
                bool request_option_press (GdkEventButton*);
                void prop_change (PBD::PropertyChange);
+               void remove_clicked ();
+
+               bool name_press (GdkEventButton*);
+               void name_edited (std::string, int);
 
                PBD::ScopedConnection property_change_connection;
                bool ignore_active_change;
@@ -106,16 +135,21 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 
        std::vector<Row*> rows;
 
-       Gtk::RadioButtonGroup use_button_group;
        Gtk::Table table;
-       Gtk::Label col_title[13];
+       Gtk::Label col_title[14];
+       Gtk::Button add_button;
 
        sigc::connection update_connection;
        PBD::ScopedConnection current_connection;
+       PBD::ScopedConnection add_connection;
+       PBD::ScopedConnection remove_connection;
 
        void rebuild ();
        void current_changed (boost::shared_ptr<ARDOUR::TransportMaster> old_master, boost::shared_ptr<ARDOUR::TransportMaster> new_master);
+       void add_master ();
 
+  public:
+       bool idle_remove (Row*);
 };
 
 class TransportMastersWindow : public ArdourWindow