/*
- Copyright (C) 2002-2009 Paul Davis
+ 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
#include "port_matrix.h"
#include "port_matrix_body.h"
+using namespace std;
+
/** Constructor.
- * @param p Port matrix that we're in.
+ * @param m Port matrix that we're in.
+ * @param b Port matrix body that we're in.
*/
PortMatrixComponent::PortMatrixComponent (PortMatrix* m, PortMatrixBody* b)
: _matrix (m),
_render_required (true),
_dimension_computation_required (true)
{
-
+
}
/** Destructor */
PortMatrixComponent::~PortMatrixComponent ()
{
if (_pixmap) {
- gdk_pixmap_unref (_pixmap);
+ g_object_unref (_pixmap);
}
}
/* make a pixmap of the right size */
if (_pixmap) {
- gdk_pixmap_unref (_pixmap);
+ g_object_unref (_pixmap);
}
_pixmap = gdk_pixmap_new (drawable, _width, _height, -1);
cairo_set_source_rgba (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p(), a);
}
-std::pair<uint32_t, uint32_t>
+pair<uint32_t, uint32_t>
PortMatrixComponent::dimensions ()
{
if (_dimension_computation_required) {
_body->component_size_changed ();
}
- return std::make_pair (_width, _height);
+ return make_pair (_width, _height);
}
-std::pair<std::string, double>
-PortMatrixComponent::display_port_name (cairo_t* cr, std::string const &n, double avail) const
+Gdk::Color
+PortMatrixComponent::background_colour ()
{
- /* XXX hopefully there exists a more efficient way of doing this */
-
- Glib::ustring name = Glib::ustring (n).uppercase ();
- bool abbreviated = false;
- uint32_t width = 0;
-
- while (1) {
- if (name.length() <= 2) {
- break;
+ return _matrix->get_style()->get_bg (Gtk::STATE_NORMAL);
+}
+
+/** @param g Group.
+ * @return Visible size of the group in grid units, taking visibility and show_only_bundles into account.
+ */
+uint32_t
+PortMatrixComponent::group_size (boost::shared_ptr<const PortGroup> g) const
+{
+ uint32_t s = 0;
+
+ PortGroup::BundleList const & bundles = g->bundles ();
+ if (_matrix->show_only_bundles()) {
+ s = bundles.size();
+ } else {
+ for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) {
+ s += _matrix->count_of_our_type ((*i)->bundle->nchannels());
}
+ }
+
+ return s;
+}
+
+/** @param bc Channel.
+ * @param groups List of groups.
+ * @return Position of bc in groups in grid units, taking show_only_bundles into account.
+ */
+uint32_t
+PortMatrixComponent::channel_to_position (ARDOUR::BundleChannel bc, boost::shared_ptr<const PortGroup> group) const
+{
+ uint32_t p = 0;
+
+ PortGroup::BundleList const & bundles = group->bundles ();
+
+ for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) {
+
+ if ((*i)->bundle == bc.bundle) {
+
+ /* found the bundle */
- cairo_text_extents_t ext;
- cairo_text_extents (cr, name.c_str(), &ext);
- if (ext.width < avail) {
- width = ext.width;
- break;
- }
+ if (_matrix->show_only_bundles()) {
+ return p;
+ } else {
+ return p + bc.channel;
+ }
- if (abbreviated) {
- name = name.substr (0, name.length() - 2) + ".";
+ }
+
+ /* move past this bundle */
+
+ if (_matrix->show_only_bundles()) {
+ p += 1;
} else {
- name = name.substr (0, name.length() - 1) + ".";
- abbreviated = true;
+ p += _matrix->count_of_our_type ((*i)->bundle->nchannels());
}
}
- return std::make_pair (name, width);
+ return 0;
+}
+
+
+ARDOUR::BundleChannel
+PortMatrixComponent::position_to_channel (double p, double, boost::shared_ptr<const PortGroup> group) const
+{
+ p /= grid_spacing ();
+
+ PortGroup::BundleList const & bundles = group->bundles ();
+ for (PortGroup::BundleList::const_iterator j = bundles.begin(); j != bundles.end(); ++j) {
+
+ if (_matrix->show_only_bundles()) {
+
+ if (p < 1) {
+ return ARDOUR::BundleChannel ((*j)->bundle, -1);
+ } else {
+ p -= 1;
+ }
+
+ } else {
+
+ uint32_t const s = _matrix->count_of_our_type ((*j)->bundle->nchannels());
+ if (p < s) {
+ return ARDOUR::BundleChannel ((*j)->bundle, p);
+ } else {
+ p -= s;
+ }
+
+ }
+
+ }
+
+ return ARDOUR::BundleChannel (boost::shared_ptr<ARDOUR::Bundle> (), -1);
}