Fix crash when closing session, recursive mon-section removal
[ardour.git] / gtk2_ardour / transport_masters_dialog.h
index 838e021a5ae3f2128340fd050b870753894d89f7..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_dialog.h"
+#include "ardour_window.h"
 
 namespace Gtk {
        class Menu;
@@ -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,20 +58,41 @@ 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;
                Gtk::Label current;
+               Gtk::Label last;
                Gtk::Label timestamp;
                Gtk::Label delta;
                Gtk::CheckButton collect_button;
                Gtk::RadioButton use_button;
                Gtk::ComboBoxText port_combo;
                Gtk::CheckButton sclock_synced_button;
-               Gtk::CheckButton fps_299730_button;
+               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();
 
@@ -74,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() {
@@ -93,34 +119,49 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
                void use_button_toggled ();
                void collect_button_toggled ();
                void sync_button_toggled ();
+               void fr2997_button_toggled ();
                void port_choice_changed ();
                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;
        };
 
        std::vector<Row*> rows;
 
-       Gtk::RadioButtonGroup use_button_group;
        Gtk::Table table;
-       Gtk::Label col_title[12];
+       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 TransportMastersDialog : public ArdourDialog
+class TransportMastersWindow : public ArdourWindow
 {
   public:
-       TransportMastersDialog ();
+       TransportMastersWindow ();
 
        void set_session (ARDOUR::Session*);
 
+  protected:
+       void on_realize ();
+
   private:
        TransportMastersWidget w;
 };