user-accounts: add positive confirmation to the add user dialog

Add checkmarks, remove exclam icons and decrese timeout (by design).

https://bugzilla.gnome.org/show_bug.cgi?id=702476
This commit is contained in:
Ondrej Holy 2013-07-23 16:52:03 +02:00 committed by Stef Walter
parent aaf25450ee
commit af691e6122
2 changed files with 72 additions and 39 deletions

View file

@ -494,17 +494,6 @@
<child>
<object class="GtkBox" id="box18">
<property name="visible">True</property>
<child>
<object class="GtkImage" id="enterprise-checkmark">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-apply</property>
<property name="halign">start</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>

View file

@ -32,7 +32,7 @@
#include "um-utils.h"
#include "pw-utils.h"
#define PASSWORD_CHECK_TIMEOUT 1000
#define PASSWORD_CHECK_TIMEOUT 600
typedef enum {
UM_LOCAL,
@ -75,6 +75,7 @@ struct _UmAccountDialog {
/* Local user account widgets */
GtkWidget *local_username;
GtkWidget *local_name;
gint local_name_timeout_id;
GtkWidget *local_username_hint;
gint local_username_timeout_id;
GtkWidget *local_account_type;
@ -99,7 +100,6 @@ struct _UmAccountDialog {
UmRealmObject *selected_realm;
gboolean enterprise_check_credentials;
GtkSpinner *enterprise_spinner;
GtkWidget *enterprise_checkmark;
GtkWidget *enterprise_hint;
gint enterprise_domain_timeout_id;
@ -300,6 +300,12 @@ update_password_strength (UmAccountDialog *self)
gtk_widget_set_sensitive (self->local_verify, strength_level > 0);
}
if (strength_level > 0) {
set_entry_validation_checkmark (GTK_ENTRY (self->local_password));
} else {
clear_entry_validation_error (GTK_ENTRY (self->local_password));
}
return strength_level;
}
@ -322,18 +328,23 @@ local_validate (UmAccountDialog *self)
entry = gtk_bin_get_child (GTK_BIN (self->local_username));
if (tip) {
set_entry_validation_error (GTK_ENTRY (entry), tip);
hint = g_strdup_printf ("%s.", tip);
g_free (tip);
} else {
clear_entry_validation_error (GTK_ENTRY (entry));
hint = g_strdup (_("This will be used to name your home folder and can't be changed."));
}
gtk_label_set_label (GTK_LABEL (self->local_username_hint), hint);
g_free (hint);
if (valid_login) {
set_entry_validation_checkmark (GTK_ENTRY (entry));
}
name = gtk_entry_get_text (GTK_ENTRY (self->local_name));
valid_name = is_valid_name (name);
if (valid_name) {
set_entry_validation_checkmark (GTK_ENTRY (self->local_name));
}
password = gtk_entry_get_text (GTK_ENTRY (self->local_password));
verify = gtk_entry_get_text (GTK_ENTRY (self->local_verify));
@ -386,10 +397,36 @@ on_username_changed (GtkComboBoxText *combo,
entry = gtk_bin_get_child (GTK_BIN (self->local_username));
clear_entry_validation_error (GTK_ENTRY (entry));
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, FALSE);
self->local_username_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT, (GSourceFunc) local_username_timeout, self);
}
static gboolean
local_name_timeout (UmAccountDialog *self)
{
dialog_validate (self);
return FALSE;
}
static gboolean
on_name_focus_out (GtkEntry *entry,
GParamSpec *pspec,
gpointer user_data)
{
UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
if (self->local_name_timeout_id != 0) {
g_source_remove (self->local_name_timeout_id);
self->local_name_timeout_id = 0;
}
local_name_timeout (self);
return FALSE;
}
static void
on_name_changed (GtkEditable *editable,
gpointer user_data)
@ -411,7 +448,10 @@ on_name_changed (GtkEditable *editable,
gtk_combo_box_set_active (GTK_COMBO_BOX (self->local_username), 0);
}
dialog_validate (self);
clear_entry_validation_error (GTK_ENTRY (editable));
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, FALSE);
self->local_username_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT, (GSourceFunc) local_name_timeout, self);
}
static void
@ -422,11 +462,12 @@ update_password_match (UmAccountDialog *self)
password = gtk_entry_get_text (GTK_ENTRY (self->local_password));
verify = gtk_entry_get_text (GTK_ENTRY (self->local_verify));
if (strlen (verify) != 0 && strcmp (password, verify) != 0) {
gtk_label_set_label (GTK_LABEL (self->local_hint), _("Passwords do not match."));
set_entry_validation_error (GTK_ENTRY (self->local_verify), _("Passwords do not match"));
} else {
clear_entry_validation_error (GTK_ENTRY (self->local_verify));
if (strlen (verify) != 0) {
if (strcmp (password, verify) != 0) {
gtk_label_set_label (GTK_LABEL (self->local_hint), _("Passwords do not match."));
} else {
set_entry_validation_checkmark (GTK_ENTRY (self->local_verify));
}
}
}
@ -468,7 +509,9 @@ on_password_changed (GtkEntry *entry,
self->local_password_timeout_id = 0;
}
clear_entry_validation_error (GTK_ENTRY (entry));
clear_entry_validation_error (GTK_ENTRY (self->local_verify));
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, FALSE);
self->local_password_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT, (GSourceFunc) local_password_timeout, self);
}
@ -515,10 +558,10 @@ local_init (UmAccountDialog *self,
G_CALLBACK (on_username_changed), self);
g_signal_connect_after (widget, "focus-out-event", G_CALLBACK (on_username_focus_out), self);
self->local_username = widget;
self->local_username_timeout_id = 0;
widget = (GtkWidget *) gtk_builder_get_object (builder, "local-name");
g_signal_connect (widget, "changed", G_CALLBACK (on_name_changed), self);
g_signal_connect_after (widget, "focus-out-event", G_CALLBACK (on_name_focus_out), self);
self->local_name = widget;
widget = (GtkWidget *) gtk_builder_get_object (builder, "local-username-hint");
@ -544,7 +587,6 @@ local_init (UmAccountDialog *self,
g_signal_connect (widget, "notify::text", G_CALLBACK (on_password_changed), self);
g_signal_connect_after (widget, "focus-out-event", G_CALLBACK (on_password_focus_out), self);
self->local_verify = widget;
self->local_password_timeout_id = 0;
widget = (GtkWidget *) gtk_builder_get_object (builder, "local-strength");
gtk_widget_set_sensitive (widget, FALSE);
@ -1044,7 +1086,7 @@ on_realm_discover_input (GObject *source,
if (self->enterprise_check_credentials) {
enterprise_check_login (self);
}
gtk_widget_show (self->enterprise_checkmark);
set_entry_validation_checkmark (GTK_ENTRY (self->enterprise_domain_entry));
gtk_label_set_text (GTK_LABEL (self->enterprise_hint), "");
g_list_free_full (realms, g_object_unref);
@ -1199,7 +1241,15 @@ on_network_changed (GNetworkMonitor *monitor,
static gboolean
enterprise_domain_timeout (UmAccountDialog *self)
{
enterprise_check_domain (self);
GtkTreeIter iter;
if (gtk_combo_box_get_active_iter (self->enterprise_domain, &iter)) {
gtk_tree_model_get (gtk_combo_box_get_model (self->enterprise_domain), &iter, 1, &self->selected_realm, -1);
set_entry_validation_checkmark (GTK_ENTRY (self->enterprise_domain_entry));
}
else {
enterprise_check_domain (self);
}
return FALSE;
}
@ -1209,7 +1259,6 @@ on_domain_changed (GtkComboBox *widget,
gpointer user_data)
{
UmAccountDialog *self = UM_ACCOUNT_DIALOG (user_data);
GtkTreeIter iter;
if (self->enterprise_domain_timeout_id != 0) {
g_source_remove (self->enterprise_domain_timeout_id);
@ -1217,14 +1266,9 @@ on_domain_changed (GtkComboBox *widget,
}
g_clear_object (&self->selected_realm);
if (gtk_combo_box_get_active_iter (self->enterprise_domain, &iter)) {
gtk_tree_model_get (gtk_combo_box_get_model (self->enterprise_domain), &iter, 1, &self->selected_realm, -1);
gtk_widget_show (self->enterprise_checkmark);
}
else {
gtk_widget_hide (self->enterprise_checkmark);
self->enterprise_domain_timeout_id = g_timeout_add (500, (GSourceFunc) enterprise_domain_timeout, self);
}
clear_entry_validation_error (GTK_ENTRY (self->enterprise_domain_entry));
self->enterprise_domain_timeout_id = g_timeout_add (PASSWORD_CHECK_TIMEOUT, (GSourceFunc) enterprise_domain_timeout, self);
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_OK, FALSE);
gtk_label_set_text (GTK_LABEL (self->enterprise_hint), "");
dialog_validate (self);
@ -1279,11 +1323,6 @@ enterprise_init (UmAccountDialog *self,
gtk_combo_box_set_model (self->enterprise_domain,
GTK_TREE_MODEL (self->enterprise_realms));
self->enterprise_domain_entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget)));
self->enterprise_domain_timeout_id = 0;
widget = (GtkWidget *) gtk_builder_get_object (builder, "enterprise-checkmark");
gtk_widget_hide (widget);
self->enterprise_checkmark = widget;
widget = (GtkWidget *) gtk_builder_get_object (builder, "enterprise-spinner");
gtk_widget_hide (widget);
@ -1535,6 +1574,11 @@ um_account_dialog_dispose (GObject *obj)
self->local_password_timeout_id = 0;
}
if (self->local_name_timeout_id != 0) {
g_source_remove (self->local_name_timeout_id);
self->local_name_timeout_id = 0;
}
if (self->local_username_timeout_id != 0) {
g_source_remove (self->local_username_timeout_id);
self->local_username_timeout_id = 0;