VBWidget.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "VBWidget.h"
  2. #include "VBForm.h"
  3. #include <LibGUI/GPainter.h>
  4. #include <LibGUI/GLabel.h>
  5. #include <LibGUI/GButton.h>
  6. #include <LibGUI/GSpinBox.h>
  7. #include <LibGUI/GTextEditor.h>
  8. static GWidget* build_gwidget(WidgetType type, GWidget* parent)
  9. {
  10. switch (type) {
  11. case WidgetType::GWidget:
  12. return new GWidget(parent);
  13. case WidgetType::GLabel:
  14. return new GLabel(parent);
  15. case WidgetType::GButton:
  16. return new GButton(parent);
  17. case WidgetType::GSpinBox:
  18. return new GSpinBox(parent);
  19. case WidgetType::GTextEditor: {
  20. auto* editor = new GTextEditor(GTextEditor::Type::MultiLine, parent);
  21. editor->set_ruler_visible(false);
  22. return editor;
  23. }
  24. default:
  25. ASSERT_NOT_REACHED();
  26. return nullptr;
  27. }
  28. }
  29. VBWidget::VBWidget(WidgetType type, VBForm& form)
  30. : m_type(type)
  31. , m_form(form)
  32. {
  33. m_gwidget = build_gwidget(type, &form);
  34. }
  35. VBWidget::~VBWidget()
  36. {
  37. }
  38. Rect VBWidget::rect() const
  39. {
  40. return m_gwidget->relative_rect();
  41. }
  42. void VBWidget::set_rect(const Rect& rect)
  43. {
  44. m_gwidget->set_relative_rect(rect);
  45. }
  46. bool VBWidget::is_selected() const
  47. {
  48. return m_form.is_selected(*this);
  49. }
  50. Rect VBWidget::grabber_rect(Direction direction) const
  51. {
  52. int grabber_size = 5;
  53. int half_grabber_size = grabber_size / 2;
  54. switch (direction) {
  55. case Direction::Left:
  56. return { rect().x() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
  57. case Direction::UpLeft:
  58. return { rect().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  59. case Direction::Up:
  60. return { rect().center().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  61. case Direction::UpRight:
  62. return { rect().right() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
  63. case Direction::Right:
  64. return { rect().right() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
  65. case Direction::DownLeft:
  66. return { rect().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  67. case Direction::Down:
  68. return { rect().center().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  69. case Direction::DownRight:
  70. return { rect().right() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
  71. default:
  72. ASSERT_NOT_REACHED();
  73. }
  74. }
  75. Direction VBWidget::grabber_at(const Point& position) const
  76. {
  77. Direction found_grabber = Direction::None;
  78. for_each_direction([&] (Direction direction) {
  79. if (grabber_rect(direction).contains(position))
  80. found_grabber = direction;
  81. });
  82. return found_grabber;
  83. }