summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-11-14 11:50:01 +0000
committerCarl Hetherington <carl@carlh.net>2009-11-14 11:50:01 +0000
commit9dbecd0fa1a977da1643977487a5485f4bf74267 (patch)
tree3dbfbd621902c3ba7da9ea9c3f1e822c453054d7
parent67601c6c50ac6506c1c6f87be1c726bd1fa4241b (diff)
Keep port matrix group labels on screen where possible.
git-svn-id: svn://localhost/ardour2/branches/3.0@6082 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/port_matrix_column_labels.cc124
-rw-r--r--gtk2_ardour/port_matrix_column_labels.h1
-rw-r--r--gtk2_ardour/port_matrix_labels.h2
-rw-r--r--gtk2_ardour/port_matrix_row_labels.cc116
-rw-r--r--gtk2_ardour/port_matrix_row_labels.h1
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<string, double> 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<string, double> 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<string, double> 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<string, double> 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 &);