Save Lua UI scripts separately
[ardour.git] / gtk2_ardour / luainstance.cc
index f184368f1d07adf05a6d42a54e91106d0129fa90..490790233f04a653db2b3b7a49456a71246899af 100644 (file)
@@ -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;
 }