Margins.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. namespace GUI {
  8. class Margins {
  9. public:
  10. Margins() = default;
  11. Margins(int all)
  12. : m_top(all)
  13. , m_right(all)
  14. , m_bottom(all)
  15. , m_left(all)
  16. {
  17. }
  18. Margins(int vertical, int horizontal)
  19. : m_top(vertical)
  20. , m_right(horizontal)
  21. , m_bottom(vertical)
  22. , m_left(horizontal)
  23. {
  24. }
  25. Margins(int top, int horizontal, int bottom)
  26. : m_top(top)
  27. , m_right(horizontal)
  28. , m_bottom(bottom)
  29. , m_left(horizontal)
  30. {
  31. }
  32. Margins(int top, int right, int bottom, int left)
  33. : m_top(top)
  34. , m_right(right)
  35. , m_bottom(bottom)
  36. , m_left(left)
  37. {
  38. }
  39. ~Margins() = default;
  40. bool is_null() const { return !m_left && !m_top && !m_right && !m_bottom; }
  41. int top() const { return m_top; }
  42. int right() const { return m_right; }
  43. int bottom() const { return m_bottom; }
  44. int left() const { return m_left; }
  45. void set_top(int value) { m_top = value; }
  46. void set_right(int value) { m_right = value; }
  47. void set_bottom(int value) { m_bottom = value; }
  48. void set_left(int value) { m_left = value; }
  49. bool operator==(const Margins& other) const
  50. {
  51. return m_left == other.m_left
  52. && m_top == other.m_top
  53. && m_right == other.m_right
  54. && m_bottom == other.m_bottom;
  55. }
  56. private:
  57. int m_top { 0 };
  58. int m_right { 0 };
  59. int m_bottom { 0 };
  60. int m_left { 0 };
  61. };
  62. }
  63. #define REGISTER_MARGINS_PROPERTY(property_name, getter, setter) \
  64. register_property( \
  65. property_name, [this]() { \
  66. auto m = getter(); \
  67. JsonObject margins_object; \
  68. margins_object.set("left", m.left()); \
  69. margins_object.set("right", m.right()); \
  70. margins_object.set("top", m.top()); \
  71. margins_object.set("bottom", m.bottom()); \
  72. return margins_object; }, \
  73. [this](auto& value) { \
  74. if (!value.is_array()) \
  75. return false; \
  76. auto size = value.as_array().size(); \
  77. if (size == 0 || size > 4) \
  78. return false; \
  79. int m[4]; \
  80. for (size_t i = 0; i < size; ++i) \
  81. m[i] = value.as_array().at(i).to_i32(); \
  82. if (size == 1) \
  83. setter({ m[0] }); \
  84. else if (size == 2) \
  85. setter({ m[0], m[1] }); \
  86. else if (size == 3) \
  87. setter({ m[0], m[1], m[2] }); \
  88. else \
  89. setter({ m[0], m[1], m[2], m[3] }); \
  90. return true; \
  91. });