[SCM] calf/master: + GUI: Separate "factory" and "user" presets (so that factory presets can be upgraded via package update without touching user data)

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:37:21 UTC 2013


The following commit has been merged in the master branch:
commit a240b03879f4c62b679b2b35fb5ffef81dcdf8ee
Author: kfoltman <kfoltman at 78b06b96-2940-0410-b7fc-879d825d01d8>
Date:   Thu Jun 26 22:30:50 2008 +0000

    + GUI: Separate "factory" and "user" presets (so that factory presets can be upgraded via package update without touching user data)
    
    
    
    git-svn-id: https://calf.svn.sourceforge.net/svnroot/calf/trunk@213 78b06b96-2940-0410-b7fc-879d825d01d8

diff --git a/src/calf/giface.h b/src/calf/giface.h
index b0ae5de..6ee1c36 100644
--- a/src/calf/giface.h
+++ b/src/calf/giface.h
@@ -334,7 +334,8 @@ struct ladspa_wrapper
         preset_descs = new std::vector<DSSI_Program_Descriptor>;
 
         preset_list plist;
-        plist.load_defaults();
+        plist.load_defaults(false);
+        plist.load_defaults(true);
         // XXXKF this assumes that plugin name in preset is case-insensitive equal to plugin label
         // if I forget about this, I'll be in a deep trouble
         dssi_default_program.Bank = 0;
diff --git a/src/calf/gui.h b/src/calf/gui.h
index 021bc25..c00849b 100644
--- a/src/calf/gui.h
+++ b/src/calf/gui.h
@@ -255,7 +255,7 @@ public:
     virtual void del_plugin(plugin_ctl_iface *plugin)=0;
     
     virtual void set_window(plugin_ctl_iface *plugin, plugin_gui_window *window)=0;
-    virtual void refresh_all_presets()=0;
+    virtual void refresh_all_presets(bool builtin_too)=0;
     virtual bool check_condition(const char *name)=0;
     virtual ~main_window_iface() {}
 };
@@ -274,14 +274,14 @@ public:
     plugin_gui *gui;
     GtkWindow *toplevel;
     GtkUIManager *ui_mgr;
-    GtkActionGroup *std_actions, *preset_actions, *command_actions;
+    GtkActionGroup *std_actions, *builtin_preset_actions, *user_preset_actions, *command_actions;
     main_window_iface *main;
     int source_id;
 
     plugin_gui_window(main_window_iface *_main);
-    std::string make_gui_preset_list(GtkActionGroup *grp);
+    std::string make_gui_preset_list(GtkActionGroup *grp, bool builtin);
     std::string make_gui_command_list(GtkActionGroup *grp);
-    void fill_gui_presets();
+    void fill_gui_presets(bool builtin);
     void create(plugin_ctl_iface *_plugin, const char *title, const char *effect);
     void close();
     static gboolean on_idle(void *data);
diff --git a/src/calf/main_win.h b/src/calf/main_win.h
index 2093399..450f81c 100644
--- a/src/calf/main_win.h
+++ b/src/calf/main_win.h
@@ -80,7 +80,7 @@ namespace synth {
         void add_plugin(plugin_ctl_iface *plugin);
         void del_plugin(plugin_ctl_iface *plugin);
         void set_window(plugin_ctl_iface *iface, plugin_gui_window *window);
-        void refresh_all_presets();
+        void refresh_all_presets(bool builtin_too);
         void refresh_plugin(plugin_ctl_iface *plugin);
         void on_closed();
         void close_guis();
diff --git a/src/calf/preset.h b/src/calf/preset.h
index dcb17af..e84b02c 100644
--- a/src/calf/preset.h
+++ b/src/calf/preset.h
@@ -85,7 +85,7 @@ struct preset_list
     std::map<std::string, int> last_preset_ids;
 
     static std::string get_preset_filename();
-    bool load_defaults();
+    bool load_defaults(bool builtin);
     void parse(const std::string &data);
     void load(const char *filename);
     void save(const char *filename);
@@ -97,7 +97,7 @@ protected:
     static void xml_end_element_handler(void *user_data, const char *name);
 };
 
