[gnome-control-center] user-accounts: Add last login field



commit 691a25823224109e0412e35fd7e6020a38746a0b
Author: Ondrej Holy <oholy redhat com>
Date:   Thu Nov 22 15:14:13 2012 +0100

    user-accounts: Add last login field
    
    https://bugzilla.gnome.org/show_bug.cgi?id=681772

 panels/user-accounts/data/user-accounts-dialog.ui |   35 +++++++++++++++
 panels/user-accounts/um-user-panel.c              |   47 ++++++++++++++++++++-
 panels/user-accounts/um-user.c                    |   12 +++++
 panels/user-accounts/um-user.h                    |    1 +
 panels/user-accounts/um-utils.c                   |   36 ++++++++++++++++
 panels/user-accounts/um-utils.h                   |    2 +
 6 files changed, 132 insertions(+), 1 deletions(-)
---
diff --git a/panels/user-accounts/data/user-accounts-dialog.ui b/panels/user-accounts/data/user-accounts-dialog.ui
index e4defc4..d6e101b 100644
--- a/panels/user-accounts/data/user-accounts-dialog.ui
+++ b/panels/user-accounts/data/user-accounts-dialog.ui
@@ -437,6 +437,41 @@
                             <property name="height">1</property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkLabel" id="last-login-label">
+                            <property name="visible">True</property>
+                            <property name="xalign">1</property>
+                            <property name="label" translatable="yes">Last Login</property>
+                            <property name="use_underline">True</property>
+                            <property name="mnemonic_widget">last-login-value-label</property>
+                            <style>
+                              <class name="dim-label"/>
+                            </style>
+                          </object>
+                          <packing>
+                            <property name="left_attach">0</property>
+                            <property name="top_attach">7</property>
+                            <property name="width">1</property>
+                            <property name="height">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="last-login-value-label">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="margin_left">6</property>
+                            <property name="margin_top">6</property>
+                            <property name="margin_bottom">6</property>
+                            <property name="hexpand">True</property>
+                            <property name="xalign">0</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="top_attach">7</property>
+                            <property name="width">1</property>
+                            <property name="height">1</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
diff --git a/panels/user-accounts/um-user-panel.c b/panels/user-accounts/um-user-panel.c
index bd8c90d..e3eb825 100644
--- a/panels/user-accounts/um-user-panel.c
+++ b/panels/user-accounts/um-user-panel.c
@@ -553,6 +553,35 @@ autologin_changed (GObject            *object,
         g_object_unref (user);
 }
 
+static gchar *
+get_login_time_text (UmUser *user)
+{
+        gchar *text, *date_str, *time_str;
+        GDateTime *date_time;
+        gint64 time;
+
+        time = um_user_get_login_time (user);
+        if (um_user_is_logged_in (user)) {
+                text = g_strdup (_("Logged in"));
+        }
+        else if (time > 0) {
+                date_time = g_date_time_new_from_unix_local (time);
+                date_str = get_smart_date (date_time);
+                time_str = g_date_time_format (date_time, "%k:%M");
+
+                text = g_strconcat (date_str, ", ", time_str, NULL);
+
+                g_date_time_unref (date_time);
+                g_free (date_str);
+                g_free (time_str);
+        }
+        else {
+                text = g_strdup ("â");
+        }
+
+        return text;
+}
+
 static void
 show_user (UmUser *user, UmUserPanelPrivate *d)
 {
@@ -561,11 +590,12 @@ show_user (UmUser *user, UmUserPanelPrivate *d)
         GtkWidget *label2;
         GtkWidget *label3;
         GdkPixbuf *pixbuf;
-        gchar *lang;
+        gchar *lang, *text;
         GtkWidget *widget;
         GtkTreeModel *model;
         GtkTreeIter iter;
         gboolean show, enable;
+        UmUser *current;
 
         pixbuf = um_user_render_icon (user, UM_ICON_STYLE_NONE, 48);
         image = get_widget (d, "user-icon-image");
@@ -624,6 +654,21 @@ show_user (UmUser *user, UmUserPanelPrivate *d)
         show = um_user_is_local_account (user);
         gtk_widget_set_visible (widget, show);
         gtk_widget_set_visible (label, show);
+
+        /* Last login: show when administrator or current user */
+        widget = get_widget (d, "last-login-value-label");
+        label = get_widget (d, "last-login-label");
+
+        current = um_user_manager_get_user_by_id (d->um, getuid ());
+        show = um_user_get_uid (user) == getuid () ||
+               um_user_get_account_type (current) == UM_ACCOUNT_TYPE_ADMINISTRATOR;
+        if (show) {
+                text = get_login_time_text (user);
+                gtk_label_set_text (GTK_LABEL (widget), text);
+                g_free (text);
+        }
+        gtk_widget_set_visible (widget, show);
+        gtk_widget_set_visible (label, show);
 }
 
 static void on_permission_changed (GPermission *permission, GParamSpec *pspec, gpointer data);
