diff --git a/gtk2_ardour/port_matrix_component.h b/gtk2_ardour/port_matrix_component.h index 196a24b0c0..3fdd26394a 100644 --- a/gtk2_ardour/port_matrix_component.h +++ b/gtk2_ardour/port_matrix_component.h @@ -137,7 +137,7 @@ protected: } /** @return colour to paint grid squares when they can't be associated */ - static Gdk::Color unknown_colour () { + static Gdk::Color non_connectable_colour () { return Gdk::Color ("#cccccc"); } diff --git a/gtk2_ardour/port_matrix_grid.cc b/gtk2_ardour/port_matrix_grid.cc index f4ca28fcd2..8a12df236e 100644 --- a/gtk2_ardour/port_matrix_grid.cc +++ b/gtk2_ardour/port_matrix_grid.cc @@ -127,7 +127,11 @@ PortMatrixGrid::render (cairo_t* cr) ++N; } - /* ASSOCIATION INDICATORS */ + /* ASSOCIATION INDICATORS and NON-CONNECTABLE INDICATORS */ + + /* we draw a grey square in a matrix box if the two ports that intersect at that box + cannot be connected because they are of different types (MIDI vs. audio) + */ uint32_t bx = 0; uint32_t by = 0; @@ -182,18 +186,24 @@ PortMatrixGrid::render (cairo_t* cr) c[_matrix->column_index()] = ARDOUR::BundleChannel ((*i)->bundle, k); c[_matrix->row_index()] = ARDOUR::BundleChannel ((*j)->bundle, l); - PortMatrixNode::State const s = _matrix->get_state (c); - - switch (s) { - case PortMatrixNode::ASSOCIATED: - draw_association_indicator (cr, x, y); - break; - - case PortMatrixNode::NOT_ASSOCIATED: - break; - - default: - break; + if (c[0].bundle->channel_type (c[0].channel) != c[1].bundle->channel_type (c[1].channel)) { + /* these two channels are of different types */ + draw_non_connectable_indicator (cr, x, y); + } else { + /* these two channels might be associated */ + PortMatrixNode::State const s = _matrix->get_state (c); + + switch (s) { + case PortMatrixNode::ASSOCIATED: + draw_association_indicator (cr, x, y); + break; + + case PortMatrixNode::NOT_ASSOCIATED: + break; + + default: + break; + } } y += grid_spacing(); @@ -241,6 +251,23 @@ PortMatrixGrid::draw_empty_square (cairo_t* cr, uint32_t x, uint32_t y) cairo_fill (cr); } +/** Draw a square to indicate that two channels in a matrix cannot be associated + * with each other. + */ +void +PortMatrixGrid::draw_non_connectable_indicator (cairo_t* cr, uint32_t x, uint32_t y) +{ + set_source_rgb (cr, non_connectable_colour ()); + cairo_rectangle ( + cr, + x + thick_grid_line_width(), + y + thick_grid_line_width(), + grid_spacing() - 2 * thick_grid_line_width(), + grid_spacing() - 2 * thick_grid_line_width() + ); + cairo_fill (cr); +} + PortMatrixNode PortMatrixGrid::position_to_node (double x, double y) const { diff --git a/gtk2_ardour/port_matrix_grid.h b/gtk2_ardour/port_matrix_grid.h index f90626334d..cb3a415ed1 100644 --- a/gtk2_ardour/port_matrix_grid.h +++ b/gtk2_ardour/port_matrix_grid.h @@ -62,6 +62,7 @@ private: void queue_draw_for (std::list const &); void draw_association_indicator (cairo_t *, uint32_t, uint32_t, double p = 1); void draw_empty_square (cairo_t *, uint32_t, uint32_t); + void draw_non_connectable_indicator (cairo_t *, uint32_t, uint32_t); std::list nodes_on_line (int, int, int, int) const; PortMatrixNode::State get_association (PortMatrixNode) const; void set_association (PortMatrixNode, bool);