Keep MENU-registered input actions between games

This commit is contained in:
uramer 2025-02-23 19:10:21 +01:00
parent 07cc2a72bb
commit 3a98b945a8
5 changed files with 72 additions and 38 deletions

View file

@ -38,10 +38,10 @@ namespace
sol::state lua; sol::state lua;
LuaUtil::InputAction::Registry registry; LuaUtil::InputAction::Registry registry;
LuaUtil::InputAction::Info a({ "a", LuaUtil::InputAction::Type::Boolean, "test", "a_name", "a_description", LuaUtil::InputAction::Info a({ "a", LuaUtil::InputAction::Type::Boolean, "test", "a_name", "a_description",
sol::make_object(lua, false) }); sol::make_object(lua, false), false });
registry.insert(a); registry.insert(a);
LuaUtil::InputAction::Info b({ "b", LuaUtil::InputAction::Type::Boolean, "test", "b_name", "b_description", LuaUtil::InputAction::Info b({ "b", LuaUtil::InputAction::Type::Boolean, "test", "b_name", "b_description",
sol::make_object(lua, false) }); sol::make_object(lua, false), false });
registry.insert(b); registry.insert(b);
LuaUtil::Callback bindA({ lua.load("return function() return true end")(), sol::table(lua, sol::create) }); LuaUtil::Callback bindA({ lua.load("return function() return true end")(), sol::table(lua, sol::create) });
LuaUtil::Callback bindBToA( LuaUtil::Callback bindBToA(

View file

@ -139,16 +139,18 @@ namespace MWLua
})); }));
api["actions"] = std::ref(context.mLuaManager->inputActions()); api["actions"] = std::ref(context.mLuaManager->inputActions());
api["registerAction"] = [manager = context.mLuaManager](sol::table options) { api["registerAction"]
LuaUtil::InputAction::Info parsedOptions; = [manager = context.mLuaManager, persistent = context.mType == Context::Menu](sol::table options) {
parsedOptions.mKey = options["key"].get<std::string_view>(); LuaUtil::InputAction::Info parsedOptions;
parsedOptions.mType = options["type"].get<LuaUtil::InputAction::Type>(); parsedOptions.mKey = options["key"].get<std::string_view>();
parsedOptions.mL10n = options["l10n"].get<std::string_view>(); parsedOptions.mType = options["type"].get<LuaUtil::InputAction::Type>();
parsedOptions.mName = options["name"].get<std::string_view>(); parsedOptions.mL10n = options["l10n"].get<std::string_view>();
parsedOptions.mDescription = options["description"].get<std::string_view>(); parsedOptions.mName = options["name"].get<std::string_view>();
parsedOptions.mDefaultValue = options["defaultValue"].get<sol::main_object>(); parsedOptions.mDescription = options["description"].get<std::string_view>();
manager->inputActions().insert(std::move(parsedOptions)); parsedOptions.mDefaultValue = options["defaultValue"].get<sol::main_object>();
}; parsedOptions.mPersistent = persistent;
manager->inputActions().insert(std::move(parsedOptions));
};
api["bindAction"] = [manager = context.mLuaManager]( api["bindAction"] = [manager = context.mLuaManager](
std::string_view key, const sol::table& callback, sol::table dependencies) { std::string_view key, const sol::table& callback, sol::table dependencies) {
std::vector<std::string_view> parsedDependencies; std::vector<std::string_view> parsedDependencies;
@ -178,14 +180,16 @@ namespace MWLua
}; };
api["triggers"] = std::ref(context.mLuaManager->inputTriggers()); api["triggers"] = std::ref(context.mLuaManager->inputTriggers());
api["registerTrigger"] = [manager = context.mLuaManager](sol::table options) { api["registerTrigger"]
LuaUtil::InputTrigger::Info parsedOptions; = [manager = context.mLuaManager, persistent = context.mType == Context::Menu](sol::table options) {
parsedOptions.mKey = options["key"].get<std::string_view>(); LuaUtil::InputTrigger::Info parsedOptions;
parsedOptions.mL10n = options["l10n"].get<std::string_view>(); parsedOptions.mKey = options["key"].get<std::string_view>();
parsedOptions.mName = options["name"].get<std::string_view>(); parsedOptions.mL10n = options["l10n"].get<std::string_view>();
parsedOptions.mDescription = options["description"].get<std::string_view>(); parsedOptions.mName = options["name"].get<std::string_view>();
manager->inputTriggers().insert(std::move(parsedOptions)); parsedOptions.mDescription = options["description"].get<std::string_view>();
}; parsedOptions.mPersistent = persistent;
manager->inputTriggers().insert(std::move(parsedOptions));
};
api["registerTriggerHandler"] api["registerTriggerHandler"]
= [manager = context.mLuaManager](std::string_view key, const sol::table& callback) { = [manager = context.mLuaManager](std::string_view key, const sol::table& callback) {
manager->inputTriggers().registerHandler(key, LuaUtil::Callback::fromLua(callback)); manager->inputTriggers().registerHandler(key, LuaUtil::Callback::fromLua(callback));

View file

@ -654,8 +654,8 @@ namespace MWLua
MWBase::Environment::get().getL10nManager()->dropCache(); MWBase::Environment::get().getL10nManager()->dropCache();
mUiResourceManager.clear(); mUiResourceManager.clear();
mLua.dropScriptCache(); mLua.dropScriptCache();
mInputActions.clear(); mInputActions.clear(true);
mInputTriggers.clear(); mInputTriggers.clear(true);
initConfiguration(); initConfiguration();
ESM::LuaScripts globalData; ESM::LuaScripts globalData;

View file

@ -239,6 +239,29 @@ namespace LuaUtil
} }
}); });
} }
void Registry::clear(bool force)
{
std::vector<Info> infoToKeep;
if (!force)
{
for (const Info& info : mInfo)
if (info.mPersistent)
infoToKeep.push_back(info);
}
mKeys.clear();
mIds.clear();
mInfo.clear();
mHandlers.clear();
mBindings.clear();
mValues.clear();
mBindingTree.clear();
if (!force)
{
for (const Info& i : infoToKeep)
insert(i);
}
}
} }
namespace InputTrigger namespace InputTrigger
@ -292,5 +315,24 @@ namespace LuaUtil
}), }),
handlers.end()); handlers.end());
} }
void Registry::clear(bool force)
{
std::vector<Info> infoToKeep;
if (!force)
{
for (const Info& info : mInfo)
if (info.mPersistent)
infoToKeep.push_back(info);
}
mInfo.clear();
mHandlers.clear();
mIds.clear();
if (!force)
{
for (const Info& i : infoToKeep)
insert(i);
}
}
} }
} }

