Fix update of the editor mixer when its route is removed; this stops routes (and...
[ardour.git] / gtk2_ardour / port_matrix.h
index 666a55da04e80a319f1bfacaf7cb19f9793c467a..0dc88f02f2e19e6413177437291bf56f8b1484f6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2002-2009 Paul Davis 
+    Copyright (C) 2002-2009 Paul Davis
 
     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
@@ -30,6 +30,7 @@
 #include "ardour/bundle.h"
 #include "port_group.h"
 #include "port_matrix_types.h"
+#include "i18n.h"
 
 /** The `port matrix' UI.  This is a widget which lets the user alter
  *  associations between one set of ports and another.  e.g. to connect
@@ -49,7 +50,7 @@ class PortMatrixBody;
 class PortMatrix : public Gtk::Table
 {
 public:
-       PortMatrix (ARDOUR::Session&, ARDOUR::DataType);
+       PortMatrix (Gtk::Window*, ARDOUR::Session&, ARDOUR::DataType);
        ~PortMatrix ();
 
        void set_type (ARDOUR::DataType);
@@ -57,7 +58,7 @@ public:
        ARDOUR::DataType type () const {
                return _type;
        }
-       
+
        void disassociate_all ();
        void setup_scrollbars ();
        void popup_menu (
@@ -104,7 +105,7 @@ public:
        PortGroupList const * ports (int d) const {
                return &_ports[d];
        }
-       
+
        void setup ();
        virtual void setup_ports (int) = 0;
        void setup_all_ports ();
@@ -122,12 +123,17 @@ public:
        virtual PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const = 0;
        virtual bool list_is_global (int) const = 0;
 
-       virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>) = 0;
-       virtual bool can_remove_channels (int) const = 0;
-       virtual void remove_channel (ARDOUR::BundleChannel) = 0;
-       virtual bool can_rename_channels (int) const = 0;
+       virtual bool can_add_channel (boost::shared_ptr<ARDOUR::Bundle>) const;
+       virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>);
+       virtual bool can_remove_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
+       virtual void remove_channel (ARDOUR::BundleChannel);
+       virtual bool can_rename_channels (boost::shared_ptr<ARDOUR::Bundle>) const {
+               return false;
+       }
        virtual void rename_channel (ARDOUR::BundleChannel) {}
-       
+       virtual std::string disassociation_verb () const = 0;
+       virtual std::string channel_noun () const { return _("channel"); }
+
        enum Result {
                Cancelled,
                Accepted
@@ -145,7 +151,7 @@ protected:
            inputs and outputs should put outputs in list 0 and inputs in list 1. */
        PortGroupList _ports[2];
        ARDOUR::Session& _session;
-       
+
 private:
 
        void hscroll_changed ();
@@ -153,6 +159,7 @@ private:
        void routes_changed ();
        void reconnect_to_routes ();
        void select_arrangement ();
+       void add_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>);
        void remove_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
        void rename_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
        void disassociate_all_on_channel (boost::weak_ptr<ARDOUR::Bundle>, uint32_t, int);
@@ -160,8 +167,11 @@ private:
        void hide_group (boost::weak_ptr<PortGroup>);
        void show_group (boost::weak_ptr<PortGroup>);
        void toggle_show_only_bundles ();
-       void on_realize ();
-       void on_unrealize ();
+       bool on_scroll_event (GdkEventScroll *);
+       boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
+       void bundle_changed (ARDOUR::Bundle::Change);
+
+       Gtk::Window* _parent;
 
        /// port type that we are working with
        ARDOUR::DataType _type;