ladybird/Userland/Libraries/LibGUI/InputBox.cpp
sin-ack 9c9a5c55cb Userland+LibGUI: Make Margins arguments match CSS ordering
Previously the argument order for Margins was (left, top, right,
bottom). To make it more familiar and closer to how CSS does it, the
argument order is now (top, right, bottom, left).
2021-08-18 10:30:50 +02:00

115 lines
3.5 KiB
C++

/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2021, Jakob-Niklas See <git@nwex.de>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibGUI/BoxLayout.h>
#include <LibGUI/Button.h>
#include <LibGUI/InputBox.h>
#include <LibGUI/Label.h>
#include <LibGUI/TextBox.h>
#include <LibGfx/Font.h>
namespace GUI {
InputBox::InputBox(Window* parent_window, String& text_value, StringView const& prompt, StringView const& title, StringView const& placeholder, InputType input_type)
: Dialog(parent_window)
, m_text_value(text_value)
, m_prompt(prompt)
, m_placeholder(placeholder)
{
set_title(title);
build(input_type);
}
InputBox::~InputBox()
{
}
int InputBox::show(Window* parent_window, String& text_value, StringView const& prompt, StringView const& title, StringView const& placeholder, InputType input_type)
{
auto box = InputBox::construct(parent_window, text_value, prompt, title, placeholder, input_type);
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(InputType input_type)
{
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 = 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);
switch (input_type) {
case InputType::Text:
m_text_editor = label_editor_container.add<TextBox>();
break;
case InputType::Password:
m_text_editor = label_editor_container.add<PasswordBox>();
break;
}
m_text_editor->set_fixed_height(19);
m_text_editor->set_text(m_text_value);
if (!m_placeholder.is_null())
m_text_editor->set_placeholder(m_placeholder);
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, 0, 4, 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);
}
}