summaryrefslogtreecommitdiff
path: root/src/lua/include/property.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/include/property.hpp')
-rw-r--r--src/lua/include/property.hpp52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/lua/include/property.hpp b/src/lua/include/property.hpp
index f19fdeec..724261be 100644
--- a/src/lua/include/property.hpp
+++ b/src/lua/include/property.hpp
@@ -33,17 +33,33 @@ class Property {
public:
Property() : Property(std::monostate{}) {}
Property(const LuaValue&);
- Property(const LuaValue&, std::function<bool(const LuaValue&)>);
+ Property(const LuaValue&, std::function<bool(const LuaValue&)> filter);
- auto Get() -> const LuaValue& { return *value_; }
+ auto get() -> const LuaValue& { return *value_; }
- auto IsTwoWay() -> bool { return cb_.has_value(); }
+ /*
+ * Assigns a new value to this property, bypassing the filter fn. All
+ * bindings will be marked as dirty, and if active, will be reapplied.
+ */
+ auto setDirect(const LuaValue&) -> void;
+ /*
+ * Invokes the filter fn, and if successful, assigns the new value to this
+ * property. All bindings will be marked as dirty, and if active, will be
+ * reapplied.
+ */
+ auto set(const LuaValue&) -> bool;
- auto PushValue(lua_State& s) -> int;
- auto PopValue(lua_State& s) -> bool;
- auto Update(const LuaValue& new_val) -> void;
+ /* Returns whether or not this Property can be written from Lua. */
+ auto isTwoWay() -> bool { return cb_.has_value(); }
- auto AddLuaBinding(lua_State*, int ref) -> void;
+ auto pushValue(lua_State& s) -> int;
+ auto popValue(lua_State& s) -> bool;
+
+ /* Reapplies all active, dirty bindings associated with this Property. */
+ auto reapplyAll() -> void;
+
+ auto addLuaBinding(lua_State*, int ref) -> void;
+ auto applySingle(lua_State*, int ref, bool mark_dirty) -> bool;
private:
std::unique_ptr<LuaValue> value_;
@@ -51,6 +67,28 @@ class Property {
std::pmr::vector<std::pair<lua_State*, int>> bindings_;
};
+/*
+ * Container for a Lua function that should be invoked whenever a Property's
+ * value changes, as well as some extra accounting metadata.
+ */
+struct Binding {
+ /* Checks the value at idx is a Binding, returning a pointer to it if so. */
+ static auto get(lua_State*, int idx) -> Binding*;
+ /*
+ * If the value at idx is a dirty, active Binding, applies the current value
+ * from its Property. Returns false if the binding was active and dirty, but
+ * invoking the Lua callback failed.
+ */
+ static auto apply(lua_State*, int idx) -> bool;
+
+ Property* property;
+ bool active;
+ bool dirty;
+};
+
+static_assert(std::is_trivially_destructible<Binding>());
+static_assert(std::is_trivially_copy_assignable<Binding>());
+
class PropertyBindings {
public:
PropertyBindings();