From 4777dc75c52f6037c80bb13a321cb6255f92cacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Thu, 20 Oct 2022 22:00:41 +0200 Subject: [PATCH] LibCore: Allow array-like rectangle specifications for rect properties This allows rectangle specifications in the form [x, y, width, height], which mirrors margin properties and is much more convenient than the JSON object specifications that were allowed before. Those are still allowed, of course. --- Userland/Libraries/LibCore/Object.h | 52 +++++++++++++++++------------ 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Userland/Libraries/LibCore/Object.h b/Userland/Libraries/LibCore/Object.h index fd662f363e..8e9d6cc9e4 100644 --- a/Userland/Libraries/LibCore/Object.h +++ b/Userland/Libraries/LibCore/Object.h @@ -311,28 +311,36 @@ T* Object::find_descendant_of_type_named(String const& name) requires IsBaseOfgetter(); \ - JsonObject rect_object; \ - rect_object.set("x"sv, rect.x()); \ - rect_object.set("y"sv, rect.y()); \ - rect_object.set("width"sv, rect.width()); \ - rect_object.set("height"sv, rect.height()); \ - return rect_object; \ - }, \ - [this](auto& value) { \ - if (!value.is_object()) \ - return false; \ - Gfx::IntRect rect; \ - rect.set_x(value.as_object().get("x"sv).to_i32()); \ - rect.set_y(value.as_object().get("y"sv).to_i32()); \ - rect.set_width(value.as_object().get("width"sv).to_i32()); \ - rect.set_height(value.as_object().get("height"sv).to_i32()); \ - setter(rect); \ - return true; \ +#define REGISTER_RECT_PROPERTY(property_name, getter, setter) \ + register_property( \ + property_name, \ + [this] { \ + auto rect = this->getter(); \ + JsonObject rect_object; \ + rect_object.set("x"sv, rect.x()); \ + rect_object.set("y"sv, rect.y()); \ + rect_object.set("width"sv, rect.width()); \ + rect_object.set("height"sv, rect.height()); \ + return rect_object; \ + }, \ + [this](auto& value) { \ + Gfx::IntRect rect; \ + if (value.is_object()) { \ + rect.set_x(value.as_object().get("x"sv).to_i32()); \ + rect.set_y(value.as_object().get("y"sv).to_i32()); \ + rect.set_width(value.as_object().get("width"sv).to_i32()); \ + rect.set_height(value.as_object().get("height"sv).to_i32()); \ + } else if (value.is_array() && value.as_array().size() == 4) { \ + rect.set_x(value.as_array()[0].to_i32()); \ + rect.set_y(value.as_array()[1].to_i32()); \ + rect.set_width(value.as_array()[2].to_i32()); \ + rect.set_height(value.as_array()[3].to_i32()); \ + } else { \ + return false; \ + } \ + setter(rect); \ + \ + return true; \ }); #define REGISTER_SIZE_PROPERTY(property_name, getter, setter) \