X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fplugin_ui.cc;h=9be3d50841be6f13296cc6c8ee2fa0358e7da35e;hb=84b4dd94e34afea47dcb6b411215d5b86f112e25;hp=c51566614d10cdec812f32674f831118e9e829c0;hpb=3975355a5f7f2d795a369b091972051a50b9f331;p=ardour.git diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index c51566614d..9be3d50841 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -48,6 +48,7 @@ #include "ardour/ladspa_plugin.h" #ifdef VST_SUPPORT #include "ardour/vst_plugin.h" +#include "vst_pluginui.h" #endif #ifdef HAVE_SLV2 #include "ardour/lv2_plugin.h" @@ -67,7 +68,6 @@ #include "latency_gui.h" #include "plugin_eq_gui.h" #include "new_plugin_preset_dialog.h" -#include "edit_plugin_presets_dialog.h" #include "i18n.h" @@ -217,7 +217,8 @@ PluginUIWindow::on_show () set_role("plugin_ui"); if (_pluginui) { - _pluginui->update_presets (); + _pluginui->update_preset_list (); + _pluginui->update_preset (); } if (_pluginui) { @@ -244,7 +245,6 @@ PluginUIWindow::on_hide () void PluginUIWindow::set_title(const std::string& title) { - //cout << "PluginUIWindow::set_title(\"" << title << "\"" << endl; Gtk::Window::set_title(title); _title = title; } @@ -367,15 +367,23 @@ PluginUIWindow::on_key_press_event (GdkEventKey* event) } return true; } else { - if (_pluginui->non_gtk_gui()) { - /* pass editor window as the window for the event - to be handled in, not this one, because there are - no widgets in this window that we want to have - key focus. - */ - return relay_key_press (event, &PublicEditor::instance()); + /* for us to be getting key press events, there really + MUST be a _pluginui, but just to be safe, check ... + */ + + if (_pluginui) { + if (_pluginui->non_gtk_gui()) { + /* pass editor window as the window for the event + to be handled in, not this one, because there are + no widgets in this window that we want to have + key focus. + */ + return relay_key_press (event, &PublicEditor::instance()); + } else { + return relay_key_press (event, this); + } } else { - return relay_key_press (event, this); + return false; } } } @@ -413,24 +421,32 @@ PluginUIWindow::plugin_going_away () PlugUIBase::PlugUIBase (boost::shared_ptr pi) : insert (pi), plugin (insert->plugin()), - save_button (_("Add")), - edit_button (_("Edit")), + add_button (_("Add")), + save_button (_("Save")), + delete_button (_("Delete")), bypass_button (_("Bypass")), latency_gui (0), plugin_analysis_expander (_("Plugin analysis")) { - //preset_combo.set_use_arrows_always(true); - update_presets(); - preset_combo.set_size_request (100, -1); - preset_combo.set_active_text (""); - preset_combo.signal_changed().connect(sigc::mem_fun(*this, &PlugUIBase::setting_selected)); - no_load_preset = false; + _preset_combo.set_size_request (100, -1); + _preset_modified.set_size_request (16, -1); + _preset_combo.signal_changed().connect(sigc::mem_fun(*this, &PlugUIBase::preset_selected)); + _no_load_preset = 0; + + _preset_box.pack_start (_preset_combo); + _preset_box.pack_start (_preset_modified); + + update_preset_list (); + update_preset (); + + add_button.set_name ("PluginAddButton"); + add_button.signal_clicked().connect (sigc::mem_fun (*this, &PlugUIBase::add_plugin_setting)); save_button.set_name ("PluginSaveButton"); save_button.signal_clicked().connect(sigc::mem_fun(*this, &PlugUIBase::save_plugin_setting)); - edit_button.set_name ("PluginEditButton"); - edit_button.signal_clicked().connect (sigc::mem_fun (*this, &PlugUIBase::edit_plugin_settings)); + delete_button.set_name ("PluginDeleteButton"); + delete_button.signal_clicked().connect (sigc::mem_fun (*this, &PlugUIBase::delete_plugin_setting)); insert->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&PlugUIBase::processor_active_changed, this, boost::weak_ptr(insert)), gui_context()); @@ -458,8 +474,10 @@ PlugUIBase::PlugUIBase (boost::shared_ptr pi) insert->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PlugUIBase::plugin_going_away, this), gui_context()); - plugin->PresetAdded.connect (preset_added_connection, invalidator (*this), boost::bind (&PlugUIBase::update_presets, this), gui_context ()); - plugin->PresetRemoved.connect (preset_removed_connection, invalidator (*this), boost::bind (&PlugUIBase::update_presets, this), gui_context ()); + plugin->PresetAdded.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::preset_added_or_removed, this), gui_context ()); + plugin->PresetRemoved.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::preset_added_or_removed, this), gui_context ()); + plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::update_preset, this), gui_context ()); + plugin->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::parameter_changed, this, _1, _2), gui_context ()); } PlugUIBase::~PlugUIBase() @@ -479,17 +497,18 @@ PlugUIBase::plugin_going_away () void PlugUIBase::set_latency_label () { - char buf[64]; framecnt_t const l = insert->effective_latency (); framecnt_t const sr = insert->session().frame_rate (); + string t; + if (l < sr / 1000) { - snprintf (buf, sizeof (buf), "latency (%" PRId64 " samples)", l); + t = string_compose (_("latency (%1 samples)"), l); } else { - snprintf (buf, sizeof (buf), "latency (%.2f msecs)", (float) l / ((float) sr / 1000.0f)); + t = string_compose (_("latency (%1 ms)"), (float) l / ((float) sr / 1000.0f)); } - latency_label.set_text (buf); + latency_label.set_text (t); } void @@ -516,25 +535,25 @@ PlugUIBase::processor_active_changed (boost::weak_ptr weak_p) } void -PlugUIBase::setting_selected() +PlugUIBase::preset_selected () { - if (no_load_preset) { + if (_no_load_preset) { return; } - if (preset_combo.get_active_text().length() > 0) { - const Plugin::PresetRecord* pr = plugin->preset_by_label(preset_combo.get_active_text()); + if (_preset_combo.get_active_text().length() > 0) { + const Plugin::PresetRecord* pr = plugin->preset_by_label (_preset_combo.get_active_text()); if (pr) { - plugin->load_preset(pr->uri); + plugin->load_preset (*pr); } else { warning << string_compose(_("Plugin preset %1 not found"), - preset_combo.get_active_text()) << endmsg; + _preset_combo.get_active_text()) << endmsg; } } } void -PlugUIBase::save_plugin_setting () +PlugUIBase::add_plugin_setting () { NewPluginPresetDialog d (plugin); @@ -548,21 +567,29 @@ PlugUIBase::save_plugin_setting () plugin->remove_preset (d.name ()); } - if (plugin->save_preset (d.name())) { - update_presets (); - no_load_preset = true; - preset_combo.set_active_text (d.name()); - no_load_preset = false; + Plugin::PresetRecord const r = plugin->save_preset (d.name()); + if (!r.uri.empty ()) { + plugin->load_preset (r); } break; } } void -PlugUIBase::edit_plugin_settings () +PlugUIBase::save_plugin_setting () +{ + string const name = _preset_combo.get_active_text (); + plugin->remove_preset (name); + Plugin::PresetRecord const r = plugin->save_preset (name); + if (!r.uri.empty ()) { + plugin->load_preset (r); + } +} + +void +PlugUIBase::delete_plugin_setting () { - EditPluginPresetsDialog d (plugin); - d.run (); + plugin->remove_preset (_preset_combo.get_active_text ()); } void @@ -641,18 +668,61 @@ PlugUIBase::toggle_plugin_analysis() } void -PlugUIBase::update_presets () +PlugUIBase::update_preset_list () { vector preset_labels; vector presets = plugin->get_presets(); - no_load_preset = true; + ++_no_load_preset; for (vector::const_iterator i = presets.begin(); i != presets.end(); ++i) { - preset_labels.push_back(i->label); + preset_labels.push_back (i->label); } - set_popdown_strings (preset_combo, preset_labels); + set_popdown_strings (_preset_combo, preset_labels); - no_load_preset = false; + --_no_load_preset; +} + +void +PlugUIBase::update_preset () +{ + Plugin::PresetRecord p = plugin->last_preset(); + + ++_no_load_preset; + _preset_combo.set_active_text (p.label); + --_no_load_preset; + + save_button.set_sensitive (!p.uri.empty() && p.user); + delete_button.set_sensitive (!p.uri.empty() && p.user); + + update_preset_modified (); +} + +void +PlugUIBase::update_preset_modified () +{ + if (plugin->last_preset().uri.empty()) { + _preset_modified.set_text (""); + return; + } + + bool const c = plugin->parameter_changed_since_last_preset (); + if (_preset_modified.get_text().empty() == c) { + _preset_modified.set_text (c ? "*" : ""); + } +} + +void +PlugUIBase::parameter_changed (uint32_t, float) +{ + update_preset_modified (); +} + +void +PlugUIBase::preset_added_or_removed () +{ + /* Update both the list and the currently-displayed preset */ + update_preset_list (); + update_preset (); }