|
|
@@ -32,7 +32,6 @@
|
|
|
#include "Header.h"
|
|
|
#include "Types.h"
|
|
|
#include "Variant.h"
|
|
|
-#include "StringUtilities.h"
|
|
|
#include "DataVariable.h"
|
|
|
|
|
|
namespace Rml {
|
|
|
@@ -41,65 +40,54 @@ namespace Core {
|
|
|
class Element;
|
|
|
class DataModel;
|
|
|
|
|
|
-class RMLUICORE_API DataController {};
|
|
|
-
|
|
|
-
|
|
|
-class DataControllerAttribute : public DataController {
|
|
|
+class RMLUICORE_API DataController {
|
|
|
public:
|
|
|
- DataControllerAttribute(DataModel& model, Element* parent, const String& in_attribute_name, const String& in_value_name);
|
|
|
+ bool UpdateVariable(DataModel& model);
|
|
|
+
|
|
|
+ const String& GetVariableName() const;
|
|
|
|
|
|
explicit operator bool() const {
|
|
|
- return !attribute_name.empty() && !variable_address.empty();
|
|
|
+ return !address.empty() && attached_element;
|
|
|
}
|
|
|
- bool Update(Element* element, DataModel& model);
|
|
|
-
|
|
|
- bool OnAttributeChange( const ElementAttributes& changed_attributes)
|
|
|
- {
|
|
|
- bool result = false;
|
|
|
- if (changed_attributes.count(attribute_name) > 0)
|
|
|
- {
|
|
|
- dirty = true;
|
|
|
- result = true;
|
|
|
- }
|
|
|
- return result;
|
|
|
+
|
|
|
+ Element* GetElement() const {
|
|
|
+ return attached_element.get();
|
|
|
+ }
|
|
|
+
|
|
|
+protected:
|
|
|
+ DataController(Element* element);
|
|
|
+
|
|
|
+ void SetAddress(Address new_address) {
|
|
|
+ address = std::move(new_address);
|
|
|
}
|
|
|
|
|
|
+ // Return true if value changed
|
|
|
+ virtual bool UpdateValue(Element* element, Variant& value_inout) = 0;
|
|
|
+
|
|
|
private:
|
|
|
- bool dirty = false;
|
|
|
- String attribute_name;
|
|
|
- Address variable_address;
|
|
|
+ ObserverPtr<Element> attached_element;
|
|
|
+ Address address;
|
|
|
+ Variant value;
|
|
|
};
|
|
|
|
|
|
|
|
|
-class RMLUICORE_API DataControllers : NonCopyMoveable {
|
|
|
+class DataControllerValue final : public DataController {
|
|
|
public:
|
|
|
+ DataControllerValue(DataModel& model, Element* element, const String& in_value_name);
|
|
|
|
|
|
- void AddController(Element* element, DataControllerAttribute&& controller) {
|
|
|
- // TODO: Enable multiple controllers per element
|
|
|
- bool inserted = attribute_controllers.emplace(element, std::move(controller)).second;
|
|
|
- RMLUI_ASSERT(inserted);
|
|
|
- }
|
|
|
+private:
|
|
|
+ bool UpdateValue(Element* element, Variant& value_inout) override;
|
|
|
+};
|
|
|
|
|
|
- bool Update(DataModel& model)
|
|
|
- {
|
|
|
- bool result = false;
|
|
|
- for (auto& controller : attribute_controllers)
|
|
|
- result |= controller.second.Update(controller.first, model);
|
|
|
- return result;
|
|
|
- }
|
|
|
|
|
|
+class RMLUICORE_API DataControllers : NonCopyMoveable {
|
|
|
+public:
|
|
|
+ void Add(UniquePtr<DataController> controller);
|
|
|
|
|
|
- void OnAttributeChange(DataModel& model, Element* element, const ElementAttributes& changed_attributes)
|
|
|
- {
|
|
|
- auto it = attribute_controllers.find(element);
|
|
|
- if (it != attribute_controllers.end())
|
|
|
- {
|
|
|
- it->second.OnAttributeChange(changed_attributes);
|
|
|
- }
|
|
|
- }
|
|
|
+ void DirtyElement(DataModel& model, Element* element);
|
|
|
|
|
|
private:
|
|
|
- UnorderedMap<Element*, DataControllerAttribute> attribute_controllers;
|
|
|
+ UnorderedMap<Element*, UniquePtr<DataController>> controllers;
|
|
|
};
|
|
|
|
|
|
|