[gnome-shell] userWidget: Use the user name if the real name doesn't fit



commit a5dd44c77f691e613e67ac63c9e7527856abe5fc
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Aug 26 18:36:16 2013 -0400

    userWidget: Use the user name if the real name doesn't fit
    
    This meets the new designs.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=706851

 js/ui/userWidget.js |  109 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 87 insertions(+), 22 deletions(-)
---
diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js
index f801a54..85676ec 100644
--- a/js/ui/userWidget.js
+++ b/js/ui/userWidget.js
@@ -1,7 +1,8 @@
-
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 //
 // A widget showing the user avatar and name
+
+const Clutter = imports.gi.Clutter;
 const AccountsService = imports.gi.AccountsService;
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
@@ -56,6 +57,83 @@ const Avatar = new Lang.Class({
     }
 });
 
+const UserWidgetLabel = new Lang.Class({
+    Name: 'UserWidgetLabel',
+    Extends: St.Widget,
+
+    _init: function(user) {
+        this.parent({ layout_manager: new Clutter.BinLayout() });
+
+        this._user = user;
+
+        this._realNameLabel = new St.Label({ style_class: 'user-widget-label',
+                                             y_align: Clutter.ActorAlign.CENTER });
+        this.add_child(this._realNameLabel);
+
+        this._userNameLabel = new St.Label({ style_class: 'user-widget-label',
+                                             y_align: Clutter.ActorAlign.CENTER });
+        this.add_child(this._userNameLabel);
+
+        this._currentLabel = null;
+
+        this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
+        this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
+        this._updateUser();
+    },
+
+    vfunc_destroy: function() {
+        if (this._userLoadedId != 0) {
+            this._user.disconnect(this._userLoadedId);
+            this._userLoadedId = 0;
+        }
+
+        if (this._userChangedId != 0) {
+            this._user.disconnect(this._userChangedId);
+            this._userChangedId = 0;
+        }
+    },
+
+    vfunc_allocate: function(box, flags) {
+        this.set_allocation(box, flags);
+
+        let availWidth = box.x2 - box.x1;
+        let availHeight = box.y2 - box.y1;
+
+        let [minRealNameWidth, minRealNameHeight,
+             natRealNameWidth, natRealNameHeight] = this._realNameLabel.get_preferred_size();
+
+        let [minUserNameWidth, minUserNameHeight,
+             natUserNameWidth, natUserNameHeight] = this._userNameLabel.get_preferred_size();
+
+        if (natRealNameWidth <= availWidth)
+            this._currentLabel = this._realNameLabel;
+        else
+            this._currentLabel = this._userNameLabel;
+
+        let childBox = new Clutter.ActorBox();
+        childBox.x1 = 0;
+        childBox.y1 = 0;
+        childBox.x2 = availWidth;
+        childBox.y2 = availHeight;
+
+        this._currentLabel.allocate(childBox, flags);
+    },
+
+    vfunc_paint: function() {
+        this._currentLabel.paint();
+    },
+
+    _updateUser: function() {
+        if (this._user.is_loaded) {
+            this._realNameLabel.text = this._user.get_real_name();
+            this._userNameLabel.text = this._user.get_user_name();
+        } else {
+            this._realNameLabel.text = '';
+            this._userNameLabel.text = '';
+        }
+    },
+});
+
 const UserWidget = new Lang.Class({
     Name: 'UserWidget',
 
@@ -67,22 +145,14 @@ const UserWidget = new Lang.Class({
         this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
 
         this._avatar = new Avatar(user);
-        this.actor.add(this._avatar.actor,
-                       { x_fill: true, y_fill: true });
-
-        this._label = new St.Label({ style_class: 'user-widget-label' });
-        this.actor.add(this._label,
-                       { expand: true,
-                         x_fill: true,
-                         y_fill: false,
-                         y_align: St.Align.MIDDLE });
-
-        this._userLoadedId = this._user.connect('notify::is-loaded',
-                                                Lang.bind(this, this._updateUser));
-        this._userChangedId = this._user.connect('changed',
-                                                 Lang.bind(this, this._updateUser));
-        if (this._user.is_loaded)
-            this._updateUser();
+        this.actor.add_child(this._avatar.actor);
+
+        this._label = new UserWidgetLabel(user);
+        this.actor.add_child(this._label);
+
+        this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
+        this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
+        this._updateUser();
     },
 
     _onDestroy: function() {
@@ -98,11 +168,6 @@ const UserWidget = new Lang.Class({
     },
 
     _updateUser: function() {
-        if (this._user.is_loaded)
-            this._label.text = this._user.get_real_name();
-        else
-            this._label.text = '';
-
         this._avatar.update();
     }
 });


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