[gnome-shell] Use UserAvatarWidget to display user avatars



commit 5e46abfa038cb544443a23a3481cc5d30ca3ae21
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Fri Aug 31 23:18:26 2012 +0200

    Use UserAvatarWidget to display user avatars
    
    Replace duplicate custom code with a common widget.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=683137

 data/theme/gnome-shell.css         |    9 ++++++
 js/gdm/loginDialog.js              |   53 +++-------------------------------
 js/ui/endSessionDialog.js          |   55 +++++++----------------------------
 js/ui/polkitAuthenticationAgent.js |   25 ++++++----------
 js/ui/unlockDialog.js              |    2 +-
 js/ui/userMenu.js                  |   11 ++++--
 6 files changed, 43 insertions(+), 112 deletions(-)
---
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index 80e7da2..5ce232b 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -1686,6 +1686,7 @@ StButton.popup-menu-item:insensitive {
     border-radius: 5px;
     width: 32px;
     height: 32px;
+    background-size: contain;
 }
 
 .end-session-dialog-shutdown-icon {
@@ -1885,6 +1886,14 @@ StButton.popup-menu-item:insensitive {
     color: #ff0000;
 }
 
+.polkit-dialog-user-icon {
+    border: 2px solid #8b8b8b;
+    border-radius: 5px;
+    background-size: contain;
+    width: 48px;
+    height: 48px;
+}
+
 /* Network Agent Dialog */
 
 .network-dialog-secret-table {
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 8975c1e..ee8b8c9 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -39,6 +39,7 @@ const Lightbox = imports.ui.lightbox;
 const Main = imports.ui.main;
 const ModalDialog = imports.ui.modalDialog;
 const Tweener = imports.ui.tweener;
+const UserMenu = imports.ui.userMenu;
 
 const _RESIZE_ANIMATION_TIME = 0.25;
 const _SCROLL_ANIMATION_TIME = 0.5;
@@ -96,8 +97,9 @@ const UserListItem = new Lang.Class({
                                      x_align: St.Align.START,
                                      x_fill: true });
 
-        this._iconBin = new St.Bin();
-        layout.add(this._iconBin);
+        this._userAvatar = new UserMenu.UserAvatarWidget(this.user,
+                                                         { styleClass: 'login-dialog-user-list-item-icon' });
+        layout.add(this._userAvatar.actor);
         let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
                                             vertical:    true });
         layout.add(textLayout, { expand: true });
