X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Ftheme.cpp;h=c881dc6891be2b1a32e90fb1b3fb8ec3b043f515;hb=f8da8feaff269b75480625e1384951c20c3a529d;hp=fb1fa2fd7380c5422fc00dba6eb221dccc350f8c;hpb=337e2d06624b4b46eb2e7e5365e2ece219f9f100;p=nageru diff --git a/nageru/theme.cpp b/nageru/theme.cpp index fb1fa2f..c881dc6 100644 --- a/nageru/theme.cpp +++ b/nageru/theme.cpp @@ -791,8 +791,9 @@ const luaL_Reg Scene_funcs[] = { 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 }, @@ -1237,16 +1238,16 @@ Theme::Theme(const string &filename, const vector &search_dirs, Resource 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); @@ -1265,6 +1266,7 @@ Theme::Theme(const string &filename, const vector &search_dirs, Resource Theme::~Theme() { + theme_menu.reset(); lua_close(L); } @@ -1296,7 +1298,7 @@ void Theme::register_constants() 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 = {} @@ -1304,6 +1306,10 @@ void Theme::register_class(const char *class_name, const luaL_Reg *funcs) 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); } @@ -1592,25 +1598,73 @@ void Theme::channel_clicked(int preview_num) assert(lua_gettop(L) == 0); } -int Theme::set_theme_menu(lua_State *L) +template +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> create_recursive_theme_menu(lua_State *L); + +unique_ptr create_theme_menu_entry(lua_State *L, int index) +{ + unique_ptr 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> 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> create_recursive_theme_menu(lua_State *L) +{ + vector> 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> 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);