VBWidget.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. VBWidget::VBWidget(VBWidgetType type, VBForm& form)
  8. : m_type(type)
  9. , m_form(form)
  10. , m_property_model(VBWidgetPropertyModel::create(*this))
  11. {
  12. m_gwidget = VBWidgetRegistry::build_gwidget(type, &form, m_properties);
  13. }
  14. VBWidget::~VBWidget()
  15. {
  16. }
  17. Rect VBWidget::rect() const
  18. {
  19. return m_gwidget->relative_rect();
  20. }
  21. void VBWidget::set_rect(const Rect& rect)
  22. {
  23. m_gwidget->set_relative_rect(rect);
  24. }
  25. bool VBWidget::is_selected() const
  26. {
  27. return m_form.is_selected(*this);
  28. }
  29. Rect VBWidget::grabber_rect(Direction direction) const
  30. {
  31. int grabber_size = 5;
  32. int half_grabber_size = grabber_size / 2;
  33. switch (direction) {
  34. case Direction::Left:
  35. return { rect().x() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
  36. case Direction::UpLeft:
  37. return { rect().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  38. case Direction::Up:
  39. return { rect().center().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  40. case Direction::UpRight:
  41. return { rect().right() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  42. case Direction::Right:
  43. return { rect().right() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
  44. case Direction::DownLeft:
  45. return { rect().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  46. case Direction::Down:
  47. return { rect().center().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  48. case Direction::DownRight:
  49. return { rect().right() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  50. default:
  51. ASSERT_NOT_REACHED();
  52. }
  53. }
  54. Direction VBWidget::grabber_at(const Point& position) const
  55. {
  56. Direction found_grabber = Direction::None;
  57. for_each_direction([&] (Direction direction) {
  58. if (grabber_rect(direction).contains(position))
  59. found_grabber = direction;
  60. });
  61. return found_grabber;
  62. }
  63. void VBWidget::for_each_property(Function<void(VBProperty&)> callback)
  64. {
  65. for (auto& it : m_properties) {
  66. callback(*it);
  67. }
  68. }