From 73a0cd56f8bab790e0bbcf09b4f51e20175f4dc8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 18 Nov 2009 13:35:31 +0000 Subject: Rework port matrix to use Gtk notebook tabs to select visible groups. git-svn-id: svn://localhost/ardour2/branches/3.0@6117 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/bundle_manager.cc | 3 + gtk2_ardour/global_port_matrix.cc | 1 + gtk2_ardour/io_selector.cc | 3 +- gtk2_ardour/port_group.cc | 64 ++++++-- gtk2_ardour/port_group.h | 13 +- gtk2_ardour/port_matrix.cc | 259 +++++++++++++++++++------------ gtk2_ardour/port_matrix.h | 28 +++- gtk2_ardour/port_matrix_body.cc | 4 +- gtk2_ardour/port_matrix_column_labels.cc | 208 +++++-------------------- gtk2_ardour/port_matrix_column_labels.h | 8 +- gtk2_ardour/port_matrix_component.cc | 128 ++++++--------- gtk2_ardour/port_matrix_component.h | 4 +- gtk2_ardour/port_matrix_grid.cc | 116 ++++++-------- gtk2_ardour/port_matrix_labels.h | 2 +- gtk2_ardour/port_matrix_row_labels.cc | 167 +++++--------------- gtk2_ardour/port_matrix_row_labels.h | 3 - 16 files changed, 408 insertions(+), 603 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc index 0eb3d56698..7e3a3e59d9 100644 --- a/gtk2_ardour/bundle_manager.cc +++ b/gtk2_ardour/bundle_manager.cc @@ -42,6 +42,9 @@ BundleEditorMatrix::BundleEditorMatrix ( { _port_group = boost::shared_ptr (new PortGroup ("")); _port_group->add_bundle (_bundle); + + setup_all_ports (); + init (); } void diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc index c303e3ce72..8f6e923bd4 100644 --- a/gtk2_ardour/global_port_matrix.cc +++ b/gtk2_ardour/global_port_matrix.cc @@ -35,6 +35,7 @@ GlobalPortMatrix::GlobalPortMatrix (Gtk::Window* p, ARDOUR::Session& s, ARDOUR:: : PortMatrix (p, s, t) { setup_all_ports (); + init (); } void diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc index a689fc666e..273a03ac87 100644 --- a/gtk2_ardour/io_selector.cc +++ b/gtk2_ardour/io_selector.cc @@ -57,10 +57,11 @@ IOSelector::IOSelector (Gtk::Window* p, ARDOUR::Session& session, boost::shared_ _ours = 1; } - _port_group.reset (new PortGroup ("")); + _port_group.reset (new PortGroup (io->name())); _ports[_ours].add_group (_port_group); setup_all_ports (); + init (); } void diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc index 938e82af0b..ab2c2a7b35 100644 --- a/gtk2_ardour/port_group.cc +++ b/gtk2_ardour/port_group.cc @@ -45,7 +45,7 @@ using namespace ARDOUR; * @param n Name. */ PortGroup::PortGroup (std::string const & n) - : name (n), _visible (true) + : name (n) { } @@ -242,7 +242,9 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups) boost::shared_ptr bus (new PortGroup (_("Bus"))); boost::shared_ptr track (new PortGroup (_("Track"))); - boost::shared_ptr system (new PortGroup (_("System"))); + boost::shared_ptr system_mono (new PortGroup (_("System (mono)"))); + boost::shared_ptr system_stereo (new PortGroup (_("System (stereo)"))); + boost::shared_ptr system_other (new PortGroup (_("System (other)"))); boost::shared_ptr ardour (new PortGroup (_("Ardour"))); boost::shared_ptr other (new PortGroup (_("Other"))); @@ -304,13 +306,25 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups) for (BundleList::iterator i = b->begin(); i != b->end(); ++i) { if (boost::dynamic_pointer_cast (*i) && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) { - system->add_bundle (*i, allow_dups); + if ((*i)->nchannels() == 1) { + system_mono->add_bundle (*i, allow_dups); + } else if ((*i)->nchannels() == 2) { + system_stereo->add_bundle (*i, allow_dups); + } else { + system_other->add_bundle (*i, allow_dups); + } } } for (BundleList::iterator i = b->begin(); i != b->end(); ++i) { if (boost::dynamic_pointer_cast (*i) == 0 && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) { - system->add_bundle (*i, allow_dups); + if ((*i)->nchannels() == 1) { + system_mono->add_bundle (*i, allow_dups); + } else if ((*i)->nchannels() == 2) { + system_stereo->add_bundle (*i, allow_dups); + } else { + system_other->add_bundle (*i, allow_dups); + } } } @@ -340,7 +354,13 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups) std::string const p = ports[n]; - if (!system->has_port(p) && !bus->has_port(p) && !track->has_port(p) && !ardour->has_port(p) && !other->has_port(p)) { + if (!system_mono->has_port(p) && + !system_stereo->has_port(p) && + !system_other->has_port(p) && + !bus->has_port(p) && + !track->has_port(p) && + !ardour->has_port(p) && + !other->has_port(p)) { if (port_has_prefix (p, "system:") || port_has_prefix (p, "alsa_pcm") || @@ -358,18 +378,27 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups) } if (!extra_system.empty()) { - system->add_bundle (make_bundle_from_ports (extra_system, inputs)); + boost::shared_ptr b = make_bundle_from_ports (extra_system, inputs); + if (b->nchannels() == 1) { + system_mono->add_bundle (b); + } else if (b->nchannels() == 2) { + system_stereo->add_bundle (b); + } else { + system_other->add_bundle (b); + } } if (!extra_other.empty()) { other->add_bundle (make_bundle_from_ports (extra_other, inputs)); } - add_group (system); - add_group (bus); - add_group (track); - add_group (ardour); - add_group (other); + add_group_if_not_empty (system_mono); + add_group_if_not_empty (system_stereo); + add_group_if_not_empty (system_other); + add_group_if_not_empty (bus); + add_group_if_not_empty (track); + add_group_if_not_empty (ardour); + add_group_if_not_empty (other); emit_changed (); } @@ -471,19 +500,24 @@ PortGroupList::bundles () const } uint32_t -PortGroupList::total_visible_channels () const +PortGroupList::total_channels () const { uint32_t n = 0; for (PortGroupList::List::const_iterator i = begin(); i != end(); ++i) { - if ((*i)->visible()) { - n += (*i)->total_channels (); - } + n += (*i)->total_channels (); } return n; } +void +PortGroupList::add_group_if_not_empty (boost::shared_ptr g) +{ + if (!g->bundles().empty ()) { + add_group (g); + } +} void PortGroupList::add_group (boost::shared_ptr g) diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h index e367adec9b..77b1fc91df 100644 --- a/gtk2_ardour/port_group.h +++ b/gtk2_ardour/port_group.h @@ -60,15 +60,6 @@ public: std::string name; ///< name for the group - bool visible () const { - return _visible; - } - - void set_visible (bool v) { - _visible = v; - Changed (); - } - bool has_port (std::string const &) const; sigc::signal Changed; @@ -95,7 +86,6 @@ private: void add_bundle_internal (boost::shared_ptr, boost::shared_ptr, bool, Gdk::Color, bool); BundleList _bundles; - bool _visible; ///< true if the group is visible in the UI }; /// A list of PortGroups @@ -107,12 +97,13 @@ class PortGroupList : public sigc::trackable typedef std::vector > List; void add_group (boost::shared_ptr); + void add_group_if_not_empty (boost::shared_ptr); void set_type (ARDOUR::DataType); void gather (ARDOUR::Session &, bool, bool); PortGroup::BundleList const & bundles () const; void clear (); void remove_bundle (boost::shared_ptr); - uint32_t total_visible_channels () const; + uint32_t total_channels () const; uint32_t size () const { return _groups.size(); } diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index e930df6b99..ae6fcd1147 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -46,7 +46,7 @@ using namespace ARDOUR; * @param type Port type that we are handling. */ PortMatrix::PortMatrix (Window* parent, Session& session, DataType type) - : Table (2, 2), + : Table (4, 4), _session (session), _parent (parent), _type (type), @@ -56,13 +56,56 @@ PortMatrix::PortMatrix (Window* parent, Session& session, DataType type) _column_index (1), _min_height_divisor (1), _show_only_bundles (false), - _inhibit_toggle_show_only_bundles (false) + _inhibit_toggle_show_only_bundles (false), + _in_setup_notebooks (false) { _body = new PortMatrixBody (this); + attach (*_body, 2, 3, 2, 3); + attach (_vscroll, 3, 4, 2, 3, SHRINK); + attach (_hscroll, 2, 3, 3, 4, FILL | EXPAND, SHRINK); + attach (_vlabel, 0, 1, 2, 3, SHRINK); + attach (_hlabel, 2, 3, 0, 1, FILL | EXPAND, SHRINK); + attach (_vnotebook, 1, 2, 2, 3, SHRINK); + attach (_hnotebook, 2, 3, 1, 2, FILL | EXPAND, SHRINK); + + _vnotebook.signal_switch_page().connect (mem_fun (*this, &PortMatrix::v_page_selected)); + _hnotebook.signal_switch_page().connect (mem_fun (*this, &PortMatrix::h_page_selected)); + for (int i = 0; i < 2; ++i) { _ports[i].set_type (type); + } + + _vlabel.set_angle (90); + _hlabel.set_use_markup (); + _vlabel.set_use_markup (); + _hlabel.set_alignment (0, 0.5); + _vlabel.set_alignment (0.5, 0); + + show_all (); +} + +PortMatrix::~PortMatrix () +{ + delete _body; + delete _menu; +} + +void +PortMatrix::init () +{ + select_arrangement (); + setup_notebooks (); + + if (!_ports[0].empty()) { + _visible_ports[0] = *_ports[0].begin(); + } + + if (!_ports[1].empty()) { + _visible_ports[1] = *_ports[1].begin(); + } + for (int i = 0; i < 2; ++i) { /* watch for the content of _ports[] changing */ _ports[i].Changed.connect (mem_fun (*this, &PortMatrix::setup)); @@ -83,18 +126,8 @@ PortMatrix::PortMatrix (Window* parent, Session& session, DataType type) _session.engine().PortRegisteredOrUnregistered.connect (mem_fun (*this, &PortMatrix::setup_all_ports)); reconnect_to_routes (); - - attach (*_body, 0, 1, 0, 1); - attach (_vscroll, 1, 2, 0, 1, SHRINK); - attach (_hscroll, 0, 1, 1, 2, FILL | EXPAND, SHRINK); - - show_all (); -} - -PortMatrix::~PortMatrix () -{ - delete _body; - delete _menu; + + setup (); } /** Disconnect from and reconnect to routes' signals that we need to watch for things that affect the matrix */ @@ -126,12 +159,9 @@ PortMatrix::routes_changed () void PortMatrix::setup () { - if ((get_flags () & Gtk::REALIZED) == 0) { - select_arrangement (); - } - _body->setup (); setup_scrollbars (); + setup_notebooks (); queue_draw (); show_all (); @@ -211,8 +241,8 @@ void PortMatrix::select_arrangement () { uint32_t const N[2] = { - _ports[0].total_visible_channels (), - _ports[1].total_visible_channels () + _ports[0].total_channels (), + _ports[1].total_channels () }; /* The list with the most channels goes on left or right, so that the most channel @@ -226,12 +256,16 @@ PortMatrix::select_arrangement () _row_index = 0; _column_index = 1; _arrangement = LEFT_TO_BOTTOM; + _vlabel.set_label (_("Sources")); + _hlabel.set_label (_("Destinations")); } else { _row_index = 1; _column_index = 0; _arrangement = TOP_TO_RIGHT; + _hlabel.set_label (_("Sources")); + _vlabel.set_label (_("Destinations")); } } @@ -242,6 +276,12 @@ PortMatrix::columns () const return &_ports[_column_index]; } +boost::shared_ptr +PortMatrix::visible_columns () const +{ + return _visible_ports[_column_index]; +} + /* @return rows list */ PortGroupList const * PortMatrix::rows () const @@ -249,12 +289,14 @@ PortMatrix::rows () const return &_ports[_row_index]; } +boost::shared_ptr +PortMatrix::visible_rows () const +{ + return _visible_ports[_row_index]; +} + void -PortMatrix::popup_menu ( - pair, BundleChannel> column, - pair, BundleChannel> row, - uint32_t t - ) +PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t) { using namespace Menu_Helpers; @@ -265,13 +307,9 @@ PortMatrix::popup_menu ( MenuList& items = _menu->items (); - boost::shared_ptr pg[2]; - pg[_column_index] = column.first; - pg[_row_index] = row.first; - BundleChannel bc[2]; - bc[_column_index] = column.second; - bc[_row_index] = row.second; + bc[_column_index] = column; + bc[_row_index] = row; char buf [64]; bool need_separator = false; @@ -343,55 +381,6 @@ PortMatrix::popup_menu ( items.push_back (SeparatorElem ()); } - need_separator = false; - - for (int dim = 0; dim < 2; ++dim) { - - if (pg[dim]) { - - boost::weak_ptr wp (pg[dim]); - - if (pg[dim]->visible()) { - if (dim == 0) { - if (pg[dim]->name.empty()) { - snprintf (buf, sizeof (buf), _("Hide sources")); - } else { - snprintf (buf, sizeof (buf), _("Hide '%s' sources"), pg[dim]->name.c_str()); - } - } else { - if (pg[dim]->name.empty()) { - snprintf (buf, sizeof (buf), _("Hide destinations")); - } else { - snprintf (buf, sizeof (buf), _("Hide '%s' destinations"), pg[dim]->name.c_str()); - } - } - - items.push_back (MenuElem (buf, bind (mem_fun (*this, &PortMatrix::hide_group), wp))); - } else { - if (dim == 0) { - if (pg[dim]->name.empty()) { - snprintf (buf, sizeof (buf), _("Show sources")); - } else { - snprintf (buf, sizeof (buf), _("Show '%s' sources"), pg[dim]->name.c_str()); - } - } else { - if (pg[dim]->name.empty()) { - snprintf (buf, sizeof (buf), _("Show destinations")); - } else { - snprintf (buf, sizeof (buf), _("Show '%s' destinations"), pg[dim]->name.c_str()); - } - } - items.push_back (MenuElem (buf, bind (mem_fun (*this, &PortMatrix::show_group), wp))); - } - - need_separator = true; - } - } - - if (need_separator) { - items.push_back (SeparatorElem ()); - } - items.push_back (MenuElem (_("Rescan"), mem_fun (*this, &PortMatrix::setup_all_ports))); items.push_back (CheckMenuElem (_("Show individual ports"), mem_fun (*this, &PortMatrix::toggle_show_only_bundles))); CheckMenuItem* i = dynamic_cast (&items.back()); @@ -483,28 +472,6 @@ PortMatrix::toggle_show_only_bundles () queue_draw (); } -void -PortMatrix::hide_group (boost::weak_ptr w) -{ - boost::shared_ptr g = w.lock (); - if (!g) { - return; - } - - g->set_visible (false); -} - -void -PortMatrix::show_group (boost::weak_ptr w) -{ - boost::shared_ptr g = w.lock (); - if (!g) { - return; - } - - g->set_visible (true); -} - pair PortMatrix::max_size () const { @@ -606,3 +573,91 @@ PortMatrix::bundle_changed (ARDOUR::Bundle::Change c) setup (); } + +void +PortMatrix::setup_notebooks () +{ + _in_setup_notebooks = true; + + remove_notebook_pages (_hnotebook); + remove_notebook_pages (_vnotebook); + + for (PortGroupList::List::const_iterator i = _ports[_row_index].begin(); i != _ports[_row_index].end(); ++i) { + HBox* dummy = manage (new HBox); + dummy->show (); + Label* label = manage (new Label ((*i)->name)); + label->set_angle (90); + _vnotebook.prepend_page (*dummy, *label); + } + + for (PortGroupList::List::const_iterator i = _ports[_column_index].begin(); i != _ports[_column_index].end(); ++i) { + HBox* dummy = manage (new HBox); + dummy->show (); + _hnotebook.append_page (*dummy, (*i)->name); + } + + _vnotebook.set_tab_pos (POS_LEFT); + _hnotebook.set_tab_pos (POS_TOP); + + _in_setup_notebooks = false; +} + +void +PortMatrix::remove_notebook_pages (Notebook& n) +{ + int const N = n.get_n_pages (); + + for (int i = 0; i < N; ++i) { + n.remove_page (); + } +} + +void +PortMatrix::v_page_selected (GtkNotebookPage *, guint n) +{ + if (_in_setup_notebooks) { + return; + } + + PortGroupList& p = _ports[_row_index]; + + n = p.size() - n - 1; + + int i = 0; + PortGroupList::List::const_iterator j = p.begin(); + while (i != int (n) && j != p.end()) { + ++i; + ++j; + } + + if (j != p.end()) { + _visible_ports[_row_index] = *j; + _body->setup (); + setup_scrollbars (); + queue_draw (); + } +} + +void +PortMatrix::h_page_selected (GtkNotebookPage *, guint n) +{ + if (_in_setup_notebooks) { + return; + } + + PortGroupList& p = _ports[_column_index]; + + int i = 0; + PortGroupList::List::const_iterator j = p.begin(); + while (i != int (n) && j != p.end()) { + ++i; + ++j; + } + + if (j != p.end()) { + _visible_ports[_column_index] = *j; + _body->setup (); + setup_scrollbars (); + queue_draw (); + } +} diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h index 0dc88f02f2..93afd0310e 100644 --- a/gtk2_ardour/port_matrix.h +++ b/gtk2_ardour/port_matrix.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include "ardour/bundle.h" #include "port_group.h" @@ -61,11 +62,7 @@ public: void disassociate_all (); void setup_scrollbars (); - void popup_menu ( - std::pair, ARDOUR::BundleChannel>, - std::pair, ARDOUR::BundleChannel>, - uint32_t - ); + void popup_menu (ARDOUR::BundleChannel, ARDOUR::BundleChannel, uint32_t); int min_height_divisor () const { return _min_height_divisor; @@ -79,6 +76,7 @@ public: LEFT_TO_BOTTOM ///< row labels to the left, column labels on the bottom }; + /** @return Arrangement in use */ Arrangement arrangement () const { return _arrangement; @@ -89,6 +87,7 @@ public: } PortGroupList const * columns () const; + boost::shared_ptr visible_columns () const; /** @return index into the _ports array for the list which is displayed as columns */ int column_index () const { @@ -96,6 +95,7 @@ public: } PortGroupList const * rows () const; + boost::shared_ptr visible_rows () const; /** @return index into the _ports array for the list which is displayed as rows */ int row_index () const { @@ -106,6 +106,11 @@ public: return &_ports[d]; } + boost::shared_ptr visible_ports (int d) const { + return _visible_ports[d]; + } + + void init (); void setup (); virtual void setup_ports (int) = 0; void setup_all_ports (); @@ -150,6 +155,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]; + boost::shared_ptr _visible_ports[2]; ARDOUR::Session& _session; private: @@ -164,12 +170,14 @@ private: void rename_channel_proxy (boost::weak_ptr, uint32_t); void disassociate_all_on_channel (boost::weak_ptr, uint32_t, int); void setup_global_ports (); - void hide_group (boost::weak_ptr); - void show_group (boost::weak_ptr); void toggle_show_only_bundles (); bool on_scroll_event (GdkEventScroll *); boost::shared_ptr io_from_bundle (boost::shared_ptr) const; void bundle_changed (ARDOUR::Bundle::Change); + void setup_notebooks (); + void remove_notebook_pages (Gtk::Notebook &); + void v_page_selected (GtkNotebookPage *, guint); + void h_page_selected (GtkNotebookPage *, guint); Gtk::Window* _parent; @@ -180,6 +188,10 @@ private: PortMatrixBody* _body; Gtk::HScrollbar _hscroll; Gtk::VScrollbar _vscroll; + Gtk::Notebook _vnotebook; + Gtk::Notebook _hnotebook; + Gtk::Label _vlabel; + Gtk::Label _hlabel; Gtk::Menu* _menu; Arrangement _arrangement; int _row_index; @@ -187,7 +199,7 @@ private: int _min_height_divisor; bool _show_only_bundles; bool _inhibit_toggle_show_only_bundles; - bool _realized; + bool _in_setup_notebooks; }; #endif diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc index 31f6d2be42..3d961baa5c 100644 --- a/gtk2_ardour/port_matrix_body.cc +++ b/gtk2_ardour/port_matrix_body.cc @@ -58,7 +58,7 @@ PortMatrixBody::~PortMatrixBody () bool PortMatrixBody::on_expose_event (GdkEventExpose* event) { - if (_matrix->columns()->empty() || _matrix->rows()->empty()) { + if (_matrix->visible_columns()->bundles().empty() || _matrix->visible_rows()->bundles().empty()) { /* nothing to connect */ @@ -446,7 +446,7 @@ PortMatrixBody::highlight_associated_channels (int dim, ARDOUR::BundleChannel h) _row_labels->add_channel_highlight (bc[dim]); } - PortGroup::BundleList const b = _matrix->ports(1 - dim)->bundles (); + PortGroup::BundleList const b = _matrix->visible_ports(1 - dim)->bundles (); for (PortGroup::BundleList::const_iterator i = b.begin(); i != b.end(); ++i) { for (uint32_t j = 0; j < i->bundle->nchannels(); ++j) { diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc index cfe6453fc7..e09f1c1a63 100644 --- a/gtk2_ardour/port_matrix_column_labels.cc +++ b/gtk2_ardour/port_matrix_column_labels.cc @@ -49,7 +49,10 @@ PortMatrixColumnLabels::compute_dimensions () _highest_text = 0; /* width of the whole thing */ _width = 0; - _highest_group_name = 0; + + /* Compute dimensions using all port groups, so that we allow for the largest and hence + we can change between visible groups without the size of the labels jumping around. + */ for (PortGroupList::List::const_iterator i = _matrix->columns()->begin(); i != _matrix->columns()->end(); ++i) { PortGroup::BundleList const c = _matrix->columns()->bundles(); @@ -84,12 +87,6 @@ PortMatrixColumnLabels::compute_dimensions () } _width += group_size (*i) * grid_spacing (); - - cairo_text_extents_t ext; - cairo_text_extents (cr, (*i)->name.c_str(), &ext); - if (ext.height > _highest_group_name) { - _highest_group_name = ext.height; - } } cairo_destroy (cr); @@ -102,11 +99,8 @@ PortMatrixColumnLabels::compute_dimensions () a += _longest_channel_name; } - double const parallelogram_height = a * sin (angle()) + _highest_text * cos (angle()); - - _height = parallelogram_height + _highest_group_name + 2 * name_pad(); - - _overhang = parallelogram_height / tan (angle ()); + _height = a * sin (angle()) + _highest_text * cos (angle()); + _overhang = _height / tan (angle ()); _width += _overhang; } @@ -131,59 +125,36 @@ PortMatrixColumnLabels::render (cairo_t* cr) double x = 0; int N = 0; - for (PortGroupList::List::const_iterator i = _matrix->columns()->begin(); i != _matrix->columns()->end(); ++i) { - - if ((*i)->visible ()) { - - PortGroup::BundleList const & bundles = (*i)->bundles (); - for (PortGroup::BundleList::const_iterator j = bundles.begin (); j != bundles.end(); ++j) { - - Gdk::Color c = j->has_colour ? j->colour : get_a_bundle_colour (N); - render_bundle_name (cr, background_colour (), c, x, 0, j->bundle); + PortGroup::BundleList const & bundles = _matrix->visible_columns()->bundles (); + for (PortGroup::BundleList::const_iterator i = bundles.begin (); i != bundles.end(); ++i) { - if (_matrix->show_only_bundles()) { - x += grid_spacing(); - } else { - x += j->bundle->nchannels () * grid_spacing(); - } - - ++N; - } + Gdk::Color c = i->has_colour ? i->colour : get_a_bundle_colour (N); + render_bundle_name (cr, background_colour (), c, x, 0, i->bundle); + if (_matrix->show_only_bundles()) { + x += grid_spacing(); } else { - - x += grid_spacing (); - + x += i->bundle->nchannels () * grid_spacing(); } + + ++N; } - /* PORT NAMES */ if (!_matrix->show_only_bundles()) { x = 0; N = 0; - for (PortGroupList::List::const_iterator i = _matrix->columns()->begin(); i != _matrix->columns()->end(); ++i) { - - if ((*i)->visible ()) { - PortGroup::BundleList const & bundles = (*i)->bundles (); - for (PortGroup::BundleList::const_iterator j = bundles.begin (); j != bundles.end(); ++j) { - - for (uint32_t k = 0; k < j->bundle->nchannels(); ++k) { - Gdk::Color c = j->has_colour ? j->colour : get_a_bundle_colour (N); - render_channel_name (cr, background_colour (), c, x, 0, ARDOUR::BundleChannel (j->bundle, k)); - x += grid_spacing(); - } - - ++N; - } - - } else { - - x += grid_spacing (); + for (PortGroup::BundleList::const_iterator i = bundles.begin (); i != bundles.end(); ++i) { + for (uint32_t j = 0; j < i->bundle->nchannels(); ++j) { + Gdk::Color c = i->has_colour ? i->colour : get_a_bundle_colour (N); + render_channel_name (cr, background_colour (), c, x, 0, ARDOUR::BundleChannel (i->bundle, j)); + x += grid_spacing(); } + + ++N; } } } @@ -241,7 +212,7 @@ PortMatrixColumnLabels::port_name_shape (double xoff, double yoff) const if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - double x_ = xoff + slanted_height() / tan (angle()) + w; + double x_ = xoff + _height / tan (angle()) + w; double y_ = yoff; shape.push_back (make_pair (x_, y_)); x_ -= w; @@ -288,18 +259,14 @@ PortMatrixColumnLabels::render_bundle_name ( double x_ = xoff; uint32_t y = yoff; - if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) { - y += _height; - } else { - y += slanted_height(); - } + y += _height; double y_ = y; cairo_move_to (cr, x_, y_); x_ += w; cairo_line_to (cr, x_, y_); - x_ += slanted_height() / tan (angle ()); - y_ -= slanted_height(); + x_ += _height / tan (angle ()); + y_ -= _height; cairo_line_to (cr, x_, y_); x_ -= w; cairo_line_to (cr, x_, y_); @@ -330,7 +297,7 @@ PortMatrixColumnLabels::render_bundle_name ( cairo_move_to ( cr, xoff + basic_text_x_pos (0) + name_pad() * cos (angle ()), - yoff + slanted_height() - name_pad() * sin (angle()) + yoff + _height - name_pad() * sin (angle()) ); } @@ -375,7 +342,7 @@ PortMatrixColumnLabels::render_channel_name ( cairo_move_to ( cr, xoff + basic_text_x_pos(bc.channel) + rl * cos (angle ()), - yoff + slanted_height() - rl * sin (angle()) + yoff + _height - rl * sin (angle()) ); } @@ -399,7 +366,7 @@ PortMatrixColumnLabels::render_channel_name ( double PortMatrixColumnLabels::channel_x (ARDOUR::BundleChannel const &bc) const { - return channel_to_position (bc, _matrix->columns()) * grid_spacing (); + return channel_to_position (bc, _matrix->visible_columns()) * grid_spacing (); } double @@ -441,7 +408,7 @@ PortMatrixColumnLabels::queue_draw_for (ARDOUR::BundleChannel const & bc) } else if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - double const x_ = x + slanted_height() / tan (angle()) - lc * cos (angle()); + double const x_ = x + _height / tan (angle()) - lc * cos (angle()); _body->queue_draw_area ( component_to_parent_x (x_) - 1, @@ -455,129 +422,38 @@ PortMatrixColumnLabels::queue_draw_for (ARDOUR::BundleChannel const & bc) } } -pair, ARDOUR::BundleChannel> -PortMatrixColumnLabels::position_to_group_and_channel (double p, double o, PortGroupList const * groups) const +ARDOUR::BundleChannel +PortMatrixColumnLabels::position_to_channel (double p, double o, boost::shared_ptr group) const { - uint32_t cx = 0; - uint32_t const gh = _highest_group_name + 2 * name_pad(); - - bool group_name = false; - if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - if (o > (_height - gh)) { - group_name = true; - cx = p; - } else { - cx = p - (_height - gh - o) * tan (angle ()); - } - } else { - if (o < gh) { - group_name = true; - cx = p - _overhang; - } else { - cx = p - (_height - o) * tan (angle ()); - } - } - - pair, ARDOUR::BundleChannel> w = PortMatrixComponent::position_to_group_and_channel (cx, o, groups); - - if (group_name) { - w.second.bundle.reset (); - } - - return w; + uint32_t const cx = p - (_height - o) * tan (angle ()); + return PortMatrixComponent::position_to_channel (cx, o, group); } void PortMatrixColumnLabels::button_press (double x, double y, int b, uint32_t t) { - pair, ARDOUR::BundleChannel> gc = position_to_group_and_channel (x, y, _matrix->columns()); + ARDOUR::BundleChannel const gc = position_to_channel (x, y, _matrix->visible_columns()); if (b == 3) { _matrix->popup_menu ( gc, - make_pair (boost::shared_ptr (), ARDOUR::BundleChannel ()), + ARDOUR::BundleChannel (), t ); } } -void -PortMatrixColumnLabels::draw_extra (cairo_t* cr) -{ - PortMatrixLabels::draw_extra (cr); - - /* PORT GROUP NAME */ - - double x = 0; - double y = 0; - - if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) { - x = component_to_parent_x (slanted_height() / tan (angle())); - y = component_to_parent_y ( _highest_group_name + name_pad()); - } else { - x = component_to_parent_x (0); - y = component_to_parent_y (_height - name_pad()); - } - - int g = 0; - for (PortGroupList::List::const_iterator i = _matrix->columns()->begin(); i != _matrix->columns()->end(); ++i) { - - /* compute width of this group */ - uint32_t w = 0; - if (!(*i)->visible()) { - w = grid_spacing (); - } else { - if (_matrix->show_only_bundles()) { - w = (*i)->bundles().size() * grid_spacing(); - } else { - w = (*i)->total_channels() * grid_spacing(); - } - } - - if (w == 0) { - continue; - } - - /* rectangle */ - set_source_rgb (cr, get_a_group_colour (g)); - double const rh = _highest_group_name + 2 * name_pad(); - if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) { - cairo_rectangle (cr, x, component_to_parent_y (0), w, rh); - } else { - cairo_rectangle (cr, x, component_to_parent_y (_height - rh), w, rh); - } - cairo_fill (cr); - - /* x area available to draw the label in (trying to keep it visible) */ - double const lx = max (x, double (_parent_rectangle.get_x ())); - double const rx = min (x + w, double (_parent_rectangle.get_width())); - - /* hence what abbreviation (or not) we need for the group name */ - string const upper = Glib::ustring ((*i)->name).uppercase (); - pair const display = fit_to_pixels (cr, upper, rx - lx); - - /* plot it */ - set_source_rgb (cr, text_colour()); - cairo_move_to (cr, (lx + rx - display.second) / 2, y); - cairo_show_text (cr, display.first.c_str()); - - x += w; - ++g; - - } -} - void PortMatrixColumnLabels::motion (double x, double y) { - pair, ARDOUR::BundleChannel> const w = position_to_group_and_channel (x, y, _matrix->columns()); + ARDOUR::BundleChannel const w = position_to_channel (x, y, _matrix->visible_columns()); - if (w.second.bundle == 0) { + if (w.bundle == 0) { _body->set_mouseover (PortMatrixNode ()); return; } - uint32_t const bh = _highest_group_name + _longest_channel_name * sin (angle ()) + _highest_text / cos (angle ()); + uint32_t const bh = _longest_channel_name * sin (angle ()) + _highest_text / cos (angle ()); if ( (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && y > bh) || @@ -588,8 +464,8 @@ PortMatrixColumnLabels::motion (double x, double y) list n; - for (uint32_t i = 0; i < w.second.bundle->nchannels(); ++i) { - ARDOUR::BundleChannel const bc (w.second.bundle, i); + for (uint32_t i = 0; i < w.bundle->nchannels(); ++i) { + ARDOUR::BundleChannel const bc (w.bundle, i); n.push_back (PortMatrixNode (ARDOUR::BundleChannel (), bc)); } @@ -597,6 +473,6 @@ PortMatrixColumnLabels::motion (double x, double y) } else { - _body->set_mouseover (PortMatrixNode (ARDOUR::BundleChannel (), w.second)); + _body->set_mouseover (PortMatrixNode (ARDOUR::BundleChannel (), w)); } } diff --git a/gtk2_ardour/port_matrix_column_labels.h b/gtk2_ardour/port_matrix_column_labels.h index e3c360cef0..cecd2e79b2 100644 --- a/gtk2_ardour/port_matrix_column_labels.h +++ b/gtk2_ardour/port_matrix_column_labels.h @@ -43,7 +43,6 @@ public: double component_to_parent_y (double y) const; double parent_to_component_y (double y) const; void mouseover_changed (std::list const &); - void draw_extra (cairo_t *); void motion (double, double); uint32_t overhang () const { @@ -56,21 +55,16 @@ private: double channel_x (ARDOUR::BundleChannel const &) const; double channel_y (ARDOUR::BundleChannel const &) const; void queue_draw_for (ARDOUR::BundleChannel const &); - std::pair, ARDOUR::BundleChannel> position_to_group_and_channel (double, double, PortGroupList const *) const; + ARDOUR::BundleChannel position_to_channel (double, double, boost::shared_ptr) const; void render (cairo_t *); void compute_dimensions (); double basic_text_x_pos (int) const; std::vector > port_name_shape (double, double) const; - double slanted_height () const { - return _height - _highest_group_name - 2 * name_pad(); - } - double _longest_bundle_name; double _longest_channel_name; double _highest_text; - double _highest_group_name; uint32_t _overhang; }; diff --git a/gtk2_ardour/port_matrix_component.cc b/gtk2_ardour/port_matrix_component.cc index c617070907..8feb7a5309 100644 --- a/gtk2_ardour/port_matrix_component.cc +++ b/gtk2_ardour/port_matrix_component.cc @@ -126,17 +126,13 @@ PortMatrixComponent::group_size (boost::shared_ptr g) const { uint32_t s = 0; - if (g->visible()) { - PortGroup::BundleList const & bundles = g->bundles (); - if (_matrix->show_only_bundles()) { - s = bundles.size(); - } else { - for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) { - s += i->bundle->nchannels(); - } - } + PortGroup::BundleList const & bundles = g->bundles (); + if (_matrix->show_only_bundles()) { + s = bundles.size(); } else { - s = 1; + for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) { + s += i->bundle->nchannels(); + } } return s; @@ -144,46 +140,35 @@ PortMatrixComponent::group_size (boost::shared_ptr g) const /** @param bc Channel. * @param groups List of groups. - * @return Position of bc in groups in grid units, taking visibility and show_only_bundles into account. + * @return Position of bc in groups in grid units, taking show_only_bundles into account. */ uint32_t -PortMatrixComponent::channel_to_position (ARDOUR::BundleChannel bc, PortGroupList const * groups) const +PortMatrixComponent::channel_to_position (ARDOUR::BundleChannel bc, boost::shared_ptr group) const { uint32_t p = 0; - for (PortGroupList::List::const_iterator i = groups->begin(); i != groups->end(); ++i) { + PortGroup::BundleList const & bundles = group->bundles (); - PortGroup::BundleList const & bundles = (*i)->bundles (); + for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) { - for (PortGroup::BundleList::const_iterator j = bundles.begin(); j != bundles.end(); ++j) { - - if (j->bundle == bc.bundle) { - - /* found the bundle */ - - if (_matrix->show_only_bundles() || !(*i)->visible()) { - return p; - } else { - return p + bc.channel; - } + if (i->bundle == bc.bundle) { + /* found the bundle */ + + if (_matrix->show_only_bundles()) { + return p; + } else { + return p + bc.channel; } - - if ((*i)->visible()) { - - /* move past this bundle */ - - if (_matrix->show_only_bundles()) { - p += 1; - } else { - p += j->bundle->nchannels (); - } - } + } - if (!(*i)->visible()) { - /* if this group isn't visible we won't have updated p, so do it now */ + /* move past this bundle */ + + if (_matrix->show_only_bundles()) { p += 1; + } else { + p += i->bundle->nchannels (); } } @@ -191,57 +176,34 @@ PortMatrixComponent::channel_to_position (ARDOUR::BundleChannel bc, PortGroupLis } -pair, ARDOUR::BundleChannel> -PortMatrixComponent::position_to_group_and_channel (double p, double, PortGroupList const * groups) const +ARDOUR::BundleChannel +PortMatrixComponent::position_to_channel (double p, double, boost::shared_ptr group) const { p /= grid_spacing (); - PortGroupList::List::const_iterator i = groups->begin (); - - while (i != groups->end()) { - - uint32_t const gs = group_size (*i); - - if (p < gs) { - - /* it's in this group */ - - if (!(*i)->visible()) { - return make_pair (*i, ARDOUR::BundleChannel (boost::shared_ptr (), 0)); - } - - PortGroup::BundleList const & bundles = (*i)->bundles (); - for (PortGroup::BundleList::const_iterator j = bundles.begin(); j != bundles.end(); ++j) { - - if (_matrix->show_only_bundles()) { - - if (p == 0) { - return make_pair (*i, ARDOUR::BundleChannel (j->bundle, 0)); - } else { - p -= 1; - } - - } else { - - uint32_t const s = j->bundle->nchannels (); - if (p < s) { - return make_pair (*i, ARDOUR::BundleChannel (j->bundle, p)); - } else { - p -= s; - } - - } + PortGroup::BundleList const & bundles = group->bundles (); + for (PortGroup::BundleList::const_iterator j = bundles.begin(); j != bundles.end(); ++j) { + if (_matrix->show_only_bundles()) { + + if (p == 0) { + return ARDOUR::BundleChannel (j->bundle, 0); + } else { + p -= 1; } - + } else { - - p -= gs; - + + uint32_t const s = j->bundle->nchannels (); + if (p < s) { + return ARDOUR::BundleChannel (j->bundle, p); + } else { + p -= s; + } + } - - ++i; + } - - return make_pair (boost::shared_ptr (), ARDOUR::BundleChannel (boost::shared_ptr (), 0)); + + return ARDOUR::BundleChannel (boost::shared_ptr (), 0); } diff --git a/gtk2_ardour/port_matrix_component.h b/gtk2_ardour/port_matrix_component.h index 6a867f16e9..cbef95344b 100644 --- a/gtk2_ardour/port_matrix_component.h +++ b/gtk2_ardour/port_matrix_component.h @@ -171,8 +171,8 @@ protected: void set_source_rgb (cairo_t *, Gdk::Color const &); void set_source_rgba (cairo_t *, Gdk::Color const &, double); uint32_t group_size (boost::shared_ptr) const; - uint32_t channel_to_position (ARDOUR::BundleChannel, PortGroupList const *) const; - virtual std::pair, ARDOUR::BundleChannel> position_to_group_and_channel (double, double, PortGroupList const *) const; + uint32_t channel_to_position (ARDOUR::BundleChannel, boost::shared_ptr) const; + virtual ARDOUR::BundleChannel position_to_channel (double, double, boost::shared_ptr) const; /** Render the complete component to a cairo context. */ virtual void render (cairo_t *) = 0; diff --git a/gtk2_ardour/port_matrix_grid.cc b/gtk2_ardour/port_matrix_grid.cc index 3b0a98e2f3..53b4b50b50 100644 --- a/gtk2_ardour/port_matrix_grid.cc +++ b/gtk2_ardour/port_matrix_grid.cc @@ -39,15 +39,16 @@ PortMatrixGrid::PortMatrixGrid (PortMatrix* m, PortMatrixBody* b) void PortMatrixGrid::compute_dimensions () { - _width = 0; - - for (PortGroupList::List::const_iterator i = _matrix->columns()->begin(); i != _matrix->columns()->end(); ++i) { - _width += group_size (*i) * grid_spacing (); + if (_matrix->visible_columns() == 0) { + _width = 0; + } else { + _width = group_size (_matrix->visible_columns()) * grid_spacing (); } - _height = 0; - for (PortGroupList::List::const_iterator i = _matrix->rows()->begin(); i != _matrix->rows()->end(); ++i) { - _height += group_size (*i) * grid_spacing (); + if (_matrix->visible_rows() == 0) { + _height = 0; + } else { + _height = group_size (_matrix->visible_rows()) * grid_spacing (); } } @@ -59,33 +60,10 @@ PortMatrixGrid::render (cairo_t* cr) cairo_rectangle (cr, 0, 0, _width, _height); cairo_fill (cr); - uint32_t x = 0; - for (PortGroupList::List::const_iterator c = _matrix->columns()->begin(); c != _matrix->columns()->end(); ++c) { - - uint32_t y = 0; - for (PortGroupList::List::const_iterator r = _matrix->rows()->begin(); r != _matrix->rows()->end(); ++r) { - - if ((*c)->visible() && (*r)->visible()) { - render_group_pair (cr, *r, *c, x, y); - } - - y += group_size (*r) * grid_spacing (); - } - - x += group_size (*c) * grid_spacing (); - } -} + PortGroup::BundleList const & row_bundles = _matrix->visible_rows()->bundles(); + PortGroup::BundleList const & column_bundles = _matrix->visible_columns()->bundles(); -void -PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptr row, boost::shared_ptr column, uint32_t const x, uint32_t const y) -{ - PortGroup::BundleList const & row_bundles = row->bundles(); - PortGroup::BundleList const & column_bundles = column->bundles(); - - /* unfortunately we need to compute the height of the row group here */ - uint32_t height = group_size (row) * grid_spacing (); - - uint32_t tx = x; + uint32_t x = 0; /* VERTICAL GRID LINES */ @@ -95,31 +73,29 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptrshow_only_bundles()) { cairo_set_line_width (cr, thin_grid_line_width()); for (uint32_t j = 0; j < i->bundle->nchannels(); ++j) { - tx += grid_spacing (); - cairo_move_to (cr, tx, y); - cairo_line_to (cr, tx, y + height); + x += grid_spacing (); + cairo_move_to (cr, x, 0); + cairo_line_to (cr, x, _height); cairo_stroke (cr); } } else { - tx += grid_spacing (); + x += grid_spacing (); } ++N; } - uint32_t const width = tx - x; - - uint32_t ty = y; + uint32_t y = 0; /* HORIZONTAL GRID LINES */ @@ -127,22 +103,22 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptrshow_only_bundles()) { cairo_set_line_width (cr, thin_grid_line_width()); for (uint32_t j = 0; j < i->bundle->nchannels(); ++j) { - ty += grid_spacing (); - cairo_move_to (cr, x, ty); - cairo_line_to (cr, x + width, ty); + y += grid_spacing (); + cairo_move_to (cr, 0, y); + cairo_line_to (cr, _width, y); cairo_stroke (cr); } } else { - ty += grid_spacing (); + y += grid_spacing (); } @@ -151,13 +127,13 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptrshow_only_bundles()) { for (PortGroup::BundleList::const_iterator i = column_bundles.begin(); i != column_bundles.end(); ++i) { - by = y; + by = 0; for (PortGroup::BundleList::const_iterator j = row_bundles.begin(); j != row_bundles.end(); ++j) { @@ -186,14 +162,14 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptrbundle->nchannels (); ++k) { - ty = by; + y = by; for (uint32_t l = 0; l < j->bundle->nchannels (); ++l) { ARDOUR::BundleChannel c[2]; @@ -204,7 +180,7 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptrbundle->nchannels () * grid_spacing(); @@ -263,21 +239,21 @@ PortMatrixNode PortMatrixGrid::position_to_node (double x, double y) const { return PortMatrixNode ( - position_to_group_and_channel (y, x, _matrix->rows()).second, - position_to_group_and_channel (x, y, _matrix->columns()).second + position_to_channel (y, x, _matrix->visible_rows()), + position_to_channel (x, y, _matrix->visible_columns()) ); } void PortMatrixGrid::button_press (double x, double y, int b, uint32_t t) { - pair, ARDOUR::BundleChannel> px = position_to_group_and_channel (x, y, _matrix->columns()); - pair, ARDOUR::BundleChannel> py = position_to_group_and_channel (y, x, _matrix->rows()); + ARDOUR::BundleChannel const px = position_to_channel (x, y, _matrix->visible_columns()); + ARDOUR::BundleChannel const py = position_to_channel (y, x, _matrix->visible_rows()); if (b == 1) { _dragging = true; - _drag_valid = (px.second.bundle && py.second.bundle); + _drag_valid = (px.bundle && py.bundle); _moved = false; _drag_start_x = x / grid_spacing (); @@ -423,8 +399,8 @@ PortMatrixGrid::draw_extra (cairo_t* cr) for (list::const_iterator i = m.begin(); i != m.end(); ++i) { - double const x = component_to_parent_x (channel_to_position (i->column, _matrix->columns()) * grid_spacing()) + grid_spacing() / 2; - double const y = component_to_parent_y (channel_to_position (i->row, _matrix->rows()) * grid_spacing()) + grid_spacing() / 2; + double const x = component_to_parent_x (channel_to_position (i->column, _matrix->visible_columns()) * grid_spacing()) + grid_spacing() / 2; + double const y = component_to_parent_y (channel_to_position (i->row, _matrix->visible_rows()) * grid_spacing()) + grid_spacing() / 2; if (i->row.bundle && i->column.bundle) { @@ -458,14 +434,14 @@ PortMatrixGrid::draw_extra (cairo_t* cr) if (s) { draw_association_indicator ( cr, - component_to_parent_x (channel_to_position (i->column, _matrix->columns()) * grid_spacing ()), - component_to_parent_y (channel_to_position (i->row, _matrix->rows()) * grid_spacing ()) + component_to_parent_x (channel_to_position (i->column, _matrix->visible_columns()) * grid_spacing ()), + component_to_parent_y (channel_to_position (i->row, _matrix->visible_rows()) * grid_spacing ()) ); } else { draw_empty_square ( cr, - component_to_parent_x (channel_to_position (i->column, _matrix->columns()) * grid_spacing ()), - component_to_parent_y (channel_to_position (i->row, _matrix->rows()) * grid_spacing ()) + component_to_parent_x (channel_to_position (i->column, _matrix->visible_columns()) * grid_spacing ()), + component_to_parent_y (channel_to_position (i->row, _matrix->visible_rows()) * grid_spacing ()) ); } } @@ -523,7 +499,7 @@ PortMatrixGrid::queue_draw_for (list const &n) if (i->row.bundle) { - double const y = channel_to_position (i->row, _matrix->rows()) * grid_spacing (); + double const y = channel_to_position (i->row, _matrix->visible_rows()) * grid_spacing (); _body->queue_draw_area ( _parent_rectangle.get_x(), component_to_parent_y (y), @@ -534,7 +510,7 @@ PortMatrixGrid::queue_draw_for (list const &n) if (i->column.bundle) { - double const x = channel_to_position (i->column, _matrix->columns()) * grid_spacing (); + double const x = channel_to_position (i->column, _matrix->visible_columns()) * grid_spacing (); _body->queue_draw_area ( component_to_parent_x (x), diff --git a/gtk2_ardour/port_matrix_labels.h b/gtk2_ardour/port_matrix_labels.h index 21dcf9de23..a977662e80 100644 --- a/gtk2_ardour/port_matrix_labels.h +++ b/gtk2_ardour/port_matrix_labels.h @@ -32,7 +32,7 @@ public: PortMatrixLabels (PortMatrix* m, PortMatrixBody* b) : PortMatrixComponent (m, b) {} virtual ~PortMatrixLabels () {} - virtual void draw_extra (cairo_t *); + void draw_extra (cairo_t *); void clear_channel_highlights (); void add_channel_highlight (ARDOUR::BundleChannel const &); diff --git a/gtk2_ardour/port_matrix_row_labels.cc b/gtk2_ardour/port_matrix_row_labels.cc index 0b8475cd03..9ef57e4778 100644 --- a/gtk2_ardour/port_matrix_row_labels.cc +++ b/gtk2_ardour/port_matrix_row_labels.cc @@ -45,7 +45,10 @@ PortMatrixRowLabels::compute_dimensions () _longest_port_name = 0; _longest_bundle_name = 0; _height = 0; - _highest_group_name = 0; + + /* Compute maximum dimensions using all port groups, so that we allow for the largest and hence + we can change between visible groups without the size of the labels jumping around. + */ for (PortGroupList::List::const_iterator i = _matrix->rows()->begin(); i != _matrix->rows()->end(); ++i) { @@ -66,22 +69,16 @@ PortMatrixRowLabels::compute_dimensions () _longest_bundle_name = ext.width; } } - - _height += group_size (*i) * grid_spacing (); - - cairo_text_extents_t ext; - cairo_text_extents (cr, (*i)->name.c_str(), &ext); - if (ext.height > _highest_group_name) { - _highest_group_name = ext.height; - } } + + _height += group_size (_matrix->visible_rows()) * grid_spacing (); + cairo_destroy (cr); gdk_pixmap_unref (pm); - _width = _highest_group_name + - _longest_bundle_name + - name_pad() * 4; + _width = _longest_bundle_name + + name_pad() * 2; if (!_matrix->show_only_bundles()) { _width += _longest_port_name; @@ -104,62 +101,35 @@ PortMatrixRowLabels::render (cairo_t* cr) double y = 0; int N = 0; int M = 0; - for (PortGroupList::List::const_iterator i = _matrix->rows()->begin(); i != _matrix->rows()->end(); ++i) { - - if ((*i)->visible ()) { - - PortGroup::BundleList const & bundles = (*i)->bundles (); - for (PortGroup::BundleList::const_iterator j = bundles.begin(); j != bundles.end(); ++j) { - render_bundle_name (cr, background_colour (), j->has_colour ? j->colour : get_a_bundle_colour (N), 0, y, j->bundle); - - if (!_matrix->show_only_bundles()) { - for (uint32_t k = 0; k < j->bundle->nchannels(); ++k) { - Gdk::Color c = j->has_colour ? j->colour : get_a_bundle_colour (M); - render_channel_name (cr, background_colour (), c, 0, y, ARDOUR::BundleChannel (j->bundle, k)); - y += grid_spacing(); - ++M; - } - } else { - y += grid_spacing(); - } - - ++N; + + PortGroup::BundleList const & bundles = _matrix->visible_rows()->bundles (); + for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) { + render_bundle_name (cr, background_colour (), i->has_colour ? i->colour : get_a_bundle_colour (N), 0, y, i->bundle); + + if (!_matrix->show_only_bundles()) { + for (uint32_t j = 0; j < i->bundle->nchannels(); ++j) { + Gdk::Color c = i->has_colour ? i->colour : get_a_bundle_colour (M); + render_channel_name (cr, background_colour (), c, 0, y, ARDOUR::BundleChannel (i->bundle, j)); + y += grid_spacing(); + ++M; } - } else { - - y += grid_spacing (); + y += grid_spacing(); } + + ++N; } } -pair, ARDOUR::BundleChannel> -PortMatrixRowLabels::position_to_group_and_channel (double p, double o, PortGroupList const * groups) const -{ - pair, ARDOUR::BundleChannel> w = PortMatrixComponent::position_to_group_and_channel (p, o, _matrix->rows()); - - uint32_t const gw = (_highest_group_name + 2 * name_pad()); - - if ( - (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && o < gw) || - (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT && o > (_width - gw)) - ) { - - w.second.bundle.reset (); - } - - return w; -} - void PortMatrixRowLabels::button_press (double x, double y, int b, uint32_t t) { - pair, ARDOUR::BundleChannel> w = position_to_group_and_channel (y, x, _matrix->rows()); + ARDOUR::BundleChannel const w = position_to_channel (y, x, _matrix->visible_rows()); if (b == 3) { _matrix->popup_menu ( - make_pair (boost::shared_ptr (), ARDOUR::BundleChannel ()), + ARDOUR::BundleChannel (), w, t ); @@ -198,14 +168,8 @@ PortMatrixRowLabels::bundle_name_x () const { double x = 0; - if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - x = _highest_group_name + 2 * name_pad(); - } else { - if (_matrix->show_only_bundles()) { - x = 0; - } else { - x = _longest_port_name + name_pad() * 2; - } + if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT && !_matrix->show_only_bundles ()) { + x = _longest_port_name + name_pad() * 2; } return x; @@ -215,7 +179,7 @@ double PortMatrixRowLabels::port_name_x () const { if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - return _longest_bundle_name + _highest_group_name + name_pad() * 4; + return _longest_bundle_name + name_pad() * 2; } else { return 0; } @@ -283,7 +247,7 @@ PortMatrixRowLabels::channel_x (ARDOUR::BundleChannel const &) const double PortMatrixRowLabels::channel_y (ARDOUR::BundleChannel const& bc) const { - return channel_to_position (bc, _matrix->rows()) * grid_spacing (); + return channel_to_position (bc, _matrix->visible_rows()) * grid_spacing (); } void @@ -327,79 +291,18 @@ PortMatrixRowLabels::mouseover_changed (list const &) } } -void -PortMatrixRowLabels::draw_extra (cairo_t* cr) -{ - PortMatrixLabels::draw_extra (cr); - - /* PORT GROUP NAMES */ - - double x = 0; - if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - x = component_to_parent_x (0); - } else { - x = component_to_parent_x (_width - _highest_group_name - 2 * name_pad()); - } - - double y = component_to_parent_y (0); - int g = 0; - for (PortGroupList::List::const_iterator i = _matrix->rows()->begin(); i != _matrix->rows()->end(); ++i) { - - /* compute height of this group */ - double h = 0; - if (!(*i)->visible()) { - h = grid_spacing (); - } else { - if (_matrix->show_only_bundles()) { - h = (*i)->bundles().size() * grid_spacing(); - } else { - h = (*i)->total_channels () * grid_spacing(); - } - } - - if (h == 0) { - continue; - } - - /* rectangle */ - set_source_rgb (cr, get_a_group_colour (g)); - double const rw = _highest_group_name + 2 * name_pad(); - cairo_rectangle (cr, x, y, rw, h); - cairo_fill (cr); - - /* y area available to draw the label in (trying to keep it visible) */ - double const ty = max (y, 0.0); - double const by = min (y + h, double (_body->alloc_scroll_height ())); - - /* hence what abbreviation (or not) we need for the group name */ - string const upper = Glib::ustring ((*i)->name).uppercase (); - pair display = fit_to_pixels (cr, upper, by - ty); - - /* plot it */ - set_source_rgb (cr, text_colour()); - cairo_move_to (cr, x + rw - name_pad(), (by + ty + display.second) / 2); - cairo_save (cr); - cairo_rotate (cr, - M_PI / 2); - cairo_show_text (cr, display.first.c_str()); - cairo_restore (cr); - - y += h; - ++g; - } -} - void PortMatrixRowLabels::motion (double x, double y) { - pair, ARDOUR::BundleChannel> const w = position_to_group_and_channel (y, x, _matrix->rows()); + ARDOUR::BundleChannel const w = position_to_channel (y, x, _matrix->visible_rows()); - if (w.second.bundle == 0) { + if (w.bundle == 0) { /* not over any bundle */ _body->set_mouseover (PortMatrixNode ()); return; } - uint32_t const bw = _highest_group_name + 2 * name_pad() + _longest_bundle_name + 2 * name_pad(); + uint32_t const bw = _longest_bundle_name + 2 * name_pad(); if ( (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && x < bw) || @@ -411,8 +314,8 @@ PortMatrixRowLabels::motion (double x, double y) list n; - for (uint32_t i = 0; i < w.second.bundle->nchannels(); ++i) { - ARDOUR::BundleChannel const bc (w.second.bundle, i); + for (uint32_t i = 0; i < w.bundle->nchannels(); ++i) { + ARDOUR::BundleChannel const bc (w.bundle, i); n.push_back (PortMatrixNode (bc, ARDOUR::BundleChannel ())); } @@ -420,7 +323,7 @@ PortMatrixRowLabels::motion (double x, double y) } else { - _body->set_mouseover (PortMatrixNode (w.second, ARDOUR::BundleChannel ())); + _body->set_mouseover (PortMatrixNode (w, ARDOUR::BundleChannel ())); } } diff --git a/gtk2_ardour/port_matrix_row_labels.h b/gtk2_ardour/port_matrix_row_labels.h index 1610a9faa5..df1490beb8 100644 --- a/gtk2_ardour/port_matrix_row_labels.h +++ b/gtk2_ardour/port_matrix_row_labels.h @@ -50,7 +50,6 @@ public: double component_to_parent_y (double y) const; double parent_to_component_y (double y) const; void mouseover_changed (std::list const &); - void draw_extra (cairo_t *); void motion (double, double); private: @@ -58,7 +57,6 @@ private: void render_bundle_name (cairo_t *, Gdk::Color, Gdk::Color, double, double, boost::shared_ptr); double channel_x (ARDOUR::BundleChannel const &) const; double channel_y (ARDOUR::BundleChannel const &) const; - virtual std::pair, ARDOUR::BundleChannel> position_to_group_and_channel (double, double, PortGroupList const *) const; void render (cairo_t *); void compute_dimensions (); @@ -70,7 +68,6 @@ private: double _longest_port_name; double _longest_bundle_name; - double _highest_group_name; }; #endif -- cgit v1.2.3