summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-08-02 10:09:59 +0200
committerAndreas Kling <kling@serenityos.org>2021-08-02 10:13:35 +0200
commit1f51b72e6d6c6f4f8ef6fbcbfb6288de3ae82e62 (patch)
treecd4444ff2ba55426bc95f09ce567ce66fe2188b6
parent46cec3a44328bee84e47e546a364b9620278b396 (diff)
downloadserenity-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.pngbin0 -> 298 bytes
-rw-r--r--Userland/Libraries/LibGUI/CMakeLists.txt3
-rw-r--r--Userland/Libraries/LibGUI/PasswordInputDialog.cpp74
-rw-r--r--Userland/Libraries/LibGUI/PasswordInputDialog.gml105
-rw-r--r--Userland/Libraries/LibGUI/PasswordInputDialog.h27
5 files changed, 209 insertions, 0 deletions
diff --git a/Base/res/icons/32x32/key.png b/Base/res/icons/32x32/key.png
new file mode 100644
index 0000000000..dbfa9261a0
--- /dev/null
+++ b/Base/res/icons/32x32/key.png
Binary files differ
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;
+};
+
+}