#include "ardour/rc_configuration.h"
#include "ardour/control_protocol_manager.h"
#include "control_protocol/control_protocol.h"
+
+#include "gui_thread.h"
+#include "midi_tracer.h"
#include "rc_option_editor.h"
#include "utils.h"
#include "midi_port_dialog.h"
private:
+ typedef std::map<MIDI::Port*,MidiTracer*> PortTraceMap;
+ PortTraceMap port_input_trace_map;
+ PortTraceMap port_output_trace_map;
+
void model_changed (TreeModel::Path const &, TreeModel::iterator const & i)
{
TreeModel::Row r = *i;
}
if (r[_model.trace_input] != port->input()->tracing()) {
- port->input()->trace (r[_model.trace_input], &cerr, string (port->name()) + _(" input: "));
+ PortTraceMap::iterator x = port_input_trace_map.find (port);
+ MidiTracer* mt;
+
+ if (x == port_input_trace_map.end()) {
+ mt = new MidiTracer (port->name() + string (" [input]"), *port->input());
+ port_input_trace_map.insert (pair<MIDI::Port*,MidiTracer*> (port, mt));
+ } else {
+ mt = x->second;
+ }
+ mt->present ();
}
}
if (port->output()) {
if (r[_model.trace_output] != port->output()->tracing()) {
- port->output()->trace (r[_model.trace_output], &cerr, string (port->name()) + _(" output: "));
+ PortTraceMap::iterator x = port_output_trace_map.find (port);
+ MidiTracer* mt;
+
+ if (x == port_output_trace_map.end()) {
+ mt = new MidiTracer (port->name() + string (" [output]"), *port->output());
+ port_output_trace_map.insert (pair<MIDI::Port*,MidiTracer*> (port, mt));
+ } else {
+ mt = x->second;
+ }
+ mt->present ();
}
}
MIDI::Manager::PortList const & ports = MIDI::Manager::instance()->get_midi_ports ();
_store->clear ();
+ port_connections.drop_connections ();
for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) {
if ((*i)->input()) {
r[_model.online] = !(*i)->input()->offline();
- (*i)->input()->OfflineStatusChanged.connect (sigc::bind (sigc::mem_fun (*this, &MIDIPorts::port_offline_changed), (*i)));
+ (*i)->input()->OfflineStatusChanged.connect (port_connections, boost::bind (&MIDIPorts::port_offline_changed, this, (*i)), gui_context());
r[_model.trace_input] = (*i)->input()->tracing();
}
ComboBoxText _mmc_combo;
ComboBoxText _mpc_combo;
list<ComboOption<string>* > _port_combos;
+ PBD::ScopedConnectionList port_connections;
};
class ControlSurfacesOptions : public OptionEditorBox
{
public:
- ControlSurfacesOptions ()
+ ControlSurfacesOptions (ArdourDialog& parent)
+ : _parent (parent)
{
_store = ListStore::create (_model);
_view.set_model (_store);
_box->pack_start (_view, false, false);
+ Label* label = manage (new Label);
+ label->set_markup (string_compose (X_("<i>%1</i>"), _("Double-click on a name to edit settings for an enabled protocol")));
+
+ _box->pack_start (*label, false, false);
+ label->show ();
+
_store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::model_changed));
+ _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked));
}
void parameter_changed (std::string const &)
}
}
+ void edit_clicked (GdkEventButton* ev)
+ {
+ if (ev->type != GDK_2BUTTON_PRESS) {
+ return;
+ }
+
+ std::string name;
+ ControlProtocolInfo* cpi;
+ TreeModel::Row row;
+
+ row = *(_view.get_selection()->get_selected());
+
+ Window* win = row[_model.editor];
+ if (win && !win->is_visible()) {
+ win->present ();
+ } else {
+ cpi = row[_model.protocol_info];
+
+ if (cpi && cpi->protocol && cpi->protocol->has_editor ()) {
+ Box* box = (Box*) cpi->protocol->get_gui ();
+ if (box) {
+ string title = row[_model.name];
+ ArdourDialog* win = new ArdourDialog (_parent, title);
+ win->get_vbox()->pack_start (*box, false, false);
+ box->show ();
+ win->present ();
+ row[_model.editor] = win;
+ }
+ }
+ }
+ }
+
class ControlSurfacesModelColumns : public TreeModelColumnRecord
{
public:
add (enabled);
add (feedback);
add (protocol_info);
+ add (editor);
}
TreeModelColumn<string> name;
TreeModelColumn<bool> enabled;
TreeModelColumn<bool> feedback;
TreeModelColumn<ControlProtocolInfo*> protocol_info;
+ TreeModelColumn<Gtk::Window*> editor;
};
Glib::RefPtr<ListStore> _store;
ControlSurfacesModelColumns _model;
TreeView _view;
+ Gtk::Window& _parent;
};
add_option (_("MIDI control"), *i);
}
+ add_option (_("MIDI control"),
+ new BoolOption (
+ "send-mtc",
+ _("Send MIDI Time Code"),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::get_send_mtc),
+ sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc)
+ ));
+
add_option (_("MIDI control"),
new BoolOption (
"mmc-control",
/* CONTROL SURFACES */
- add_option (_("Control surfaces"), new ControlSurfacesOptions);
+ add_option (_("Control surfaces"), new ControlSurfacesOptions (*this));
ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
"remote-model",