summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2018-06-09 13:23:35 +0200
committerFlorian Müllner <fmuellner@gnome.org>2018-06-09 15:36:02 +0200
commita1dc4fc0957d6b34f8c8fe6dde7e82f345d10a5d (patch)
treee9eb35f562b19144a774ba1237b50bab59e41c8e
parent68b01a8f567ebfbd16b46e941f75d9e0a84a931d (diff)
downloadgnome-shell-wip/fmuellner/fix-clear-events.tar.gz
events: Re-use event messages where possiblewip/fmuellner/fix-clear-events
Destroying and recreating the entire events list on every change is not only wasteful, it also breaks the clear functionality as messages scheduled for removal are replaced with "new" messages after the first message has been removed. Address both issues by keeping track of all messages and re-use them whenever possible. https://gitlab.gnome.org/GNOME/gnome-shell/issues/325
-rw-r--r--js/ui/calendar.js28
1 files changed, 21 insertions, 7 deletions
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
index a46017ad0..651aac610 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -821,6 +821,8 @@ var EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource();
+ this._messageById = new Map();
+
this.parent();
this._title = new St.Button({ style_class: 'events-section-title',
@@ -875,20 +877,32 @@ var EventsSection = new Lang.Class({
this._reloading = true;
- this._list.destroy_all_children();
-
let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date);
let events = this._eventSource.getEvents(periodBegin, periodEnd);
+ let ids = events.map(e => e.id);
+ this._messageById.forEach((message, id) => {
+ if (ids.includes(id))
+ return;
+ this._messageById.delete(id);
+ this.removeMessage(message);
+ });
+
for (let i = 0; i < events.length; i++) {
let event = events[i];
- let message = new EventMessage(event, this._date);
- message.connect('close', () => {
- this._ignoreEvent(event);
- });
- this.addMessage(message, false);
+ let message = this._messageById.get(event.id);
+ if (!message) {
+ message = new EventMessage(event, this._date);
+ message.connect('close', () => {
+ this._ignoreEvent(event);
+ });
+ this._messageById.set(event.id, message);
+ this.addMessage(message, false);
+ } else {
+ this.moveMessage(message, i, false);
+ }
}
this._reloading = false;