-extern preset_list global_presets;
+extern preset_list builtin_presets, user_presets;
 
 };
 
diff --git a/src/calf/preset_gui.h b/src/calf/preset_gui.h
index afd22f4..53a3d20 100644
--- a/src/calf/preset_gui.h
+++ b/src/calf/preset_gui.h
@@ -29,9 +29,10 @@ struct activate_preset_params
 {
     plugin_gui *gui;
     int preset;
+    bool builtin;
     
-    activate_preset_params(plugin_gui *_gui, int _preset)
-    : gui(_gui), preset(_preset)
+    activate_preset_params(plugin_gui *_gui, int _preset, bool _builtin)
+    : gui(_gui), preset(_preset), builtin(_builtin)
     {
     }
 };
diff --git a/src/dssigui.cpp b/src/dssigui.cpp
index 937f229..333a6ab 100644
--- a/src/dssigui.cpp
+++ b/src/dssigui.cpp
@@ -251,7 +251,8 @@ struct dssi_osc_server: public osc_server, public osc_message_sink<osc_strstream
         window->create(plugin, title.c_str(), effect_name.c_str());
         plugin->gui = window->gui;
         gtk_signal_connect(GTK_OBJECT(window->toplevel), "destroy", G_CALLBACK(on_destroy), this);
-        global_presets.get_for_plugin(presets, effect_name.c_str());
+        builtin_presets.get_for_plugin(presets, effect_name.c_str());
+        user_presets.get_for_plugin(presets, effect_name.c_str());
     }
     
     virtual void receive_osc_message(std::string address, std::string args, osc_strstream &buffer)
@@ -362,7 +363,8 @@ int main(int argc, char *argv[])
     }
 
     try {
-        global_presets.load_defaults();
+        builtin_presets.load_defaults(true);
+        user_presets.load_defaults(false);
     }
     catch(synth::preset_exception &e)
     {
diff --git a/src/gui.cpp b/src/gui.cpp
index 68512f8..01a8457 100644
--- a/src/gui.cpp
+++ b/src/gui.cpp
@@ -805,6 +805,8 @@ static void store_preset_action(GtkAction *action, plugin_gui_window *gui_win)
 
 static const GtkActionEntry actions[] = {
     { "PresetMenuAction", "", "_Preset", NULL, "Preset operations", NULL },
+    { "BuiltinPresetMenuAction", "", "_Built-in", NULL, "Built-in (factory) presets", NULL },
+    { "UserPresetMenuAction", "", "_User", NULL, "User (your) presets", NULL },
     { "CommandMenuAction", "", "_Command", NULL, "Plugin-related commands", NULL },
     { "store-preset", "", "_Store preset", NULL, "Store a current setting as preset", (GCallback)store_preset_action },
 };
@@ -817,21 +819,34 @@ static const char *ui_xml =
 "    <menu action=\"PresetMenuAction\">\n"
 "      <menuitem action=\"store-preset\"/>\n"
 "      <separator/>\n"
-"      <placeholder name=\"presets\"/>\n"
+"      <menu action=\"BuiltinPresetMenuAction\">\n"
+"        <placeholder name=\"builtin_presets\"/>\n"
+"      </menu>\n"
+"      <menu action=\"UserPresetMenuAction\">\n"
+"        <placeholder name=\"user_presets\"/>\n"
+"      </menu>\n"
 "    </menu>\n"
 "    <placeholder name=\"commands\"/>\n"
 "  </menubar>\n"
 "</ui>\n"
 ;
 
-static const char *preset_pre_xml = 
+static const char *general_preset_pre_xml = 
 "<ui>\n"
 "  <menubar>\n"
-"    <menu action=\"PresetMenuAction\">\n"
-"      <placeholder name=\"presets\">\n";
+"    <menu action=\"PresetMenuAction\">\n";
+
+static const char *builtin_preset_pre_xml = 
+"      <menu action=\"BuiltinPresetMenuAction\">\n"
+"        <placeholder name=\"builtin_presets\">\n";
+
+static const char *user_preset_pre_xml = 
+"      <menu action=\"UserPresetMenuAction\">\n"
+"        <placeholder name=\"user_presets\">\n";
 
 static const char *preset_post_xml = 
-"      </placeholder>\n"
+"        </placeholder>\n"
+"      </menu>\n"
 "    </menu>\n"
 "  </menubar>\n"
 "</ui>\n"
@@ -855,26 +870,28 @@ plugin_gui_window::plugin_gui_window(main_window_iface *_main)
     toplevel = NULL;
     ui_mgr = NULL;
     std_actions = NULL;
-    preset_actions = NULL;
+    builtin_preset_actions = NULL;
+    user_preset_actions = NULL;
     command_actions = NULL;
     main = _main;
     assert(main);
 }
 
