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/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.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..09bdc7d --- /dev/null +++ b/include/guisan/widgets/passwordfield.hpp @@ -0,0 +1,111 @@ +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * 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/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..a9897e7 --- /dev/null +++ b/src/widgets/passwordfield.cpp @@ -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(]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; + } + +}