[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