Add Editor/UI Lua Scripting and Action/Callback Script
[ardour.git] / gtk2_ardour / luainstance.h
1 #ifndef __gtkardour_luainstance_h__
2 #define __gtkardour_luainstance_h__
3
4 #include <bitset>
5
6 #include "pbd/id.h"
7 #include "pbd/signals.h"
8 #include "pbd/xml++.h"
9
10 #include "ardour/luascripting.h"
11 #include "ardour/luabindings.h"
12 #include "ardour/session_handle.h"
13
14 #include "lua/luastate.h"
15 #include "LuaBridge/LuaBridge.h"
16
17 #include "luasignal.h"
18
19 typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
20
21 class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
22 {
23 public:
24         LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
25         LuaCallback (ARDOUR::Session*, XMLNode & node);
26         ~LuaCallback ();
27
28         XMLNode& get_state (void);
29         void set_session (ARDOUR::Session *);
30
31         const PBD::ID& id () const { return _id; }
32         const std::string& name () const { return _name; }
33         ActionHook signals () const { return _signals; }
34         bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
35         PBD::Signal0<void> drop_callback;
36
37 protected:
38         void session_going_away ();
39
40 private:
41         LuaState lua;
42
43         PBD::ID _id;
44         std::string _name;
45         ActionHook _signals;
46
47         void reconnect ();
48         template <class T> void reconnect_object (T);
49         void init ();
50
51         luabridge::LuaRef * _lua_add;
52         luabridge::LuaRef * _lua_get;
53         luabridge::LuaRef * _lua_call;
54         luabridge::LuaRef * _lua_save;
55         luabridge::LuaRef * _lua_load;
56
57         PBD::ScopedConnectionList _connections;
58
59         template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
60         template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
61
62         template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
63         template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
64
65         template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
66         template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
67 };
68
69 typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
70 typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
71
72
73
74 class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
75 {
76 public:
77         static LuaInstance* instance();
78         ~LuaInstance();
79
80         static void register_classes (lua_State* L);
81         static void register_hooks (lua_State* L);
82
83         void set_session (ARDOUR::Session* s);
84
85         int set_state (const XMLNode&);
86         XMLNode& get_action_state (void);
87         XMLNode& get_hook_state (void);
88
89         bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
90
91         /* actions */
92         void call_action (const int);
93
94         bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
95         bool remove_lua_action (const int);
96         bool lua_action_name (const int, std::string&);
97         std::vector<std::string> lua_action_names ();
98         bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
99         sigc::signal<void,int,std::string> ActionChanged;
100
101         /* callbacks */
102         bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
103         bool unregister_lua_slot (const PBD::ID&);
104         std::vector<PBD::ID> lua_slots () const;
105         bool lua_slot_name (const PBD::ID&, std::string&) const;
106         std::vector<std::string> lua_slot_names () const;
107         bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
108         sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
109
110 private:
111         LuaInstance();
112         static LuaInstance* _instance;
113
114         void init ();
115         void session_going_away ();
116
117         LuaState lua;
118
119         luabridge::LuaRef * _lua_call_action;
120         luabridge::LuaRef * _lua_add_action;
121         luabridge::LuaRef * _lua_del_action;
122         luabridge::LuaRef * _lua_get_action;
123
124         luabridge::LuaRef * _lua_load;
125         luabridge::LuaRef * _lua_save;
126         luabridge::LuaRef * _lua_clear;
127
128         LuaCallbackMap _callbacks;
129         PBD::ScopedConnectionList _slotcon;
130 };
131
132 #endif