Allow to un/load Lua Session Scripts in the Script Manager

This commit is contained in:
Robin Gareus 2017-02-19 00:07:16 +01:00
parent 32fe5a083e
commit a732c7c9fa
4 changed files with 159 additions and 3 deletions

View file

@ -16,8 +16,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "gtkmm2ext/gui_thread.h"
#include "gtkmm2ext/utils.h"
#include "ardour/session.h"
#include "LuaBridge/LuaBridge.h"
#include "lua_script_manager.h"
#include "script_selector.h"
#include "pbd/i18n.h"
@ -34,6 +39,8 @@ LuaScriptManager::LuaScriptManager ()
, _a_call_button (_("Call"))
, _c_add_button (_("New Hook"))
, _c_del_button (_("Remove"))
, _s_add_button (_("Load"))
, _s_del_button (_("Remove"))
{
/* action script page */
_a_store = ListStore::create (_a_model);
@ -98,21 +105,62 @@ LuaScriptManager::LuaScriptManager ()
pages.pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Action Hooks"));
/* session script page */
_s_store = ListStore::create (_s_model);
_s_view.set_model (_s_store);
_s_view.append_column (_("Name"), _s_model.name);
_s_view.get_column(0)->set_resizable (true);
_s_view.get_column(0)->set_expand (true);
edit_box = manage (new Gtk::HBox);
edit_box->set_spacing(3);
edit_box->pack_start (_s_add_button, true, true);
edit_box->pack_start (_s_del_button, true, true);
_s_add_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::add_sess_btn_clicked));
_s_del_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::del_sess_btn_clicked));
_s_view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &LuaScriptManager::session_script_selection_changed));
vbox = manage (new VBox());
vbox->pack_start (_s_view, false, false);
vbox->pack_end (*edit_box, false, false);
vbox->show_all ();
pages.pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Session Scripts"));
/* global layout */
add (pages);
pages.show();
setup_actions ();
setup_callbacks ();
setup_session_scripts ();
action_selection_changed ();
callback_selection_changed ();
session_script_selection_changed ();
}
void
LuaScriptManager::set_session (ARDOUR::Session *s)
{
ArdourWindow::set_session (s);
setup_session_scripts ();
if (!_session) {
return;
}
_session->LuaScriptsChanged.connect (_session_script_connection, invalidator (*this), boost::bind (&LuaScriptManager::setup_session_scripts, this), gui_context());
setup_session_scripts ();
}
void
LuaScriptManager::session_going_away ()
{
ArdourWindow::session_going_away ();
_session_script_connection.disconnect ();
hide_all();
}
@ -310,3 +358,61 @@ LuaScriptManager::set_callback_script_name (PBD::ID id, const std::string& name,
}
callback_selection_changed ();
}
void
LuaScriptManager::setup_session_scripts ()
{
_s_store->clear ();
if (!_session) {
return;
}
std::vector<std::string> reg = _session->registered_lua_functions ();
for (std::vector<string>::const_iterator i = reg.begin(); i != reg.end(); ++i) {
TreeModel::Row r = *_s_store->append ();
r[_s_model.name] = *i;
}
session_script_selection_changed ();
}
void
LuaScriptManager::session_script_selection_changed ()
{
if (!_session) {
_s_del_button.set_sensitive (false);
_s_add_button.set_sensitive (false);
return;
}
TreeModel::Row row = *(_s_view.get_selection()->get_selected());
if (row) {
_s_del_button.set_sensitive (true);
} else {
_s_del_button.set_sensitive (false);
}
_s_add_button.set_sensitive (true);
}
void
LuaScriptManager::add_sess_btn_clicked ()
{
if (!_session) {
return;
}
LuaInstance *li = LuaInstance::instance();
li->interactive_add (LuaScriptInfo::Session, -1);
}
void
LuaScriptManager::del_sess_btn_clicked ()
{
assert (_session);
TreeModel::Row row = *(_s_view.get_selection()->get_selected());
const std::string& name = row[_s_model.name];
try {
_session->unregister_lua_function (name);
} catch (luabridge::LuaException const& e) {
string msg = string_compose (_("Session script '%1' removal failed: %2"), name, e.what ());
MessageDialog am (msg);
am.run ();
}
}