diff options
author | Florian Müllner <fmuellner@gnome.org> | 2018-06-09 13:23:35 +0200 |
---|---|---|
committer | Florian Müllner <fmuellner@gnome.org> | 2018-06-09 15:36:02 +0200 |
commit | a1dc4fc0957d6b34f8c8fe6dde7e82f345d10a5d (patch) | |
tree | e9eb35f562b19144a774ba1237b50bab59e41c8e | |
parent | 68b01a8f567ebfbd16b46e941f75d9e0a84a931d (diff) | |
download | gnome-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.js | 28 |
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; |