summaryrefslogtreecommitdiff
path: root/gtk2_ardour/port_matrix_column_labels.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-01-20 14:46:00 +0000
committerCarl Hetherington <carl@carlh.net>2009-01-20 14:46:00 +0000
commit61db2175eb8b8fffd0c1796ace78ac33c9e1adf0 (patch)
tree6fdc23e7e0161ce54642b0bd44dc8e0a33f05efe /gtk2_ardour/port_matrix_column_labels.cc
parentef038c1a84ecd541a540d5a5baa677d7663e535c (diff)
New matrix-based editor for connections and bundles, based on thorwil's design.
Add Bundle Manager dialog. git-svn-id: svn://localhost/ardour2/branches/3.0@4415 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/port_matrix_column_labels.cc')
-rw-r--r--gtk2_ardour/port_matrix_column_labels.cc199
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();
+ }
+ }
+}
+