From 69f62cdf6d491fe8bd472d7b8ff1266f4e5668ed Mon Sep 17 00:00:00 2001 From: Gwilherm Baudic Date: Wed, 13 Nov 2024 20:39:10 +0100 Subject: [PATCH 1/5] Add PasswordField widget --- SConstruct | 1 + include/guisan.hpp | 1 + include/guisan/widgets/passwordfield.hpp | 99 ++++++++++++++++++++++++ src/SConscript | 1 + src/widgets/passwordfield.cpp | 93 ++++++++++++++++++++++ 5 files changed, 195 insertions(+) create mode 100644 include/guisan/widgets/passwordfield.hpp create mode 100644 src/widgets/passwordfield.cpp diff --git a/SConstruct b/SConstruct index ade8d19..cb45b86 100644 --- a/SConstruct +++ b/SConstruct @@ -112,6 +112,7 @@ 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/include/guisan.hpp b/include/guisan.hpp index 65aba43..6673257 100644 --- a/include/guisan.hpp +++ b/include/guisan.hpp @@ -102,6 +102,7 @@ #include #include #include +#include #include #include #include diff --git a/include/guisan/widgets/passwordfield.hpp b/include/guisan/widgets/passwordfield.hpp new file mode 100644 index 0000000..f3affd1 --- /dev/null +++ b/include/guisan/widgets/passwordfield.hpp @@ -0,0 +1,99 @@ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * 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 '*' instead of the real content. + * If for some reason the Font you are using does not contain this 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. + */ + PasswordField(const std::string& text); + + // Inherited from Widget + + void draw(Graphics* graphics) override; + + }; +} + +#endif // end GCN_PASSWORDFIELD_HPP diff --git a/src/SConscript b/src/SConscript index 67a863d..175cde9 100644 --- a/src/SConscript +++ b/src/SConscript @@ -44,6 +44,7 @@ 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 new file mode 100644 index 0000000..8d97a80 --- /dev/null +++ b/src/widgets/passwordfield.cpp @@ -0,0 +1,93 @@ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * 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).size(), '*'); + std::string realText(mText->getRow(0)); + + // Switch replacement text before drawing it to hide it + mText->setRow(0, encodedText); + TextField::draw(graphics); + mText->setRow(0, realText); + } + +} From a346dc79d64a99041652533173ec9cf3c08c8174 Mon Sep 17 00:00:00 2001 From: Gwilherm Baudic Date: Thu, 14 Nov 2024 19:24:37 +0100 Subject: [PATCH 2/5] Apply suggestions from code review Co-authored-by: Joris Dauphin --- include/guisan/widgets/passwordfield.hpp | 10 +++------- src/widgets/passwordfield.cpp | 12 ++++-------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/include/guisan/widgets/passwordfield.hpp b/include/guisan/widgets/passwordfield.hpp index f3affd1..68572eb 100644 --- a/include/guisan/widgets/passwordfield.hpp +++ b/include/guisan/widgets/passwordfield.hpp @@ -6,11 +6,11 @@ * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ * - * Copyright (c) 2004, 2005, 2006, 2007 Olof Naessén and Per Larsson + * 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// + * Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a// * _Qhm`] _f "'c 1!5m * Visit: http://guichan.darkbits.org )Qk

@@ -87,7 +83,7 @@ namespace gcn * * @param text the initial text. */ - PasswordField(const std::string& text); + explicit PasswordField(const std::string& text); // Inherited from Widget diff --git a/src/widgets/passwordfield.cpp b/src/widgets/passwordfield.cpp index 8d97a80..dadccff 100644 --- a/src/widgets/passwordfield.cpp +++ b/src/widgets/passwordfield.cpp @@ -6,11 +6,11 @@ * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ * - * Copyright (c) 2004, 2005, 2006, 2007 Olof Naessén and Per Larsson + * 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// + * Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a// * _Qhm`] _f "'c 1!5m * Visit: http://guichan.darkbits.org )Qk

