summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2012-06-20 22:01:22 +0000
committerCarl Hetherington <carl@carlh.net>2012-06-20 22:01:22 +0000
commit85c2fd2b692e37dd1c5049229fb5733e0e262cc3 (patch)
tree5af5c5e9d6607854f6fdd2ccdaf735ba656d6ffd /gtk2_ardour
parent7a76e8ae96c20b270dd3104328f8bee199c9a770 (diff)
Add a menu option and key press (F) in port matrices to flip the selected row and columns in the matrix.
git-svn-id: svn://localhost/ardour2/branches/3.0@12804 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/bundle_manager.cc2
-rw-r--r--gtk2_ardour/global_port_matrix.cc2
-rw-r--r--gtk2_ardour/port_matrix.cc76
-rw-r--r--gtk2_ardour/port_matrix.h7
4 files changed, 86 insertions, 1 deletions
diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc
index 9dff8f82d2..e9cddbd754 100644
--- a/gtk2_ardour/bundle_manager.cc
+++ b/gtk2_ardour/bundle_manager.cc
@@ -221,6 +221,8 @@ BundleEditor::BundleEditor (Session* session, boost::shared_ptr<UserBundle> bund
add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_ACCEPT);
show_all ();
+
+ signal_key_press_event().connect (sigc::mem_fun (_matrix, &BundleEditorMatrix::key_press));
}
void
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc
index f229a1a4ac..d749990463 100644
--- a/gtk2_ardour/global_port_matrix.cc
+++ b/gtk2_ardour/global_port_matrix.cc
@@ -160,6 +160,8 @@ GlobalPortMatrixWindow::GlobalPortMatrixWindow (Session* s, DataType t)
break;
}
+ signal_key_press_event().connect (sigc::mem_fun (_port_matrix, &PortMatrix::key_press));
+
add (_port_matrix);
_port_matrix.show ();
}
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc
index 8465cdcd32..40c48b2345 100644
--- a/gtk2_ardour/port_matrix.cc
+++ b/gtk2_ardour/port_matrix.cc
@@ -504,12 +504,16 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
}
items.push_back (MenuElem (_("Rescan"), sigc::mem_fun (*this, &PortMatrix::setup_all_ports)));
+
items.push_back (CheckMenuElem (_("Show individual ports"), sigc::mem_fun (*this, &PortMatrix::toggle_show_only_bundles)));
CheckMenuItem* i = dynamic_cast<CheckMenuItem*> (&items.back());
_inhibit_toggle_show_only_bundles = true;
i->set_active (!_show_only_bundles);
_inhibit_toggle_show_only_bundles = false;
+ items.push_back (MenuElem (_("Flip"), sigc::mem_fun (*this, &PortMatrix::flip)));
+ items.back().set_sensitive (can_flip ());
+
_menu->popup (1, t);
}
@@ -1122,3 +1126,75 @@ PortMatrix::bundle_with_channels (boost::shared_ptr<ARDOUR::Bundle> b)
{
return b && b->nchannels() != ARDOUR::ChanCount::ZERO;
}
+
+/** See if a `flip' is possible.
+ * @return If flip is possible, the new (row, column) notebook indices that
+ * should be selected; otherwise, (-1, -1)
+ */
+pair<int, int>
+PortMatrix::check_flip () const
+{
+ /* Look for the row's port group name in the columns */
+
+ int new_column = 0;
+ boost::shared_ptr<const PortGroup> r = visible_ports (_row_index);
+ PortGroupList::List::const_iterator i = _ports[_column_index].begin();
+ while (i != _ports[_column_index].end() && (*i)->name != r->name) {
+ ++i;
+ ++new_column;
+ }
+
+ if (i == _ports[_column_index].end ()) {
+ return make_pair (-1, -1);
+ }
+
+ /* Look for the column's port group name in the rows */
+
+ int new_row = 0;
+ boost::shared_ptr<const PortGroup> c = visible_ports (_column_index);
+ i = _ports[_row_index].begin();
+ while (i != _ports[_row_index].end() && (*i)->name != c->name) {
+ ++i;
+ ++new_row;
+ }
+
+ if (i == _ports[_row_index].end ()) {
+ return make_pair (-1, -1);
+ }
+
+ if (_arrangement == LEFT_TO_BOTTOM) {
+ new_row = _ports[_row_index].size() - new_row - 1;
+ }
+
+ return make_pair (new_row, new_column);
+}
+
+bool
+PortMatrix::can_flip () const
+{
+ return check_flip().first != -1;
+}
+
+/** Flip the column and row pages around, if possible */
+void
+PortMatrix::flip ()
+{
+ pair<int, int> n = check_flip ();
+ if (n.first == -1) {
+ return;
+ }
+
+ _vnotebook.set_current_page (n.first);
+ _hnotebook.set_current_page (n.second);
+}
+
+bool
+PortMatrix::key_press (GdkEventKey* k)
+{
+ if (k->keyval == GDK_f) {
+ flip ();
+ return true;
+ }
+
+ return false;
+}
diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h
index 5614293e45..76ead4bee9 100644
--- a/gtk2_ardour/port_matrix.h
+++ b/gtk2_ardour/port_matrix.h
@@ -130,6 +130,9 @@ public:
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.
*/
@@ -199,10 +202,12 @@ private:
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
+ /** port type that we are working with, or NIL if we are working with all of them */
ARDOUR::DataType _type;
PBD::ScopedConnectionList _route_connections;
PBD::ScopedConnectionList _changed_connections;