Skip to content

Commit 6e9d15f

Browse files
committed
Merge branch 'keep-menu-actions-after-load' into 'master'
#8365 Keep MENU-registered input actions between games See merge request OpenMW/openmw!4554
2 parents 62d1cdc + 3a98b94 commit 6e9d15f

File tree

5 files changed

+72
-38
lines changed

5 files changed

+72
-38
lines changed

apps/components_tests/lua/test_inputactions.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ namespace
3838
sol::state lua;
3939
LuaUtil::InputAction::Registry registry;
4040
LuaUtil::InputAction::Info a({ "a", LuaUtil::InputAction::Type::Boolean, "test", "a_name", "a_description",
41-
sol::make_object(lua, false) });
41+
sol::make_object(lua, false), false });
4242
registry.insert(a);
4343
LuaUtil::InputAction::Info b({ "b", LuaUtil::InputAction::Type::Boolean, "test", "b_name", "b_description",
44-
sol::make_object(lua, false) });
44+
sol::make_object(lua, false), false });
4545
registry.insert(b);
4646
LuaUtil::Callback bindA({ lua.load("return function() return true end")(), sol::table(lua, sol::create) });
4747
LuaUtil::Callback bindBToA(

apps/openmw/mwlua/inputbindings.cpp

+22-18
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,18 @@ namespace MWLua
139139
}));
140140

141141
api["actions"] = std::ref(context.mLuaManager->inputActions());
142-
api["registerAction"] = [manager = context.mLuaManager](sol::table options) {
143-
LuaUtil::InputAction::Info parsedOptions;
144-
parsedOptions.mKey = options["key"].get<std::string_view>();
145-
parsedOptions.mType = options["type"].get<LuaUtil::InputAction::Type>();
146-
parsedOptions.mL10n = options["l10n"].get<std::string_view>();
147-
parsedOptions.mName = options["name"].get<std::string_view>();
148-
parsedOptions.mDescription = options["description"].get<std::string_view>();
149-
parsedOptions.mDefaultValue = options["defaultValue"].get<sol::main_object>();
150-
manager->inputActions().insert(std::move(parsedOptions));
151-
};
142+
api["registerAction"]
143+
= [manager = context.mLuaManager, persistent = context.mType == Context::Menu](sol::table options) {
144+
LuaUtil::InputAction::Info parsedOptions;
145+
parsedOptions.mKey = options["key"].get<std::string_view>();
146+
parsedOptions.mType = options["type"].get<LuaUtil::InputAction::Type>();
147+
parsedOptions.mL10n = options["l10n"].get<std::string_view>();
148+
parsedOptions.mName = options["name"].get<std::string_view>();
149+
parsedOptions.mDescription = options["description"].get<std::string_view>();
150+
parsedOptions.mDefaultValue = options["defaultValue"].get<sol::main_object>();
151+
parsedOptions.mPersistent = persistent;
152+
manager->inputActions().insert(std::move(parsedOptions));
153+
};
152154
api["bindAction"] = [manager = context.mLuaManager](
153155
std::string_view key, const sol::table& callback, sol::table dependencies) {
154156
std::vector<std::string_view> parsedDependencies;
@@ -178,14 +180,16 @@ namespace MWLua
178180
};
179181