getRow(0).size(), '*'); - std::string realText(mText->getRow(0)); + const std::string realText(mText->getRow(0)); + const std::string encodedText(realText.size(), '*'); // Switch replacement text before drawing it to hide it mText->setRow(0, encodedText); From 2b6fd317aa995162a2df6882550315b801f937c7 Mon Sep 17 00:00:00 2001 From: Gwilherm Baudic Date: Thu, 14 Nov 2024 20:05:46 +0100 Subject: [PATCH 3/5] Make masking character configurable --- include/guisan/widgets/passwordfield.hpp | 15 ++++++++++++--- src/widgets/passwordfield.cpp | 7 ++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/guisan/widgets/passwordfield.hpp b/include/guisan/widgets/passwordfield.hpp index 68572eb..efe7b48 100644 --- a/include/guisan/widgets/passwordfield.hpp +++ b/include/guisan/widgets/passwordfield.hpp @@ -65,8 +65,8 @@ namespace gcn { /** * A text field in which you can write or display a line of text. - * Unlike a TextField the text will appear as '*' instead of the real content. - * If for some reason the Font you are using does not contain this character, the + * 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: @@ -88,7 +88,16 @@ namespace gcn // 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); + + private: + char masking('*'); }; } diff --git a/src/widgets/passwordfield.cpp b/src/widgets/passwordfield.cpp index dadccff..b34b567 100644 --- a/src/widgets/passwordfield.cpp +++ b/src/widgets/passwordfield.cpp @@ -78,12 +78,17 @@ namespace gcn void PasswordField::draw(Graphics* graphics) { const std::string realText(mText->getRow(0)); - const std::string encodedText(realText.size(), '*'); + 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; + } } From f7529a3eecf3838cef7493cbec72fdffbef6d207 Mon Sep 17 00:00:00 2001 From: Gwilherm Baudic Date: Fri, 15 Nov 2024 19:47:49 +0100 Subject: [PATCH 4/5] Update include/guisan/widgets/passwordfield.hpp Co-authored-by: Joris Dauphin --- include/guisan/widgets/passwordfield.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/guisan/widgets/passwordfield.hpp b/include/guisan/widgets/passwordfield.hpp index efe7b48..0ebfb7a 100644 --- a/include/guisan/widgets/passwordfield.hpp +++ b/include/guisan/widgets/passwordfield.hpp @@ -97,7 +97,7 @@ namespace gcn void setMaskingChar(const char mask); private: - char masking('*'); + char masking = '*'; }; } From 65745cb0231c81b4b1a15381071d427af2094bf9 Mon Sep 17 00:00:00 2001 From: Gwilherm Baudic Date: Fri, 15 Nov 2024 21:09:19 +0100 Subject: [PATCH 5/5] Add getter and example --- examples/widgets_example.hpp | 4 ++++ include/guisan/widgets/passwordfield.hpp | 7 +++++++ src/widgets/passwordfield.cpp | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/examples/widgets_example.hpp b/examples/widgets_example.hpp index 79728f7..f83cc40 100644 --- a/examples/widgets_example.hpp +++ b/examples/widgets_example.hpp @@ -79,6 +79,8 @@ namespace WidgetsExample textField = std::make_unique("Text field"); + passwordField = std::make_unique("password"); + textBox = std::make_unique("Lorem ipsum dolor sit amet consectetur\n" "adipiscing elit Integer vitae ultrices\n" "eros Curabitur malesuada dolor imperdieat\n" @@ -150,6 +152,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(textBoxScrollArea.get(), 290, 50); top->add(inputBox.get(), 270, 180); top->add(listBox.get(), 290, 200); @@ -228,6 +231,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 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/widgets/passwordfield.hpp b/include/guisan/widgets/passwordfield.hpp index 0ebfb7a..09bdc7d 100644 --- a/include/guisan/widgets/passwordfield.hpp +++ b/include/guisan/widgets/passwordfield.hpp @@ -96,6 +96,13 @@ namespace gcn */ void setMaskingChar(const char mask); + /** + * Get the masking character + * + * @return the masking character + */ + const char getMaskingChar() const; + private: char masking = '*'; }; diff --git a/src/widgets/passwordfield.cpp b/src/widgets/passwordfield.cpp index b34b567..a9897e7 100644 --- a/src/widgets/passwordfield.cpp +++ b/src/widgets/passwordfield.cpp @@ -90,5 +90,10 @@ namespace gcn { masking = mask; } + + const char PasswordField::getMaskingChar() const + { + return masking; + } }