diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css index 33c95cc6a..cd216ad11 100644 --- a/data/theme/gnome-shell-high-contrast.css +++ b/data/theme/gnome-shell-high-contrast.css @@ -861,6 +861,12 @@ StScrollBar { .message-list { width: 31.5em; } +.message-list-clear-button.button { + background-color: transparent; + margin: 1.5em 1.5em 0; } + .message-list-clear-button.button:hover, .message-list-clear-button.button:focus { + background-color: #0d0d0d; } + .message-list-sections { spacing: 1.5em; } diff --git a/data/theme/gnome-shell-sass b/data/theme/gnome-shell-sass index 2af71071a..e7d72f3d2 160000 --- a/data/theme/gnome-shell-sass +++ b/data/theme/gnome-shell-sass @@ -1 +1 @@ -Subproject commit 2af71071ae2f4e4e89851dee93befd5007d4d693 +Subproject commit e7d72f3d2dbc4ed6382a619b9c6abc1590a8144e diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css index 88ec11bc6..7c703022c 100644 --- a/data/theme/gnome-shell.css +++ b/data/theme/gnome-shell.css @@ -861,6 +861,12 @@ StScrollBar { .message-list { width: 31.5em; } +.message-list-clear-button.button { + background-color: transparent; + margin: 1.5em 1.5em 0; } + .message-list-clear-button.button:hover, .message-list-clear-button.button:focus { + background-color: #454c4c; } + .message-list-sections { spacing: 1.5em; } diff --git a/js/ui/calendar.js b/js/ui/calendar.js index 70252e2ec..8669efe5b 100644 --- a/js/ui/calendar.js +++ b/js/ui/calendar.js @@ -1098,12 +1098,26 @@ const CalendarMessageList = new Lang.Class({ this._placeholder = new Placeholder(); this.actor.add_actor(this._placeholder.actor); + let box = new St.BoxLayout({ vertical: true, + x_expand: true, y_expand: true }); + this.actor.add_actor(box); + this._scrollView = new St.ScrollView({ style_class: 'vfade', overlay_scrollbars: true, x_expand: true, y_expand: true, x_fill: true, y_fill: true }); this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); - this.actor.add_actor(this._scrollView); + box.add_actor(this._scrollView); + + this._clearButton = new St.Button({ style_class: 'message-list-clear-button button', + label: _("Clear All"), + can_focus: true }); + this._clearButton.set_x_align(Clutter.ActorAlign.END); + this._clearButton.connect('clicked', () => { + let sections = [...this._sections.keys()]; + sections.forEach((s) => { s.clear(); }); + }); + box.add_actor(this._clearButton); this._sectionList = new St.BoxLayout({ style_class: 'message-list-sections', vertical: true, @@ -1129,6 +1143,7 @@ const CalendarMessageList = new Lang.Class({ destroyId: 0, visibleId: 0, emptyChangedId: 0, + canClearChangedId: 0, keyFocusId: 0 }; obj.destroyId = section.actor.connect('destroy', Lang.bind(this, @@ -1139,6 +1154,8 @@ const CalendarMessageList = new Lang.Class({ Lang.bind(this, this._sync)); obj.emptyChangedId = section.connect('empty-changed', Lang.bind(this, this._sync)); + obj.canClearChangedId = section.connect('can-clear-changed', + Lang.bind(this, this._sync)); obj.keyFocusId = section.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn)); @@ -1152,6 +1169,7 @@ const CalendarMessageList = new Lang.Class({ section.actor.disconnect(obj.destroyId); section.actor.disconnect(obj.visibleId); section.disconnect(obj.emptyChangedId); + section.disconnect(obj.canClearChangedId); section.disconnect(obj.keyFocusId); this._sections.delete(section); @@ -1172,10 +1190,16 @@ const CalendarMessageList = new Lang.Class({ if (!visible) return; - let showPlaceholder = sections.every(function(s) { + let empty = sections.every(function(s) { return s.empty || !s.actor.visible; }); - this._placeholder.actor.visible = showPlaceholder; + this._placeholder.actor.visible = empty; + this._clearButton.visible = !empty; + + let canClear = sections.some(function(s) { + return s.canClear && s.actor.visible; + }); + this._clearButton.reactive = canClear; }, setEventSource: function(eventSource) {