From 91ba76fb0acd850452d39a9041ed412eb5effbb1 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 12 Sep 2022 20:05:07 +0200 Subject: [PATCH] Add plugin presets to processor-box context menu --- gtk2_ardour/ardour.menus.in | 1 + gtk2_ardour/processor_box.cc | 53 +++++++++++++++++++++++++++++++++++- gtk2_ardour/processor_box.h | 2 ++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 8644c069fa..95ec675c33 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -787,6 +787,7 @@ + #ifndef MIXBUS diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 71fe4a3370..d2cdc64840 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -821,6 +821,40 @@ ProcessorEntry::build_controls_menu () return menu; } +void +ProcessorEntry::plugin_preset_selected (ARDOUR::Plugin::PresetRecord preset) +{ + boost::shared_ptr pi = boost::dynamic_pointer_cast (_processor); + assert (pi); + if (!preset.label.empty()) { + _pi->load_preset (preset); + } else { + pi->plugin->clear_preset(); + } +} + +Menu* +ProcessorEntry::build_presets_menu () +{ + using namespace Menu_Helpers; + + boost::shared_ptr pi = boost::dynamic_pointer_cast (_processor); + if (!pi) { + return NULL; + } + + vector presets = pi->plugin()->get_presets(); + + Menu* menu = manage (new Menu); + MenuList& items = menu->items (); + + for (auto const& p : presets) { + items.push_back (MenuElem (p.label, sigc::bind (sigc::mem_fun (*this, &ProcessorEntry::plugin_preset_selected), p))); + } + + return menu; +} + void ProcessorEntry::toggle_inline_display_visibility () { @@ -2328,7 +2362,6 @@ ProcessorBox::show_processor_menu (int arg) } } - Gtk::MenuItem* send_menu_item = dynamic_cast(ActionManager::get_widget("/ProcessorMenu/send_options")); if (send_menu_item) { if (single_selection && !_route->is_monitor()) { @@ -2346,6 +2379,23 @@ ProcessorBox::show_processor_menu (int arg) } } + Gtk::MenuItem* presets_menu_item = dynamic_cast(ActionManager::get_widget("/ProcessorMenu/presets")); + if (presets_menu_item) { + if (single_selection) { + Menu* m = single_selection->build_presets_menu (); + if (m && !m->items().empty()) { + presets_menu_item->set_submenu (*m); + presets_menu_item->set_sensitive (true); + } else { + delete m; + gtk_menu_item_set_submenu (presets_menu_item->gobj(), 0); + presets_menu_item->set_sensitive (false); + } + } else { + presets_menu_item->set_sensitive (false); + } + } + /* Sensitise actions as approprioate */ const bool sensitive = !processor_display.selection().empty() && ! stub_processor_selected (); @@ -3981,6 +4031,7 @@ ProcessorBox::register_actions () ActionManager::register_action (processor_box_actions, X_("controls"), _("Controls")); ActionManager::register_action (processor_box_actions, X_("send_options"), _("Send Options")); + ActionManager::register_action (processor_box_actions, X_("presets"), _("Presets")); ActionManager::register_action (processor_box_actions, X_("clear"), _("Clear (all)"), sigc::ptr_fun (ProcessorBox::rb_clear)); diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index 8dadd99e75..ebbc2556d3 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -174,6 +174,7 @@ public: std::string state_id () const; Gtk::Menu* build_controls_menu (); Gtk::Menu* build_send_options_menu (); + Gtk::Menu* build_presets_menu (); protected: ArdourWidgets::ArdourButton _button; @@ -256,6 +257,7 @@ private: void toggle_panner_link (); void toggle_allow_feedback (); + void plugin_preset_selected (ARDOUR::Plugin::PresetRecord); class PluginInlineDisplay : public PluginDisplay { public: