X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_matrix_column_labels.cc;h=522015548f5b35a967130fdd37cf54c823b0607a;hb=129ace60e24aa7b5297563d389edbae1d70a3a80;hp=2aeb084b9f0c54651b712e5cd65869b2b64893a6;hpb=be55dcbce3b26d9af7562cedb75dee25eab66623;p=ardour.git diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc index 2aeb084b9f..522015548f 100644 --- a/gtk2_ardour/port_matrix_column_labels.cc +++ b/gtk2_ardour/port_matrix_column_labels.cc @@ -45,10 +45,6 @@ PortMatrixColumnLabels::compute_dimensions () _longest_bundle_name = 0; /* width of the longest channel name */ _longest_channel_name = 0; - /* height of highest bit of text (apart from group names) */ - _highest_text = 0; - /* width of the whole thing */ - _width = 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. @@ -59,34 +55,37 @@ PortMatrixColumnLabels::compute_dimensions () for (PortGroup::BundleList::const_iterator j = c.begin (); j != c.end(); ++j) { cairo_text_extents_t ext; - cairo_text_extents (cr, j->bundle->name().c_str(), &ext); + cairo_text_extents (cr, (*j)->bundle->name().c_str(), &ext); if (ext.width > _longest_bundle_name) { _longest_bundle_name = ext.width; } - if (ext.height > _highest_text) { - _highest_text = ext.height; - } - - for (uint32_t k = 0; k < j->bundle->nchannels (); ++k) { + for (uint32_t k = 0; k < (*j)->bundle->nchannels (); ++k) { cairo_text_extents ( cr, - j->bundle->channel_name (k).c_str(), + (*j)->bundle->channel_name (k).c_str(), &ext ); if (ext.width > _longest_channel_name) { _longest_channel_name = ext.width; } - - if (ext.height > _highest_text) { - _highest_text = ext.height; - } } } + } - _width += group_size (*i) * grid_spacing (); + /* height metrics */ + cairo_text_extents_t ext; + cairo_text_extents (cr, X_("AQRjpy"), &ext); + _text_height = ext.height; + _descender_height = ext.height + ext.y_bearing; + + /* width of the whole thing */ + if (_matrix->visible_columns()) { + _width = group_size (_matrix->visible_columns()) * grid_spacing (); + } else { + _width = 0; } cairo_destroy (cr); @@ -99,7 +98,7 @@ PortMatrixColumnLabels::compute_dimensions () a += _longest_channel_name; } - _height = a * sin (angle()) + _highest_text * cos (angle()); + _height = a * sin (angle()) + _text_height * cos (angle()); _overhang = _height / tan (angle ()); _width += _overhang; } @@ -108,7 +107,7 @@ double PortMatrixColumnLabels::basic_text_x_pos (int) const { return grid_spacing() / 2 + - _highest_text / (2 * sin (angle ())); + _text_height / (2 * sin (angle ())); } void @@ -128,13 +127,13 @@ PortMatrixColumnLabels::render (cairo_t* cr) PortGroup::BundleList const & bundles = _matrix->visible_columns()->bundles (); for (PortGroup::BundleList::const_iterator i = bundles.begin (); i != bundles.end(); ++i) { - Gdk::Color c = i->has_colour ? i->colour : get_a_bundle_colour (N); - render_bundle_name (cr, background_colour (), c, x, 0, i->bundle); + 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 += i->bundle->nchannels () * grid_spacing(); + x += (*i)->bundle->nchannels () * grid_spacing(); } ++N; @@ -148,9 +147,9 @@ PortMatrixColumnLabels::render (cairo_t* cr) 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)); + 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(); } @@ -278,6 +277,8 @@ PortMatrixColumnLabels::render_bundle_name ( set_source_rgb (cr, text_colour()); + double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height; + if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) { double rl = 0; @@ -288,16 +289,16 @@ PortMatrixColumnLabels::render_bundle_name ( } cairo_move_to ( cr, - xoff + basic_text_x_pos (0) + rl * cos (angle()), - yoff + _height - rl * sin (angle()) + xoff + grid_spacing() - q * sin (angle ()) + rl * cos (angle()), + yoff + _height - q * cos (angle ()) - rl * sin (angle()) ); } else { cairo_move_to ( cr, - xoff + basic_text_x_pos (0) + name_pad() * cos (angle ()), - yoff + _height - name_pad() * sin (angle()) + xoff + grid_spacing() - q * sin (angle ()), + yoff + _height - q * cos (angle ()) ); } @@ -328,21 +329,24 @@ PortMatrixColumnLabels::render_channel_name ( set_source_rgb (cr, text_colour()); + double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height; + if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) { cairo_move_to ( cr, - xoff + basic_text_x_pos(bc.channel), - yoff + _height - name_pad() * sin (angle()) + xoff + grid_spacing() - q * sin (angle ()), + yoff + _height - q * cos (angle ()) ); + } else { double const rl = 3 * name_pad() + _longest_bundle_name; cairo_move_to ( cr, - xoff + basic_text_x_pos(bc.channel) + rl * cos (angle ()), - yoff + _height - rl * sin (angle()) + xoff + grid_spacing() - q * sin (angle ()) + rl * cos (angle ()), + yoff + _height - q * cos (angle ()) - rl * sin (angle()) ); } @@ -432,11 +436,19 @@ PortMatrixColumnLabels::position_to_channel (double p, double o, boost::shared_p void PortMatrixColumnLabels::button_press (double x, double y, int b, uint32_t t, guint) { - ARDOUR::BundleChannel const gc = position_to_channel (x, y, _matrix->visible_columns()); + ARDOUR::BundleChannel w = position_to_channel (x, y, _matrix->visible_columns()); + + if ( + (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && y > (_height - _longest_bundle_name * sin (angle ()))) || + (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT && y < (_longest_bundle_name * sin (angle ()))) + ) { + + w.channel = -1; + } if (b == 3) { _matrix->popup_menu ( - gc, + w, ARDOUR::BundleChannel (), t ); @@ -453,7 +465,7 @@ PortMatrixColumnLabels::motion (double x, double y) return; } - uint32_t const bh = _longest_channel_name * sin (angle ()) + _highest_text / cos (angle ()); + uint32_t const bh = _longest_channel_name * sin (angle ()) + _text_height / cos (angle ()); if ( (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && y > bh) ||