[gnome-initial-setup/show-password-button] password: Add checkbox to toggle password visibility



commit 0050c4e034c88da5f259e9e607b2a7f75e4928c9
Author: Alessandro Puccetti <alessandro kinvolk io>
Date:   Tue May 9 16:00:04 2017 +0200

    password: Add checkbox to toggle password visibility
    
    User research shows that allowing users to view the password that
    they've typed, reduces how often passwords are forgotten, especially for
    users who are unaccustomed to creating and typing passwords.
    
    https://www.nngroup.com/articles/password-creation/ has some more
    interesting reading on this.
    
    This patch has gone through several iterations downstream and contains
    code written by Emmanuele Bassi, Cosimo Cecchi, and Alessandro Puccetti.
    Peter Synak worked on the UX design.
    
    Closes GNOME/gnome-initial-setup#81.

 .../pages/password/gis-password-page.c             | 25 ++++++++++++++++++++++
 .../pages/password/gis-password-page.ui            | 13 +++++++++++
 2 files changed, 38 insertions(+)
---
diff --git a/gnome-initial-setup/pages/password/gis-password-page.c 
b/gnome-initial-setup/pages/password/gis-password-page.c
index e3daae7..abeb94d 100644
--- a/gnome-initial-setup/pages/password/gis-password-page.c
+++ b/gnome-initial-setup/pages/password/gis-password-page.c
@@ -44,6 +44,7 @@ struct _GisPasswordPagePrivate
   GtkWidget *password_strength;
   GtkWidget *password_explanation;
   GtkWidget *confirm_explanation;
+  GtkWidget *password_toggle;
   gboolean valid_confirm;
   gboolean valid_password;
   guint timeout_id;
@@ -53,6 +54,25 @@ typedef struct _GisPasswordPagePrivate GisPasswordPagePrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GisPasswordPage, gis_password_page, GIS_TYPE_PAGE);
 
+static void
+update_password_visibility (GisPasswordPage  *page)
+{
+  GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+  GtkWidget *password_entry = priv->password_entry;
+  GtkWidget *confirm_entry = priv->confirm_entry;
+  gboolean is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->password_toggle));
+
+  gtk_entry_set_visibility (GTK_ENTRY (password_entry), is_active);
+  gtk_entry_set_visibility (GTK_ENTRY (confirm_entry), is_active);
+}
+
+static void
+password_visibility_toggled (GtkToggleButton *button,
+                             GisPasswordPage  *page)
+{
+  update_password_visibility (page);
+}
+
 static gboolean
 page_validate (GisPasswordPage *page)
 {
@@ -246,6 +266,10 @@ gis_password_page_constructed (GObject *object)
   g_signal_connect_swapped (priv->confirm_entry, "activate",
                             G_CALLBACK (confirm), page);
 
+  g_signal_connect (priv->password_toggle, "toggled",
+                    G_CALLBACK (password_visibility_toggled), page);
+  update_password_visibility (page);
+
   g_signal_connect (GIS_PAGE (page)->driver, "notify::username",
                     G_CALLBACK (username_changed), page);
 
@@ -283,6 +307,7 @@ gis_password_page_class_init (GisPasswordPageClass *klass)
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage, 
password_strength);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage, 
password_explanation);
   gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage, 
confirm_explanation);
+  gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage, password_toggle);
 
   page_class->page_id = PAGE_ID;
   page_class->locale_changed = gis_password_page_locale_changed;
diff --git a/gnome-initial-setup/pages/password/gis-password-page.ui 
b/gnome-initial-setup/pages/password/gis-password-page.ui
index 0c94bcf..3afdf61 100644
--- a/gnome-initial-setup/pages/password/gis-password-page.ui
+++ b/gnome-initial-setup/pages/password/gis-password-page.ui
@@ -197,6 +197,19 @@
                 <property name="height">1</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkCheckButton" id="password_toggle">
+                <property name="label" translatable="yes">_Show Password</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="left_attach">2</property>
+                <property name="top_attach">0</property>
+              </packing>
+            </child>
           </object>
         </child>
       </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]