From a5dd44c77f691e613e67ac63c9e7527856abe5fc Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 26 Aug 2013 18:36:16 -0400 Subject: [PATCH] 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 | 105 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 85 insertions(+), 20 deletions(-) diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js index f801a5439..85676ec4e 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.actor.add_child(this._avatar.actor); - 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._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)); - if (this._user.is_loaded) - this._updateUser(); + 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(); } });