180182
api["triggers"] = std::ref(context.mLuaManager->inputTriggers());
181-
api["registerTrigger"] = [manager = context.mLuaManager](sol::table options) {
182-
LuaUtil::InputTrigger::Info parsedOptions;
183-
parsedOptions.mKey = options["key"].get<std::string_view>();
184-
parsedOptions.mL10n = options["l10n"].get<std::string_view>();
185-
parsedOptions.mName = options["name"].get<std::string_view>();
186-
parsedOptions.mDescription = options["description"].get<std::string_view>();
187-
manager->inputTriggers().insert(std::move(parsedOptions));
188-
};
183+
api["registerTrigger"]
184+
= [manager = context.mLuaManager, persistent = context.mType == Context::Menu](sol::table options) {
185+
LuaUtil::InputTrigger::Info parsedOptions;
186+
parsedOptions.mKey = options["key"].get<std::string_view>();
187+
parsedOptions.mL10n = options["l10n"].get<std::string_view>();
188+
parsedOptions.mName = options["name"].get<std::string_view>();
189+
parsedOptions.mDescription = options["description"].get<std::string_view>();
190+
parsedOptions.mPersistent = persistent;
191+
manager->inputTriggers().insert(std::move(parsedOptions));
192+
};
189193
api["registerTriggerHandler"]
190194
= [manager = context.mLuaManager](std::string_view key, const sol::table& callback) {
191195
manager->inputTriggers().registerHandler(key, LuaUtil::Callback::fromLua(callback));

apps/openmw/mwlua/luamanagerimp.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -654,8 +654,8 @@ namespace MWLua
654654
MWBase::Environment::get().getL10nManager()->dropCache();
655655
mUiResourceManager.clear();
656656
mLua.dropScriptCache();
657-
mInputActions.clear();
658-
mInputTriggers.clear();
657+
mInputActions.clear(true);
658+
mInputTriggers.clear(true);
659659
initConfiguration();
660660

661661
ESM::LuaScripts globalData;

components/lua/inputactions.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,29 @@ namespace LuaUtil
239239
}
240240
});
241241
}
242+
243+
void Registry::clear(bool force)
244+
{
245+
std::vector<Info> infoToKeep;
246+
if (!force)
247+
{
248+
for (const Info& info : mInfo)
249+
if (info.mPersistent)
250+
infoToKeep.push_back(info);
251+
}
252+
mKeys.clear();
253+
mIds.clear();
254+
mInfo.clear();
255+
mHandlers.clear();
256+
mBindings.clear();
257+
mValues.clear();
258+
mBindingTree.clear();
259+
if (!force)
260+
{
261+
for (const Info& i : infoToKeep)
262+
insert(i);
263+
}
264+
}
242265
}
243266

244267
namespace InputTrigger
@@ -292,5 +315,24 @@ namespace LuaUtil
292315
}),
293316
handlers.end());
294317
}
318+
319+
void Registry::clear(bool force)
320+
{
321+
std::vector<Info> infoToKeep;
322+
if (!force)
323+
{
324+
for (const Info& info : mInfo)
325+
if (info.mPersistent)
326+
infoToKeep.push_back(info);
327+
}
328+
mInfo.clear();
329+
mHandlers.clear();
330+
mIds.clear();
331+
if (!force)
332+
{
333+
for (const Info& i : infoToKeep)
334+
insert(i);
335+
}
336+
}
295337
}
296338
}

components/lua/inputactions.hpp

+4-16
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace LuaUtil::InputAction
2929
std::string mName;
3030
std::string mDescription;
3131
sol::main_object mDefaultValue;
32+
bool mPersistent;
3233
};
3334

3435
class MultiTree
@@ -73,16 +74,7 @@ namespace LuaUtil::InputAction
7374
{
7475
mHandlers[safeIdByKey(key)].push_back(handler);
7576
}
76-
void clear()
77-
{
78-
mKeys.clear();
79-
mIds.clear();
80-
mInfo.clear();
81-
mHandlers.clear();
82-
mBindings.clear();
83-
mValues.clear();
84-
mBindingTree.clear();
85-
}
77+
void clear(bool force = false);
8678

8779
private:
8880
using Id = MultiTree::Node;
@@ -110,6 +102,7 @@ namespace LuaUtil::InputTrigger
110102
std::string mL10n;
111103
std::string mName;
112104
std::string mDescription;
105+
bool mPersistent;
113106
};
114107

115108
class Registry
@@ -130,12 +123,7 @@ namespace LuaUtil::InputTrigger
130123
void insert(const Info& info);
131124
void registerHandler(std::string_view key, const LuaUtil::Callback& callback);
132125
void activate(std::string_view key);
133-
void clear()
134-
{
135-
mInfo.clear();
136-
mHandlers.clear();
137-
mIds.clear();
138-
}
126+
void clear(bool force = false);
139127

140128
private:
141129
using Id = size_t;

0 commit comments

Comments
 (0)