From 9dbecd0fa1a977da1643977487a5485f4bf74267 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 14 Nov 2009 11:50:01 +0000 Subject: Keep port matrix group labels on screen where possible. git-svn-id: svn://localhost/ardour2/branches/3.0@6082 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/port_matrix_column_labels.cc | 124 +++++++++++++++++-------------- gtk2_ardour/port_matrix_column_labels.h | 1 + gtk2_ardour/port_matrix_labels.h | 2 +- gtk2_ardour/port_matrix_row_labels.cc | 116 ++++++++++++++++------------- gtk2_ardour/port_matrix_row_labels.h | 1 + 5 files changed, 135 insertions(+), 109 deletions(-) diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc index dfa14f1d89..5dcb710e7e 100644 --- a/gtk2_ardour/port_matrix_column_labels.cc +++ b/gtk2_ardour/port_matrix_column_labels.cc @@ -126,64 +126,9 @@ PortMatrixColumnLabels::render (cairo_t* cr) cairo_rectangle (cr, 0, 0, _width, _height); cairo_fill (cr); - /* PORT GROUP NAME */ - - double x = 0; - double y = 0; - - if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) { - x = slanted_height() / tan (angle()); - y = _highest_group_name + name_pad(); - } else { - x = 0; - 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, 0, w, rh); - } else { - cairo_rectangle (cr, x, _height - rh, w, rh); - } - cairo_fill (cr); - - string const upper = Glib::ustring ((*i)->name).uppercase (); - pair const display = fit_to_pixels (cr, upper, w); - - /* plot it */ - set_source_rgb (cr, text_colour()); - cairo_move_to (cr, x + (w - display.second) / 2, y); - cairo_show_text (cr, display.first.c_str()); - - x += w; - ++g; - - } - /* BUNDLE PARALLELOGRAM-TYPE-THING AND NAME */ - x = 0; + double x = 0; int N = 0; for (PortGroupList::List::const_iterator i = _matrix->columns()->begin(); i != _matrix->columns()->end(); ++i) { @@ -258,12 +203,14 @@ PortMatrixColumnLabels::parent_to_component_x (double x) const double PortMatrixColumnLabels::component_to_parent_y (double y) const { + /* Column labels don't scroll vertically, so y conversion does not depend on yoffset */ return y + _parent_rectangle.get_y(); } double PortMatrixColumnLabels::parent_to_component_y (double y) const { + /* Column labels don't scroll vertically, so y conversion does not depend on yoffset */ return y - _parent_rectangle.get_y(); } @@ -543,3 +490,68 @@ PortMatrixColumnLabels::button_press (double x, double y, int b, uint32_t 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; + + } +} diff --git a/gtk2_ardour/port_matrix_column_labels.h b/gtk2_ardour/port_matrix_column_labels.h index 3b1c5a128c..5923bac4fc 100644 --- a/gtk2_ardour/port_matrix_column_labels.h +++ b/gtk2_ardour/port_matrix_column_labels.h @@ -43,6 +43,7 @@ public: double component_to_parent_y (double y) const; double parent_to_component_y (double y) const; void mouseover_changed (PortMatrixNode const &); + void draw_extra (cairo_t *); uint32_t overhang () const { return _overhang; diff --git a/gtk2_ardour/port_matrix_labels.h b/gtk2_ardour/port_matrix_labels.h index a977662e80..21dcf9de23 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 () {} - void draw_extra (cairo_t *); + virtual 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 e9dd59b695..fdeaba77b6 100644 --- a/gtk2_ardour/port_matrix_row_labels.cc +++ b/gtk2_ardour/port_matrix_row_labels.cc @@ -99,60 +99,9 @@ PortMatrixRowLabels::render (cairo_t* cr) cairo_rectangle (cr, 0, 0, _width, _height); cairo_fill (cr); - /* PORT GROUP NAMES */ - - double x = 0; - if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) { - x = 0; - } else { - x = _width - _highest_group_name - 2 * name_pad(); - } - - double 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); - - /* 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, h); - - /* plot it */ - set_source_rgb (cr, text_colour()); - cairo_move_to (cr, x + rw - name_pad(), y + (h + 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; - } - /* BUNDLE AND PORT NAMES */ - y = 0; + double y = 0; int N = 0; int M = 0; for (PortGroupList::List::const_iterator i = _matrix->rows()->begin(); i != _matrix->rows()->end(); ++i) { @@ -222,12 +171,14 @@ PortMatrixRowLabels::button_press (double x, double y, int b, uint32_t t) double PortMatrixRowLabels::component_to_parent_x (double x) const { + /* Row labels don't scroll horizontally, so x conversion does not depend on xoffset */ return x + _parent_rectangle.get_x(); } double PortMatrixRowLabels::parent_to_component_x (double x) const { + /* Row labels don't scroll horizontally, so x conversion does not depend on xoffset */ return x - _parent_rectangle.get_x(); } @@ -369,3 +320,64 @@ PortMatrixRowLabels::mouseover_changed (PortMatrixNode const &) add_channel_highlight (_body->mouseover().row); } } + +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; + } +} diff --git a/gtk2_ardour/port_matrix_row_labels.h b/gtk2_ardour/port_matrix_row_labels.h index 508d45d943..13e2747276 100644 --- a/gtk2_ardour/port_matrix_row_labels.h +++ b/gtk2_ardour/port_matrix_row_labels.h @@ -50,6 +50,7 @@ public: double component_to_parent_y (double y) const; double parent_to_component_y (double y) const; void mouseover_changed (PortMatrixNode const &); + void draw_extra (cairo_t *); private: void render_channel_name (cairo_t *, Gdk::Color, Gdk::Color, double, double, ARDOUR::BundleChannel const &); -- cgit v1.2.3