messageTray: Simplify the actor hierarchy a bit

With no more tricky interaction between bottom tray and notification
banners, we can merge the remaining actors into a single one.

https://bugzilla.gnome.org/show_bug.cgi?id=744850
This commit is contained in:
Florian Müllner 2015-02-11 18:04:22 +01:00
parent 830b4559c0
commit 77413feb57

View File

@ -1351,22 +1351,19 @@ const MessageTray = new Lang.Class({
this._onStatusChanged(status); this._onStatusChanged(status);
})); }));
this._notificationWidget = new St.Widget({ name: 'notification-container', this.actor = new St.Widget({ name: 'notification-container',
reactive: true, reactive: true,
track_hover: true, track_hover: true,
y_align: Clutter.ActorAlign.START, y_align: Clutter.ActorAlign.START,
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
y_expand: true, y_expand: true,
x_expand: true, x_expand: true,
layout_manager: new Clutter.BinLayout() }); layout_manager: new Clutter.BinLayout() });
this._notificationWidget.connect('key-release-event', Lang.bind(this, this._onNotificationKeyRelease)); this.actor.connect('key-release-event', Lang.bind(this, this._onNotificationKeyRelease));
this._notificationWidget.connect('notify::hover', Lang.bind(this, this._onNotificationHoverChanged)); this.actor.connect('notify::hover', Lang.bind(this, this._onNotificationHoverChanged));
this._notificationBin = new St.Bin({ y_expand: true }); this.actor.hide();
this._notificationBin.set_y_align(Clutter.ActorAlign.START); this._notificationFocusGrabber = new FocusGrabber(this.actor);
this._notificationWidget.add_actor(this._notificationBin);
this._notificationWidget.hide();
this._notificationFocusGrabber = new FocusGrabber(this._notificationWidget);
this._notificationQueue = []; this._notificationQueue = [];
this._notification = null; this._notification = null;
this._notificationClickedId = 0; this._notificationClickedId = 0;
@ -1374,7 +1371,7 @@ const MessageTray = new Lang.Class({
this._closeButton = Util.makeCloseButton(); this._closeButton = Util.makeCloseButton();
this._closeButton.hide(); this._closeButton.hide();
this._closeButton.connect('clicked', Lang.bind(this, this._closeNotification)); this._closeButton.connect('clicked', Lang.bind(this, this._closeNotification));
this._notificationWidget.add_actor(this._closeButton); this.actor.add_actor(this._closeButton);
this._userActiveWhileNotificationShown = false; this._userActiveWhileNotificationShown = false;
@ -1389,7 +1386,7 @@ const MessageTray = new Lang.Class({
// state of the pointer when a notification pops up. // state of the pointer when a notification pops up.
this._pointerInNotification = false; this._pointerInNotification = false;
// This tracks this._notificationWidget.hover and is used to fizzle // This tracks this.actor.hover and is used to fizzle
// out non-changing hover notifications in onNotificationHoverChanged. // out non-changing hover notifications in onNotificationHoverChanged.
this._notificationHovered = false; this._notificationHovered = false;
@ -1400,8 +1397,8 @@ const MessageTray = new Lang.Class({
this.clearableCount = 0; this.clearableCount = 0;
Main.layoutManager.trayBox.add_actor(this._notificationWidget); Main.layoutManager.trayBox.add_actor(this.actor);
Main.layoutManager.trackChrome(this._notificationWidget); Main.layoutManager.trackChrome(this.actor);
Main.layoutManager.trackChrome(this._closeButton); Main.layoutManager.trackChrome(this._closeButton);
global.screen.connect('in-fullscreen-changed', Lang.bind(this, this._updateState)); global.screen.connect('in-fullscreen-changed', Lang.bind(this, this._updateState));
@ -1558,10 +1555,10 @@ const MessageTray = new Lang.Class({
}, },
_onNotificationHoverChanged: function() { _onNotificationHoverChanged: function() {
if (this._notificationWidget.hover == this._notificationHovered) if (this.actor.hover == this._notificationHovered)
return; return;
this._notificationHovered = this._notificationWidget.hover; this._notificationHovered = this.actor.hover;
if (this._notificationHovered) { if (this._notificationHovered) {
this._resetNotificationLeftTimeout(); this._resetNotificationLeftTimeout();
@ -1575,7 +1572,7 @@ const MessageTray = new Lang.Class({
// automatically. Instead, the user is able to expand the notification by mousing away from it and then // automatically. Instead, the user is able to expand the notification by mousing away from it and then
// mousing back in. Because this is an expected action, we set the boolean flag that indicates that a longer // mousing back in. Because this is an expected action, we set the boolean flag that indicates that a longer
// timeout should be used before popping down the notification. // timeout should be used before popping down the notification.
if (this._notificationWidget.contains(actorAtShowNotificationPosition)) { if (this.actor.contains(actorAtShowNotificationPosition)) {
this._useLongerNotificationLeftTimeout = true; this._useLongerNotificationLeftTimeout = true;
return; return;
} }
@ -1743,11 +1740,11 @@ const MessageTray = new Lang.Class({
this._notificationUnfocusedId = this._notification.connect('unfocused', Lang.bind(this, function() { this._notificationUnfocusedId = this._notification.connect('unfocused', Lang.bind(this, function() {
this._updateState(); this._updateState();
})); }));
this._notificationBin.child = this._notification.actor; this.actor.add_actor(this._notification.actor);
this._notificationWidget.opacity = 0; this.actor.opacity = 0;
this._notificationWidget.y = 0; this.actor.y = 0;
this._notificationWidget.show(); this.actor.show();
this._updateShowingNotification(); this._updateShowingNotification();
@ -1790,14 +1787,14 @@ const MessageTray = new Lang.Class({
// notification is being shown. // notification is being shown.
let tweenParams = { opacity: 255, let tweenParams = { opacity: 255,
y: -this._notificationWidget.height, y: -this.actor.height,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: this._showNotificationCompleted, onComplete: this._showNotificationCompleted,
onCompleteScope: this onCompleteScope: this
}; };
this._tween(this._notificationWidget, '_notificationState', State.SHOWN, tweenParams); this._tween(this.actor, '_notificationState', State.SHOWN, tweenParams);
}, },
_showNotificationCompleted: function() { _showNotificationCompleted: function() {
@ -1861,8 +1858,8 @@ const MessageTray = new Lang.Class({
this._resetNotificationLeftTimeout(); this._resetNotificationLeftTimeout();
if (animate) { if (animate) {
this._tween(this._notificationWidget, '_notificationState', State.HIDDEN, this._tween(this.actor, '_notificationState', State.HIDDEN,
{ y: this._notificationWidget.height, { y: this.actor.height,
opacity: 0, opacity: 0,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
@ -1870,9 +1867,9 @@ const MessageTray = new Lang.Class({
onCompleteScope: this onCompleteScope: this
}); });
} else { } else {
Tweener.removeTweens(this._notificationWidget); Tweener.removeTweens(this.actor);
this._notificationWidget.y = this._notificationWidget.height; this.actor.y = this.actor.height;
this._notificationWidget.opacity = 0; this.actor.opacity = 0;
this._notificationState = State.HIDDEN; this._notificationState = State.HIDDEN;
this._hideNotificationCompleted(); this._hideNotificationCompleted();
} }
@ -1889,8 +1886,8 @@ const MessageTray = new Lang.Class({
this._closeButton.hide(); this._closeButton.hide();
this._pointerInNotification = false; this._pointerInNotification = false;
this._notificationRemoved = false; this._notificationRemoved = false;
this._notificationBin.child = null; this.actor.remove_actor(notification.actor);
this._notificationWidget.hide(); this.actor.hide();
}, },
_expandActiveNotification: function() { _expandActiveNotification: function() {
@ -1914,17 +1911,18 @@ const MessageTray = new Lang.Class({
}, },
_onNotificationExpanded: function() { _onNotificationExpanded: function() {
let expandedY = - this._notificationWidget.height; let expandedY = - this.actor.height;
this.actor.set_child_above_sibling(this._closeButton, null);
this._closeButton.show(); this._closeButton.show();
// Don't animate the notification to its new position if it has shrunk: // Don't animate the notification to its new position if it has shrunk:
// there will be a very visible "gap" that breaks the illusion. // there will be a very visible "gap" that breaks the illusion.
if (this._notificationWidget.y < expandedY) { if (this.actor.y < expandedY) {
this._notificationWidget.y = expandedY; this.actor.y = expandedY;
} else if (this._notification.y != expandedY) { } else if (this._notification.y != expandedY) {
// Tween also opacity here, to override a possible tween that's // Tween also opacity here, to override a possible tween that's
// currently hiding the notification. // currently hiding the notification.
Tweener.addTween(this._notificationWidget, Tweener.addTween(this.actor,
{ y: expandedY, { y: expandedY,
opacity: 255, opacity: 255,
time: ANIMATION_TIME, time: ANIMATION_TIME,