-string plugin_gui_window::make_gui_preset_list(GtkActionGroup *grp)
+string plugin_gui_window::make_gui_preset_list(GtkActionGroup *grp, bool builtin)
 {
-    string preset_xml = preset_pre_xml;
-    preset_vector &pvec = global_presets.presets;
+    string preset_xml = string(general_preset_pre_xml) + (builtin ? builtin_preset_pre_xml : user_preset_pre_xml);
+    preset_vector &pvec = (builtin ? builtin_presets : user_presets).presets;
+    GtkActionGroup *preset_actions = builtin ? builtin_preset_actions : user_preset_actions;
     for (unsigned int i = 0; i < pvec.size(); i++)
     {
-        if (global_presets.presets[i].plugin != gui->effect_name)
+        if (pvec[i].plugin != gui->effect_name)
             continue;
         stringstream ss;
-        ss << "preset" << i;
+        ss << (builtin ? "builtin_preset" : "user_preset") << i;
         preset_xml += "          <menuitem name=\""+pvec[i].name+"\" action=\""+ss.str()+"\"/>\n";
         
         GtkActionEntry ae = { ss.str().c_str(), NULL, pvec[i].name.c_str(), NULL, NULL, (GCallback)activate_preset };
-        gtk_action_group_add_actions_full(preset_actions, &ae, 1, (gpointer)new activate_preset_params(gui, i), action_destroy_notify);
+        gtk_action_group_add_actions_full(preset_actions, &ae, 1, (gpointer)new activate_preset_params(gui, i, builtin), action_destroy_notify);
     }
     preset_xml += preset_post_xml;
     return preset_xml;
@@ -899,15 +916,19 @@ string plugin_gui_window::make_gui_command_list(GtkActionGroup *grp)
     return command_xml;
 }
 
