From 618b050f59df84ead75ca340b71c4fab3087da0d Mon Sep 17 00:00:00 2001 From: Jarod42 Date: Mon, 2 Dec 2024 23:11:21 +0100 Subject: [PATCH] Integrate passwordfield directly into textfield. --- SConstruct | 1 - examples/widgets_example.hpp | 7 +- include/guisan.hpp | 1 - include/guisan/widgets/passwordfield.hpp | 111 ----------------------- include/guisan/widgets/textfield.hpp | 19 ++++ src/SConscript | 1 - src/widgets/passwordfield.cpp | 99 -------------------- src/widgets/textfield.cpp | 16 ++++ 8 files changed, 39 insertions(+), 216 deletions(-) delete mode 100644 include/guisan/widgets/passwordfield.hpp delete mode 100644 src/widgets/passwordfield.cpp diff --git a/SConstruct b/SConstruct index fe30451..1e025e8 100644 --- a/SConstruct +++ b/SConstruct @@ -113,7 +113,6 @@ widget_headers = [ 'include/guisan/widgets/label.hpp', 'include/guisan/widgets/listbox.hpp', 'include/guisan/widgets/messagebox.hpp', - 'include/guisan/widgets/passwordfield.hpp', 'include/guisan/widgets/progressbar.hpp', 'include/guisan/widgets/radiobutton.hpp', 'include/guisan/widgets/scrollarea.hpp', diff --git a/examples/widgets_example.hpp b/examples/widgets_example.hpp index 708872e..4c539f0 100644 --- a/examples/widgets_example.hpp +++ b/examples/widgets_example.hpp @@ -57,7 +57,8 @@ namespace WidgetsExample textField = std::make_unique("Text field"); - passwordField = std::make_unique("password"); + passwordField = std::make_unique("password"); + passwordField->setMaskingChar('*'); textBox = std::make_unique("Lorem ipsum dolor sit amet consectetur\n" "adipiscing elit Integer vitae ultrices\n" @@ -129,7 +130,7 @@ namespace WidgetsExample top->add(imageButton.get(), 10, 290); top->add(imageTextButton.get(), 10, 380); top->add(textField.get(), 375, 10); - top->add(passwordField.get(), 425, 10); + top->add(passwordField.get(), 375, 30); top->add(textBoxScrollArea.get(), 290, 50); top->add(inputBox.get(), 270, 180); top->add(listBox.get(), 290, 200); @@ -208,7 +209,7 @@ namespace WidgetsExample std::unique_ptr imageTextButton; // An image text button std::unique_ptr inputBox; // An input box std::unique_ptr textField; // One-line text field - std::unique_ptr passwordField; // One-line password field + std::unique_ptr passwordField; // One-line password field std::unique_ptr textBox; // Multi-line text box std::unique_ptr textBoxScrollArea; // Scroll area for the text box std::unique_ptr listBox; // A list box diff --git a/include/guisan.hpp b/include/guisan.hpp index cc7b644..84595d7 100644 --- a/include/guisan.hpp +++ b/include/guisan.hpp @@ -103,7 +103,6 @@ #include #include #include -#include #include #include #include diff --git a/include/guisan/widgets/passwordfield.hpp b/include/guisan/widgets/passwordfield.hpp deleted file mode 100644 index 09bdc7d..0000000 --- a/include/guisan/widgets/passwordfield.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004, 2005, 2006, 2007 Olof Naessén and Per Larsson - * - * Js_./ - * Per Larsson a.k.a finalman _RqZ{a<^_aa - * Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a// - * _Qhm`] _f "'c 1!5m - * Visit: http://guichan.darkbits.org )Qk

ws?a-?' ._/L #' - * binary forms, with or without )4d[#7r, . ' )d`)[ - * modification, are permitted provided _Q-5'5W..j/?' -?!\)cam' - * that the following conditions are met: j<. a J@\ - * this list of conditions and the j(]1u - -namespace gcn -{ - /** - * A text field in which you can write or display a line of text. - * Unlike a TextField the text will appear as masked, instead of the real content. - * If for some reason the Font you are using does not contain the character, the - * PasswordField will be filled by spaces. - */ - class GCN_CORE_DECLSPEC PasswordField: - public TextField - { - public: - /** - * Default constructor. - */ - PasswordField(); - - /** - * Constructor. Initializes the passwordfield with a given string. - * - * @param text the initial text. - */ - explicit PasswordField(const std::string& text); - - // Inherited from Widget - - void draw(Graphics* graphics) override; - - /** - * Set the masking character to hide the password - * - * @param mask the masking character - */ - void setMaskingChar(const char mask); - - /** - * Get the masking character - * - * @return the masking character - */ - const char getMaskingChar() const; - - private: - char masking = '*'; - }; -} - -#endif // end GCN_PASSWORDFIELD_HPP diff --git a/include/guisan/widgets/textfield.hpp b/include/guisan/widgets/textfield.hpp index cc6096c..bfb52ce 100644 --- a/include/guisan/widgets/textfield.hpp +++ b/include/guisan/widgets/textfield.hpp @@ -157,6 +157,20 @@ namespace gcn */ unsigned int getCaretPosition() const; + /** + * Set the masking character to hide the password, or '\0' + * + * @param passwordMasking the masking character + */ + void setMaskingChar(char passwordMasking); + + /** + * Get the masking character + * + * @return the masking character if any or '\0' + */ + char getMaskingChar() const; + // Inherited from Widget void draw(Graphics* graphics) override; @@ -204,6 +218,11 @@ namespace gcn * text needs to scroll in order to show the last type character. */ int mXScroll = 0; + + /** + * Replacement character for password field, or '\0'. + */ + char mPasswordMasking = '\0'; }; } diff --git a/src/SConscript b/src/SConscript index 175cde9..67a863d 100644 --- a/src/SConscript +++ b/src/SConscript @@ -44,7 +44,6 @@ widget_sources = [ 'widgets/label.cpp', 'widgets/listbox.cpp', 'widgets/messagebox.cpp', - 'widgets/passwordfield.cpp', 'widgets/progressbar.cpp', 'widgets/radiobutton.cpp', 'widgets/scrollarea.cpp', diff --git a/src/widgets/passwordfield.cpp b/src/widgets/passwordfield.cpp deleted file mode 100644 index a9897e7..0000000 --- a/src/widgets/passwordfield.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004, 2005, 2006, 2007 Olof Naessén and Per Larsson - * - * Js_./ - * Per Larsson a.k.a finalman _RqZ{a<^_aa - * Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a// - * _Qhm`] _f "'c 1!5m - * Visit: http://guichan.darkbits.org )Qk

ws?a-?' ._/L #' - * binary forms, with or without )4d[#7r, . ' )d`)[ - * modification, are permitted provided _Q-5'5W..j/?' -?!\)cam' - * that the following conditions are met: j<. a J@\ - * this list of conditions and the j(]1ugetRow(0)); - const std::string encodedText(realText.size(), masking); - - // Switch replacement text before drawing it to hide it - mText->setRow(0, encodedText); - TextField::draw(graphics); - mText->setRow(0, realText); - } - - void PasswordField::setMaskingChar(const char mask) - { - masking = mask; - } - - const char PasswordField::getMaskingChar() const - { - return masking; - } - -} diff --git a/src/widgets/textfield.cpp b/src/widgets/textfield.cpp index ffb9fe9..503f898 100644 --- a/src/widgets/textfield.cpp +++ b/src/widgets/textfield.cpp @@ -97,6 +97,11 @@ namespace gcn void TextField::draw(Graphics* graphics) { + // Switch replacement text before drawing it to possibly hide it + const std::string realText(mText->getRow(0)); + const std::string encodedText = mPasswordMasking ? std::string(realText.size(), mPasswordMasking) : realText; + mText->setRow(0, encodedText); + Color faceColor = getBaseColor(); Color highlightColor, shadowColor; int alpha = getBaseColor().a; @@ -143,6 +148,7 @@ namespace gcn graphics->drawText(mText->getRow(0), 1 - mXScroll, 2, Graphics::Left, isEnabled()); graphics->popClipArea(); + mText->setRow(0, realText); } void TextField::drawCaret(Graphics* graphics, int x) @@ -286,4 +292,14 @@ namespace gcn { fixScroll(); } + + void TextField::setMaskingChar(char passwordMasking) + { + mPasswordMasking = passwordMasking; + } + + char TextField::getMaskingChar() const + { + return mPasswordMasking; + } }