*/
#include <iostream>
+#include "gtkmm2ext/keyboard.h"
#include "ardour/bundle.h"
-#include "ardour/types.h"
+#include "canvas/colors.h"
+#include "utils.h"
#include "port_matrix_column_labels.h"
#include "port_matrix.h"
#include "port_matrix_body.h"
-#include "utils.h"
+
+#include "i18n.h"
using namespace std;
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);
+ cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 200, 200);
+ cairo_t* cr = cairo_create (surface);
/* 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 (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.
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().n_total(); ++k) {
- for (uint32_t k = 0; k < j->bundle->nchannels (); ++k) {
+ if (!_matrix->should_show ((*j)->bundle->channel_type(k))) {
+ continue;
+ }
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;
- }
}
}
+ }
+
+ /* 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 += group_size (*i) * grid_spacing ();
+ /* width of the whole thing */
+ if (_matrix->visible_columns()) {
+ _width = group_size (_matrix->visible_columns()) * grid_spacing ();
+ } else {
+ _width = 0;
}
cairo_destroy (cr);
- gdk_pixmap_unref (pm);
+ cairo_surface_destroy (surface);
/* height of the whole thing */
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;
}
PortMatrixColumnLabels::basic_text_x_pos (int) const
{
return grid_spacing() / 2 +
- _highest_text / (2 * sin (angle ()));
+ _text_height / (2 * sin (angle ()));
}
void
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 += _matrix->count_of_our_type_min_1 ((*i)->bundle->nchannels()) * grid_spacing();
}
-
+
++N;
}
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));
+ uint32_t const C = _matrix->count_of_our_type ((*i)->bundle->nchannels ());
+
+ for (uint32_t j = 0; j < C; ++j) {
+ Gdk::Color c = (*i)->has_colour ? (*i)->colour : get_a_bundle_colour (N);
+
+ ARDOUR::BundleChannel bc (
+ (*i)->bundle,
+ (*i)->bundle->type_channel_to_overall (_matrix->type (), j)
+ );
+
+ render_channel_name (cr, background_colour (), c, x, 0, bc);
x += grid_spacing();
}
-
+
+ if (C == 0) {
+ x += grid_spacing ();
+ }
+
++N;
}
}
ARDOUR::BundleChannel c = i->column;
ARDOUR::BundleChannel r = i->row;
-
- if (c.bundle && r.bundle) {
+
+ if (PortMatrix::bundle_with_channels (c.bundle) && PortMatrix::bundle_with_channels (r.bundle)) {
add_channel_highlight (c);
} else if (c.bundle) {
_body->highlight_associated_channels (_matrix->column_index(), c);
if (_matrix->show_only_bundles()) {
w = grid_spacing ();
} else {
- w = b->nchannels() * grid_spacing();
+ w = _matrix->count_of_our_type_min_1 (b->nchannels()) * grid_spacing();
}
double x_ = xoff;
cairo_set_line_width (cr, label_border_width());
cairo_stroke (cr);
- set_source_rgb (cr, text_colour());
+ Gdk::Color textcolor;
+ ARDOUR_UI_UTILS::set_color_from_rgba(textcolor, ArdourCanvas::contrasting_text_color(ARDOUR_UI_UTILS::gdk_color_to_rgba(bg_colour)));
+ set_source_rgb (cr, textcolor);
+
+ 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 (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 ())
);
}
cairo_set_line_width (cr, label_border_width());
cairo_stroke (cr);
- set_source_rgb (cr, text_colour());
+ Gdk::Color textcolor;
+ ARDOUR_UI_UTILS::set_color_from_rgba(textcolor, ArdourCanvas::contrasting_text_color(ARDOUR_UI_UTILS::gdk_color_to_rgba(bg_colour)));
+ set_source_rgb (cr, textcolor);
+
+ 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())
);
}
- if (bc.bundle->nchannels() > 1) {
+ if (_matrix->count_of_our_type (bc.bundle->nchannels()) > 1) {
/* only plot the name if the bundle has more than one channel;
the name of a single channel is assumed to be redundant */
-
+
cairo_save (cr);
cairo_rotate (cr, -angle());
-
+
cairo_show_text (
cr,
bc.bundle->channel_name(bc.channel).c_str()
);
-
+
cairo_restore (cr);
}
}
}
void
-PortMatrixColumnLabels::button_press (double x, double y, int b, uint32_t t, guint)
+PortMatrixColumnLabels::button_press (double x, double y, GdkEventButton* ev)
{
- 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 ())))
+ ) {
- if (b == 3) {
+ w.channel = -1;
+ }
+
+ if (Gtkmm2ext::Keyboard::is_delete_event (ev) && w.channel != -1) {
+ _matrix->remove_channel (w);
+ } else if (ev->button == 3) {
_matrix->popup_menu (
- gc,
+ w,
ARDOUR::BundleChannel (),
- t
+ ev->time
);
}
}
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) ||
) {
/* if the mouse is over a bundle name, highlight all channels in the bundle */
-
+
list<PortMatrixNode> n;
- for (uint32_t i = 0; i < w.bundle->nchannels(); ++i) {
+ for (uint32_t i = 0; i < w.bundle->nchannels().n_total(); ++i) {
+ if (!_matrix->should_show (w.bundle->channel_type (i))) {
+ continue;
+ }
+
ARDOUR::BundleChannel const bc (w.bundle, i);
n.push_back (PortMatrixNode (ARDOUR::BundleChannel (), bc));
}
_body->set_mouseover (n);
} else {
-
+
_body->set_mouseover (PortMatrixNode (ARDOUR::BundleChannel (), w));
}
-}
+}