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:
parent
af070324db
commit
c6ffb3e2b8
12 changed files with 94 additions and 87 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue