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 #include +#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;