mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-11 17:16:38 +01:00
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.
This commit is contained in:
parent
abb0957028
commit
9971e718fe
3 changed files with 71 additions and 8 deletions
|
|
@ -2578,7 +2578,7 @@ Editor::set_state (const XMLNode& node, int version)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return LuaInstance::instance()->set_state(node);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
|
|
@ -2646,8 +2646,6 @@ Editor::get_state ()
|
||||||
|
|
||||||
node->set_property ("nudge-clock-value", nudge_clock->current_duration());
|
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 ());
|
node->add_child_nocopy (_locations->get_state ());
|
||||||
|
|
||||||
return *node;
|
return *node;
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#include <cairomm/surface.h>
|
#include <cairomm/surface.h>
|
||||||
#include <pango/pangocairo.h>
|
#include <pango/pangocairo.h>
|
||||||
|
|
||||||
|
#include "pbd/file_utils.h"
|
||||||
#include "pbd/strsplit.h"
|
#include "pbd/strsplit.h"
|
||||||
|
|
||||||
#include "gtkmm2ext/bindings.h"
|
#include "gtkmm2ext/bindings.h"
|
||||||
|
|
@ -28,6 +29,7 @@
|
||||||
#include "ardour/audioengine.h"
|
#include "ardour/audioengine.h"
|
||||||
#include "ardour/disk_reader.h"
|
#include "ardour/disk_reader.h"
|
||||||
#include "ardour/disk_writer.h"
|
#include "ardour/disk_writer.h"
|
||||||
|
#include "ardour/filesystem_paths.h"
|
||||||
#include "ardour/plugin_manager.h"
|
#include "ardour/plugin_manager.h"
|
||||||
#include "ardour/route.h"
|
#include "ardour/route.h"
|
||||||
#include "ardour/session.h"
|
#include "ardour/session.h"
|
||||||
|
|
@ -54,6 +56,8 @@
|
||||||
|
|
||||||
#include "pbd/i18n.h"
|
#include "pbd/i18n.h"
|
||||||
|
|
||||||
|
static const char* ui_scripts_file_name = "ui_scripts";
|
||||||
|
|
||||||
namespace LuaCairo {
|
namespace LuaCairo {
|
||||||
/** wrap RefPtr< Cairo::ImageSurface >
|
/** wrap RefPtr< Cairo::ImageSurface >
|
||||||
*
|
*
|
||||||
|
|
@ -1092,7 +1096,7 @@ LuaInstance::LuaInstance ()
|
||||||
lua.Print.connect (&_lua_print);
|
lua.Print.connect (&_lua_print);
|
||||||
init ();
|
init ();
|
||||||
|
|
||||||
LuaScriptParamList args;
|
load_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
LuaInstance::~LuaInstance ()
|
LuaInstance::~LuaInstance ()
|
||||||
|
|
@ -1266,6 +1270,61 @@ LuaInstance::init ()
|
||||||
lua_setglobal (L, "Editor");
|
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)
|
void LuaInstance::set_session (Session* s)
|
||||||
{
|
{
|
||||||
SessionHandlePtr::set_session (s);
|
SessionHandlePtr::set_session (s);
|
||||||
|
|
@ -1273,6 +1332,8 @@ void LuaInstance::set_session (Session* s)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
load_state ();
|
||||||
|
|
||||||
lua_State* L = lua.getState();
|
lua_State* L = lua.getState();
|
||||||
LuaBindings::set_session (L, _session);
|
LuaBindings::set_session (L, _session);
|
||||||
|
|
||||||
|
|
@ -1537,7 +1598,7 @@ LuaInstance::set_lua_action (
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_session->set_dirty ();
|
set_dirty ();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1553,7 +1614,7 @@ LuaInstance::remove_lua_action (const int id)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ActionChanged (id, ""); /* EMIT SIGNAL */
|
ActionChanged (id, ""); /* EMIT SIGNAL */
|
||||||
_session->set_dirty ();
|
set_dirty ();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1678,7 +1739,7 @@ LuaInstance::register_lua_slot (const std::string& name, const std::string& scri
|
||||||
} catch (luabridge::LuaException const& e) {
|
} catch (luabridge::LuaException const& e) {
|
||||||
cerr << "LuaException:" << e.what () << endl;
|
cerr << "LuaException:" << e.what () << endl;
|
||||||
} catch (...) { }
|
} catch (...) { }
|
||||||
_session->set_dirty ();
|
set_dirty ();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1691,7 +1752,7 @@ LuaInstance::unregister_lua_slot (const PBD::ID& id)
|
||||||
_callbacks.erase (i);
|
_callbacks.erase (i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
_session->set_dirty ();
|
set_dirty ();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,9 @@ public:
|
||||||
XMLNode& get_action_state (void);
|
XMLNode& get_action_state (void);
|
||||||
XMLNode& get_hook_state (void);
|
XMLNode& get_hook_state (void);
|
||||||
|
|
||||||
|
int load_state ();
|
||||||
|
int save_state ();
|
||||||
|
|
||||||
bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
|
bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
|
||||||
|
|
||||||
/* actions */
|
/* actions */
|
||||||
|
|
@ -131,6 +134,7 @@ private:
|
||||||
static LuaInstance* _instance;
|
static LuaInstance* _instance;
|
||||||
|
|
||||||
void init ();
|
void init ();
|
||||||
|
void set_dirty ();
|
||||||
void session_going_away ();
|
void session_going_away ();
|
||||||
|
|
||||||
LuaState lua;
|
LuaState lua;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue