Optimize automation-event process splitting
[ardour.git] / gtk2_ardour / port_matrix.h
index 666a55da04e80a319f1bfacaf7cb19f9793c467a..09c334b5efe7222f3e5bb570f08e0e6e26e0b378 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
 #include <gtkmm/table.h>
 #include <gtkmm/label.h>
 #include <gtkmm/checkbutton.h>
+#include <gtkmm/notebook.h>
 #include <boost/shared_ptr.hpp>
+
 #include "ardour/bundle.h"
+#include "ardour/types.h"
+#include "ardour/session_handle.h"
+
 #include "port_group.h"
 #include "port_matrix_types.h"
 
@@ -44,12 +49,18 @@ namespace ARDOUR {
        class Bundle;
 }
 
+namespace Gtk {
+       namespace Menu_Helpers {
+               class MenuList;
+       }
+}
+
 class PortMatrixBody;
 
-class PortMatrix : public Gtk::Table
+class PortMatrix : public Gtk::Table, public ARDOUR::SessionHandlePtr
 {
 public:
-       PortMatrix (ARDOUR::Session&, ARDOUR::DataType);
+       PortMatrix (Gtk::Window*, ARDOUR::Session *, ARDOUR::DataType);
        ~PortMatrix ();
 
        void set_type (ARDOUR::DataType);
@@ -57,14 +68,10 @@ public:
        ARDOUR::DataType type () const {
                return _type;
        }
-       
+
        void disassociate_all ();
        void setup_scrollbars ();
-       void popup_menu (
-               std::pair<boost::shared_ptr<PortGroup>, ARDOUR::BundleChannel>,
-               std::pair<boost::shared_ptr<PortGroup>, ARDOUR::BundleChannel>,
-               uint32_t
-               );
+       void popup_menu (ARDOUR::BundleChannel, ARDOUR::BundleChannel, uint32_t);
 
        int min_height_divisor () const {
                return _min_height_divisor;
@@ -78,6 +85,7 @@ public:
                LEFT_TO_BOTTOM ///< row labels to the left, column labels on the bottom
        };
 
+
        /** @return Arrangement in use */
        Arrangement arrangement () const {
                return _arrangement;
@@ -88,6 +96,7 @@ public:
        }
 
        PortGroupList const * columns () const;
+       boost::shared_ptr<const PortGroup> visible_columns () const;
 
        /** @return index into the _ports array for the list which is displayed as columns */
        int column_index () const {
@@ -95,6 +104,7 @@ public:
        }
 
        PortGroupList const * rows () const;
+       boost::shared_ptr<const PortGroup> visible_rows () const;
 
        /** @return index into the _ports array for the list which is displayed as rows */
        int row_index () const {
@@ -104,13 +114,25 @@ public:
        PortGroupList const * ports (int d) const {
                return &_ports[d];
        }
-       
+
+       boost::shared_ptr<const PortGroup> visible_ports (int d) const;
+
+       void init ();
        void setup ();
        virtual void setup_ports (int) = 0;
        void setup_all_ports ();
 
        std::pair<uint32_t, uint32_t> max_size () const;
 
+       bool should_show (ARDOUR::DataType) const;
+       uint32_t count_of_our_type (ARDOUR::ChanCount) const;
+       uint32_t count_of_our_type_min_1 (ARDOUR::ChanCount) const;
+
+       PortMatrixNode::State get_association (PortMatrixNode) const;
+
+       void flip ();
+       bool key_press (GdkEventKey *);
+
        /** @param c Channels; where c[0] is from _ports[0] and c[1] is from _ports[1].
         *  @param s New state.
         */
@@ -122,12 +144,18 @@ 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_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
+       virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::DataType);
+       virtual bool can_remove_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
+       virtual void remove_channel (ARDOUR::BundleChannel);
+       virtual void remove_all_channels (boost::weak_ptr<ARDOUR::Bundle>);
+       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;
+
        enum Result {
                Cancelled,
                Accepted
@@ -135,6 +163,8 @@ public:
 
        sigc::signal<void, Result> Finished;
 
+       static bool bundle_with_channels (boost::shared_ptr<ARDOUR::Bundle>);
+
 protected:
 
        /** We have two port group lists.  One will be presented on the rows of the matrix,
@@ -144,8 +174,7 @@ protected:
            from left to right as you go from list 0 to list 1.  Hence subclasses which deal with
            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,23 +182,48 @@ private:
        void routes_changed ();
        void reconnect_to_routes ();
        void select_arrangement ();
+       void add_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, ARDOUR::DataType);
        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);
+       void disassociate_all_on_bundle (boost::weak_ptr<ARDOUR::Bundle>, int);
        void setup_global_ports ();
-       void hide_group (boost::weak_ptr<PortGroup>);
-       void show_group (boost::weak_ptr<PortGroup>);
+        void setup_global_ports_proxy ();
        void toggle_show_only_bundles ();
-       void on_realize ();
-       void on_unrealize ();
-
-       /// port type that we are working with
+       bool on_scroll_event (GdkEventScroll *);
+       boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
+       void setup_notebooks ();
+       void remove_notebook_pages (Gtk::Notebook &);
+       void notebook_page_selected (GtkNotebookPage *, guint);
+       void route_processors_changed (ARDOUR::RouteProcessorChange);
+       void body_dimensions_changed ();
+       void session_going_away ();
+       void add_remove_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr<ARDOUR::Bundle>, int);
+       void add_disassociate_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr<ARDOUR::Bundle>, int, int);
+       void port_connected_or_disconnected ();
+       void update_tab_highlighting ();
+       std::pair<int, int> check_flip () const;
+       bool can_flip () const;
+
+       Gtk::Window* _parent;
+
+       /** port type that we are working with, or NIL if we are working with all of them */
        ARDOUR::DataType _type;
-       std::vector<sigc::connection> _route_connections;
+       PBD::ScopedConnectionList _route_connections;
+       PBD::ScopedConnectionList _changed_connections;
+       PBD::ScopedConnectionList _bundle_changed_connections;
 
        PortMatrixBody* _body;
        Gtk::HScrollbar _hscroll;
        Gtk::VScrollbar _vscroll;
+       Gtk::Notebook _vnotebook;
+       Gtk::Notebook _hnotebook;
+       Gtk::Label _vlabel;
+       Gtk::Label _hlabel;
+       Gtk::VBox _vbox;
+       Gtk::HBox _hbox;
+       Gtk::Label _hspacer;
+       Gtk::Label _vspacer;
        Gtk::Menu* _menu;
        Arrangement _arrangement;
        int _row_index;
@@ -177,7 +231,7 @@ private:
        int _min_height_divisor;
        bool _show_only_bundles;
        bool _inhibit_toggle_show_only_bundles;
-       bool _realized;
+       bool _ignore_notebook_page_selected;
 };
 
 #endif