From a384dab13095f3d909e52eff9e6170ae55416601 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 30 Jan 2009 15:08:09 +0000 Subject: More port matrix re-working. Global matrix now has separate visibility buttons for ins and outs. The matrix will now be arranged so that more ports are labelled horizontally than vertically, to aid readability. git-svn-id: svn://localhost/ardour2/branches/3.0@4467 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/port_matrix.h | 128 +++++++++++++++++++++++++++------------------- 1 file changed, 75 insertions(+), 53 deletions(-) (limited to 'gtk2_ardour/port_matrix.h') diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h index 425e3915c4..b93a288c50 100644 --- a/gtk2_ardour/port_matrix.h +++ b/gtk2_ardour/port_matrix.h @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include #include "port_matrix_body.h" #include "port_group.h" @@ -31,12 +34,9 @@ * associations between one set of ports and another. e.g. to connect * things together. * - * The columns are labelled with various ports from around Ardour and the - * system. - * * It is made up of a body, PortMatrixBody, which is rendered using cairo, - * and some scrollbars. All of this is arranged inside the VBox that we - * inherit from. + * and some scrollbars and other stuff. All of this is arranged inside the + * VBox that we inherit from. */ namespace ARDOUR { @@ -46,94 +46,116 @@ namespace ARDOUR { class PortMatrix : public Gtk::VBox { public: - PortMatrix (ARDOUR::Session&, ARDOUR::DataType, bool); + PortMatrix (ARDOUR::Session&, ARDOUR::DataType); ~PortMatrix (); - virtual void setup (); - void set_offer_inputs (bool); void set_type (ARDOUR::DataType); ARDOUR::DataType type () const { return _type; } - bool offering_input () const { - return _offer_inputs; - } - void disassociate_all (); + void setup_scrollbars (); + void popup_channel_context_menu (int, uint32_t, uint32_t); - enum Result { - Cancelled, - Accepted + enum Arrangement { + TOP_TO_RIGHT, ///< column labels on top, row labels to the right + LEFT_TO_BOTTOM ///< row labels to the left, column labels on the bottom }; - sigc::signal Finished; + /** @return Arrangement in use */ + Arrangement arrangement () const { + return _arrangement; + } - /** @param ab Our bundle. - * @param ac Channel on our bundle. - * @param bb Other bundle. - * @arapm bc Channel on other bundle. + PortGroupList const * columns () const; + + /** @return index into the _ports array for the list which is displayed as columns */ + int column_index () const { + return _column_index; + } + + PortGroupList const * rows () const; + + /** @return index into the _ports array for the list which is displayed as rows */ + int row_index () const { + return _row_index; + } + + virtual void setup (); + + /** @param c Channels; where c[0] is from _ports[0] and c[1] is from _ports[1]. * @param s New state. - * @param k XXX */ - virtual void set_state ( - boost::shared_ptr ab, - uint32_t ac, - boost::shared_ptr bb, - uint32_t bc, - bool s, - uint32_t k - ) = 0; + virtual void set_state (ARDOUR::BundleChannel c[2], bool s) = 0; enum State { - ASSOCIATED, - NOT_ASSOCIATED, - UNKNOWN + ASSOCIATED, ///< the ports are associaed + NOT_ASSOCIATED, ///< the ports are not associated + UNKNOWN ///< we don't know anything about these two ports' relationship }; - /** @param ab Our bundle. - * @param ac Channel on our bundle. - * @param bb Other bundle. - * @arapm bc Channel on other bundle. + /** @param c Channels; where c[0] is from _ports[0] and c[1] is from _ports[1]. * @return state */ - virtual State get_state ( - boost::shared_ptr ab, - uint32_t ac, - boost::shared_ptr bb, - uint32_t bc - ) const = 0; + virtual State get_state (ARDOUR::BundleChannel c[2]) const = 0; virtual void add_channel (boost::shared_ptr) = 0; - virtual void remove_channel (boost::shared_ptr, uint32_t) = 0; - virtual bool can_rename_channels () const = 0; - virtual void rename_channel (boost::shared_ptr, uint32_t) {} + virtual bool can_remove_channels (int) const = 0; + virtual void remove_channel (ARDOUR::BundleChannel) = 0; + virtual bool can_rename_channels (int) const = 0; + virtual void rename_channel (ARDOUR::BundleChannel) {} - void setup_scrollbars (); + enum Result { + Cancelled, + Accepted + }; + + sigc::signal Finished; protected: - PortGroupList _row_ports; - PortGroupList _column_ports; + /** We have two port group lists. One will be presented on the rows of the matrix, + the other on the columns. The PortMatrix chooses the arrangement based on which has + more ports in it. Subclasses must fill these two lists with the port groups that they + wish to present. The PortMatrix will arrange its layout such that signal flow is vaguely + 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 (); void vscroll_changed (); void routes_changed (); + void reconnect_to_routes (); + void visibility_toggled (boost::weak_ptr, Gtk::CheckButton *); + void select_arrangement (); + void remove_channel_proxy (boost::weak_ptr, uint32_t); + void rename_channel_proxy (boost::weak_ptr, uint32_t); - ARDOUR::Session& _session; - /// true to offer inputs, otherwise false - bool _offer_inputs; /// port type that we are working with ARDOUR::DataType _type; + std::vector _route_connections; PortMatrixBody _body; Gtk::HScrollbar _hscroll; Gtk::VScrollbar _vscroll; - std::list _port_group_uis; - std::vector _route_connections; + Gtk::HBox _main_hbox; + Gtk::HBox _column_visibility_box; + Gtk::Label _column_visibility_label; + std::vector _column_visibility_buttons; + Gtk::VBox _row_visibility_box; + Gtk::Label _row_visibility_label; + std::vector _row_visibility_buttons; + Gtk::Table _scroller_table; + Gtk::Menu* _menu; + bool _setup_once; + Arrangement _arrangement; + int _row_index; + int _column_index; }; #endif -- cgit v1.2.3