preview
This commit is contained in:
parent
e8ae8f75a0
commit
50395cded8
@ -2591,3 +2591,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
-boxpointer-gap: 4px;
|
-boxpointer-gap: 4px;
|
||||||
-arrow-rise: 0px;
|
-arrow-rise: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.top-bar-notification-preview {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
@ -150,8 +150,8 @@ function _initializeUI() {
|
|||||||
if (LoginManager.canLock())
|
if (LoginManager.canLock())
|
||||||
screenShield = new ScreenShield.ScreenShield();
|
screenShield = new ScreenShield.ScreenShield();
|
||||||
|
|
||||||
panel = new Panel.Panel();
|
|
||||||
messageTray = new MessageTray.MessageTray();
|
messageTray = new MessageTray.MessageTray();
|
||||||
|
panel = new Panel.Panel();
|
||||||
keyboard = new Keyboard.Keyboard();
|
keyboard = new Keyboard.Keyboard();
|
||||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||||
|
@ -559,6 +559,8 @@ const Notification = new Lang.Class({
|
|||||||
this._buttonBox.destroy_all_children();
|
this._buttonBox.destroy_all_children();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.gicon = params.gicon;
|
||||||
|
|
||||||
if (this._icon && (params.gicon || params.clear)) {
|
if (this._icon && (params.gicon || params.clear)) {
|
||||||
this._icon.destroy();
|
this._icon.destroy();
|
||||||
this._icon = null;
|
this._icon = null;
|
||||||
@ -603,6 +605,8 @@ const Notification = new Lang.Class({
|
|||||||
// is done correctly automatically.
|
// is done correctly automatically.
|
||||||
this.actor.set_text_direction(titleDirection);
|
this.actor.set_text_direction(titleDirection);
|
||||||
|
|
||||||
|
this.bannerBodyText = banner;
|
||||||
|
|
||||||
this._bodyUrlHighlighter.setMarkup(banner, params.bannerMarkup);
|
this._bodyUrlHighlighter.setMarkup(banner, params.bannerMarkup);
|
||||||
|
|
||||||
if (this._soundName != params.soundName ||
|
if (this._soundName != params.soundName ||
|
||||||
@ -918,11 +922,94 @@ const Source = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Source.prototype);
|
Signals.addSignalMethods(Source.prototype);
|
||||||
|
|
||||||
|
const TopBarNotificationPreview = new Lang.Class({
|
||||||
|
Name: 'TopBarNotificationPreview',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.actor = new St.BoxLayout({ style_class: 'top-bar-notification-preview' });
|
||||||
|
|
||||||
|
this._icon = new St.Icon({ icon_size: 22 });
|
||||||
|
this.actor.add_child(this._icon);
|
||||||
|
|
||||||
|
this._title = new St.Label({ style_class: 'top-bar-notification-preview-title' });
|
||||||
|
this.actor.add_child(this._title);
|
||||||
|
|
||||||
|
this._body = new St.Label({ style_class: 'top-bar-notification-preview-body' });
|
||||||
|
this.actor.add_child(this._body);
|
||||||
|
},
|
||||||
|
|
||||||
|
setNotification: function(notification) {
|
||||||
|
this._icon.gicon = notification.gicon;
|
||||||
|
|
||||||
|
let title = notification.title;
|
||||||
|
title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : '';
|
||||||
|
this._title.clutter_text.set_markup('<b>' + title + '</b>');
|
||||||
|
|
||||||
|
this._body.clutter_text.set_text(_fixMarkup(notification.bannerBodyText, false));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const TopBarNotificationController = new Lang.Class({
|
||||||
|
Name: 'TopBarNotificationController',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.actor = new St.Widget();
|
||||||
|
|
||||||
|
this._notificationPreview = new TopBarNotificationPreview();
|
||||||
|
this.actor.add_child(this._notificationPreview.actor);
|
||||||
|
|
||||||
|
this._notificationQueue = [];
|
||||||
|
this._timeoutId = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
_timeout: function() {
|
||||||
|
this._notificationQueue.shift();
|
||||||
|
this._update();
|
||||||
|
this._timeoutId = 0;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
},
|
||||||
|
|
||||||
|
_ensureTimeout: function() {
|
||||||
|
if (this._timeoutId == 0)
|
||||||
|
this._timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 2, Lang.bind(this, this._timeout));
|
||||||
|
},
|
||||||
|
|
||||||
|
get hasNotification() {
|
||||||
|
return (this._notificationQueue.length > 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
_update: function() {
|
||||||
|
if (this._notificationQueue.length > 0) {
|
||||||
|
let notification = this._notificationQueue[0];
|
||||||
|
this._notificationPreview.setNotification(notification);
|
||||||
|
|
||||||
|
this._ensureTimeout();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.emit('updated');
|
||||||
|
},
|
||||||
|
|
||||||
|
pushNotification: function(notification) {
|
||||||
|
this._notificationQueue.push(notification);
|
||||||
|
|
||||||
|
notification.connect('destroy', Lang.bind(this, function() {
|
||||||
|
let idx = this._notificationQueue.indexOf(notification);
|
||||||
|
this._notificationQueue.splice(idx, 1);
|
||||||
|
this._update();
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._update();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(TopBarNotificationController.prototype);
|
||||||
|
|
||||||
const MessageTray = new Lang.Class({
|
const MessageTray = new Lang.Class({
|
||||||
Name: 'MessageTray',
|
Name: 'MessageTray',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._sources = new Map();
|
this._sources = new Map();
|
||||||
|
|
||||||
|
this.notificationPreview = new TopBarNotificationController();
|
||||||
},
|
},
|
||||||
|
|
||||||
_expireNotification: function() {
|
_expireNotification: function() {
|
||||||
@ -1003,7 +1090,7 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onNotify: function(source, notification) {
|
_onNotify: function(source, notification) {
|
||||||
// Fill in here.
|
this.notificationPreview.pushNotification(notification);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(MessageTray.prototype);
|
Signals.addSignalMethods(MessageTray.prototype);
|
||||||
|
@ -862,11 +862,56 @@ const AggregateMenu = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const DateMenuButton2 = new Lang.Class({
|
||||||
|
Name: 'DateMenuButton2',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.container = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
|
|
||||||
|
this._notificationPreview = Main.messageTray.notificationPreview;
|
||||||
|
this.container.add_child(this._notificationPreview.actor);
|
||||||
|
this._notificationPreview.actor.x_expand = true;
|
||||||
|
this._notificationPreview.actor.x_align = Clutter.ActorAlign.CENTER;
|
||||||
|
this._notificationPreview.connect('updated', Lang.bind(this, this._sync));
|
||||||
|
|
||||||
|
let dateMenu = new imports.ui.dateMenu.DateMenuButton();
|
||||||
|
this._clock = dateMenu.container;
|
||||||
|
this._clock.x_expand = true;
|
||||||
|
this._clock.x_align = Clutter.ActorAlign.CENTER;
|
||||||
|
this.container.add_child(this._clock);
|
||||||
|
|
||||||
|
this._currentlyShowing = 'clock';
|
||||||
|
this._sync();
|
||||||
|
},
|
||||||
|
|
||||||
|
_show: function(which, animate) {
|
||||||
|
if (this._currentlyShowing == which)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._currentlyShowing = which;
|
||||||
|
if (this._currentlyShowing == 'clock') {
|
||||||
|
this._notificationPreview.actor.visible = false;
|
||||||
|
this._clock.visible = true;
|
||||||
|
} else if (this._currentlyShowing == 'notification') {
|
||||||
|
this._notificationPreview.actor.visible = true;
|
||||||
|
this._clock.visible = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_sync: function() {
|
||||||
|
if (this._currentlyShowing == 'clock' && this._notificationPreview.hasNotification)
|
||||||
|
this._show('notification', true);
|
||||||
|
else if (this._currentlyShowing == 'notification' && !this._notificationPreview.hasNotification)
|
||||||
|
this._show('clock', false);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(DateMenuButton2.prototype);
|
||||||
|
|
||||||
const PANEL_ITEM_IMPLEMENTATIONS = {
|
const PANEL_ITEM_IMPLEMENTATIONS = {
|
||||||
'activities': ActivitiesButton,
|
'activities': ActivitiesButton,
|
||||||
'aggregateMenu': AggregateMenu,
|
'aggregateMenu': AggregateMenu,
|
||||||
'appMenu': AppMenuButton,
|
'appMenu': AppMenuButton,
|
||||||
'dateMenu': imports.ui.dateMenu.DateMenuButton,
|
'dateMenu': DateMenuButton2,
|
||||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||||
'a11yGreeter': imports.ui.status.accessibility.ATGreeterIndicator,
|
'a11yGreeter': imports.ui.status.accessibility.ATGreeterIndicator,
|
||||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user