feat: 实现托盘菜单 (#1538)

* 从 v1 添加托盘相关图标

* feat: ipcRenderer事件

* feat: 托盘菜单实现

* 修复合并后的错误

* fix: 托盘图标的like

* 将 tray 相关的 ipc 放入ipcMain.ts

* update

* update

* feat: 设置托盘Tooltip

* fix

* fix: tray play/pause fade

* fix: 暂时将tray like与tooltip的设置移入Player组件中

useUserLikedTracksIDs 会在重新聚焦而不是切换track时触发,导致托盘无法实时更新数据

基于以上一点,在Player组件中有了一个用于设置tray数据的useEffect,故将tray tooltip的设置也放入其中,使tray的数据尽可能简单的和player数据保持一致

* 将部分ipcRenderer调用挪到单独的IpcRendererReact组件

* 移除SetTrayPlayState,复用已有channel

* update
This commit is contained in:
memorydream 2022-04-20 20:25:20 +08:00 committed by GitHub
parent b1fd51233a
commit ffdf66b57e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 392 additions and 19 deletions

View file

@ -11,6 +11,8 @@ import axios from 'axios'
import { resizeImage } from './common'
import { fetchPlaylistWithReactQuery } from '@/renderer/hooks/usePlaylist'
import { fetchAlbumWithReactQuery } from '@/renderer/hooks/useAlbum'
import { IpcChannels } from '@/shared/IpcChannels'
import { RepeatMode } from '@/shared/playerDataTypes'
type TrackID = number
export enum TrackListSourceType {
@ -32,11 +34,6 @@ export enum State {
Paused = 'paused',
Loading = 'loading',
}
export enum RepeatMode {
Off = 'off',
On = 'on',
One = 'one',
}
const PLAY_PAUSE_FADE_DURATION = 200
@ -47,6 +44,7 @@ export class Player {
private _progress: number = 0
private _progressInterval: ReturnType<typeof setInterval> | undefined
private _volume: number = 1 // 0 to 1
private _repeatMode: RepeatMode = RepeatMode.Off
state: State = State.Initializing
mode: Mode = Mode.TrackList
@ -54,25 +52,26 @@ export class Player {
trackListSource: TrackListSource | null = null
fmTrackList: TrackID[] = []
shuffle: boolean = false
repeatMode: RepeatMode = RepeatMode.Off
fmTrack: Track | null = null
init(params: { [key: string]: any }) {
if (params._track) this._track = params._track
if (params._trackIndex) this._trackIndex = params._trackIndex
if (params._volume) this._volume = params._volume
if (params._repeatMode) this._repeatMode = params._repeatMode
if (params.state) this.trackList = params.state
if (params.mode) this.mode = params.mode
if (params.trackList) this.trackList = params.trackList
if (params.trackListSource) this.trackListSource = params.trackListSource
if (params.fmTrackList) this.fmTrackList = params.fmTrackList
if (params.shuffle) this.shuffle = params.shuffle
if (params.repeatMode) this.repeatMode = params.repeatMode
if (params.fmTrack) this.fmTrack = params.fmTrack
this.state = State.Ready
this._playAudio(false) // just load the audio, not play
this._initFM()
window.ipcRenderer?.send(IpcChannels.Repeat, { mode: this._repeatMode })
}
get howler() {
@ -151,6 +150,14 @@ export class Player {
Howler.volume(this._volume)
}
get repeatMode(): RepeatMode {
return this._repeatMode
}
set repeatMode(value) {
this._repeatMode = value
window.ipcRenderer?.send(IpcChannels.Repeat, { mode: this._repeatMode })
}
private async _initFM() {
if (this.fmTrackList.length === 0) await this._loadMoreFMTracks()