const luaL_Reg Block_funcs[] = {
{ "display", Block_display },
- { "choose_alternative", Block_choose_alternative },
+ { "choose", Block_choose },
{ "enable", Block_enable },
+ { "enable_if", Block_enable_if },
{ "disable", Block_disable },
{ "set_int", Block_set_int },
{ "set_float", Block_set_float },
register_class("ImageInput", ImageInput_funcs);
register_class("VideoInput", VideoInput_funcs);
register_class("HTMLInput", HTMLInput_funcs);
- register_class("IdentityEffect", IdentityEffect_funcs);
- register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs);
- register_class("ResampleEffect", ResampleEffect_funcs);
- register_class("PaddingEffect", PaddingEffect_funcs);
- register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs);
- register_class("OverlayEffect", OverlayEffect_funcs);
- register_class("ResizeEffect", ResizeEffect_funcs);
- register_class("MultiplyEffect", MultiplyEffect_funcs);
- register_class("MixEffect", MixEffect_funcs);
- register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs);
+ register_class("IdentityEffect", IdentityEffect_funcs, IDENTITY_EFFECT);
+ register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs, WHITE_BALANCE_EFFECT);
+ register_class("ResampleEffect", ResampleEffect_funcs, RESAMPLE_EFFECT);
+ register_class("PaddingEffect", PaddingEffect_funcs, PADDING_EFFECT);
+ register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs, INTEGRAL_PADDING_EFFECT);
+ register_class("OverlayEffect", OverlayEffect_funcs, OVERLAY_EFFECT);
+ register_class("ResizeEffect", ResizeEffect_funcs, RESIZE_EFFECT);
+ register_class("MultiplyEffect", MultiplyEffect_funcs, MULTIPLY_EFFECT);
+ register_class("MixEffect", MixEffect_funcs, MIX_EFFECT);
+ register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs, LIFT_GAMMA_GAIN_EFFECT);
register_class("InputStateInfo", InputStateInfo_funcs);
register_class("ThemeMenu", ThemeMenu_funcs);
Theme::~Theme()
{
+ theme_menu.reset();
lua_close(L);
}
assert(lua_gettop(L) == 0);
}
-void Theme::register_class(const char *class_name, const luaL_Reg *funcs)
+void Theme::register_class(const char *class_name, const luaL_Reg *funcs, EffectType effect_type)
{
assert(lua_gettop(L) == 0);
luaL_newmetatable(L, class_name); // mt = {}
luaL_setfuncs(L, funcs, 1); // for (name,f in funcs) { mt[name] = f, with upvalue {theme} }
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index"); // mt.__index = mt
+ if (effect_type != NO_EFFECT_TYPE) {
+ lua_pushnumber(L, effect_type);
+ lua_setfield(L, -2, "__effect_type_id"); // mt.__effect_type_id = effect_type
+ }
lua_setglobal(L, class_name); // ClassName = mt
assert(lua_gettop(L) == 0);
}
assert(lua_gettop(L) == 0);
}
-int Theme::set_theme_menu(lua_State *L)
+template <class T>
+void destroy(T &ref)
+{
+ ref.~T();
+}
+
+Theme::MenuEntry::~MenuEntry()
{
- for (const Theme::MenuEntry &entry : theme_menu) {
- luaL_unref(L, LUA_REGISTRYINDEX, entry.lua_ref);
+ if (is_submenu) {
+ luaL_unref(entry.L, LUA_REGISTRYINDEX, entry.lua_ref);
+ } else {
+ destroy(submenu);
}
- theme_menu.clear();
+}
- int num_elements = lua_gettop(L);
- for (int i = 1; i <= num_elements; ++i) {
- lua_rawgeti(L, i, 1);
- const string text = checkstdstring(L, -1);
- lua_pop(L, 1);
+namespace {
+
+vector<unique_ptr<Theme::MenuEntry>> create_recursive_theme_menu(lua_State *L);
+
+unique_ptr<Theme::MenuEntry> create_theme_menu_entry(lua_State *L, int index)
+{
+ unique_ptr<Theme::MenuEntry> entry;
+
+ lua_rawgeti(L, index, 1);
+ const string text = checkstdstring(L, -1);
+ lua_pop(L, 1);
- lua_rawgeti(L, i, 2);
+ lua_rawgeti(L, index, 2);
+ if (lua_istable(L, -1)) {
+ vector<unique_ptr<Theme::MenuEntry>> submenu = create_recursive_theme_menu(L);
+ entry.reset(new Theme::MenuEntry{ text, move(submenu) });
+ lua_pop(L, 1);
+ } else {
luaL_checktype(L, -1, LUA_TFUNCTION);
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
+ entry.reset(new Theme::MenuEntry{ text, L, ref });
+ }
+ return entry;
+}
+
+vector<unique_ptr<Theme::MenuEntry>> create_recursive_theme_menu(lua_State *L)
+{
+ vector<unique_ptr<Theme::MenuEntry>> menu;
+ size_t num_elements = lua_objlen(L, -1);
+ for (size_t i = 1; i <= num_elements; ++i) {
+ lua_rawgeti(L, -1, i);
+ menu.emplace_back(create_theme_menu_entry(L, -1));
+ lua_pop(L, 1);
+ }
+ return menu;
+}
- theme_menu.push_back(MenuEntry{ text, ref });
+} // namespace
+
+int Theme::set_theme_menu(lua_State *L)
+{
+ theme_menu.reset();
+
+ vector<unique_ptr<MenuEntry>> root_menu;
+ int num_elements = lua_gettop(L);
+ for (int i = 1; i <= num_elements; ++i) {
+ root_menu.emplace_back(create_theme_menu_entry(L, i));
}
+ fprintf(stderr, "now creating a new one\n");
+ theme_menu.reset(new MenuEntry("", move(root_menu)));
+ fprintf(stderr, "DONE reset\n");
+
lua_pop(L, num_elements);
assert(lua_gettop(L) == 0);