Remove fade handles from recording regions. Fixes #3322.
[ardour.git] / gtk2_ardour / port_matrix_column_labels.cc
index 2aeb084b9f0c54651b712e5cd65869b2b64893a6..fe5158588f3f4328995068c2e6d0b35352eb8795 100644 (file)
@@ -25,6 +25,8 @@
 #include "port_matrix_body.h"
 #include "utils.h"
 
+#include "i18n.h"
+
 using namespace std;
 
 PortMatrixColumnLabels::PortMatrixColumnLabels (PortMatrix* m, PortMatrixBody* b)
@@ -45,10 +47,6 @@ PortMatrixColumnLabels::compute_dimensions ()
        _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.
@@ -59,38 +57,45 @@ PortMatrixColumnLabels::compute_dimensions ()
                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);
+       g_object_unref (pm);
 
        /* height of the whole thing */
 
@@ -99,7 +104,7 @@ PortMatrixColumnLabels::compute_dimensions ()
                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;
 }
@@ -108,7 +113,7 @@ double
 PortMatrixColumnLabels::basic_text_x_pos (int) const
 {
        return grid_spacing() / 2 +
-               _highest_text / (2 * sin (angle ()));
+               _text_height / (2 * sin (angle ()));
 }
 
 void
@@ -128,13 +133,13 @@ PortMatrixColumnLabels::render (cairo_t* cr)
        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 ((*i)->bundle->nchannels()) * grid_spacing();
                }
                
                ++N;
@@ -148,9 +153,14 @@ PortMatrixColumnLabels::render (cairo_t* cr)
 
                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));
+                       for (uint32_t j = 0; j < (*i)->bundle->nchannels().n_total(); ++j) {
+
+                               if (!_matrix->should_show ((*i)->bundle->channel_type(j))) {
+                                       continue;
+                               }
+                               
+                               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));
                                x += grid_spacing();
                        }
                        
@@ -253,7 +263,7 @@ PortMatrixColumnLabels::render_bundle_name (
        if (_matrix->show_only_bundles()) {
                w = grid_spacing ();
        } else {
-               w = b->nchannels() * grid_spacing();
+               w = _matrix->count_of_our_type (b->nchannels()) * grid_spacing();
        }
 
        double x_ = xoff;
@@ -278,6 +288,8 @@ PortMatrixColumnLabels::render_bundle_name (
 
        set_source_rgb (cr, text_colour());
 
+       double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height;
+
        if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) {
 
                double rl = 0;
@@ -288,16 +300,16 @@ PortMatrixColumnLabels::render_bundle_name (
                }
                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 ())
                        );
        }
 
@@ -328,25 +340,28 @@ PortMatrixColumnLabels::render_channel_name (
 
        set_source_rgb (cr, text_colour());
 
+       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 */
@@ -432,11 +447,19 @@ PortMatrixColumnLabels::position_to_channel (double p, double o, boost::shared_p
 void
 PortMatrixColumnLabels::button_press (double x, double y, int b, uint32_t t, guint)
 {
-       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 ())))
+               ) {
+
+               w.channel = -1;
+       }
 
        if (b == 3) {
                _matrix->popup_menu (
-                       gc,
+                       w,
                        ARDOUR::BundleChannel (),
                        t
                        );
@@ -453,7 +476,7 @@ PortMatrixColumnLabels::motion (double x, double y)
                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) ||
@@ -464,7 +487,12 @@ PortMatrixColumnLabels::motion (double x, double y)
                
                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));
                }