Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
4.0 kB · 137 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138#ifndef COMPONENTS_LUA_INPUTACTIONS#define COMPONENTS_LUA_INPUTACTIONS
#include <string>#include <string_view>#include <unordered_map>#include <vector>
#include <sol/sol.hpp>
#include <components/lua/asyncpackage.hpp>#include <components/lua/scriptscontainer.hpp>#include <components/misc/algorithm.hpp>
namespace LuaUtil::InputAction{ enum class Type { Boolean, Number, Range, };
struct Info { std::string mKey; Type mType; std::string mL10n; std::string mName; std::string mDescription; sol::main_object mDefaultValue; bool mPersistent; };
class MultiTree { public: using Node = size_t;
Node insert(); bool multiEdge(Node target, const std::vector<Node>& source); size_t size() const { return mParents.size(); }
template <typename Function> // Function = void(Node) void traverse(Function callback) const;
void clear() { mParents.clear(); mChildren.clear(); }
private: std::vector<std::vector<Node>> mParents; std::vector<std::vector<Node>> mChildren;
bool validateTree() const; };
class Registry { public: using ConstIterator = std::vector<Info>::const_iterator; void insert(const Info& info); size_t size() const { return mKeys.size(); } std::optional<std::string> firstKey() const { return mKeys.empty() ? std::nullopt : std::optional(mKeys[0]); } std::optional<std::string> nextKey(std::string_view key) const; std::optional<Info> operator[](std::string_view actionKey); bool bind( std::string_view key, const LuaUtil::Callback& callback, const std::vector<std::string_view>& dependencies); sol::object valueOfType(std::string_view key, Type type); void update(double dt); void registerHandler(std::string_view key, const LuaUtil::Callback& handler) { mHandlers[safeIdByKey(key)].push_back(handler); } void clear(bool force = false);
private: using Id = MultiTree::Node; Id safeIdByKey(std::string_view key); struct Binding { LuaUtil::Callback mCallback; std::vector<Id> mDependencies; }; std::vector<std::string> mKeys; std::unordered_map<std::string, Id, Misc::StringUtils::StringHash, std::equal_to<>> mIds; std::vector<Info> mInfo; std::vector<std::vector<LuaUtil::Callback>> mHandlers; std::vector<std::vector<Binding>> mBindings; std::vector<sol::object> mValues; MultiTree mBindingTree; };}
namespace LuaUtil::InputTrigger{ struct Info { std::string mKey; std::string mL10n; std::string mName; std::string mDescription; bool mPersistent; };
class Registry { public: std::optional<std::string> firstKey() const { return mIds.empty() ? std::nullopt : std::optional(mIds.begin()->first); } std::optional<std::string> nextKey(std::string_view key) const { auto it = mIds.find(key); if (it == mIds.end() || ++it == mIds.end()) return std::nullopt; return it->first; } std::optional<Info> operator[](std::string_view key); void insert(const Info& info); void registerHandler(std::string_view key, const LuaUtil::Callback& callback); void activate(std::string_view key); void clear(bool force = false);
private: using Id = size_t; Id safeIdByKey(std::string_view key); std::unordered_map<std::string, Id, Misc::StringUtils::StringHash, std::equal_to<>> mIds; std::vector<Info> mInfo; std::vector<std::vector<LuaUtil::Callback>> mHandlers; };}
#endif // COMPONENTS_LUA_INPUTACTIONS