From 1f51b72e6d6c6f4f8ef6fbcbfb6288de3ae82e62 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 2 Aug 2021 10:09:59 +0200 Subject: [PATCH] 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. :^) --- Base/res/icons/32x32/key.png | Bin 0 -> 298 bytes Userland/Libraries/LibGUI/CMakeLists.txt | 3 + .../Libraries/LibGUI/PasswordInputDialog.cpp | 74 ++++++++++++ .../Libraries/LibGUI/PasswordInputDialog.gml | 105 ++++++++++++++++++ .../Libraries/LibGUI/PasswordInputDialog.h | 27 +++++ 5 files changed, 209 insertions(+) create mode 100644 Base/res/icons/32x32/key.png create mode 100644 Userland/Libraries/LibGUI/PasswordInputDialog.cpp create mode 100644 Userland/Libraries/LibGUI/PasswordInputDialog.gml create mode 100644 Userland/Libraries/LibGUI/PasswordInputDialog.h diff --git a/Base/res/icons/32x32/key.png b/Base/res/icons/32x32/key.png new file mode 100644 index 0000000000000000000000000000000000000000..dbfa9261a0451ea2756e76635e3595c80307da09 GIT binary patch literal 298 zcmV+_0oDGAP)t<$@OyWKQm5LG-Oo2*`rF@72=ksxPh$aVHJ_4X8>)ahN06hyL z(yj~u&~;rYgmCy?Lw!O40#}gfgPE}`3vJt0%ucBvxWWyKLDZU&tEl-$5EdtNmBKp(VYT7v zTM#>*Cc|mH5$0PEvwd^FApp`Wuy@}{K2X~mzRdtJ^He8fBH~;FBN@;*A6y!^H1Ovd wm^l-2-hixqp!E+%b0J#VaVwYFVb8Jg1hd51Q;YlO2><{907*qoM6N<$f>54!(*OVf literal 0 HcmV?d00001 diff --git a/Userland/Libraries/LibGUI/CMakeLists.txt b/Userland/Libraries/LibGUI/CMakeLists.txt index adb1fb7516c..3b1a5735a12 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 00000000000..5f70b7c6af9 --- /dev/null +++ b/Userland/Libraries/LibGUI/PasswordInputDialog.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +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.load_from_gml(password_input_dialog_gml); + + auto& key_icon_label = *widget.find_descendant_of_type_named("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("server_label"); + server_label.set_text(move(server)); + + auto& username_label = *widget.find_descendant_of_type_named("username_label"); + username_label.set_text(move(username)); + + auto& password_box = *widget.find_descendant_of_type_named("password_box"); + + auto& ok_button = *widget.find_descendant_of_type_named("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("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 00000000000..cc31100c8e0 --- /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 00000000000..db0d05d936a --- /dev/null +++ b/Userland/Libraries/LibGUI/PasswordInputDialog.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +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; +}; + +}