diff --git a/panels/user-accounts/um-user.c b/panels/user-accounts/um-user.c
index 1bbaa8c..589698e 100644
--- a/panels/user-accounts/um-user.c
+++ b/panels/user-accounts/um-user.c
@@ -60,6 +60,7 @@ typedef struct {
         gchar          *language;
         gchar          *location;
         guint64         login_frequency;
+        gint64          login_time;
         gchar          *icon_file;
         gboolean        locked;
         gboolean        automatic_login;
@@ -138,6 +139,9 @@ user_properties_get (GDBusConnection *bus,
                 else if (strcmp (key, "LoginFrequency") == 0) {
                         g_variant_get (value, "t", &props->login_frequency);
                 }
+                else if (strcmp (key, "LoginTime") == 0) {
+                        g_variant_get (value, "x", &props->login_time);
+                }
                 else if (strcmp (key, "IconFile") == 0) {
                         g_variant_get (value, "s", &props->icon_file);
                 }
@@ -304,6 +308,14 @@ um_user_get_login_frequency (UmUser *user)
         return user->props->login_frequency;
 }
 
+gint64
+um_user_get_login_time (UmUser *user)
+{
+        g_return_val_if_fail (UM_IS_USER (user), 0);
+
+        return user->props->login_time;
+}
+
 gint
 um_user_collate (UmUser *user1,
                   UmUser *user2)
diff --git a/panels/user-accounts/um-user.h b/panels/user-accounts/um-user.h
index d1b583a..6ea1c7d 100644
--- a/panels/user-accounts/um-user.h
+++ b/panels/user-accounts/um-user.h
@@ -69,6 +69,7 @@ const gchar   *um_user_get_location        (UmUser   *user);
 const gchar   *um_user_get_home_directory  (UmUser   *user);
 const gchar   *um_user_get_shell           (UmUser   *user);
 gulong         um_user_get_login_frequency (UmUser   *user);
+gint64         um_user_get_login_time      (UmUser   *user);
 gint           um_user_get_password_mode   (UmUser   *user);
 const gchar   *um_user_get_password_hint   (UmUser   *user);
 const gchar   *um_user_get_icon_file       (UmUser   *user);
diff --git a/panels/user-accounts/um-utils.c b/panels/user-accounts/um-utils.c
index fd9e8a9..8d42bf3 100644
--- a/panels/user-accounts/um-utils.c
+++ b/panels/user-accounts/um-utils.c
@@ -746,3 +746,39 @@ generate_username_choices (const gchar  *name,
         g_string_free (item3, TRUE);
         g_string_free (item4, TRUE);
 }
+
+gchar *
+get_smart_date (GDateTime *date)
+{
+        gchar *label;
+        GDateTime *today, *local;
+        GTimeSpan span;
+
+        /* Set today date */
+        local = g_date_time_new_now_local ();
+        today = g_date_time_new_local (g_date_time_get_year (local),
+                                       g_date_time_get_month (local),
+                                       g_date_time_get_day_of_month (local),
+                                       0, 0, 0);
+
+        span = g_date_time_difference (today, date);
+        if (span <= 0) {
+                label = g_strdup (_("Today"));
+        }
+        else if (span <= G_TIME_SPAN_DAY) {
+                label = g_strdup (_("Yesterday"));
+        }
+        else {
+                if (g_date_time_get_year (date) == g_date_time_get_year (today)) {
+                        label = g_date_time_format (date, "%b %e");
+                }
+                else {
+                        label = g_date_time_format (date, "%b %e, %Y");
+                }
+        }
+
+        g_date_time_unref (local);
+        g_date_time_unref (today);
+
+        return label;
+}
diff --git a/panels/user-accounts/um-utils.h b/panels/user-accounts/um-utils.h
index bb98ab0..1f9dee2 100644
--- a/panels/user-accounts/um-utils.h
+++ b/panels/user-accounts/um-utils.h
@@ -65,6 +65,8 @@ gboolean is_valid_username                (const gchar     *name,
 void     generate_username_choices        (const gchar     *name,
                                            GtkListStore    *store);
 
+gchar *  get_smart_date                   (GDateTime *date);
+
 G_END_DECLS
 
 #endif



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