diff --git a/gtk2_ardour/plugin_pin_dialog.cc b/gtk2_ardour/plugin_pin_dialog.cc index 961bf550a8..fc63dfbde0 100644 --- a/gtk2_ardour/plugin_pin_dialog.cc +++ b/gtk2_ardour/plugin_pin_dialog.cc @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016-2018 Robin Gareus + * Copyright (C) 2016-2023 Robin Gareus * * 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 @@ -395,7 +395,7 @@ PluginPinWidget::plugin_reconfigured () ++_n_inputs; } - CtrlWidget cw (CtrlWidget ("", Input, dt, id, 0, sidechain)); + CtrlWidget cw (CtrlWidget ("", Input, dt, id, 0, 0, sidechain)); _elements.push_back (cw); } @@ -413,14 +413,14 @@ PluginPinWidget::plugin_reconfigured () DataType dt (i < _sinks.n_midi () ? DataType::MIDI : DataType::AUDIO); int idx = (dt == DataType::MIDI) ? i : i - _sinks.n_midi (); const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, true, idx)); - CtrlWidget cw (CtrlWidget (iod.name, Sink, dt, idx, n, iod.is_sidechain)); + CtrlWidget cw (CtrlWidget (iod.name, Sink, dt, idx, n, iod.bus_number, iod.is_sidechain)); _elements.push_back (cw); } for (uint32_t i = 0; i < _sources.n_total (); ++i) { DataType dt (i < _sources.n_midi () ? DataType::MIDI : DataType::AUDIO); int idx = (dt == DataType::MIDI) ? i : i - _sources.n_midi (); const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, false, idx)); - _elements.push_back (CtrlWidget (iod.name, Source, dt, idx, n)); + _elements.push_back (CtrlWidget (iod.name, Source, dt, idx, n, iod.bus_number)); } _in_map[n] = _pi->input_map (n); _out_map[n] = _pi->output_map (n); @@ -744,7 +744,7 @@ PluginPinWidget::update_element_pos () } void -PluginPinWidget::set_color (cairo_t* cr, bool midi) +PluginPinWidget::set_color (cairo_t* cr, bool midi) const { // see also gtk2_ardour/processor_box.cc static const uint32_t audio_port_color = 0x4A8A0EFF; // Green @@ -764,7 +764,7 @@ PluginPinWidget::set_color (cairo_t* cr, bool midi) } void -PluginPinWidget::draw_io_pin (cairo_t* cr, const CtrlWidget& w) +PluginPinWidget::draw_io_pin (cairo_t* cr, const CtrlWidget& w) const { if (w.e->sc) { const double dy = w.h * .5; @@ -860,6 +860,19 @@ PluginPinWidget::draw_plugin_pin (cairo_t* cr, const CtrlWidget& w) } } +void +PluginPinWidget::draw_plugin_bus (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1) const +{ + const double dy = w0.h * .5; + rounded_top_rectangle (cr, w0.x - 1, w0.y - dy, 2 + w1.x + w0.w - w0.x, w0.h, 7); + + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, .4, .4, .4); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, .6, .6, .6); + cairo_fill (cr); +} + double PluginPinWidget::pin_x_pos (uint32_t i, double x0, double width, uint32_t n_total, uint32_t n_midi, bool midi) { @@ -913,7 +926,7 @@ PluginPinWidget::edge_coordinates (const CtrlWidget& w, double &x, double &y) } void -PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool horiz, bool dashed) +PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool horiz, bool dashed) const { const double bz = 2 * _pin_box_size; double bc = (dashed && x0 == x1) ? 1.25 * _pin_box_size : 0; @@ -940,7 +953,7 @@ PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, } void -PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1, bool dashed) +PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1, bool dashed) const { double x0, x1, y0, y1; edge_coordinates (w0, x0, y0); @@ -949,6 +962,36 @@ PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlW draw_connection (cr, x0, x1, y0, y1, w0.e->dt == DataType::MIDI, w0.e->sc, dashed); } +void +PluginPinWidget::draw_bus_groups (cairo_t* cr, const CtrlType t) const +{ + uint32_t bcnt = 0; + CtrlWidget const* g_start = NULL; + CtrlWidget const* g_prev = NULL; + + for (auto const& i : _elements) { + if (i.e->ct != t || i.e->dt != DataType::AUDIO) { + continue; + } + if (!g_start) { + g_start = &i; + } else if (i.e->bn > g_start->e->bn) { + if (bcnt > 0) { + assert (g_start && g_prev); + draw_plugin_bus (cr, *g_start, *g_prev); + } + g_start = &i; + bcnt = 0; + } else { + ++bcnt; + } + g_prev = &i; + } + if (bcnt > 0 && g_start->e->bn > 0) { + assert (g_start && g_prev); + draw_plugin_bus (cr, *g_start, *g_prev); + } +} bool PluginPinWidget::darea_expose_event (GdkEventExpose* ev) @@ -1102,6 +1145,9 @@ PluginPinWidget::darea_expose_event (GdkEventExpose* ev) } } + draw_bus_groups (cr, Sink); + draw_bus_groups (cr, Source); + /* pins and ports */ for (CtrlElemList::const_iterator i = _elements.begin (); i != _elements.end (); ++i) { switch (i->e->ct) { @@ -1111,7 +1157,7 @@ PluginPinWidget::darea_expose_event (GdkEventExpose* ev) break; case Sink: case Source: - draw_plugin_pin (cr, *i); + draw_plugin_pin (cr, *i); // XXX color by bus break; } } diff --git a/gtk2_ardour/plugin_pin_dialog.h b/gtk2_ardour/plugin_pin_dialog.h index 9ae152c046..bee3533262 100644 --- a/gtk2_ardour/plugin_pin_dialog.h +++ b/gtk2_ardour/plugin_pin_dialog.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016-2018 Robin Gareus + * Copyright (C) 2016-2023 Robin Gareus * * 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 @@ -58,22 +58,23 @@ private: } CtrlType; struct _CtrlElem { - _CtrlElem (CtrlType c, ARDOUR::DataType d, uint32_t i, uint32_t p, bool s) - : ct (c), dt (d), id (i), ip (p), sc (s) {} + _CtrlElem (CtrlType c, ARDOUR::DataType d, uint32_t i, uint32_t p, uint32_t b, bool s) + : ct (c), dt (d), id (i), ip (p), bn (b), sc (s) {} CtrlType ct; ARDOUR::DataType dt; uint32_t id; // port/pin ID uint32_t ip; // plugin ID (for Sink, Source only); + uint32_t bn; // bus-number bool sc; // sidechain }; typedef boost::shared_ptr<_CtrlElem> CtrlElem; struct CtrlWidget { - CtrlWidget (const std::string& n, CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0, bool sc = false) + CtrlWidget (const std::string& n, CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0, uint32_t bn = 0, bool sc = false) : name (n), x(0), y(0), w (0), h (0), prelight (false) { - e = CtrlElem (new _CtrlElem (ct, dt, id, ip, sc)); + e = CtrlElem (new _CtrlElem (ct, dt, id, ip, bn, sc)); } std::string name; double x,y; @@ -137,13 +138,15 @@ private: void start_drag (const CtrlElem&, double, double); - void draw_io_pin (cairo_t*, const CtrlWidget&); + void draw_io_pin (cairo_t*, const CtrlWidget&) const; void draw_plugin_pin (cairo_t*, const CtrlWidget&); + void draw_plugin_bus (cairo_t*, const CtrlWidget&, const CtrlWidget&) const; - void set_color (cairo_t*, bool); + void set_color (cairo_t*, bool) const; double pin_x_pos (uint32_t, double, double, uint32_t, uint32_t, bool); - void draw_connection (cairo_t*, double, double, double, double, bool, bool, bool dashed = false); - void draw_connection (cairo_t*, const CtrlWidget&, const CtrlWidget&, bool dashed = false); + void draw_connection (cairo_t*, double, double, double, double, bool, bool, bool dashed = false) const; + void draw_connection (cairo_t*, const CtrlWidget&, const CtrlWidget&, bool dashed = false) const; + void draw_bus_groups (cairo_t*, const CtrlType) const; const CtrlWidget& get_io_ctrl (CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0) const; static void edge_coordinates (const CtrlWidget& w, double &x, double &y);