diff options
author | Andreas Kling <kling@serenityos.org> | 2021-08-02 10:09:59 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-02 10:13:35 +0200 |
commit | 1f51b72e6d6c6f4f8ef6fbcbfb6288de3ae82e62 (patch) | |
tree | cd4444ff2ba55426bc95f09ce567ce66fe2188b6 | |
parent | 46cec3a44328bee84e47e546a364b9620278b396 (diff) | |
download | serenity-1f51b72e6d6c6f4f8ef6fbcbfb6288de3ae82e62.zip |
LibGUI: Add a simple GUI::PasswordInputDialog
Asking the user for a password is a fairly common thing, so let's have
a reusable GUI dialog for it! This first iteration only supports having
pre-filled "server" and "username" fields. This can obviously be made
more flexible as needs arise. :^)
-rw-r--r-- | Base/res/icons/32x32/key.png | bin | 0 -> 298 bytes | |||
-rw-r--r-- | Userland/Libraries/LibGUI/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/PasswordInputDialog.cpp | 74 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/PasswordInputDialog.gml | 105 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/PasswordInputDialog.h | 27 |
5 files changed, 209 insertions, 0 deletions
diff --git a/Base/res/icons/32x32/key.png b/Base/res/icons/32x32/key.png Binary files differnew file mode 100644 index 0000000000..dbfa9261a0 --- /dev/null +++ b/Base/res/icons/32x32/key.png diff --git a/Userland/Libraries/LibGUI/CMakeLists.txt b/Userland/Libraries/LibGUI/CMakeLists.txt index adb1fb7516..3b1a5735a1 100644 --- a/Userland/Libraries/LibGUI/CMakeLists.txt +++ b/Userland/Libraries/LibGUI/CMakeLists.txt @@ -1,5 +1,6 @@ compile_gml(FontPickerDialog.gml FontPickerDialogGML.h font_picker_dialog_gml) compile_gml(FilePickerDialog.gml FilePickerDialogGML.h file_picker_dialog_gml) +compile_gml(PasswordInputDialog.gml PasswordInputDialogGML.h password_input_dialog_gml) set(SOURCES AboutDialog.cpp @@ -68,6 +69,8 @@ set(SOURCES Notification.cpp OpacitySlider.cpp Painter.cpp + PasswordInputDialog.cpp + PasswordInputDialogGML.h ProcessChooser.cpp Progressbar.cpp RadioButton.cpp diff --git a/Userland/Libraries/LibGUI/PasswordInputDialog.cpp b/Userland/Libraries/LibGUI/PasswordInputDialog.cpp new file mode 100644 index 0000000000..5f70b7c6af --- /dev/null +++ b/Userland/Libraries/LibGUI/PasswordInputDialog.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibGUI/Button.h> +#include <LibGUI/Label.h> +#include <LibGUI/PasswordInputDialog.h> +#include <LibGUI/PasswordInputDialogGML.h> +#include <LibGUI/TextBox.h> + +namespace GUI { + +PasswordInputDialog::PasswordInputDialog(Window* parent_window, String title, String server, String username) + : Dialog(parent_window) +{ + if (parent_window) + set_icon(parent_window->icon()); + set_resizable(false); + resize(340, 122); + set_title(move(title)); + + auto& widget = set_main_widget<Widget>(); + + widget.load_from_gml(password_input_dialog_gml); + + auto& key_icon_label = *widget.find_descendant_of_type_named<GUI::Label>("key_icon_label"); + + key_icon_label.set_icon(Gfx::Bitmap::try_load_from_file("/res/icons/32x32/key.png")); + + auto& server_label = *widget.find_descendant_of_type_named<GUI::Label>("server_label"); + server_label.set_text(move(server)); + + auto& username_label = *widget.find_descendant_of_type_named<GUI::Label>("username_label"); + username_label.set_text(move(username)); + + auto& password_box = *widget.find_descendant_of_type_named<GUI::PasswordBox>("password_box"); + + auto& ok_button = *widget.find_descendant_of_type_named<GUI::Button>("ok_button"); + ok_button.on_click = [&](auto) { + dbgln("GUI::PasswordInputDialog: OK button clicked"); + m_password = password_box.text(); + done(ExecOK); + }; + + auto& cancel_button = *widget.find_descendant_of_type_named<GUI::Button>("cancel_button"); + cancel_button.on_click = [this](auto) { + dbgln("GUI::PasswordInputDialog: Cancel button clicked"); + done(ExecCancel); + }; + + password_box.on_return_pressed = [&] { + ok_button.click(); + }; + password_box.on_escape_pressed = [&] { + cancel_button.click(); + }; + password_box.set_focus(true); +} + +PasswordInputDialog::~PasswordInputDialog() +{ +} + +int PasswordInputDialog::show(Window* parent_window, String& text_value, String title, String server, String username) +{ + auto box = PasswordInputDialog::construct(parent_window, move(title), move(server), move(username)); + auto result = box->exec(); + text_value = box->m_password; + return result; +} + +} diff --git a/Userland/Libraries/LibGUI/PasswordInputDialog.gml b/Userland/Libraries/LibGUI/PasswordInputDialog.gml new file mode 100644 index 0000000000..cc31100c8e --- /dev/null +++ b/Userland/Libraries/LibGUI/PasswordInputDialog.gml @@ -0,0 +1,105 @@ +@GUI::Widget { + fill_with_background_color: true + + layout: @GUI::HorizontalBoxLayout { + margins: [8, 8, 8, 8] + spacing: 8 + } + + @GUI::Widget { + shrink_to_fit: true + + layout: @GUI::VerticalBoxLayout { + } + + @GUI::Label { + name: "key_icon_label" + fixed_height: 32 + fixed_width: 32 + } + } + + @GUI::Widget { + layout: @GUI::VerticalBoxLayout { + } + + @GUI::Widget { + fixed_height: 24 + + layout: @GUI::HorizontalBoxLayout { + } + + @GUI::Label { + text: "Server:" + fixed_width: 80 + text_alignment: "CenterLeft" + } + + @GUI::Label { + name: "server_label" + text: "server.ip" + text_alignment: "CenterLeft" + } + } + + @GUI::Widget { + fixed_height: 24 + + layout: @GUI::HorizontalBoxLayout { + } + + @GUI::Label { + text: "Username:" + fixed_width: 80 + text_alignment: "CenterLeft" + } + + @GUI::Label { + name: "username_label" + text: "username" + text_alignment: "CenterLeft" + } + } + + @GUI::Widget { + fixed_height: 24 + + layout: @GUI::HorizontalBoxLayout { + } + + @GUI::Label { + text: "Password:" + fixed_width: 80 + text_alignment: "CenterLeft" + } + + @GUI::PasswordBox { + name: "password_box" + } + } + + @GUI::Widget + + @GUI::Widget { + shrink_to_fit: true + layout: @GUI::HorizontalBoxLayout { + spacing: 6 + } + + @GUI::Widget { + } + + @GUI::Button { + text: "OK" + name: "ok_button" + fixed_width: 75 + } + + @GUI::Button { + text: "Cancel" + name: "cancel_button" + fixed_width: 75 + } + } + } +} diff --git a/Userland/Libraries/LibGUI/PasswordInputDialog.h b/Userland/Libraries/LibGUI/PasswordInputDialog.h new file mode 100644 index 0000000000..db0d05d936 --- /dev/null +++ b/Userland/Libraries/LibGUI/PasswordInputDialog.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGUI/Dialog.h> + +namespace GUI { + +class PasswordInputDialog : public Dialog { + C_OBJECT(PasswordInputDialog); + +public: + virtual ~PasswordInputDialog() override; + + static int show(Window* parent_window, String& text_value, String title, String server, String username); + +private: + explicit PasswordInputDialog(Window* parent_window, String title, String server, String username); + + String m_password; +}; + +} |