diff options
author | Andreas Kling <kling@serenityos.org> | 2021-01-12 12:17:30 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-01-12 12:17:46 +0100 |
commit | 13d7c09125f8eec703d0a43a9a87fc8aa08f7319 (patch) | |
tree | 70fd643c429cea5c1f9362c2674511d17a53f3b5 /Userland/Libraries/LibGUI/InputBox.cpp | |
parent | dc28c07fa526841e05e16161c74a6c23984f1dd5 (diff) | |
download | serenity-13d7c09125f8eec703d0a43a9a87fc8aa08f7319.zip |
Libraries: Move to Userland/Libraries/
Diffstat (limited to 'Userland/Libraries/LibGUI/InputBox.cpp')
-rw-r--r-- | Userland/Libraries/LibGUI/InputBox.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGUI/InputBox.cpp b/Userland/Libraries/LibGUI/InputBox.cpp new file mode 100644 index 0000000000..8e24da6fa6 --- /dev/null +++ b/Userland/Libraries/LibGUI/InputBox.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <LibGUI/BoxLayout.h> +#include <LibGUI/Button.h> +#include <LibGUI/InputBox.h> +#include <LibGUI/Label.h> +#include <LibGUI/TextBox.h> +#include <LibGfx/Font.h> +#include <stdio.h> + +namespace GUI { + +InputBox::InputBox(Window* parent_window, const StringView& prompt, const StringView& title) + : Dialog(parent_window) + , m_prompt(prompt) +{ + set_title(title); + build(); +} + +InputBox::~InputBox() +{ +} + +int InputBox::show(String& text_value, Window* parent_window, const StringView& prompt, const StringView& title) +{ + auto box = InputBox::construct(parent_window, prompt, title); + box->set_resizable(false); + if (parent_window) + box->set_icon(parent_window->icon()); + auto result = box->exec(); + text_value = box->text_value(); + return result; +} + +void InputBox::build() +{ + auto& widget = set_main_widget<Widget>(); + + int text_width = widget.font().width(m_prompt); + int title_width = widget.font().width(title()) + 24 /* icon, plus a little padding -- not perfect */; + int max_width = AK::max(text_width, title_width); + + set_rect(x(), y(), max_width + 140, 62); + + widget.set_layout<VerticalBoxLayout>(); + widget.set_fill_with_background_color(true); + + widget.layout()->set_margins({ 6, 6, 6, 6 }); + widget.layout()->set_spacing(6); + + auto& label_editor_container = widget.add<Widget>(); + label_editor_container.set_layout<HorizontalBoxLayout>(); + + auto& label = label_editor_container.add<Label>(m_prompt); + label.set_fixed_size(text_width, 16); + + m_text_editor = label_editor_container.add<TextBox>(); + m_text_editor->set_fixed_height(19); + + auto& button_container_outer = widget.add<Widget>(); + button_container_outer.set_fixed_height(20); + button_container_outer.set_layout<VerticalBoxLayout>(); + + auto& button_container_inner = button_container_outer.add<Widget>(); + button_container_inner.set_layout<HorizontalBoxLayout>(); + button_container_inner.layout()->set_spacing(6); + button_container_inner.layout()->set_margins({ 4, 4, 0, 4 }); + button_container_inner.layout()->add_spacer(); + + m_ok_button = button_container_inner.add<Button>(); + m_ok_button->set_fixed_height(20); + m_ok_button->set_text("OK"); + m_ok_button->on_click = [this](auto) { + dbgln("GUI::InputBox: OK button clicked"); + m_text_value = m_text_editor->text(); + done(ExecOK); + }; + + m_cancel_button = button_container_inner.add<Button>(); + m_cancel_button->set_fixed_height(20); + m_cancel_button->set_text("Cancel"); + m_cancel_button->on_click = [this](auto) { + dbgln("GUI::InputBox: Cancel button clicked"); + done(ExecCancel); + }; + + m_text_editor->on_return_pressed = [this] { + m_ok_button->click(); + }; + m_text_editor->on_escape_pressed = [this] { + m_cancel_button->click(); + }; + m_text_editor->set_focus(true); +} + +} |