Serenity Operating System
at hosted 193 lines 7.9 kB view raw
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}