mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-28 21:07:59 +03:00
Keep MENU-registered input actions between games
This commit is contained in:
parent
07cc2a72bb
commit
3a98b945a8
5 changed files with 72 additions and 38 deletions
|
@ -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(
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue