From 0c6f896d4b69db1c121a68bfd3b88a56a1c86a25 Mon Sep 17 00:00:00 2001 From: Julian Sparber Date: Thu, 9 May 2024 17:16:44 +0200 Subject: [PATCH] mpris: Move widgets to messageList.js Widgets for other type of messages (notifications) are already in `messageList.js` therefore move widgets for mpris also there. Part-of: --- js/ui/calendar.js | 3 +- js/ui/messageList.js | 103 ++++++++++++++++++++++++++++++++++++++++++ js/ui/mpris.js | 104 ------------------------------------------- 3 files changed, 104 insertions(+), 106 deletions(-) diff --git a/js/ui/calendar.js b/js/ui/calendar.js index 57847278e..9451d0afc 100644 --- a/js/ui/calendar.js +++ b/js/ui/calendar.js @@ -7,7 +7,6 @@ import St from 'gi://St'; import * as Main from './main.js'; import * as MessageList from './messageList.js'; -import * as Mpris from './mpris.js'; import * as PopupMenu from './popupMenu.js'; import {ensureActorVisibleInScrollView} from '../misc/animationUtils.js'; @@ -877,7 +876,7 @@ class CalendarMessageList extends St.Widget { this); this._scrollView.child = this._sectionList; - this._mediaSection = new Mpris.MediaSection(); + this._mediaSection = new MessageList.MediaSection(); this._addSection(this._mediaSection); this._notificationSection = new MessageList.NotificationSection(); diff --git a/js/ui/messageList.js b/js/ui/messageList.js index 1417370b1..b9456f3f9 100644 --- a/js/ui/messageList.js +++ b/js/ui/messageList.js @@ -10,6 +10,7 @@ import St from 'gi://St'; import * as Main from './main.js'; import * as MessageTray from './messageTray.js'; +import * as Mpris from './mpris.js'; import * as Util from '../misc/util.js'; import {formatTimeSpan} from '../misc/dateUtils.js'; @@ -741,6 +742,68 @@ class NotificationMessage extends Message { } }); +const MediaMessage = GObject.registerClass( +class MediaMessage extends Message { + constructor(player) { + super(player.source); + + this._player = player; + this.add_style_class_name('media-message'); + + this._prevButton = this.addMediaControl('media-skip-backward-symbolic', + () => { + this._player.previous(); + }); + + this._playPauseButton = this.addMediaControl('', + () => { + this._player.playPause(); + }); + + this._nextButton = this.addMediaControl('media-skip-forward-symbolic', + () => { + this._player.next(); + }); + + this._player.connectObject('changed', this._update.bind(this), this); + this._update(); + } + + vfunc_clicked() { + this._player.raise(); + Main.panel.closeCalendar(); + } + + _updateNavButton(button, sensitive) { + button.reactive = sensitive; + } + + _update() { + let icon; + if (this._player.trackCoverUrl) { + const file = Gio.File.new_for_uri(this._player.trackCoverUrl); + icon = new Gio.FileIcon({file}); + } else { + icon = new Gio.ThemedIcon({name: 'audio-x-generic-symbolic'}); + } + + this.set({ + title: this._player.trackTitle, + body: this._player.trackArtists.join(', '), + icon, + }); + + let isPlaying = this._player.status === 'Playing'; + let iconName = isPlaying + ? 'media-playback-pause-symbolic' + : 'media-playback-start-symbolic'; + this._playPauseButton.child.icon_name = iconName; + + this._updateNavButton(this._prevButton, this._player.canGoPrevious); + this._updateNavButton(this._nextButton, this._player.canGoNext); + } +}); + export const MessageListSection = GObject.registerClass({ Properties: { 'can-clear': GObject.ParamSpec.boolean( @@ -1013,3 +1076,43 @@ class NotificationSection extends MessageListSection { super.vfunc_map(); } }); + +export const MediaSection = GObject.registerClass( +class MediaSection extends MessageListSection { + constructor() { + super(); + this._players = new Map(); + this._mediaSource = new Mpris.MprisSource(); + + this._mediaSource.connectObject( + 'player-added', (_, player) => this._addPlayer(player), + 'player-removed', (_, player) => this._removePlayer(player), + this); + + this._mediaSource.players.forEach(player => { + this._addPlayer(player); + }); + } + + _addPlayer(player) { + if (this._players.has(player)) + throw new Error('Player was already added previously'); + + const message = new MediaMessage(player); + this._players.set(player, message); + this.addMessage(message, true); + } + + _removePlayer(player) { + const message = this._players.get(player); + + if (message) + this.removeMessage(message, true); + + this._players.delete(player); + } + + get allowed() { + return !Main.sessionMode.isGreeter; + } +}); diff --git a/js/ui/mpris.js b/js/ui/mpris.js index 31f3acc92..b1281504b 100644 --- a/js/ui/mpris.js +++ b/js/ui/mpris.js @@ -2,7 +2,6 @@ import Gio from 'gi://Gio'; import GObject from 'gi://GObject'; import Shell from 'gi://Shell'; -import * as Main from './main.js'; import * as MessageList from './messageList.js'; import {loadInterfaceXML} from '../misc/fileUtils.js'; @@ -18,69 +17,6 @@ const MprisPlayerProxy = Gio.DBusProxy.makeProxyWrapper(MprisPlayerIface); const MPRIS_PLAYER_PREFIX = 'org.mpris.MediaPlayer2.'; -const MediaMessage = GObject.registerClass( -class MediaMessage extends MessageList.Message { - constructor(player) { - super(player.source); - - this._player = player; - this.add_style_class_name('media-message'); - - this._prevButton = this.addMediaControl('media-skip-backward-symbolic', - () => { - this._player.previous(); - }); - - this._playPauseButton = this.addMediaControl('', - () => { - this._player.playPause(); - }); - - this._nextButton = this.addMediaControl('media-skip-forward-symbolic', - () => { - this._player.next(); - }); - - this._player.connectObject('changed', this._update.bind(this), this); - this._update(); - } - - vfunc_clicked() { - this._player.raise(); - Main.panel.closeCalendar(); - } - - _updateNavButton(button, sensitive) { - button.reactive = sensitive; - } - - _update() { - let icon; - if (this._player.trackCoverUrl) { - const file = Gio.File.new_for_uri(this._player.trackCoverUrl); - icon = new Gio.FileIcon({file}); - } else { - icon = new Gio.ThemedIcon({name: 'audio-x-generic-symbolic'}); - } - - this.set({ - title: this._player.trackTitle, - body: this._player.trackArtists.join(', '), - icon, - }); - - let isPlaying = this._player.status === 'Playing'; - let iconName = isPlaying - ? 'media-playback-pause-symbolic' - : 'media-playback-start-symbolic'; - this._playPauseButton.child.icon_name = iconName; - - this._updateNavButton(this._prevButton, this._player.canGoPrevious); - this._updateNavButton(this._nextButton, this._player.canGoNext); - } -}); - - export const MprisPlayer = GObject.registerClass({ Properties: { 'can-play': GObject.ParamSpec.boolean( @@ -316,43 +252,3 @@ export const MprisSource = GObject.registerClass({ this._addPlayer(name); } }); - -export const MediaSection = GObject.registerClass( -class MediaSection extends MessageList.MessageListSection { - constructor() { - super(); - this._players = new Map(); - this._mediaSource = new MprisSource(); - - this._mediaSource.connectObject( - 'player-added', (_, player) => this._addPlayer(player), - 'player-removed', (_, player) => this._removePlayer(player), - this); - - this._mediaSource.players.forEach(player => { - this._addPlayer(player); - }); - } - - _addPlayer(player) { - if (this._players.has(player)) - throw new Error('Player was already added previously'); - - const message = new MediaMessage(player); - this._players.set(player, message); - this.addMessage(message, true); - } - - _removePlayer(player) { - const message = this._players.get(player); - - if (message) - this.removeMessage(message, true); - - this._players.delete(player); - } - - get allowed() { - return !Main.sessionMode.isGreeter; - } -});