Provide a visual cue to indicate that MIDI and audio ports cannot be connected to each other in the port matrix.

git-svn-id: svn://localhost/ardour2/branches/3.0@7463 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-07-21 23:20:56 +00:00
parent 75fb4557e5
commit 8b0e35cba4
3 changed files with 42 additions and 14 deletions

View File

@ -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");
}

View File

@ -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
{

View File

@ -62,6 +62,7 @@ private:
void queue_draw_for (std::list<PortMatrixNode> 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<PortMatrixNode> nodes_on_line (int, int, int, int) const;
PortMatrixNode::State get_association (PortMatrixNode) const;
void set_association (PortMatrixNode, bool);