Przeglądaj źródła

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.
kleines Filmröllchen 2 lat temu
rodzic
commit
4777dc75c5
1 zmienionych plików z 30 dodań i 22 usunięć
  1. 30 22
      Userland/Libraries/LibCore/Object.h

+ 30 - 22
Userland/Libraries/LibCore/Object.h

@@ -311,28 +311,36 @@ T* Object::find_descendant_of_type_named(String const& name) requires IsBaseOf<O
         },                                                     \
         {});
 
-#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) {                                            \
-            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) \