summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-11-04 18:46:21 +0100
committerRobin Gareus <robin@gareus.org>2018-11-04 18:47:14 +0100
commit9971e718fed4a1126d97bad69f2608638d5a5464 (patch)
tree452f128de10a5be917c0adf967c82dde2a0a3acb
parentabb09570284a5fbd7358a42ee94b34134ee583ba (diff)
Save Lua UI scripts separately
Previously EditorAction and ExitorHook scripts were saved with instant.xml. The were saved with each session and in the config dir (for new sessions). This allowed inconsistent UI setups, especially when loading old sessions that had no or different scripts. Now Editor scripts (actions and hooks) are saved in a dedicated file, session-independently. This goes along with ui_config in general e.g. action-table-columns The scripts are not saved with ui_config file for two reasons: ui_config settings related to built-in ui_config_vars.h, and in the future there may be further indirection like "ui-rc-file". Note: previously loaded editor scripts are lost with this change.
-rw-r--r--gtk2_ardour/editor.cc4
-rw-r--r--gtk2_ardour/luainstance.cc71
-rw-r--r--gtk2_ardour/luainstance.h4
3 files changed, 71 insertions, 8 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index c18833bd8c..743ec420c0 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -2578,7 +2578,7 @@ Editor::set_state (const XMLNode& node, int version)
}
}
- return LuaInstance::instance()->set_state(node);
+ return 0;
}
XMLNode&
@@ -2646,8 +2646,6 @@ Editor::get_state ()
node->set_property ("nudge-clock-value", nudge_clock->current_duration());
- node->add_child_nocopy (LuaInstance::instance()->get_action_state());
- node->add_child_nocopy (LuaInstance::instance()->get_hook_state());
node->add_child_nocopy (_locations->get_state ());
return *node;
diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc
index f184368f1d..490790233f 100644
--- a/gtk2_ardour/luainstance.cc
+++ b/gtk2_ardour/luainstance.cc
@@ -20,6 +20,7 @@
#include <cairomm/surface.h>
#include <pango/pangocairo.h>
+#include "pbd/file_utils.h"
#include "pbd/strsplit.h"
#include "gtkmm2ext/bindings.h"
@@ -28,6 +29,7 @@
#include "ardour/audioengine.h"
#include "ardour/disk_reader.h"
#include "ardour/disk_writer.h"
+#include "ardour/filesystem_paths.h"
#include "ardour/plugin_manager.h"
#include "ardour/route.h"
#include "ardour/session.h"
@@ -54,6 +56,8 @@
#include "pbd/i18n.h"
+static const char* ui_scripts_file_name = "ui_scripts";
+
namespace LuaCairo {
/** wrap RefPtr< Cairo::ImageSurface >
*
@@ -1092,7 +1096,7 @@ LuaInstance::LuaInstance ()
lua.Print.connect (&_lua_print);
init ();
- LuaScriptParamList args;
+ load_state ();
}
LuaInstance::~LuaInstance ()
@@ -1266,6 +1270,61 @@ LuaInstance::init ()
lua_setglobal (L, "Editor");
}
+int
+LuaInstance::load_state ()
+{
+ std::string uiscripts;
+ if (!find_file (ardour_config_search_path(), ui_scripts_file_name, uiscripts)) {
+ return -1;
+ }
+ XMLTree tree;
+
+ info << string_compose (_("Loading user ui scripts file %1"), uiscripts) << endmsg;
+
+ if (!tree.read (uiscripts)) {
+ error << string_compose(_("cannot read ui scripts file \"%1\""), uiscripts) << endmsg;
+ return -1;
+ }
+
+ if (set_state (*tree.root())) {
+ error << string_compose(_("user ui scripts file \"%1\" not loaded successfully."), uiscripts) << endmsg;
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+LuaInstance::save_state ()
+{
+ if (!_session) {
+ /* action scripts are un-registered with the session */
+ return -1;
+ }
+
+ std::string uiscripts = Glib::build_filename (user_config_directory(), ui_scripts_file_name);
+
+ XMLNode* node = new XMLNode (X_("UIScripts"));
+ node->add_child_nocopy (get_action_state ());
+ node->add_child_nocopy (get_hook_state ());
+
+ XMLTree tree;
+ tree.set_root (node);
+
+ if (!tree.write (uiscripts.c_str())){
+ error << string_compose (_("UI script file %1 not saved"), uiscripts) << endmsg;
+ return -1;
+ }
+ return 0;
+}
+
+void
+LuaInstance::set_dirty ()
+{
+ save_state ();
+ _session->set_dirty (); // XXX is this reasonable?
+}
+
void LuaInstance::set_session (Session* s)
{
SessionHandlePtr::set_session (s);
@@ -1273,6 +1332,8 @@ void LuaInstance::set_session (Session* s)
return;
}
+ load_state ();
+
lua_State* L = lua.getState();
LuaBindings::set_session (L, _session);
@@ -1537,7 +1598,7 @@ LuaInstance::set_lua_action (
} catch (...) {
return false;
}
- _session->set_dirty ();
+ set_dirty ();
return true;
}
@@ -1553,7 +1614,7 @@ LuaInstance::remove_lua_action (const int id)
return false;
}
ActionChanged (id, ""); /* EMIT SIGNAL */
- _session->set_dirty ();
+ set_dirty ();
return true;
}
@@ -1678,7 +1739,7 @@ LuaInstance::register_lua_slot (const std::string& name, const std::string& scri
} catch (luabridge::LuaException const& e) {
cerr << "LuaException:" << e.what () << endl;
} catch (...) { }
- _session->set_dirty ();
+ set_dirty ();
return false;
}
@@ -1691,7 +1752,7 @@ LuaInstance::unregister_lua_slot (const PBD::ID& id)
_callbacks.erase (i);
return true;
}
- _session->set_dirty ();
+ set_dirty ();
return false;
}
diff --git a/gtk2_ardour/luainstance.h b/gtk2_ardour/luainstance.h
index d48ab8330a..8f5fb0ba87 100644
--- a/gtk2_ardour/luainstance.h
+++ b/gtk2_ardour/luainstance.h
@@ -100,6 +100,9 @@ public:
XMLNode& get_action_state (void);
XMLNode& get_hook_state (void);
+ int load_state ();
+ int save_state ();
+
bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
/* actions */
@@ -131,6 +134,7 @@ private:
static LuaInstance* _instance;
void init ();
+ void set_dirty ();
void session_going_away ();
LuaState lua;