Pin management dialog: re-layout, calc min. size
This commit is contained in:
parent
0989209cf0
commit
8ac55574d2
@ -38,8 +38,10 @@ using namespace Gtkmm2ext;
|
|||||||
|
|
||||||
PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
||||||
: ArdourWindow (string_compose (_("Pin Configuration: %1"), pi->name ()))
|
: ArdourWindow (string_compose (_("Pin Configuration: %1"), pi->name ()))
|
||||||
, _strict_io (_("Strict I/O"))
|
, _ind_strict_io (_("Strict I/O"))
|
||||||
, _automatic (_("Automatic"))
|
, _ind_customized (_("Customized"))
|
||||||
|
, _rst_config (_("Configuration"))
|
||||||
|
, _rst_mapping (_("Connections"))
|
||||||
, _add_plugin (_("+"))
|
, _add_plugin (_("+"))
|
||||||
, _del_plugin (_("-"))
|
, _del_plugin (_("-"))
|
||||||
, _add_output_audio (_("+"))
|
, _add_output_audio (_("+"))
|
||||||
@ -47,7 +49,8 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
|||||||
, _add_output_midi (_("+"))
|
, _add_output_midi (_("+"))
|
||||||
, _del_output_midi (_("-"))
|
, _del_output_midi (_("-"))
|
||||||
, _pi (pi)
|
, _pi (pi)
|
||||||
, _pin_box_size (4)
|
, _pin_box_size (8)
|
||||||
|
, _min_width (300)
|
||||||
, _position_valid (false)
|
, _position_valid (false)
|
||||||
, _ignore_updates (false)
|
, _ignore_updates (false)
|
||||||
{
|
{
|
||||||
@ -65,9 +68,11 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
|||||||
_plugin_connections, invalidator (*this), boost::bind (&PluginPinDialog::plugin_reconfigured, this), gui_context()
|
_plugin_connections, invalidator (*this), boost::bind (&PluginPinDialog::plugin_reconfigured, this), gui_context()
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO min. width depending on # of pins.
|
// needs a better way: insensitive indicators
|
||||||
darea.set_size_request(600, 200);
|
_ind_strict_io.set_sensitive (false); // track status
|
||||||
_strict_io.set_sensitive (false);
|
_ind_strict_io.set_name ("rude solo");
|
||||||
|
_ind_customized.set_sensitive (false); // plugin status
|
||||||
|
_ind_customized.set_name ("rude solo");
|
||||||
|
|
||||||
Label* l;
|
Label* l;
|
||||||
int r = 0;
|
int r = 0;
|
||||||
@ -78,6 +83,8 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
|||||||
l = manage (new Label (_("Track/Bus:"), ALIGN_END));
|
l = manage (new Label (_("Track/Bus:"), ALIGN_END));
|
||||||
t->attach (*l, 0, 1, r, r + 1);
|
t->attach (*l, 0, 1, r, r + 1);
|
||||||
l = manage (new Label ());
|
l = manage (new Label ());
|
||||||
|
l->set_alignment (ALIGN_START);
|
||||||
|
l->set_padding (2, 1);
|
||||||
l->set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
|
l->set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
|
||||||
l->set_width_chars (24);
|
l->set_width_chars (24);
|
||||||
l->set_max_width_chars (24);
|
l->set_max_width_chars (24);
|
||||||
@ -88,6 +95,8 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
|||||||
l = manage (new Label (_("Plugin:"), ALIGN_END));
|
l = manage (new Label (_("Plugin:"), ALIGN_END));
|
||||||
t->attach (*l, 0, 1, r, r + 1);
|
t->attach (*l, 0, 1, r, r + 1);
|
||||||
l = manage (new Label ());
|
l = manage (new Label ());
|
||||||
|
l->set_alignment(ALIGN_START);
|
||||||
|
l->set_padding (2, 1);
|
||||||
l->set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
|
l->set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
|
||||||
l->set_width_chars (24);
|
l->set_width_chars (24);
|
||||||
l->set_max_width_chars (24);
|
l->set_max_width_chars (24);
|
||||||
@ -95,10 +104,16 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
|||||||
t->attach (*l, 1, 3, r, r + 1);
|
t->attach (*l, 1, 3, r, r + 1);
|
||||||
++r;
|
++r;
|
||||||
|
|
||||||
l = manage (new Label (_("Settings:"), ALIGN_END));
|
l = manage (new Label (_("Status:"), ALIGN_END));
|
||||||
t->attach (*l, 0, 1, r, r + 1);
|
t->attach (*l, 0, 1, r, r + 1);
|
||||||
t->attach (_strict_io, 1, 2, r, r + 1, FILL, SHRINK);
|
t->attach (_ind_strict_io, 1, 2, r, r + 1, FILL, SHRINK);
|
||||||
t->attach (_automatic, 2, 3, r, r + 1, FILL, SHRINK);
|
t->attach (_ind_customized, 2, 3, r, r + 1, FILL, SHRINK);
|
||||||
|
++r;
|
||||||
|
|
||||||
|
l = manage (new Label (_("Reset:"), ALIGN_END));
|
||||||
|
t->attach (*l, 0, 1, r, r + 1);
|
||||||
|
t->attach (_rst_mapping, 1, 2, r, r + 1, FILL, SHRINK);
|
||||||
|
t->attach (_rst_config, 2, 3, r, r + 1, FILL, SHRINK);
|
||||||
++r;
|
++r;
|
||||||
|
|
||||||
l = manage (new Label (_("Instances:"), ALIGN_END));
|
l = manage (new Label (_("Instances:"), ALIGN_END));
|
||||||
@ -131,20 +146,22 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
|
|||||||
plugin_reconfigured ();
|
plugin_reconfigured ();
|
||||||
|
|
||||||
darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
|
darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
|
||||||
|
darea.signal_size_request().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_size_request));
|
||||||
darea.signal_size_allocate().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_size_allocate));
|
darea.signal_size_allocate().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_size_allocate));
|
||||||
darea.signal_expose_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_expose_event));
|
darea.signal_expose_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_expose_event));
|
||||||
darea.signal_button_press_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_button_press_event));
|
darea.signal_button_press_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_button_press_event));
|
||||||
darea.signal_button_release_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_button_release_event));
|
darea.signal_button_release_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_button_release_event));
|
||||||
darea.signal_motion_notify_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_motion_notify_event));
|
darea.signal_motion_notify_event().connect (sigc::mem_fun (*this, &PluginPinDialog::darea_motion_notify_event));
|
||||||
|
|
||||||
_automatic.signal_clicked.connect (sigc::mem_fun(*this, &PluginPinDialog::automatic_clicked));
|
_rst_mapping.signal_clicked.connect (sigc::mem_fun(*this, &PluginPinDialog::reset_mapping));
|
||||||
_add_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_plugin_clicked), true));
|
_rst_config.signal_clicked.connect (sigc::mem_fun(*this, &PluginPinDialog::reset_configuration));
|
||||||
_del_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_plugin_clicked), false));
|
_add_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_plugin_clicked), true));
|
||||||
|
_del_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_plugin_clicked), false));
|
||||||
|
|
||||||
_add_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::AUDIO));
|
_add_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::AUDIO));
|
||||||
_del_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::AUDIO));
|
_del_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::AUDIO));
|
||||||
_add_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::MIDI));
|
_add_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::MIDI));
|
||||||
_del_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::MIDI));
|
_del_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun(*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::MIDI));
|
||||||
}
|
}
|
||||||
|
|
||||||
PluginPinDialog::~PluginPinDialog()
|
PluginPinDialog::~PluginPinDialog()
|
||||||
@ -165,7 +182,20 @@ PluginPinDialog::plugin_reconfigured ()
|
|||||||
_del_plugin.set_sensitive (_n_plugins > 1);
|
_del_plugin.set_sensitive (_n_plugins > 1);
|
||||||
_del_output_audio.set_sensitive (_out.n_audio () > 0 && _out.n_total () > 1);
|
_del_output_audio.set_sensitive (_out.n_audio () > 0 && _out.n_total () > 1);
|
||||||
_del_output_midi.set_sensitive (_out.n_midi () > 0 && _out.n_total () > 1);
|
_del_output_midi.set_sensitive (_out.n_midi () > 0 && _out.n_total () > 1);
|
||||||
_strict_io.set_active (_pi->strict_io());
|
_ind_strict_io.set_active (_pi->strict_io());
|
||||||
|
_ind_customized.set_active (_pi->custom_cfg());
|
||||||
|
|
||||||
|
// calc minimum width
|
||||||
|
const uint32_t max_ports = std::max (_in.n_total (), _out.n_total ());
|
||||||
|
const uint32_t max_pins = std::max ((_sinks * _n_plugins).n_total (), (_sources * _n_plugins).n_total ());
|
||||||
|
uint32_t min_width = std::max (25 * max_ports, (uint32_t)(20 + _pin_box_size) * max_pins);
|
||||||
|
min_width = std::max (min_width, 40 * _n_plugins);
|
||||||
|
min_width = std::max ((uint32_t)300, min_width);
|
||||||
|
min_width = 10 * ceilf (min_width / 10.f);
|
||||||
|
if (min_width != _min_width) {
|
||||||
|
_min_width = min_width;
|
||||||
|
darea.queue_resize ();
|
||||||
|
}
|
||||||
|
|
||||||
update_elements ();
|
update_elements ();
|
||||||
}
|
}
|
||||||
@ -318,16 +348,6 @@ PluginPinDialog::draw_plugin_pin (cairo_t* cr, const CtrlWidget& w)
|
|||||||
cairo_fill (cr);
|
cairo_fill (cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
PluginPinDialog::is_valid_port (uint32_t i, uint32_t n_total, uint32_t n_midi, bool midi)
|
|
||||||
{
|
|
||||||
if (!midi) { i += n_midi; }
|
|
||||||
if (i >= n_total) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
double
|
||||||
PluginPinDialog::pin_x_pos (uint32_t i, double x0, double width, uint32_t n_total, uint32_t n_midi, bool midi)
|
PluginPinDialog::pin_x_pos (uint32_t i, double x0, double width, uint32_t n_total, uint32_t n_midi, bool midi)
|
||||||
{
|
{
|
||||||
@ -339,9 +359,10 @@ void
|
|||||||
PluginPinDialog::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool dashed)
|
PluginPinDialog::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool dashed)
|
||||||
{
|
{
|
||||||
const double bz = 2 * _pin_box_size;
|
const double bz = 2 * _pin_box_size;
|
||||||
|
const double bc = dashed ? 1.25 * _pin_box_size : 0;
|
||||||
|
|
||||||
cairo_move_to (cr, x0, y0);
|
cairo_move_to (cr, x0, y0);
|
||||||
cairo_curve_to (cr, x0, y0 + bz, x1, y1 - bz, x1, y1);
|
cairo_curve_to (cr, x0 - bc, y0 + bz, x1 - bc, y1 - bz, x1, y1);
|
||||||
cairo_set_line_width (cr, 3.0);
|
cairo_set_line_width (cr, 3.0);
|
||||||
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
|
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
|
||||||
cairo_set_source_rgb (cr, 1, 0, 0);
|
cairo_set_source_rgb (cr, 1, 0, 0);
|
||||||
@ -419,9 +440,6 @@ PluginPinDialog::darea_expose_event (GdkEventExpose* ev)
|
|||||||
for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
|
for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
|
||||||
uint32_t pn = (*c).first; // pin
|
uint32_t pn = (*c).first; // pin
|
||||||
uint32_t pb = (*c).second;
|
uint32_t pb = (*c).second;
|
||||||
if (!is_valid_port (pb, pc_in, pc_in_midi, is_midi)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
double c_x0 = pin_x_pos (pb, 0, width, pc_in, pc_in_midi, is_midi);
|
double c_x0 = pin_x_pos (pb, 0, width, pc_in, pc_in_midi, is_midi);
|
||||||
double c_x1 = pin_x_pos (pn, x0 - bxw2, bxw, _sinks.n_total (), _sinks.n_midi (), is_midi);
|
double c_x1 = pin_x_pos (pn, x0 - bxw2, bxw, _sinks.n_total (), _sinks.n_midi (), is_midi);
|
||||||
draw_connection (cr, c_x0, c_x1, y_in, yc - bxh2 - _pin_box_size, is_midi);
|
draw_connection (cr, c_x0, c_x1, y_in, yc - bxh2 - _pin_box_size, is_midi);
|
||||||
@ -433,9 +451,6 @@ PluginPinDialog::darea_expose_event (GdkEventExpose* ev)
|
|||||||
for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
|
for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
|
||||||
uint32_t pn = (*c).first; // pin
|
uint32_t pn = (*c).first; // pin
|
||||||
uint32_t pb = (*c).second;
|
uint32_t pb = (*c).second;
|
||||||
if (!is_valid_port (pb, pc_out, pc_out_midi, is_midi)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
double c_x0 = pin_x_pos (pn, x0 - bxw2, bxw, _sources.n_total (), _sources.n_midi (), is_midi);
|
double c_x0 = pin_x_pos (pn, x0 - bxw2, bxw, _sources.n_total (), _sources.n_midi (), is_midi);
|
||||||
double c_x1 = pin_x_pos (pb, 0, width, pc_out, pc_out_midi, is_midi);
|
double c_x1 = pin_x_pos (pb, 0, width, pc_out, pc_out_midi, is_midi);
|
||||||
draw_connection (cr, c_x0, c_x1, yc + bxh2 + _pin_box_size, y_out, is_midi);
|
draw_connection (cr, c_x0, c_x1, yc + bxh2 + _pin_box_size, y_out, is_midi);
|
||||||
@ -461,6 +476,13 @@ PluginPinDialog::darea_expose_event (GdkEventExpose* ev)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PluginPinDialog::darea_size_request (Gtk::Requisition* req)
|
||||||
|
{
|
||||||
|
req->width = _min_width;
|
||||||
|
req->height = 200;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PluginPinDialog::darea_size_allocate (Gtk::Allocation&)
|
PluginPinDialog::darea_size_allocate (Gtk::Allocation&)
|
||||||
{
|
{
|
||||||
@ -579,7 +601,7 @@ PluginPinDialog::handle_input_action (const CtrlElem &s, const CtrlElem &i)
|
|||||||
void
|
void
|
||||||
PluginPinDialog::handle_output_action (const CtrlElem &s, const CtrlElem &o)
|
PluginPinDialog::handle_output_action (const CtrlElem &s, const CtrlElem &o)
|
||||||
{
|
{
|
||||||
const int pc = s->ip;
|
const uint32_t pc = s->ip;
|
||||||
bool valid;
|
bool valid;
|
||||||
ChanMapping out_map (_pi->output_map (pc));
|
ChanMapping out_map (_pi->output_map (pc));
|
||||||
uint32_t idx = out_map.get (s->dt, s->id, &valid);
|
uint32_t idx = out_map.get (s->dt, s->id, &valid);
|
||||||
@ -619,11 +641,17 @@ PluginPinDialog::handle_output_action (const CtrlElem &s, const CtrlElem &o)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PluginPinDialog::automatic_clicked ()
|
PluginPinDialog::reset_configuration ()
|
||||||
{
|
{
|
||||||
_route()->reset_plugin_insert (_pi);
|
_route()->reset_plugin_insert (_pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PluginPinDialog::reset_mapping ()
|
||||||
|
{
|
||||||
|
_pi->reset_map ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PluginPinDialog::add_remove_plugin_clicked (bool add)
|
PluginPinDialog::add_remove_plugin_clicked (bool add)
|
||||||
{
|
{
|
||||||
|
@ -76,8 +76,10 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
Gtk::DrawingArea darea;
|
Gtk::DrawingArea darea;
|
||||||
ArdourButton _strict_io;
|
ArdourButton _ind_strict_io;
|
||||||
ArdourButton _automatic;
|
ArdourButton _ind_customized;
|
||||||
|
ArdourButton _rst_config;
|
||||||
|
ArdourButton _rst_mapping;
|
||||||
ArdourButton _add_plugin;
|
ArdourButton _add_plugin;
|
||||||
ArdourButton _del_plugin;
|
ArdourButton _del_plugin;
|
||||||
ArdourButton _add_output_audio;
|
ArdourButton _add_output_audio;
|
||||||
@ -89,6 +91,7 @@ private:
|
|||||||
void update_elements ();
|
void update_elements ();
|
||||||
void update_element_pos ();
|
void update_element_pos ();
|
||||||
|
|
||||||
|
void darea_size_request (Gtk::Requisition*);
|
||||||
void darea_size_allocate (Gtk::Allocation&);
|
void darea_size_allocate (Gtk::Allocation&);
|
||||||
bool darea_expose_event (GdkEventExpose*);
|
bool darea_expose_event (GdkEventExpose*);
|
||||||
bool darea_motion_notify_event (GdkEventMotion*);
|
bool darea_motion_notify_event (GdkEventMotion*);
|
||||||
@ -100,10 +103,10 @@ private:
|
|||||||
|
|
||||||
void set_color (cairo_t*, bool);
|
void set_color (cairo_t*, bool);
|
||||||
double pin_x_pos (uint32_t, double, double, uint32_t, uint32_t, bool);
|
double pin_x_pos (uint32_t, double, double, uint32_t, uint32_t, bool);
|
||||||
bool is_valid_port (uint32_t, uint32_t, uint32_t, bool);
|
|
||||||
void draw_connection (cairo_t*, double, double, double, double, bool, bool dashed = false);
|
void draw_connection (cairo_t*, double, double, double, double, bool, bool dashed = false);
|
||||||
|
|
||||||
void automatic_clicked ();
|
void reset_mapping ();
|
||||||
|
void reset_configuration ();
|
||||||
void add_remove_plugin_clicked (bool);
|
void add_remove_plugin_clicked (bool);
|
||||||
void add_remove_port_clicked (bool, ARDOUR::DataType);
|
void add_remove_port_clicked (bool, ARDOUR::DataType);
|
||||||
void handle_input_action (const CtrlElem &, const CtrlElem &);
|
void handle_input_action (const CtrlElem &, const CtrlElem &);
|
||||||
@ -118,6 +121,7 @@ private:
|
|||||||
|
|
||||||
double _pin_box_size;
|
double _pin_box_size;
|
||||||
double _width, _height;
|
double _width, _height;
|
||||||
|
double _min_width;
|
||||||
bool _position_valid;
|
bool _position_valid;
|
||||||
bool _ignore_updates;
|
bool _ignore_updates;
|
||||||
ARDOUR::Route* _route () { return static_cast<ARDOUR::Route*> (_pi->owner ()); }
|
ARDOUR::Route* _route () { return static_cast<ARDOUR::Route*> (_pi->owner ()); }
|
||||||
|
Loading…
Reference in New Issue
Block a user