1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:48:10 +00:00

VisualBuilder: Use real GWidgets instead of pretend VBWidgets.

That first design was the wrong idea. Instead, have VBWidget instantiate
a GWidget of the appropriate type and parent it to the VBForm.
We then use a new "greedy hit-testing" mechanism in GWidget to prevent any
mouse events from reaching the VBForm's children.

To paint the grabbers above the child widgets, I added a slightly hackish
but kind of neat second_paint_event() that is called after a widget has
painted all of his children. :^)
This commit is contained in:
Andreas Kling 2019-04-11 03:34:37 +02:00
parent af070324db
commit c6ffb3e2b8
12 changed files with 94 additions and 87 deletions

View file

@ -1,16 +1,51 @@
#include "VBWidget.h"
#include "VBForm.h"
#include <LibGUI/GPainter.h>
#include <LibGUI/GLabel.h>
#include <LibGUI/GButton.h>
#include <LibGUI/GSpinBox.h>
#include <LibGUI/GTextEditor.h>
VBWidget::VBWidget(VBForm& form)
: m_form(form)
static GWidget* build_gwidget(WidgetType type, GWidget* parent)
{
switch (type) {
case WidgetType::GWidget:
return new GWidget(parent);
case WidgetType::GLabel:
return new GLabel(parent);
case WidgetType::GButton:
return new GButton(parent);
case WidgetType::GSpinBox:
return new GSpinBox(parent);
case WidgetType::GTextEditor:
return new GTextEditor(GTextEditor::Type::MultiLine, parent);
default:
ASSERT_NOT_REACHED();
return nullptr;
}
}
VBWidget::VBWidget(WidgetType type, VBForm& form)
: m_type(type)
, m_form(form)
{
m_gwidget = build_gwidget(type, &form);
}
VBWidget::~VBWidget()
{
}
Rect VBWidget::rect() const
{
return m_gwidget->relative_rect();
}
void VBWidget::set_rect(const Rect& rect)
{
m_gwidget->set_relative_rect(rect);
}
bool VBWidget::is_selected() const
{
return m_form.is_selected(*this);
@ -22,21 +57,21 @@ Rect VBWidget::grabber_rect(Direction direction) const
int half_grabber_size = grabber_size / 2;
switch (direction) {
case Direction::Left:
return { m_rect.x() - half_grabber_size, m_rect.center().y() - half_grabber_size, grabber_size, grabber_size };
return { rect().x() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
case Direction::UpLeft:
return { m_rect.x() - half_grabber_size, m_rect.y() - half_grabber_size, grabber_size, grabber_size };
return { rect().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
case Direction::Up:
return { m_rect.center().x() - half_grabber_size, m_rect.y() - half_grabber_size, grabber_size, grabber_size };
return { rect().center().x() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
case Direction::UpRight:
return { m_rect.right() - half_grabber_size, m_rect.y() - half_grabber_size, grabber_size, grabber_size };
return { rect().right() - half_grabber_size, rect().y() - half_grabber_size, grabber_size, grabber_size };
case Direction::Right:
return { m_rect.right() - half_grabber_size, m_rect.center().y() - half_grabber_size, grabber_size, grabber_size };
return { rect().right() - half_grabber_size, rect().center().y() - half_grabber_size, grabber_size, grabber_size };
case Direction::DownLeft:
return { m_rect.x() - half_grabber_size, m_rect.bottom() - half_grabber_size, grabber_size, grabber_size };
return { rect().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
case Direction::Down:
return { m_rect.center().x() - half_grabber_size, m_rect.bottom() - half_grabber_size, grabber_size, grabber_size };
return { rect().center().x() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
case Direction::DownRight:
return { m_rect.right() - half_grabber_size, m_rect.bottom() - half_grabber_size, grabber_size, grabber_size };
return { rect().right() - half_grabber_size, rect().bottom() - half_grabber_size, grabber_size, grabber_size };
default:
ASSERT_NOT_REACHED();
}
@ -51,9 +86,3 @@ Direction VBWidget::grabber_at(const Point& position) const
});
return found_grabber;
}
void VBWidget::paint(GPainter& painter)
{
painter.fill_rect(m_rect, Color::White);
painter.draw_rect(m_rect, Color::Black);
}