VBWidget.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "VBWidget.h"
  2. #include "VBForm.h"
  3. #include "VBProperty.h"
  4. #include "VBWidgetRegistry.h"
  5. #include "VBWidgetPropertyModel.h"
  6. #include <LibGUI/GPainter.h>
  7. #include <LibGUI/GLabel.h>
  8. #include <LibGUI/GButton.h>
  9. #include <LibGUI/GScrollBar.h>
  10. #include <LibGUI/GSpinBox.h>
  11. #include <LibGUI/GTextEditor.h>
  12. #include <LibGUI/GGroupBox.h>
  13. #include <LibGUI/GProgressBar.h>
  14. VBWidget::VBWidget(VBWidgetType type, VBForm& form)
  15. : m_type(type)
  16. , m_form(form)
  17. , m_property_model(VBWidgetPropertyModel::create(*this))
  18. {
  19. m_gwidget = VBWidgetRegistry::build_gwidget(type, &form, m_properties);
  20. }
  21. VBWidget::~VBWidget()
  22. {
  23. }
  24. Rect VBWidget::rect() const
  25. {
  26. return m_gwidget->relative_rect();
  27. }
  28. void VBWidget::set_rect(const Rect& rect)
  29. {
  30. if (rect == m_gwidget->relative_rect())
  31. return;
  32. m_gwidget->set_relative_rect(rect);
  33. synchronize_properties();
  34. }
  35. bool VBWidget::is_selected() const
  36. {
  37. return m_form.is_selected(*this);
  38. }
  39. Rect VBWidget::grabber_rect(Direction direction) const
  40. {
  41. int grabber_size = 5;
  42. int half_grabber_size = grabber_size / 2;
  43. switch (direction) {
  44. case Direction::Left:
  45. return { rect().x() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
  46. case Direction::UpLeft:
  47. return { rect().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  48. case Direction::Up:
  49. return { rect().center().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  50. case Direction::UpRight:
  51. return { rect().right() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  52. case Direction::Right:
  53. return { rect().right() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
  54. case Direction::DownLeft:
  55. return { rect().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  56. case Direction::Down:
  57. return { rect().center().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  58. case Direction::DownRight:
  59. return { rect().right() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  60. default:
  61. ASSERT_NOT_REACHED();
  62. }
  63. }
  64. Direction VBWidget::grabber_at(const Point& position) const
  65. {
  66. Direction found_grabber = Direction::None;
  67. for_each_direction([&] (Direction direction) {
  68. if (grabber_rect(direction).contains(position))
  69. found_grabber = direction;
  70. });
  71. return found_grabber;
  72. }
  73. void VBWidget::for_each_property(Function<void(VBProperty&)> callback)
  74. {
  75. for (auto& it : m_properties) {
  76. callback(*it);
  77. }
  78. }
  79. void VBWidget::synchronize_properties()
  80. {
  81. property("width").set_value(m_gwidget->width());
  82. property("height").set_value(m_gwidget->height());
  83. property("x").set_value(m_gwidget->x());
  84. property("y").set_value(m_gwidget->y());
  85. property("visible").set_value(m_gwidget->is_visible());
  86. property("enabled").set_value(m_gwidget->is_enabled());
  87. property("tooltip").set_value(m_gwidget->tooltip());
  88. property("background_color").set_value(m_gwidget->background_color());
  89. property("foreground_color").set_value(m_gwidget->foreground_color());
  90. if (m_type == VBWidgetType::GLabel) {
  91. auto& widget = *static_cast<GLabel*>(m_gwidget);
  92. property("text").set_value(widget.text());
  93. }
  94. if (m_type == VBWidgetType::GButton) {
  95. auto& widget = *static_cast<GButton*>(m_gwidget);
  96. property("caption").set_value(widget.caption());
  97. }
  98. if (m_type == VBWidgetType::GScrollBar) {
  99. auto& widget = *static_cast<GScrollBar*>(m_gwidget);
  100. property("min").set_value(widget.min());
  101. property("max").set_value(widget.max());
  102. property("value").set_value(widget.value());
  103. property("step").set_value(widget.step());
  104. }
  105. if (m_type == VBWidgetType::GSpinBox) {
  106. auto& widget = *static_cast<GSpinBox*>(m_gwidget);
  107. property("min").set_value(widget.min());
  108. property("max").set_value(widget.max());
  109. property("value").set_value(widget.value());
  110. }
  111. if (m_type == VBWidgetType::GProgressBar) {
  112. auto& widget = *static_cast<GProgressBar*>(m_gwidget);
  113. property("min").set_value(widget.min());
  114. property("max").set_value(widget.max());
  115. property("value").set_value(widget.value());
  116. }
  117. if (m_type == VBWidgetType::GTextEditor) {
  118. auto& widget = *static_cast<GTextEditor*>(m_gwidget);
  119. property("text").set_value(widget.text());
  120. property("ruler_visible").set_value(widget.is_ruler_visible());
  121. }
  122. m_property_model->update();
  123. }
  124. VBProperty& VBWidget::property(const String& name)
  125. {
  126. for (auto& prop : m_properties) {
  127. if (prop->name() == name)
  128. return *prop;
  129. }
  130. m_properties.append(make<VBProperty>(name, GVariant()));
  131. return *m_properties.last();
  132. }