Bläddra i källkod

Add data view for style

Michael Ragazzon 6 år sedan
förälder
incheckning
c620ab3810

+ 25 - 3
Include/RmlUi/Core/DataView.h

@@ -57,7 +57,7 @@ private:
 
 	struct DataEntry {
 		size_t index = 0; // Index into 'text'
-		String name;
+		String binding_name;
 		String value;
 	};
 
@@ -70,7 +70,7 @@ private:
 
 class DataViewAttribute {
 public:
-	DataViewAttribute(const DataModel& model, Element* element, const String& attribute_name, const String& value_name);
+	DataViewAttribute(const DataModel& model, Element* element, const String& binding_name, const String& attribute_name);
 
 	inline operator bool() const {
 		return !attribute_name.empty() && element;
@@ -79,8 +79,24 @@ public:
 
 private:
 	ObserverPtr<Element> element;
+	String binding_name;
 	String attribute_name;
-	String value_name;
+};
+
+
+class DataViewStyle {
+public:
+	DataViewStyle(const DataModel& model, Element* element, const String& binding_name, const String& property_name);
+
+	inline operator bool() const {
+		return !binding_name.empty() && !property_name.empty() && element;
+	}
+	bool Update(const DataModel& model);
+
+private:
+	ObserverPtr<Element> element;
+	String binding_name;
+	String property_name;
 };
 
 
@@ -111,6 +127,9 @@ public:
 	void AddView(DataViewIf&& view) {
 		if_views.push_back(std::move(view));
 	}
+	void AddView(DataViewStyle&& view) {
+		style_views.push_back(std::move(view));
+	}
 
 	bool Update(const DataModel& model)
 	{
@@ -121,6 +140,8 @@ public:
 			result |= view.Update(model);
 		for (auto& view : if_views)
 			result |= view.Update(model);
+		for (auto& view : style_views)
+			result |= view.Update(model);
 		return result;
 	}
 
@@ -128,6 +149,7 @@ private:
 	std::vector<DataViewText> text_views;
 	std::vector<DataViewAttribute> attribute_views;
 	std::vector<DataViewIf> if_views;
+	std::vector<DataViewStyle> style_views;
 };
 
 }

+ 3 - 3
Samples/basic/databinding/src/main.cpp

@@ -106,16 +106,16 @@ private:
 struct Invader {
 	Rml::Core::String name;
 	Rml::Core::String sprite;
-	Rml::Core::Colourf color;
+	Rml::Core::String color;
 };
 
 
 struct MyData {
 	Rml::Core::String hello_world = "Hello World!";
 	int rating = 99;
-	bool good_rating = 1;
+	bool good_rating = true;
 
-	Invader invader{ "Delightful invader", "icon-invader", Rml::Core::Colourf{} };
+	Invader invader{ "Delightful invader", "icon-invader", "red" };
 
 	std::vector<Invader> invaders;
 } my_data;

+ 31 - 5
Source/Core/DataView.cpp

@@ -58,7 +58,7 @@ DataViewText::DataViewText(const DataModel& model, ElementText* in_parent_elemen
 
 		DataEntry entry;
 		entry.index = text.size();
-		entry.name = (String)StringUtilities::StripWhitespace(StringView(in_text.data() + begin_name, in_text.data() + end_name));
+		entry.binding_name = (String)StringUtilities::StripWhitespace(StringView(in_text.data() + begin_name, in_text.data() + end_name));
 		data_entries.push_back(std::move(entry));
 
 		previous_close_brackets = end_name + 2;
@@ -89,7 +89,7 @@ bool DataViewText::Update(const DataModel& model)
 	for (DataEntry& entry : data_entries)
 	{
 		String value;
-		bool result = model.GetValue(entry.name, value);
+		bool result = model.GetValue(entry.binding_name, value);
 
 		if (result && entry.value != value)
 		{
@@ -144,8 +144,8 @@ String DataViewText::BuildText() const
 }
 
 
-DataViewAttribute::DataViewAttribute(const DataModel& model, Element* element, const String& attribute_name, const String& value_name)
-	: element(element->GetObserverPtr()), attribute_name(attribute_name), value_name(value_name)
+DataViewAttribute::DataViewAttribute(const DataModel& model, Element* element, const String& binding_name, const String& attribute_name)
+	: element(element->GetObserverPtr()), binding_name(binding_name), attribute_name(attribute_name)
 {
 	Update(model);
 }
@@ -154,7 +154,7 @@ bool DataViewAttribute::Update(const DataModel& model)
 {
 	bool result = false;
 	String value;
-	if (model.GetValue(value_name, value))
+	if (model.GetValue(binding_name, value))
 	{
 		Variant* attribute = element->GetAttribute(attribute_name);
 
@@ -169,6 +169,32 @@ bool DataViewAttribute::Update(const DataModel& model)
 
 
 
+DataViewStyle::DataViewStyle(const DataModel& model, Element* element, const String& binding_name, const String& property_name)
+	: element(element->GetObserverPtr()), binding_name(binding_name), property_name(property_name)
+{
+	Update(model);
+}
+
+
+bool DataViewStyle::Update(const DataModel& model)
+{
+	bool result = false;
+	String value;
+	if (model.GetValue(binding_name, value))
+	{
+		const Property* p = element->GetLocalProperty(property_name);
+		if (!p || p->Get<String>() != value)
+		{
+			element->SetProperty(property_name, value);
+			result = true;
+		}
+	}
+	return result;
+}
+
+
+
+
 DataViewIf::DataViewIf(const DataModel& model, Element* element, const String& binding_name) : element(element->GetObserverPtr()), binding_name(binding_name)
 {
 	Update(model);

+ 11 - 1
Source/Core/Factory.cpp

@@ -283,7 +283,7 @@ ElementPtr Factory::InstanceElement(Element* parent, const String& instancer_nam
 							{
 								const String attr_bind_name = name.substr(5 + data_type.size() + 1);
 
-								DataViewAttribute data_view(*data_model, element.get(), attr_bind_name, value_bind_name);
+								DataViewAttribute data_view(*data_model, element.get(), value_bind_name, attr_bind_name);
 								if (data_view)
 									data_model->views.AddView(std::move(data_view));
 								else
@@ -303,6 +303,16 @@ ElementPtr Factory::InstanceElement(Element* parent, const String& instancer_nam
 								else
 									Log::Message(Log::LT_WARNING, "Could not add data-if view to element '%s'.", parent->GetAddress().c_str());
 							}
+							else if (data_type == "style")
+							{
+								const String property_name = name.substr(5 + data_type.size() + 1);
+
+								DataViewStyle view(*data_model, element.get(), value_bind_name, property_name);
+								if (view)
+									data_model->views.AddView(std::move(view));
+								else
+									Log::Message(Log::LT_WARNING, "Could not add data-style view to element '%s'.", parent->GetAddress().c_str());
+							}
 						}
 					}
 				}