diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-20 16:34:45 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-20 16:34:52 -0400 |
commit | 492596756091b4be798c83b2b393736688ed74d8 (patch) | |
tree | 971ac9170fc1b571a7ff84a1cdfd6e02b7163b67 /gtk2_ardour/rc_option_editor.cc | |
parent | 235c1f9adbadc874b0c8b6a23b54af5942bc0e04 (diff) |
use new API for user-provided MIDI port information
Diffstat (limited to 'gtk2_ardour/rc_option_editor.cc')
-rw-r--r-- | gtk2_ardour/rc_option_editor.cc | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index f5a378b3cd..8379a31ddd 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1883,13 +1883,23 @@ class MidiPortOptions : public OptionEditorBox, public sigc::trackable void on_show () { refill (); - AudioEngine::instance()->PortRegisteredOrUnregistered.connect (port_connection, + + AudioEngine::instance()->PortRegisteredOrUnregistered.connect (connections, invalidator (*this), boost::bind (&MidiPortOptions::refill, this), gui_context()); + AudioEngine::instance()->MidiPortInfoChanged.connect (connections, + invalidator (*this), + boost::bind (&MidiPortOptions::refill, this), + gui_context()); + AudioEngine::instance()->MidiSelectionPortsChanged.connect (connections, + invalidator (*this), + boost::bind (&MidiPortOptions::refill, this), + gui_context()); } void refill () { + if (refill_midi_ports (true, midi_input_view)) { input_label.show (); } else { @@ -1903,14 +1913,13 @@ class MidiPortOptions : public OptionEditorBox, public sigc::trackable } private: - PBD::ScopedConnection port_connection; + PBD::ScopedConnectionList connections; /* MIDI port management */ struct MidiPortColumns : public Gtk::TreeModel::ColumnRecord { MidiPortColumns () { add (pretty_name); - add (in_use); add (music_data); add (control_data); add (selection); @@ -1919,7 +1928,6 @@ class MidiPortOptions : public OptionEditorBox, public sigc::trackable } Gtk::TreeModelColumn<std::string> pretty_name; - Gtk::TreeModelColumn<bool> in_use; Gtk::TreeModelColumn<bool> music_data; Gtk::TreeModelColumn<bool> control_data; Gtk::TreeModelColumn<bool> selection; @@ -1936,7 +1944,6 @@ class MidiPortOptions : public OptionEditorBox, public sigc::trackable void setup_midi_port_view (Gtk::TreeView&, bool with_selection); bool refill_midi_ports (bool for_input, Gtk::TreeView&); void pretty_name_edit (std::string const & path, std::string const & new_text, Gtk::TreeView*); - void midi_use_column_toggled (std::string const & path, Gtk::TreeView*); void midi_music_column_toggled (std::string const & path, Gtk::TreeView*); void midi_control_column_toggled (std::string const & path, Gtk::TreeView*); void midi_selection_column_toggled (std::string const & path, Gtk::TreeView*); @@ -1946,7 +1953,6 @@ void MidiPortOptions::setup_midi_port_view (Gtk::TreeView& view, bool with_selection) { int pretty_name_column; - int use_column; int music_column; int control_column; int selection_column; @@ -1955,14 +1961,6 @@ MidiPortOptions::setup_midi_port_view (Gtk::TreeView& view, bool with_selection) pretty_name_column = view.append_column_editable (_("Name (click to edit)"), midi_port_columns.pretty_name) - 1; - col = manage (new TreeViewColumn ("", midi_port_columns.in_use)); - col->set_alignment (ALIGN_CENTER); - l = manage (new Label (_("Use"))); - set_tooltip (*l, string_compose (_("If ticked, %1 will use this port.\n\nOtherwise, the port will be ignored."), PROGRAM_NAME)); - col->set_widget (*l); - l->show (); - use_column = view.append_column (*col) - 1; - col = manage (new TreeViewColumn ("", midi_port_columns.music_data)); col->set_alignment (ALIGN_CENTER); l = manage (new Label (_("Music Data"))); @@ -1997,10 +1995,6 @@ MidiPortOptions::setup_midi_port_view (Gtk::TreeView& view, bool with_selection) CellRendererToggle* toggle_cell; - toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (use_column)); - toggle_cell->property_activatable() = true; - toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_use_column_toggled), &view)); - toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (music_column)); toggle_cell->property_activatable() = true; toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_music_column_toggled), &view)); @@ -2016,7 +2010,7 @@ MidiPortOptions::setup_midi_port_view (Gtk::TreeView& view, bool with_selection) } view.get_selection()->set_mode (SELECTION_NONE); - view.set_tooltip_column (5); /* port "real" name */ + view.set_tooltip_column (4); /* port "real" name */ } bool @@ -2026,7 +2020,7 @@ MidiPortOptions::refill_midi_ports (bool for_input, Gtk::TreeView& view) std::vector<string> ports; - AudioEngine::instance()->get_ports (string(), DataType::MIDI, for_input ? IsOutput : IsInput, ports); + AudioEngine::instance()->get_known_midi_ports (ports); if (ports.empty()) { view.hide (); @@ -2041,22 +2035,33 @@ MidiPortOptions::refill_midi_ports (bool for_input, Gtk::TreeView& view) continue; } + PortManager::MidiPortInformation mpi (AudioEngine::instance()->midi_port_information (*s)); + + if (mpi.pretty_name.empty()) { + /* vanished since get_known_midi_ports() */ + continue; + } + + if (for_input != mpi.input) { + continue; + } + TreeModel::Row row = *(model->append()); - string pretty = AudioEngine::instance()->get_pretty_name_by_name (*s); - row[midi_port_columns.pretty_name] = (pretty.empty() ? *s : pretty); - row[midi_port_columns.in_use] = true; - row[midi_port_columns.music_data] = true; - row[midi_port_columns.control_data] = true; + row[midi_port_columns.pretty_name] = mpi.pretty_name; + row[midi_port_columns.music_data] = mpi.properties & MidiPortMusic; + row[midi_port_columns.control_data] = mpi.properties & MidiPortControl; + row[midi_port_columns.selection] = mpi.properties & MidiPortSelection; row[midi_port_columns.name] = *s; } view.set_model (model); + return true; } void -MidiPortOptions::midi_use_column_toggled (string const & path, TreeView* view) +MidiPortOptions::midi_music_column_toggled (string const & path, TreeView* view) { TreeIter iter = view->get_model()->get_iter (path); @@ -2064,22 +2069,15 @@ MidiPortOptions::midi_use_column_toggled (string const & path, TreeView* view) return; } - bool value ((*iter)[midi_port_columns.in_use]); - (*iter)[midi_port_columns.in_use] = !value; - -} + bool new_value = ! bool ((*iter)[midi_port_columns.music_data]); -void -MidiPortOptions::midi_music_column_toggled (string const & path, TreeView* view) -{ - TreeIter iter = view->get_model()->get_iter (path); + /* don't reset model - wait for MidiPortInfoChanged signal */ - if (!iter) { - return; + if (new_value) { + ARDOUR::AudioEngine::instance()->add_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortMusic); + } else { + ARDOUR::AudioEngine::instance()->remove_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortMusic); } - - bool value ((*iter)[midi_port_columns.music_data]); - (*iter)[midi_port_columns.music_data] = !value; } void @@ -2091,13 +2089,14 @@ MidiPortOptions::midi_control_column_toggled (string const & path, TreeView* vie return; } - bool value ((*iter)[midi_port_columns.control_data]); - (*iter)[midi_port_columns.control_data] = !value; + bool new_value = ! bool ((*iter)[midi_port_columns.control_data]); - if (!value) { - // ARDOUR::AudioEngine::instance()->remove_port_purpose (PortFlags (ControlData)); + /* don't reset model - wait for MidiPortInfoChanged signal */ + + if (new_value) { + ARDOUR::AudioEngine::instance()->add_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortControl); } else { - // ARDOUR::AudioEngine::instance()->add_port_purpose (PortFlags (ControlData)); + ARDOUR::AudioEngine::instance()->remove_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortControl); } } @@ -2109,13 +2108,15 @@ MidiPortOptions::midi_selection_column_toggled (string const & path, TreeView* v if (!iter) { return; } - bool value ((*iter)[midi_port_columns.selection]); - (*iter)[midi_port_columns.selection] = !value; - if (!value) { - ARDOUR::AudioEngine::instance()->add_to_midi_selection_ports ((*iter)[midi_port_columns.name]); + bool new_value = ! bool ((*iter)[midi_port_columns.selection]); + + /* don't reset model - wait for MidiSelectionPortsChanged signal */ + + if (new_value) { + ARDOUR::AudioEngine::instance()->add_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortSelection); } else { - ARDOUR::AudioEngine::instance()->remove_from_midi_selection_ports ((*iter)[midi_port_columns.name]); + ARDOUR::AudioEngine::instance()->remove_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortSelection); } } |