-void plugin_gui_window::fill_gui_presets()
+void plugin_gui_window::fill_gui_presets(bool builtin)
 {
+    GtkActionGroup *&preset_actions = builtin ? builtin_preset_actions : user_preset_actions;
     if(preset_actions) {
         gtk_ui_manager_remove_action_group(ui_mgr, preset_actions);
         preset_actions = NULL;
     }
     
-    preset_actions = gtk_action_group_new("presets");
-    string preset_xml = make_gui_preset_list(preset_actions);
+    if (builtin)
+        builtin_preset_actions = gtk_action_group_new("builtin_presets");
+    else
+        user_preset_actions = gtk_action_group_new("user_presets");
+    string preset_xml = make_gui_preset_list(preset_actions, builtin);
     gtk_ui_manager_insert_action_group(ui_mgr, preset_actions, 0);    
     GError *error = NULL;
     gtk_ui_manager_add_ui_from_string(ui_mgr, preset_xml.c_str(), -1, &error);
@@ -942,7 +963,8 @@ void plugin_gui_window::create(plugin_ctl_iface *_jh, const char *title, const c
     
     command_actions = gtk_action_group_new("commands");
 
-    fill_gui_presets();
+    fill_gui_presets(true);
+    fill_gui_presets(false);
     
     gtk_box_pack_start(GTK_BOX(vbox), gtk_ui_manager_get_widget(ui_mgr, "/ui/menubar"), false, false, 0);
 
diff --git a/src/jackhost.cpp b/src/jackhost.cpp
index 49ee598..6f58f81 100644
--- a/src/jackhost.cpp
+++ b/src/jackhost.cpp
@@ -154,7 +154,7 @@ struct host_session: public main_window_owner_iface
     void close();
     static gboolean update_lash(void *self) { ((host_session *)self)->update_lash(); return TRUE; }
     void update_lash();
-    void activate_preset(int plugin, const std::string &preset);
+    bool activate_preset(int plugin, const std::string &preset, bool builtin);
 #if USE_LASH
     void send_lash(LASH_Event_Type type, const std::string &data) {
         lash_send_event(lash_client, lash_event_new_with_all(type, data.c_str()));
@@ -198,8 +198,15 @@ void host_session::add_plugin(string name, string preset)
     plugins.push_back(jh);
     client.add(jh);
     main_win->add_plugin(jh);
-    if (!preset.empty())
-        activate_preset(plugins.size() - 1, preset);
+    if (!preset.empty()) {
+        if (!activate_preset(plugins.size() - 1, preset, false))
+        {
+            if (!activate_preset(plugins.size() - 1, preset, true))
+            {
+                fprintf(stderr, "Unknown preset: %s\n", preset.c_str());
+            }
+        }
+    }
 }
 
 void host_session::create_plugins_from_list()
@@ -251,23 +258,19 @@ void host_session::remove_plugin(plugin_ctl_iface *plugin)
     }
 }
 
-void host_session::activate_preset(int i, const std::string &preset)
+bool host_session::activate_preset(int i, const std::string &preset, bool builtin)
 {
     string cur_plugin = plugins[i]->get_id();
-    preset_vector &pvec = global_presets.presets;
-    bool found = false;
+    preset_vector &pvec = (builtin ? builtin_presets : user_presets).presets;
     for (unsigned int i = 0; i < pvec.size(); i++) {
         if (pvec[i].name == preset && pvec[i].plugin == cur_plugin)
         {
             pvec[i].activate(plugins[i]);
             gui_win->gui->refresh();
-            found = true;
-            break;
+            return true;
         }
     }
-    if (!found) {
-        fprintf(stderr, "Warning: unknown preset %s %s\n", preset.c_str(), cur_plugin.c_str());
-    }
+    return false;
 }
 
 void host_session::connect()
@@ -529,10 +532,12 @@ int main(int argc, char *argv[])
         }
     }
     try {
-        global_presets.load_defaults();
+        builtin_presets.load_defaults(true);
+        user_presets.load_defaults(false);
     }
     catch(synth::preset_exception &e)
     {
+        // XXXKF this exception is already handled by load_defaults, so this is redundant
         fprintf(stderr, "Error while loading presets: %s\n", e.what());
         exit(1);
     }
diff --git a/src/main_win.cpp b/src/main_win.cpp
index 7beebe5..50f8e27 100644
--- a/src/main_win.cpp
+++ b/src/main_win.cpp
@@ -138,12 +138,15 @@ void main_window::set_window(plugin_ctl_iface *plugin, plugin_gui_window *gui_wi
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(strip->name), gui_win != NULL);
 }
 
-void main_window::refresh_all_presets()
+void main_window::refresh_all_presets(bool builtin_too)
 {
     for (std::map<plugin_ctl_iface *, plugin_strip *>::iterator i = plugins.begin(); i != plugins.end(); i++)
     {
-        if (i->second && i->second->gui_win)
-            i->second->gui_win->fill_gui_presets();
+        if (i->second && i->second->gui_win) {
+            i->second->gui_win->fill_gui_presets(false);
+            if (builtin_too)
+                i->second->gui_win->fill_gui_presets(true);
+        }
     }
 }
 