View file

@ -29,6 +29,7 @@ namespace LuaUtil::InputAction
std::string mName; std::string mName;
std::string mDescription; std::string mDescription;
sol::main_object mDefaultValue; sol::main_object mDefaultValue;
bool mPersistent;
}; };
class MultiTree class MultiTree
@ -73,16 +74,7 @@ namespace LuaUtil::InputAction
{ {
mHandlers[safeIdByKey(key)].push_back(handler); mHandlers[safeIdByKey(key)].push_back(handler);
} }
void clear() void clear(bool force = false);
{
mKeys.clear();
mIds.clear();
mInfo.clear();
mHandlers.clear();
mBindings.clear();
mValues.clear();
mBindingTree.clear();
}
private: private:
using Id = MultiTree::Node; using Id = MultiTree::Node;
@ -110,6 +102,7 @@ namespace LuaUtil::InputTrigger
std::string mL10n; std::string mL10n;
std::string mName; std::string mName;
std::string mDescription; std::string mDescription;
bool mPersistent;
}; };
class Registry class Registry
@ -130,12 +123,7 @@ namespace LuaUtil::InputTrigger
void insert(const Info& info); void insert(const Info& info);
void registerHandler(std::string_view key, const LuaUtil::Callback& callback); void registerHandler(std::string_view key, const LuaUtil::Callback& callback);
void activate(std::string_view key); void activate(std::string_view key);
void clear() void clear(bool force = false);
{
mInfo.clear();
mHandlers.clear();
mIds.clear();
}
private: private:
using Id = size_t; using Id = size_t;