Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "VBForm.h"
28#include "VBPropertiesWindow.h"
29#include "VBWidget.h"
30#include "VBWidgetPropertyModel.h"
31#include <LibGUI/AboutDialog.h>
32#include <LibGUI/Action.h>
33#include <LibGUI/Application.h>
34#include <LibGUI/BoxLayout.h>
35#include <LibGUI/Button.h>
36#include <LibGUI/Menu.h>
37#include <LibGUI/MenuBar.h>
38#include <LibGUI/TableView.h>
39#include <LibGUI/Widget.h>
40#include <LibGUI/Window.h>
41#include <fcntl.h>
42#include <signal.h>
43#include <stdio.h>
44#include <unistd.h>
45
46static RefPtr<GUI::Window> make_toolbox_window();
47
48int main(int argc, char** argv)
49{
50 GUI::Application app(argc, argv);
51
52 auto propbox = VBPropertiesWindow::construct();
53
54 auto form1 = VBForm::construct("Form1");
55 form1->on_widget_selected = [&](VBWidget* widget) {
56 propbox->table_view().set_model(widget ? &widget->property_model() : nullptr);
57 };
58
59 auto menubar = make<GUI::MenuBar>();
60 auto& app_menu = menubar->add_menu("Visual Builder");
61 app_menu.add_action(GUI::CommonActions::make_quit_action([](auto&) {
62 GUI::Application::the().quit(0);
63 return;
64 }));
65
66 auto& file_menu = menubar->add_menu("File");
67 file_menu.add_action(GUI::Action::create("Dump Form", [&](auto&) {
68 form1->dump();
69 }));
70 file_menu.add_action(GUI::Action::create("Save Form...", { Mod_Ctrl, Key_S }, [&](auto&) {
71 form1->write_to_file("/tmp/form.frm");
72 }));
73
74 auto window = GUI::Window::construct();
75 window->set_title(form1->name());
76 window->set_rect(120, 200, 640, 400);
77 window->set_main_widget(form1);
78
79 window->show();
80
81 auto& help_menu = menubar->add_menu("Help");
82 help_menu.add_action(GUI::Action::create("About", [&](auto&) {
83 GUI::AboutDialog::show("Visual Builder", Gfx::Bitmap::load_from_file("/res/icons/32x32/app-visual-builder.png"), window);
84 }));
85
86 app.set_menubar(move(menubar));
87
88 auto toolbox = make_toolbox_window();
89 toolbox->show();
90
91 propbox->show();
92
93 if (argc == 2) {
94 form1->load_from_file(argv[1]);
95 }
96
97 return app.exec();
98}
99
100RefPtr<GUI::Window> make_toolbox_window()
101{
102 auto window = GUI::Window::construct();
103 window->set_title("Widgets");
104 window->set_rect(20, 200, 80, 300);
105
106 auto& widget = window->set_main_widget<GUI::Widget>();
107 widget.set_fill_with_background_color(true);
108 widget.set_layout<GUI::VerticalBoxLayout>();
109 widget.layout()->set_spacing(0);
110
111 auto& label_button = widget.add<GUI::Button>();
112 label_button.set_button_style(Gfx::ButtonStyle::CoolBar);
113 label_button.set_tooltip("GLabel");
114 label_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/label.png"));
115 label_button.on_click = [] {
116 if (auto* form = VBForm::current())
117 form->insert_widget(VBWidgetType::GLabel);
118 };
119
120 auto& button_button = widget.add<GUI::Button>();
121 button_button.set_button_style(Gfx::ButtonStyle::CoolBar);
122 button_button.set_tooltip("GButton");
123 button_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/button.png"));
124 button_button.on_click = [] {
125 if (auto* form = VBForm::current())
126 form->insert_widget(VBWidgetType::GButton);
127 };
128 auto& spinbox_button = widget.add<GUI::Button>();
129 spinbox_button.set_button_style(Gfx::ButtonStyle::CoolBar);
130 spinbox_button.set_tooltip("GSpinBox");
131 spinbox_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/spinbox.png"));
132 spinbox_button.on_click = [] {
133 if (auto* form = VBForm::current())
134 form->insert_widget(VBWidgetType::GSpinBox);
135 };
136 auto& editor_button = widget.add<GUI::Button>();
137 editor_button.set_button_style(Gfx::ButtonStyle::CoolBar);
138 editor_button.set_tooltip("GTextEditor");
139 editor_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/textbox.png"));
140 editor_button.on_click = [] {
141 if (auto* form = VBForm::current())
142 form->insert_widget(VBWidgetType::GTextEditor);
143 };
144 auto& progress_bar_button = widget.add<GUI::Button>();
145 progress_bar_button.set_button_style(Gfx::ButtonStyle::CoolBar);
146 progress_bar_button.set_tooltip("GProgressBar");
147 progress_bar_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/progressbar.png"));
148 progress_bar_button.on_click = [] {
149 if (auto* form = VBForm::current())
150 form->insert_widget(VBWidgetType::GProgressBar);
151 };
152 auto& slider_button = widget.add<GUI::Button>();
153 slider_button.set_button_style(Gfx::ButtonStyle::CoolBar);
154 slider_button.set_tooltip("GSlider");
155 slider_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/slider.png"));
156 slider_button.on_click = [] {
157 if (auto* form = VBForm::current())
158 form->insert_widget(VBWidgetType::GSlider);
159 };
160 auto& checkbox_button = widget.add<GUI::Button>();
161 checkbox_button.set_button_style(Gfx::ButtonStyle::CoolBar);
162 checkbox_button.set_tooltip("GCheckBox");
163 checkbox_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/checkbox.png"));
164 checkbox_button.on_click = [] {
165 if (auto* form = VBForm::current())
166 form->insert_widget(VBWidgetType::GCheckBox);
167 };
168 auto& radiobutton_button = widget.add<GUI::Button>();
169 radiobutton_button.set_button_style(Gfx::ButtonStyle::CoolBar);
170 radiobutton_button.set_tooltip("GRadioButton");
171 radiobutton_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/filled-radio-circle.png"));
172 radiobutton_button.on_click = [] {
173 if (auto* form = VBForm::current())
174 form->insert_widget(VBWidgetType::GRadioButton);
175 };
176 auto& scrollbar_button = widget.add<GUI::Button>();
177 scrollbar_button.set_button_style(Gfx::ButtonStyle::CoolBar);
178 scrollbar_button.set_tooltip("GScrollBar");
179 scrollbar_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/scrollbar.png"));
180 scrollbar_button.on_click = [] {
181 if (auto* form = VBForm::current())
182 form->insert_widget(VBWidgetType::GScrollBar);
183 };
184 auto& groupbox_button = widget.add<GUI::Button>();
185 groupbox_button.set_button_style(Gfx::ButtonStyle::CoolBar);
186 groupbox_button.set_tooltip("GGroupBox");
187 groupbox_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/vbwidgets/groupbox.png"));
188 groupbox_button.on_click = [] {
189 if (auto* form = VBForm::current())
190 form->insert_widget(VBWidgetType::GGroupBox);
191 };
192 return window;
193}