summaryrefslogtreecommitdiff
path: root/gtk2_ardour/port_matrix.h
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-01-30 15:08:09 +0000
committerCarl Hetherington <carl@carlh.net>2009-01-30 15:08:09 +0000
commita384dab13095f3d909e52eff9e6170ae55416601 (patch)
treec8af98d36927095909f54d3e8e8819af4c98b184 /gtk2_ardour/port_matrix.h
parent24aab941eb4d77e5bdf3933b11f8ce5659872b52 (diff)
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
Diffstat (limited to 'gtk2_ardour/port_matrix.h')
-rw-r--r--gtk2_ardour/port_matrix.h128
1 files changed, 75 insertions, 53 deletions
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 <list>
#include <gtkmm/box.h>
#include <gtkmm/scrollbar.h>
+#include <gtkmm/table.h>
+#include <gtkmm/label.h>
+#include <gtkmm/checkbutton.h>
#include <boost/shared_ptr.hpp>
#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<void, Result> 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<ARDOUR::Bundle> ab,
- uint32_t ac,
- boost::shared_ptr<ARDOUR::Bundle> 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<ARDOUR::Bundle> ab,
- uint32_t ac,
- boost::shared_ptr<ARDOUR::Bundle> bb,
- uint32_t bc
- ) const = 0;
+ virtual State get_state (ARDOUR::BundleChannel c[2]) const = 0;
virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>) = 0;
- virtual void remove_channel (boost::shared_ptr<ARDOUR::Bundle>, uint32_t) = 0;
- virtual bool can_rename_channels () const = 0;
- virtual void rename_channel (boost::shared_ptr<ARDOUR::Bundle>, 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<void, Result> 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<PortGroup>, Gtk::CheckButton *);
+ void select_arrangement ();
+ void remove_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
+ void rename_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, 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<sigc::connection> _route_connections;
PortMatrixBody _body;
Gtk::HScrollbar _hscroll;
Gtk::VScrollbar _vscroll;
- std::list<PortGroupUI*> _port_group_uis;
- std::vector<sigc::connection> _route_connections;
+ Gtk::HBox _main_hbox;
+ Gtk::HBox _column_visibility_box;
+ Gtk::Label _column_visibility_label;
+ std::vector<Gtk::CheckButton*> _column_visibility_buttons;
+ Gtk::VBox _row_visibility_box;
+ Gtk::Label _row_visibility_label;
+ std::vector<Gtk::CheckButton*> _row_visibility_buttons;
+ Gtk::Table _scroller_table;
+ Gtk::Menu* _menu;
+ bool _setup_once;
+ Arrangement _arrangement;
+ int _row_index;
+ int _column_index;
};
#endif