Add plugin presets to processor-box context menu

This commit is contained in:
Robin Gareus
2022-09-12 20:05:07 +02:00
parent 46deb15d12
commit 91ba76fb0a
3 changed files with 55 additions and 1 deletions

View File

@@ -787,6 +787,7 @@
<separator/>
<menuitem action='controls'/>
<menuitem action='send_options'/>
<menuitem action='presets'/>
<separator/>
#ifndef MIXBUS
<menu action="disk-io-menu">

View File

@@ -821,6 +821,40 @@ ProcessorEntry::build_controls_menu ()
return menu;
}
void
ProcessorEntry::plugin_preset_selected (ARDOUR::Plugin::PresetRecord preset)
{
boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_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<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_processor);
if (!pi) {
return NULL;
}
vector<ARDOUR::Plugin::PresetRecord> 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<Gtk::MenuItem*>(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<Gtk::MenuItem*>(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));

View File

@@ -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: