feat(autogen): split off InternalUpdateProperty

This commit is contained in:
maelstrom 2025-04-28 01:27:23 +02:00
parent 30d00a7de2
commit de30976dc0
4 changed files with 37 additions and 15 deletions

View file

@ -85,8 +85,6 @@ void writePropertySetHandler(std::ofstream& out, ClassAnalysis state) {
} else { } else {
out << "\n this->" << prop.fieldName << " = " << castFromVariant("value", prop.backingFieldType) << ";"; out << "\n this->" << prop.fieldName << " = " << castFromVariant("value", prop.backingFieldType) << ";";
} }
if (!prop.onUpdateCallback.empty())
out << "\n " << prop.onUpdateCallback << "(name);";
out << "\n }"; out << "\n }";
first = false; first = false;
@ -106,6 +104,26 @@ void writePropertySetHandler(std::ofstream& out, ClassAnalysis state) {
out << "\n};\n\n"; out << "\n};\n\n";
} }
void writePropertyUpdateHandler(std::ofstream& out, ClassAnalysis state) {
out << "void " << state.name << "::InternalUpdateProperty(std::string name) {";
out << "\n ";
bool first = true;
for (auto& prop : state.properties) {
if (prop.onUpdateCallback.empty()) continue;
out << (first ? "" : " else ") << "if (name == \"" << prop.name << "\") {";
out << "\n " << prop.onUpdateCallback << "(name);";
out << "\n }";
first = false;
}
out << "\n " << state.baseClass << "::InternalUpdateProperty(name);";
out << "\n};\n\n";
}
void writePropertyGetHandler(std::ofstream& out, ClassAnalysis state) { void writePropertyGetHandler(std::ofstream& out, ClassAnalysis state) {
out << "result<Data::Variant, MemberNotFound> " << state.name << "::InternalGetPropertyValue(std::string name) {"; out << "result<Data::Variant, MemberNotFound> " << state.name << "::InternalGetPropertyValue(std::string name) {";
@ -224,5 +242,6 @@ void writeCodeForClass(std::ofstream& out, ClassAnalysis& state) {
writePropertySetHandler(out, state); writePropertySetHandler(out, state);
writePropertyGetHandler(out, state); writePropertyGetHandler(out, state);
writePropertyMetaHandler(out, state); writePropertyMetaHandler(out, state);
writePropertyUpdateHandler(out, state);
writePropertiesList(out, state); writePropertiesList(out, state);
} }

View file

@ -24,10 +24,11 @@
#define AUTOGEN_PREAMBLE \ #define AUTOGEN_PREAMBLE \
protected: \ protected: \
result<PropertyMeta, MemberNotFound> InternalGetPropertyMeta(std::string name) override; \ virtual result<PropertyMeta, MemberNotFound> InternalGetPropertyMeta(std::string name) override; \
fallible<MemberNotFound, AssignToReadOnlyMember> InternalSetPropertyValue(std::string name, Data::Variant value) override; \ virtual fallible<MemberNotFound, AssignToReadOnlyMember> InternalSetPropertyValue(std::string name, Data::Variant value) override; \
result<Data::Variant, MemberNotFound> InternalGetPropertyValue(std::string name) override; \ virtual result<Data::Variant, MemberNotFound> InternalGetPropertyValue(std::string name) override; \
std::vector<std::string> InternalGetProperties() override; \ virtual void InternalUpdateProperty(std::string name) override; \
virtual std::vector<std::string> InternalGetProperties() override; \
public: \ public: \
const static InstanceType TYPE; \ const static InstanceType TYPE; \
virtual const InstanceType* GetClass() override; \ virtual const InstanceType* GetClass() override; \

View file

@ -189,9 +189,12 @@ result<Data::Variant, MemberNotFound> Instance::GetPropertyValue(std::string nam
return InternalGetPropertyValue(name); return InternalGetPropertyValue(name);
} }
fallible<MemberNotFound, AssignToReadOnlyMember> Instance::SetPropertyValue(std::string name, Data::Variant value) { fallible<MemberNotFound, AssignToReadOnlyMember> Instance::SetPropertyValue(std::string name, Data::Variant value, bool sendUpdateEvent) {
auto result = InternalSetPropertyValue(name, value); auto result = InternalSetPropertyValue(name, value);
if (result.isSuccess()) sendPropertyUpdatedSignal(shared_from_this(), name, value); if (result.isSuccess() && sendUpdateEvent) {
InternalUpdateProperty(name);
sendPropertyUpdatedSignal(shared_from_this(), name, value);
}
return result; return result;
} }
@ -236,6 +239,9 @@ fallible<MemberNotFound, AssignToReadOnlyMember> Instance::InternalSetPropertyVa
return {}; return {};
} }
void Instance::InternalUpdateProperty(std::string name) {
}
std::vector<std::string> Instance::InternalGetProperties() { std::vector<std::string> Instance::InternalGetProperties() {
std::vector<std::string> members; std::vector<std::string> members;
members.push_back("Name"); members.push_back("Name");
@ -245,12 +251,7 @@ std::vector<std::string> Instance::InternalGetProperties() {
} }
void Instance::UpdateProperty(std::string name) { void Instance::UpdateProperty(std::string name) {
// TODO: temporary workaround because I'm too lazy to implement this in autogen InternalUpdateProperty(name);
InternalSetPropertyValue(name, InternalGetPropertyValue(name).expect()).expect();
// PropertyMeta meta = GetPropertyMeta(name).expect();
// if (!meta.updateCallback) return; // Nothing to update, exit.
// meta.updateCallback.value()(name);
} }
std::vector<std::string> Instance::GetProperties() { std::vector<std::string> Instance::GetProperties() {

View file

@ -72,6 +72,7 @@ protected:
virtual result<Data::Variant, MemberNotFound> InternalGetPropertyValue(std::string name); virtual result<Data::Variant, MemberNotFound> InternalGetPropertyValue(std::string name);
virtual fallible<MemberNotFound, AssignToReadOnlyMember> InternalSetPropertyValue(std::string name, Data::Variant value); virtual fallible<MemberNotFound, AssignToReadOnlyMember> InternalSetPropertyValue(std::string name, Data::Variant value);
virtual result<PropertyMeta, MemberNotFound> InternalGetPropertyMeta(std::string name); virtual result<PropertyMeta, MemberNotFound> InternalGetPropertyMeta(std::string name);
virtual void InternalUpdateProperty(std::string name);
virtual std::vector<std::string> InternalGetProperties(); virtual std::vector<std::string> InternalGetProperties();
virtual void OnParentUpdated(std::optional<std::shared_ptr<Instance>> oldParent, std::optional<std::shared_ptr<Instance>> newParent); virtual void OnParentUpdated(std::optional<std::shared_ptr<Instance>> oldParent, std::optional<std::shared_ptr<Instance>> newParent);
@ -110,7 +111,7 @@ public:
// Properties // Properties
result<Data::Variant, MemberNotFound> GetPropertyValue(std::string name); result<Data::Variant, MemberNotFound> GetPropertyValue(std::string name);
fallible<MemberNotFound, AssignToReadOnlyMember> SetPropertyValue(std::string name, Data::Variant value); fallible<MemberNotFound, AssignToReadOnlyMember> SetPropertyValue(std::string name, Data::Variant value, bool sendUpdateEvent = true);
result<PropertyMeta, MemberNotFound> GetPropertyMeta(std::string name); result<PropertyMeta, MemberNotFound> GetPropertyMeta(std::string name);
// Manually trigger the update of a property. Useful internally when setting properties directly // Manually trigger the update of a property. Useful internally when setting properties directly
void UpdateProperty(std::string name); void UpdateProperty(std::string name);