Manage attempts to save plugin presets with the same name. Helps with #2662.
authorCarl Hetherington <carl@carlh.net>
Mon, 6 Dec 2010 02:41:46 +0000 (02:41 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 6 Dec 2010 02:41:46 +0000 (02:41 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8191 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/plugin_ui.cc
gtk2_ardour/wscript
libs/ardour/ardour/ladspa_plugin.h
libs/ardour/ardour/lv2_plugin.h
libs/ardour/ardour/plugin.h
libs/ardour/ladspa_plugin.cc
libs/ardour/lv2_plugin.cc
libs/ardour/plugin.cc

index ce36b8a4145d7ef43f82677300b3268451c3df8e..fc8411cbb6a72156348f3e2dde6f1c8e99f9c109 100644 (file)
@@ -66,6 +66,7 @@
 #include "keyboard.h"
 #include "latency_gui.h"
 #include "plugin_eq_gui.h"
+#include "new_plugin_preset_dialog.h"
 
 #include "i18n.h"
 
@@ -475,7 +476,7 @@ PlugUIBase::set_latency_label ()
        framecnt_t const sr = insert->session().frame_rate ();
 
        if (l < sr / 1000) {
-               snprintf (buf, sizeof (buf), "latency (%d samples)", l);
+               snprintf (buf, sizeof (buf), "latency (%" PRId64 " samples)", l);
        } else {
                snprintf (buf, sizeof (buf), "latency (%.2f msecs)", (float) l / ((float) sr / 1000.0f));
        }
@@ -527,27 +528,23 @@ PlugUIBase::setting_selected()
 void
 PlugUIBase::save_plugin_setting ()
 {
-       ArdourPrompter prompter (true);
-       prompter.set_title(_("New Preset"));
-       prompter.set_prompt(_("Name of New Preset:"));
-       prompter.add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT);
-       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
-       prompter.set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
+       NewPluginPresetDialog d (plugin);
 
-       prompter.show_all();
-       prompter.present ();
-
-       switch (prompter.run ()) {
+       switch (d.run ()) {
        case Gtk::RESPONSE_ACCEPT:
-               string name;
-               prompter.get_result(name);
-               if (name.length()) {
-                       if (plugin->save_preset(name)) {
-                               update_presets();
-                               no_load_preset = true;
-                               preset_combo.set_active_text (name);
-                               no_load_preset = false;
-                       }
+               if (d.name().empty()) {
+                       break;
+               }
+
+               if (d.replace ()) {
+                       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;
                }
                break;
        }
index ac0ef483a78277c19f9de59ce92b1d997df60f84..bd0015720ba0d917e165c26595469f1477e9f2fd 100644 (file)
@@ -149,6 +149,7 @@ gtk2_ardour_sources = [
         'monitor_section.cc',
        'mouse_cursors.cc',
        'nag.cc',
+       'new_plugin_preset_dialog.cc',
        'normalize_dialog.cc',
         'note_player.cc',
        'option_editor.cc',
index 968342a909c18f86fabea17ee292561d145f9b14..4358de792e8ce40da7f330fa72ff919ae71bdf48 100644 (file)
@@ -99,7 +99,8 @@ class LadspaPlugin : public ARDOUR::Plugin
 
        XMLNode& get_state();
        int      set_state (const XMLNode&, int version);
-       bool     save_preset(std::string name);
+       bool     save_preset (std::string name);
+       void     remove_preset (std::string name);
 
        bool has_editor() const { return false; }
 
index 821922903bc2f7744710678aa2d42dfeabd33927..bdaf1a153be347b10383252b499b0d1a0d471d29 100644 (file)
@@ -114,8 +114,9 @@ class LV2Plugin : public ARDOUR::Plugin
 
        XMLNode& get_state();
        int      set_state(const XMLNode& node, int version);
-       bool     save_preset(std::string uri);
-       bool     load_preset(const std::string& uri);
+       bool     save_preset (std::string uri);
+       void     remove_preset (std::string uri);
+       bool     load_preset (const std::string& uri);
        virtual std::vector<Plugin::PresetRecord> get_presets();
 
        bool has_editor() const;
index bab2b71f31d67dc8471fcf8785c9af24124ef1cb..4a2153c6e05094ba527f4d65053f5b7dcf81d517 100644 (file)
@@ -129,6 +129,7 @@ class Plugin : public PBD::StatefulDestructible, public Latent
        virtual bool parameter_is_output(uint32_t) const = 0;
 
        virtual bool save_preset (std::string) = 0;
+       virtual void remove_preset (std::string) = 0;
        virtual bool load_preset (const std::string& uri);
 
        struct PresetRecord {
@@ -187,6 +188,10 @@ class Plugin : public PBD::StatefulDestructible, public Latent
        virtual void set_parameter (uint32_t which, float val) = 0;
 
        bool save_preset (std::string, std::string /* vst, ladspa etc. */);
+       void remove_preset (std::string, std::string);
+       bool write_preset_file (std::string, std::string);
+       std::string preset_source (std::string, std::string) const;
+       std::string preset_envvar () const;
 
        ARDOUR::AudioEngine&     _engine;
        ARDOUR::Session&         _session;
index fb5a88e5f861b1acc9425fc552cbf592c704cfae..00454cea5ed76b1e60a8e14f6dae2890e45b6c1e 100644 (file)
@@ -372,6 +372,12 @@ LadspaPlugin::save_preset (string name)
        return Plugin::save_preset (name, "ladspa");
 }
 
+void
+LadspaPlugin::remove_preset (string name)
+{
+       return Plugin::remove_preset (name, "ladspa");
+}
+
 int
 LadspaPlugin::set_state (const XMLNode& node, int version)
 {
index 9edd929aadd80fb5a33bed62a7d4e462e87cb770..082c2f1ba38f4e10e760d100142bdd9a1316b6bc 100644 (file)
@@ -386,6 +386,12 @@ LV2Plugin::save_preset (string /*name*/)
        return false;
 }
 
+void
+LV2Plugin::remove_preset (string /*name*/)
+{
+       return;
+}
+
 bool
 LV2Plugin::has_editor() const
 {
index 366f683e5692fe1377db512039d7c8d8869bdae1..4fe51141f6b2238f25d1acec2fde742345e9e4a7 100644 (file)
@@ -162,6 +162,109 @@ Plugin::load_preset(const string& preset_uri)
        return true;
 }
 
+/* XXX: should be in liblrdf */
+static void
+lrdf_remove_preset (const char *source, const char *setting_uri)
+{
+       lrdf_statement p;
+       lrdf_statement *q;
+       lrdf_statement *i;
+       char setting_uri_copy[64];
+       char buf[64];
+       
+       strncpy(setting_uri_copy, setting_uri, sizeof(setting_uri_copy));
+
+       p.subject = setting_uri_copy;
+       strncpy(buf, LADSPA_BASE "hasPortValue", sizeof(buf));
+       p.predicate = buf;
+       p.object = NULL;
+       q = lrdf_matches(&p);
+
+       p.predicate = NULL;
+       p.object = NULL;
+       for (i = q; i; i = i->next) {
+               p.subject = i->object;
+               lrdf_remove_matches(&p);
+       }
+
+       lrdf_free_statements(q);
+
+       p.subject = NULL;
+       strncpy(buf, LADSPA_BASE "hasSetting", sizeof(buf));
+       p.predicate = buf;
+       p.object = setting_uri_copy;
+       lrdf_remove_matches(&p);
+
+       p.subject = setting_uri_copy;
+       p.predicate = NULL;
+       p.object = NULL;
+       lrdf_remove_matches (&p);
+}
+
+void
+Plugin::remove_preset (string name, string domain)
+{
+       string const envvar = preset_envvar ();
+       if (envvar.empty()) {
+               warning << _("Could not locate HOME.  Preset not removed.") << endmsg;
+               return;
+       }
+
+       Plugin::PresetRecord const * p = preset_by_label (name);
+       if (!p) {
+               return;
+       }
+       
+       string const source = preset_source (envvar, domain);
+       lrdf_remove_preset (source.c_str(), p->uri.c_str ());
+
+       presets.erase (p->uri);
+
+       write_preset_file (envvar, domain);
+}
+
+string
+Plugin::preset_envvar () const
+{
+       char* envvar;
+       if ((envvar = getenv ("HOME")) == 0) {
+               return "";
+       }
+       
+       return envvar;
+}
+
+string
+Plugin::preset_source (string envvar, string domain) const
+{
+       return string_compose ("file:%1/.%2/rdf/ardour-presets.n3", envvar, domain);
+}
+
+bool
+Plugin::write_preset_file (string envvar, string domain)
+{
+       string path = string_compose("%1/.%2", envvar, domain);
+       if (g_mkdir_with_parents (path.c_str(), 0775)) {
+               warning << string_compose(_("Could not create %1.  Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
+               return false;
+       }
+
+       path += "/rdf";
+       if (g_mkdir_with_parents (path.c_str(), 0775)) {
+               warning << string_compose(_("Could not create %1.  Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
+               return false;
+       }
+
+       string const source = preset_source (envvar, domain);
+
+       if (lrdf_export_by_source (source.c_str(), source.substr(5).c_str())) {
+               warning << string_compose(_("Error saving presets file %1."), source) << endmsg;
+               return false;
+       }
+
+       return true;
+}
+
 bool
 Plugin::save_preset (string name, string domain)
 {
@@ -191,13 +294,13 @@ Plugin::save_preset (string name, string domain)
                }
        }
 
-       char* envvar;
-       if ((envvar = getenv ("HOME")) == 0) {
+       string const envvar = preset_envvar ();
+       if (envvar.empty()) {
                warning << _("Could not locate HOME.  Preset not saved.") << endmsg;
                return false;
        }
 
-       string source(string_compose("file:%1/.%2/rdf/ardour-presets.n3", envvar, domain));
+       string const source = preset_source (envvar, domain);
 
        char* uri = lrdf_add_preset (source.c_str(), name.c_str(), id, &defaults);
        
@@ -206,24 +309,7 @@ Plugin::save_preset (string name, string domain)
        presets.insert (make_pair (uri, PresetRecord (uri, name)));
        free (uri);
 
-       string path = string_compose("%1/.%2", envvar, domain);
-       if (g_mkdir_with_parents (path.c_str(), 0775)) {
-               warning << string_compose(_("Could not create %1.  Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
-               return false;
-       }
-
-       path += "/rdf";
-       if (g_mkdir_with_parents (path.c_str(), 0775)) {
-               warning << string_compose(_("Could not create %1.  Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
-               return false;
-       }
-
-       if (lrdf_export_by_source(source.c_str(), source.substr(5).c_str())) {
-               warning << string_compose(_("Error saving presets file %1."), source) << endmsg;
-               return false;
-       }
-
-       return true;
+       return write_preset_file (envvar, domain);
 }
 
 PluginPtr