diff options
-rw-r--r-- | gtk2_ardour/mixer_ui.cc | 17 | ||||
-rw-r--r-- | gtk2_ardour/mixer_ui.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/processor_box.cc | 42 | ||||
-rw-r--r-- | gtk2_ardour/processor_box.h | 3 |
4 files changed, 63 insertions, 0 deletions
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index f6ebfe827d..97702b15bc 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -207,6 +207,7 @@ Mixer_UI::Mixer_UI () favorite_plugins_display.set_drag_column (favorite_plugins_columns.name.index()); favorite_plugins_display.signal_row_activated().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_activated)); favorite_plugins_display.signal_button_press_event().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_button_press), false); + favorite_plugins_display.signal_drop.connect (sigc::mem_fun (*this, &Mixer_UI::plugin_drop)); favorite_plugins_scroller.add (favorite_plugins_display); favorite_plugins_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); @@ -2500,3 +2501,19 @@ PluginTreeStore::row_drop_possible_vfunc(const Gtk::TreeModel::Path& dest, const } return false; } + +void +Mixer_UI::plugin_drop (const Glib::RefPtr<Gdk::DragContext>&, const Gtk::SelectionData& data) +{ + if (data.get_target() != "PluginPresetPtr") { + return; + } + const void *d = data.get_data(); + const PluginPresetPtr ppp = *(static_cast<const PluginPresetPtr*> (d)); + + PluginManager::PluginStatusType status = PluginManager::Favorite; + PluginManager& manager (PluginManager::instance()); + + manager.set_status (ppp->_pip->type, ppp->_pip->unique_id, status); + manager.save_statuses (); +} diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index 331128c2d1..915809620a 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -201,6 +201,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR void plugin_row_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column); bool plugin_row_button_press (GdkEventButton*); void popup_note_context_menu (GdkEventButton*); + void plugin_drop (const Glib::RefPtr<Gdk::DragContext>&, const Gtk::SelectionData& data); enum ProcessorPosition { AddTop, diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index a997795cde..96d291e725 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -75,6 +75,7 @@ #include "send_ui.h" #include "timers.h" #include "tooltips.h" +#include "new_plugin_preset_dialog.h" #include "i18n.h" @@ -132,6 +133,12 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo _button.set_elements(ArdourButton::Element(_button.elements() & ~ArdourButton::Indicator)); _unknown_processor = true; } + { + boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_processor); + if (pi && pi->plugin()) { + _plugin_preset_pointer = PluginPresetPtr (new PluginPreset (pi->plugin()->get_info())); + } + } if (_processor) { _vbox.pack_start (_routing_icon); @@ -211,6 +218,41 @@ ProcessorEntry::drag_text () const { return name (Wide); } +bool +ProcessorEntry::drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &data) +{ + if (data.get_target() == "PluginPresetPtr" && _plugin_preset_pointer) { + boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_processor); + boost::shared_ptr<ARDOUR::Plugin> plugin = pi->plugin(); + assert (plugin); + NewPluginPresetDialog d (plugin); + + _plugin_preset_pointer->_preset.valid = false; + + switch (d.run ()) { + case Gtk::RESPONSE_ACCEPT: + if (d.name().empty()) { + break; + } + + if (d.replace ()) { + plugin->remove_preset (d.name ()); + } + + Plugin::PresetRecord const r = plugin->save_preset (d.name()); + + if (!r.uri.empty ()) { + _plugin_preset_pointer->_preset.uri = r.uri; + _plugin_preset_pointer->_preset.label = r.label; + _plugin_preset_pointer->_preset.user = r.user; + _plugin_preset_pointer->_preset.valid = r.valid; + } + } + data.set (data.get_target(), 8, (const guchar *) &_plugin_preset_pointer, sizeof (PluginPresetPtr)); + return true; + } + return false; +} void ProcessorEntry::set_position (Position p, uint32_t num) diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index 872f58ce61..d904e13c74 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -119,6 +119,8 @@ public: bool is_selectable() const {return _selectable;} void set_selectable(bool s) { _selectable = s; } + bool drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &); + enum Position { PreFader, Fader, @@ -165,6 +167,7 @@ private: PBD::ScopedConnection active_connection; PBD::ScopedConnection name_connection; PBD::ScopedConnection config_connection; + ARDOUR::PluginPresetPtr _plugin_preset_pointer; class Control : public sigc::trackable { public: |