diff options
Diffstat (limited to 'gtk2_ardour/port_matrix_column_labels.cc')
-rw-r--r-- | gtk2_ardour/port_matrix_column_labels.cc | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc new file mode 100644 index 0000000000..343d225b55 --- /dev/null +++ b/gtk2_ardour/port_matrix_column_labels.cc @@ -0,0 +1,199 @@ +/* + Copyright (C) 2002-2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <iostream> +#include "ardour/bundle.h" +#include "port_matrix_column_labels.h" +#include "port_matrix.h" + +PortMatrixColumnLabels::PortMatrixColumnLabels (PortMatrixBody* b) + : PortMatrixComponent (b) +{ + +} + +void +PortMatrixColumnLabels::compute_dimensions () +{ + GdkPixmap* pm = gdk_pixmap_new (NULL, 1, 1, 24); + gdk_drawable_set_colormap (pm, gdk_colormap_get_system()); + cairo_t* cr = gdk_cairo_create (pm); + + /* width of the longest bundle name */ + _longest_bundle_name = 0; + /* width of the longest channel name */ + _longest_channel_name = 0; + /* height of highest bit of text */ + _highest_text = 0; + + for (std::vector<boost::shared_ptr<ARDOUR::Bundle> >::const_iterator i = _body->column_bundles().begin (); i != _body->column_bundles().end(); ++i) { + + cairo_text_extents_t ext; + cairo_text_extents (cr, (*i)->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 j = 0; j < (*i)->nchannels (); ++j) { + + cairo_text_extents ( + cr, + (*i)->channel_name (j).c_str(), + &ext + ); + + if (ext.width > _longest_channel_name) { + _longest_channel_name = ext.width; + } + if (ext.height > _highest_text) { + _highest_text = ext.height; + } + } + } + + cairo_destroy (cr); + gdk_pixmap_unref (pm); + + /* width and height of the whole thing */ + + _width = 0; + for (std::vector<boost::shared_ptr<ARDOUR::Bundle> >::const_iterator i = _body->column_bundles().begin (); i != _body->column_bundles().end(); ++i) { + _width += (*i)->nchannels() * column_width(); + } + + _height = + (_longest_bundle_name + _longest_channel_name + 4 * name_pad()) * sin (angle()) + + _highest_text * cos (angle()); + + _width += _height / tan (angle ()); +} + +uint32_t +PortMatrixColumnLabels::basic_text_x_pos (int c) const +{ + return column_width() / 2 + + _highest_text / (2 * sin (angle ())); +} + +void +PortMatrixColumnLabels::render (cairo_t* cr) +{ + /* BACKGROUND */ + + set_source_rgb (cr, background_colour()); + cairo_rectangle (cr, 0, 0, _width, _height); + cairo_fill (cr); + + /* BUNDLE PARALLELOGRAM-TYPE-THING AND NAME */ + + uint32_t x = 0; + for (std::vector<boost::shared_ptr<ARDOUR::Bundle> >::const_iterator i = _body->column_bundles().begin (); i != _body->column_bundles().end(); ++i) { + + Gdk::Color colour = get_a_bundle_colour (i - _body->column_bundles().begin ()); + set_source_rgb (cr, colour); + + uint32_t const w = (*i)->nchannels() * column_width(); + + uint32_t x_ = x; + uint32_t y_ = _height; + + cairo_move_to (cr, x_, y_); + x_ += w; + cairo_line_to (cr, x_, y_); + x_ += _height / tan (angle ()); + y_ -= _height; + cairo_line_to (cr, x_, y_); + x_ -= w; + cairo_line_to (cr, x_, y_); + cairo_line_to (cr, x, _height); + cairo_fill_preserve (cr); + set_source_rgb (cr, background_colour()); + cairo_set_line_width (cr, label_border_width()); + cairo_stroke (cr); + + set_source_rgb (cr, text_colour()); + + uint32_t const rl = 3 * name_pad() + _longest_channel_name; + + cairo_move_to ( + cr, + x + basic_text_x_pos (0) + rl * cos (angle()), + _height - rl * sin (angle()) + ); + + cairo_save (cr); + cairo_rotate (cr, -angle()); + cairo_show_text (cr, (*i)->name().c_str()); + cairo_restore (cr); + + x += (*i)->nchannels () * column_width(); + } + + + /* PORT NAMES */ + + x = 0; + for (std::vector<boost::shared_ptr<ARDOUR::Bundle> >::const_iterator i = _body->column_bundles().begin(); i != _body->column_bundles().end(); ++i) { + + for (uint32_t j = 0; j < (*i)->nchannels(); ++j) { + + uint32_t const p = _longest_channel_name + (2 * name_pad()); + uint32_t const w = column_width(); + + uint32_t x_ = x; + uint32_t y_ = _height; + cairo_move_to (cr, x_, y_); + x_ += w; + cairo_line_to (cr, x_, y_); + x_ += p * cos (angle()); + y_ -= p * sin (angle()); + cairo_line_to (cr, x_, y_); + x_ -= column_width() * pow (sin (angle()), 2); + y_ -= column_width() * sin (angle()) * cos (angle()); + cairo_line_to (cr, x_, y_); + cairo_line_to (cr, x, _height); + + Gdk::Color colour = get_a_bundle_colour (i - _body->column_bundles().begin()); + set_source_rgb (cr, colour); + cairo_fill_preserve (cr); + set_source_rgb (cr, background_colour()); + cairo_set_line_width (cr, label_border_width()); + cairo_stroke (cr); + + set_source_rgb (cr, text_colour()); + cairo_move_to (cr, x + basic_text_x_pos(j), _height - name_pad() * sin (angle())); + + cairo_save (cr); + cairo_rotate (cr, -angle()); + + cairo_show_text ( + cr, + (*i)->channel_name(j).c_str() + ); + + cairo_restore (cr); + + x += column_width(); + } + } +} + |