From 75c76f6692950c5f527dcd16ea6e32e3464a9bc5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 11 Apr 2019 04:13:11 +0200 Subject: [PATCH] VisualBuilder: Make it possible to insert widgets from the toolbox. --- Applications/VisualBuilder/VBForm.cpp | 15 +++++++++++++++ Applications/VisualBuilder/VBForm.h | 5 +++++ Applications/VisualBuilder/main.cpp | 27 +++++++++++++++++++++------ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Applications/VisualBuilder/VBForm.cpp b/Applications/VisualBuilder/VBForm.cpp index 380a27b862..464a56c1a9 100644 --- a/Applications/VisualBuilder/VBForm.cpp +++ b/Applications/VisualBuilder/VBForm.cpp @@ -2,10 +2,17 @@ #include "VBWidget.h" #include +static VBForm* s_current; +VBForm* VBForm::current() +{ + return s_current; +} + VBForm::VBForm(const String& name, GWidget* parent) : GWidget(parent) , m_name(name) { + s_current = this; set_fill_with_background_color(true); set_background_color(Color::LightGray); set_greedy_for_hits(true); @@ -23,6 +30,14 @@ VBForm::VBForm(const String& name, GWidget* parent) m_widgets.append(move(button1)); } +void VBForm::insert_widget(WidgetType type) +{ + auto widget = VBWidget::create(type, *this); + widget->set_rect({ m_next_insertion_position, { m_grid_size * 10 + 1, m_grid_size * 5 + 1 } }); + m_next_insertion_position.move_by(m_grid_size, m_grid_size); + m_widgets.append(move(widget)); +} + VBForm::~VBForm() { } diff --git a/Applications/VisualBuilder/VBForm.h b/Applications/VisualBuilder/VBForm.h index 7f30e8fee6..978df684ee 100644 --- a/Applications/VisualBuilder/VBForm.h +++ b/Applications/VisualBuilder/VBForm.h @@ -9,6 +9,8 @@ public: explicit VBForm(const String& name, GWidget* parent = nullptr); virtual ~VBForm() override; + static VBForm* current(); + String name() const { return m_name; } void set_name(const String& name) { m_name = name; } @@ -18,6 +20,8 @@ public: void set_should_snap_to_grip(bool snap) { m_should_snap_to_grid = snap; } bool should_snap_to_grid() const { return m_should_snap_to_grid; } + void insert_widget(WidgetType); + protected: virtual void paint_event(GPaintEvent&) override; virtual void second_paint_event(GPaintEvent&) override; @@ -35,5 +39,6 @@ private: WeakPtr m_selected_widget; Point m_transform_event_origin; Rect m_transform_widget_origin_rect; + Point m_next_insertion_position; Direction m_resize_direction { Direction::None }; }; diff --git a/Applications/VisualBuilder/main.cpp b/Applications/VisualBuilder/main.cpp index 9ec5c2a579..17b5455a86 100644 --- a/Applications/VisualBuilder/main.cpp +++ b/Applications/VisualBuilder/main.cpp @@ -2,14 +2,9 @@ #include #include #include -#include -#include #include -#include #include -#include -#include -#include +#include #include "VBForm.h" #include "VBWidget.h" #include @@ -68,6 +63,26 @@ GWindow* make_toolbox_window() auto* widget = new GWidget; widget->set_fill_with_background_color(true); + widget->set_layout(make(Orientation::Vertical)); window->set_main_widget(widget); + + auto* button_button = new GButton(widget); + button_button->set_caption("Button"); + button_button->on_click = [] (GButton&) { + if (auto* form = VBForm::current()) + form->insert_widget(WidgetType::GButton); + }; + auto* spinbox_button = new GButton(widget); + spinbox_button->set_caption("SpinBox"); + spinbox_button->on_click = [] (GButton&) { + if (auto* form = VBForm::current()) + form->insert_widget(WidgetType::GSpinBox); + }; + auto* editor_button = new GButton(widget); + editor_button->set_caption("TextEditor"); + editor_button->on_click = [] (GButton&) { + if (auto* form = VBForm::current()) + form->insert_widget(WidgetType::GTextEditor); + }; return window; }