New Route dialog: add fallback default selection
[ardour.git] / gtk2_ardour / luainstance.h
1 #ifndef __gtkardour_luainstance_h__
2 #define __gtkardour_luainstance_h__
3
4 #include <bitset>
5
6 #include <cairo.h>
7
8 #include "pbd/id.h"
9 #include "pbd/signals.h"
10 #include "pbd/xml++.h"
11
12 #include "ardour/luascripting.h"
13 #include "ardour/lua_script_params.h"
14 #include "ardour/luabindings.h"
15 #include "ardour/session_handle.h"
16
17 #include "lua/luastate.h"
18
19 #include "luasignal.h"
20
21 namespace luabridge {
22         class LuaRef;
23 }
24
25 typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
26
27 class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
28 {
29 public:
30         LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
31         LuaCallback (ARDOUR::Session*, XMLNode & node);
32         ~LuaCallback ();
33
34         XMLNode& get_state (void);
35         void set_session (ARDOUR::Session *);
36
37         const PBD::ID& id () const { return _id; }
38         const std::string& name () const { return _name; }
39         ActionHook signals () const { return _signals; }
40         bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
41         PBD::Signal0<void> drop_callback;
42
43 protected:
44         void session_going_away ();
45
46 private:
47         LuaState lua;
48
49         PBD::ID _id;
50         std::string _name;
51         ActionHook _signals;
52
53         void reconnect ();
54         template <class T> void reconnect_object (T);
55         void init ();
56
57         luabridge::LuaRef * _lua_add;
58         luabridge::LuaRef * _lua_get;
59         luabridge::LuaRef * _lua_call;
60         luabridge::LuaRef * _lua_save;
61         luabridge::LuaRef * _lua_load;
62
63         PBD::ScopedConnectionList _connections;
64
65         template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
66         template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
67
68         template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
69         template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
70
71         template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
72         template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
73
74         template <typename T, typename C1, typename C2, typename C3> void connect_3 (enum LuaSignal::LuaSignal, T, PBD::Signal3<void, C1, C2, C3>*);
75         template <typename T, typename C1, typename C2, typename C3> void proxy_3 (enum LuaSignal::LuaSignal, T, C1, C2, C3);
76 };
77
78 typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
79 typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
80
81
82
83 class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
84 {
85 public:
86         static LuaInstance* instance();
87         static void destroy_instance();
88         ~LuaInstance();
89
90         static void register_classes (lua_State* L);
91         static void register_hooks (lua_State* L);
92         static void bind_cairo (lua_State* L);
93         static void bind_dialog (lua_State* L);
94
95         static void render_action_icon (cairo_t* cr, int w, int h, uint32_t c, void* i);
96
97         void set_session (ARDOUR::Session* s);
98
99         int set_state (const XMLNode&);
100         XMLNode& get_action_state (void);
101         XMLNode& get_hook_state (void);
102
103         bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
104
105         /* actions */
106         void call_action (const int);
107         void render_icon (int i, cairo_t*, int, int, uint32_t);
108
109         bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
110         bool remove_lua_action (const int);
111         bool lua_action_name (const int, std::string&);
112         std::vector<std::string> lua_action_names ();
113         bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
114         bool lua_action_has_icon (const int);
115         sigc::signal<void,int,std::string> ActionChanged;
116
117         /* callbacks */
118         bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
119         bool unregister_lua_slot (const PBD::ID&);
120         std::vector<PBD::ID> lua_slots () const;
121         bool lua_slot_name (const PBD::ID&, std::string&) const;
122         std::vector<std::string> lua_slot_names () const;
123         bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
124         sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
125
126         static PBD::Signal0<void> LuaTimerDS; // deci-seconds (Timer every .1s)
127         static PBD::Signal0<void> SetSession; // emitted when a session is loaded
128
129 private:
130         LuaInstance();
131         static LuaInstance* _instance;
132
133         void init ();
134         void session_going_away ();
135
136         LuaState lua;
137
138         luabridge::LuaRef * _lua_call_action;
139         luabridge::LuaRef * _lua_render_icon;
140         luabridge::LuaRef * _lua_add_action;
141         luabridge::LuaRef * _lua_del_action;
142         luabridge::LuaRef * _lua_get_action;
143
144         luabridge::LuaRef * _lua_load;
145         luabridge::LuaRef * _lua_save;
146         luabridge::LuaRef * _lua_clear;
147
148         LuaCallbackMap _callbacks;
149         PBD::ScopedConnectionList _slotcon;
150
151         void every_point_one_seconds ();
152         sigc::connection point_one_second_connection;
153 };
154
155 #endif