@@ -125,55 +127,10 @@ const UserListItem = new Lang.Class({
 
     _onUserChanged: function() {
         this._nameLabel.set_text(this.user.get_real_name());
-        this._updateIcon();
+        this._userAvatar.update();
         this._updateLoggedIn();
     },
 
-    _setIconFromFile: function(iconFile, styleClass) {
-        if (styleClass)
-            this._iconBin.set_style_class_name(styleClass);
-        this._iconBin.set_style(null);
-
-        this._iconBin.child = null;
-        if (iconFile) {
-            this._iconBin.show();
-            // We use background-image instead of, say, St.TextureCache
-            // so the theme writers can add a rounded frame around the image
-            // and so theme writers can pick the icon size.
-            this._iconBin.set_style('background-image: url("' + iconFile + '");' +
-                                    'background-size: contain;');
-        } else {
-            this._iconBin.hide();
-        }
-    },
-
-    _setIconFromName: function(iconName, styleClass) {
-        if (styleClass)
-            this._iconBin.set_style_class_name(styleClass);
-        this._iconBin.set_style(null);
-
-        if (iconName != null) {
-            let icon = new St.Icon();
-            icon.set_icon_name(iconName)
-
-            this._iconBin.child = icon;
-            this._iconBin.show();
-        } else {
-            this._iconBin.child = null;
-            this._iconBin.hide();
-        }
-    },
-
-    _updateIcon: function() {
-        let iconFileName = this.user.get_icon_file();
-        let gicon = null;
-
-        if (GLib.file_test(iconFileName, GLib.FileTest.EXISTS))
-            this._setIconFromFile(iconFileName, 'login-dialog-user-list-item-icon');
-        else
-            this._setIconFromName('avatar-default-symbolic', 'login-dialog-user-list-item-icon');
-    },
-
     syncStyleClasses: function() {
         this._updateLoggedIn();
 
diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
index d4b4c43..887d5ca 100644
--- a/js/ui/endSessionDialog.js
+++ b/js/ui/endSessionDialog.js
@@ -34,6 +34,7 @@ const GnomeSession = imports.misc.gnomeSession;
 const Main = imports.ui.main;
 const ModalDialog = imports.ui.modalDialog;
 const Tweener = imports.ui.tweener;
+const UserMenu = imports.ui.userMenu;
 
 let _endSessionDialog = null;
 
@@ -303,40 +304,6 @@ const EndSessionDialog = new Lang.Class({
         this._user.disconnect(this._userChangedId);
     },
 
-    _setIconFromFile: function(iconFile, styleClass) {
-        if (styleClass)
-            this._iconBin.set_style_class_name(styleClass);
-        this._iconBin.set_style(null);
-
-        this._iconBin.child = null;
-        if (iconFile) {
-            this._iconBin.show();
-            this._iconBin.set_style('background-image: url("' + iconFile + '");' +
-                                    'background-size: contain;');
-        } else {
-            this._iconBin.hide();
-        }
-    },
-
-    _setIconFromName: function(iconName, styleClass) {
-        if (styleClass)
-            this._iconBin.set_style_class_name(styleClass);
-        this._iconBin.set_style(null);
-
-        if (iconName != null) {
-            let textureCache = St.TextureCache.get_default();
-            let icon = textureCache.load_icon_name(this._iconBin.get_theme_node(),
-                                                   iconName,
-                                                   _DIALOG_ICON_SIZE);
-
-            this._iconBin.child = icon;
-            this._iconBin.show();
-        } else {
-            this._iconBin.child = null;
-            this._iconBin.hide();
-        }
-    },
-
     _updateDescription: function() {
         if (this.state != ModalDialog.State.OPENING &&
             this.state != ModalDialog.State.OPENED)
@@ -385,16 +352,16 @@ const EndSessionDialog = new Lang.Class({
             return;
 
         let dialogContent = DialogContent[this._type];
-
-        if (this._user.is_loaded && !dialogContent.iconName) {
-            let iconFile = this._user.get_icon_file();
-            if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
-                this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
-            else
-                this._setIconFromName('avatar-default-symbolic', dialogContent.iconStyleClass);
-        } else if (dialogContent.iconName) {
-            this._setIconFromName(dialogContent.iconName,
-                                  dialogContent.iconStyleClass);
+        if (dialogContent.iconName) {
+            this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
+                                                icon_size: _DIALOG_ICON_SIZE,
+                                                style_class: dialogContent.iconStyleClass });
+        } else {
+            let avatarWidget = new UserMenu.UserAvatarWidget(this._user,
+                                                             { iconSize: _DIALOG_ICON_SIZE,
+                                                               styleClass: dialogContent.iconStyleClass });
+            this._iconBin.child = avatarWidget.actor;
+            avatarWidget.update();
         }
 
         this._updateDescription();
diff --git a/js/ui/polkitAuthenticationAgent.js b/js/ui/polkitAuthenticationAgent.js
index 1f1ef75..92e4c6a 100644
--- a/js/ui/polkitAuthenticationAgent.js
+++ b/js/ui/polkitAuthenticationAgent.js
@@ -35,6 +35,9 @@ const PolkitAgent = imports.gi.PolkitAgent;
 
 const ModalDialog = imports.ui.modalDialog;
 const ShellEntry = imports.ui.shellEntry;
+const UserMenu = imports.ui.userMenu;
+
+const DIALOG_ICON_SIZE = 48;
 
 const AuthenticationDialog = new Lang.Class({
     Name: 'AuthenticationDialog',
@@ -117,9 +120,11 @@ const AuthenticationDialog = new Lang.Class({
             let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
                                              vertical: false });
             messageBox.add(userBox);
-            this._userIcon = new St.Icon();
-            this._userIcon.hide();
-            userBox.add(this._userIcon,
+            this._userAvatar = new UserMenu.UserAvatarWidget(this._user,
+                                                             { iconSize: DIALOG_ICON_SIZE,
+                                                               styleClass: 'polkit-dialog-user-icon' });
+            this._userAvatar.actor.hide();
+            userBox.add(this._userAvatar.actor,
                         { x_fill:  true,
                           y_fill:  false,
                           x_align: St.Align.END,
@@ -314,18 +319,8 @@ const AuthenticationDialog = new Lang.Class({
 
     _onUserChanged: function() {
         if (this._user.is_loaded) {
-            if (this._userIcon) {
-                let iconFileName = this._user.get_icon_file();
-                let iconFile = Gio.file_new_for_path(iconFileName);
-                let icon;
-                if (iconFile.query_exists(null)) {
-                    icon = new Gio.FileIcon({file: iconFile});
-                } else {
-                    icon = new Gio.ThemedIcon({name: 'avatar-default-symbolic'});
-                }
-                this._userIcon.set_gicon (icon);
-                this._userIcon.show();
-            }
+            this._userAvatar.update();
+            this._userAvatar.actor.show();
         }
     },
 
diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js
index fb510fc..a4d666d 100644
--- a/js/ui/unlockDialog.js
+++ b/js/ui/unlockDialog.js
@@ -33,7 +33,7 @@ const UserWidget = new Lang.Class({
         this.actor = new St.BoxLayout({ style_class: 'unlock-dialog-user-name-container',
                                         vertical: false });
 
-        this._avatar = new UserMenu.UserAvatarWidget(user, { reactive: false });
+        this._avatar = new UserMenu.UserAvatarWidget(user);
         this.actor.add(this._avatar.actor,
                        { x_fill: true, y_fill: true });
 
diff --git a/js/ui/userMenu.js b/js/ui/userMenu.js
index 8fec394..bc09df8 100644
--- a/js/ui/userMenu.js
+++ b/js/ui/userMenu.js
@@ -48,9 +48,12 @@ const UserAvatarWidget = new Lang.Class({
 
     _init: function(user, params) {
         this._user = user;
-        params = Params.parse(params, { reactive: true });
+        params = Params.parse(params, { reactive: false,
+                                        iconSize: DIALOG_ICON_SIZE,
+                                        styleClass: 'status-chooser-user-icon' });
+        this._iconSize = params.iconSize;
 
-        this.actor = new St.Bin({ style_class: 'status-chooser-user-icon',
+        this.actor = new St.Bin({ style_class: params.styleClass,
                                   track_hover: params.reactive,
                                   reactive: params.reactive });
     },
@@ -67,7 +70,7 @@ const UserAvatarWidget = new Lang.Class({
         } else {
             this.actor.style = null;
             this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
-                                             icon_size: DIALOG_ICON_SIZE });
+                                             icon_size: this._iconSize });
         }
     }
 });
@@ -143,7 +146,7 @@ const IMStatusChooserItem = new Lang.Class({
         this._userManager = AccountsService.UserManager.get_default();
         this._user = this._userManager.get_user(GLib.get_user_name());
 
-        this._avatar = new UserAvatarWidget(this._user);
+        this._avatar = new UserAvatarWidget(this._user, { reactive: true });
         this._iconBin = new St.Button({ child: this._avatar.actor });
         this.addActor(this._iconBin);
 



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