diff --git a/src/preset.cpp b/src/preset.cpp
index 405618e..af0b6d3 100644
--- a/src/preset.cpp
+++ b/src/preset.cpp
@@ -33,7 +33,7 @@
 using namespace synth;
 using namespace std;
 
-synth::preset_list synth::global_presets;
+synth::preset_list synth::builtin_presets, synth::user_presets;
 
 std::string plugin_preset::to_xml()
 {
@@ -181,18 +181,24 @@ void preset_list::xml_end_element_handler(void *user_data, const char *name)
     throw preset_exception("Invalid XML element close: %s", name, 0);
 }
 
-bool preset_list::load_defaults()
+bool preset_list::load_defaults(bool builtin)
 {
     try {
         struct stat st;
-        if (!stat(preset_list::get_preset_filename().c_str(), &st)) {
-            load(preset_list::get_preset_filename().c_str());
-            if (!presets.empty())
-                return true;
+        if (!builtin)
+        {
+            if (!stat(preset_list::get_preset_filename().c_str(), &st)) {
+                load(preset_list::get_preset_filename().c_str());
+                if (!presets.empty())
+                    return true;
+            }
         }
-        if (presets.empty() && !stat(PKGLIBDIR "/presets.xml", &st)) {
-            load(PKGLIBDIR "/presets.xml");
-            return true;
+        else
+        {
+            if (presets.empty() && !stat(PKGLIBDIR "/presets.xml", &st)) {
+                load(PKGLIBDIR "/presets.xml");
+                return true;
+            }
         }
     }
     catch(preset_exception &ex)
diff --git a/src/preset_gui.cpp b/src/preset_gui.cpp
index 27a8cac..b859f22 100644
--- a/src/preset_gui.cpp
+++ b/src/preset_gui.cpp
@@ -53,7 +53,7 @@ void synth::store_preset(GtkWindow *toplevel, plugin_gui *gui)
     GtkTreeModel *model = GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_STRING));
     gtk_combo_box_set_model(GTK_COMBO_BOX(preset_name_combo), model);
     gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(preset_name_combo), 0);
-    for(preset_vector::const_iterator i = global_presets.presets.begin(); i != global_presets.presets.end(); i++)
+    for(preset_vector::const_iterator i = user_presets.presets.begin(); i != user_presets.presets.end(); i++)
     {
         if (i->plugin != gui->effect_name)
             continue;
@@ -77,7 +77,7 @@ void synth::store_preset(GtkWindow *toplevel, plugin_gui *gui)
         }
         catch(...)
         {
-            tmp = global_presets;
+            tmp = user_presets;
         }
         bool found = false;
         for(preset_vector::const_iterator i = tmp.presets.begin(); i != tmp.presets.end(); i++)
@@ -98,9 +98,9 @@ void synth::store_preset(GtkWindow *toplevel, plugin_gui *gui)
                 return;
         }
         tmp.add(sp);
-        global_presets = tmp;
-        global_presets.save(tmp.get_preset_filename().c_str());
-        gui->window->main->refresh_all_presets();
+        user_presets = tmp;
+        user_presets.save(tmp.get_preset_filename().c_str());
+        gui->window->main->refresh_all_presets(false);
     }
     //gtk_window_set_transient_for(GTK_WINDOW(store_preset_dlg), toplevel);
 }
@@ -108,7 +108,7 @@ void synth::store_preset(GtkWindow *toplevel, plugin_gui *gui)
 void synth::activate_preset(GtkAction *action, activate_preset_params *params)
 {
     plugin_gui *gui = params->gui;
-    plugin_preset &p = global_presets.presets[params->preset];
+    plugin_preset &p = (params->builtin ? builtin_presets : user_presets).presets[params->preset];
     if (p.plugin != gui->effect_name)
         return;
     if (!gui->plugin->activate_preset(p.bank, p.program))

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list