rotate the floating window icon based on net speed
Some checks are pending
Build / windows (arm64) (push) Waiting to run
Build / windows (ia32) (push) Waiting to run
Build / windows (x64) (push) Waiting to run
Build / windows7 (ia32) (push) Waiting to run
Build / windows7 (x64) (push) Waiting to run
Build / linux (arm64) (push) Waiting to run
Build / linux (x64) (push) Waiting to run
Build / macos (arm64) (push) Waiting to run
Build / macos (x64) (push) Waiting to run
Build / updater (push) Blocked by required conditions
Build / aur-release-updater (mihomo-party) (push) Blocked by required conditions
Build / aur-release-updater (mihomo-party-bin) (push) Blocked by required conditions
Build / aur-release-updater (mihomo-party-electron) (push) Blocked by required conditions
Build / aur-release-updater (mihomo-party-electron-bin) (push) Blocked by required conditions
Build / aur-git-updater (push) Waiting to run
Build / Update WinGet Package (push) Blocked by required conditions
Build / Update Homebrew cask (push) Blocked by required conditions

This commit is contained in:
pompurin404 2024-10-07 23:58:12 +08:00
parent ba92a26a1e
commit 548ac52484
No known key found for this signature in database
3 changed files with 30 additions and 2 deletions

View File

@ -1,4 +1,4 @@
import { useEffect, useState } from 'react' import { useEffect, useMemo, useState } from 'react'
import MihomoIcon from './components/base/mihomo-icon' import MihomoIcon from './components/base/mihomo-icon'
import { calcTraffic } from './utils/calc' import { calcTraffic } from './utils/calc'
import { showContextMenu, triggerMainWindow } from './utils/ipc' import { showContextMenu, triggerMainWindow } from './utils/ipc'
@ -8,13 +8,27 @@ import { useControledMihomoConfig } from './hooks/use-controled-mihomo-config'
const FloatingApp: React.FC = () => { const FloatingApp: React.FC = () => {
const { appConfig } = useAppConfig() const { appConfig } = useAppConfig()
const { controledMihomoConfig } = useControledMihomoConfig() const { controledMihomoConfig } = useControledMihomoConfig()
const { sysProxy } = appConfig || {} const { sysProxy, spinFloatingIcon = true } = appConfig || {}
const { tun } = controledMihomoConfig || {} const { tun } = controledMihomoConfig || {}
const sysProxyEnabled = sysProxy?.enable const sysProxyEnabled = sysProxy?.enable
const tunEnabled = tun?.enable const tunEnabled = tun?.enable
const [upload, setUpload] = useState(0) const [upload, setUpload] = useState(0)
const [download, setDownload] = useState(0) const [download, setDownload] = useState(0)
const slowest = 10
const fastest = 0.1
const spinDuration = useMemo(() => {
let duration = upload + download === 0 ? slowest : 409600 / (upload + download)
if (duration > slowest) {
duration = slowest
}
if (duration < fastest) {
duration = fastest
}
return duration
}, [upload, download])
useEffect(() => { useEffect(() => {
window.electron.ipcRenderer.on('mihomoTraffic', async (_e, info: IMihomoTrafficInfo) => { window.electron.ipcRenderer.on('mihomoTraffic', async (_e, info: IMihomoTrafficInfo) => {
setUpload(info.up) setUpload(info.up)
@ -24,6 +38,7 @@ const FloatingApp: React.FC = () => {
window.electron.ipcRenderer.removeAllListeners('mihomoTraffic') window.electron.ipcRenderer.removeAllListeners('mihomoTraffic')
} }
}, []) }, [])
return ( return (
<div className="app-drag h-[100vh] w-[100vw] overflow-hidden"> <div className="app-drag h-[100vh] w-[100vw] overflow-hidden">
<div className="floating-bg border-1 border-divider flex rounded-full bg-content1 h-[calc(100%-2px)] w-[calc(100%-2px)]"> <div className="floating-bg border-1 border-divider flex rounded-full bg-content1 h-[calc(100%-2px)] w-[calc(100%-2px)]">
@ -36,6 +51,7 @@ const FloatingApp: React.FC = () => {
onClick={() => { onClick={() => {
triggerMainWindow() triggerMainWindow()
}} }}
style={spinFloatingIcon ? { animation: `spin ${spinDuration}s linear infinite` } : {}}
className={`app-nodrag cursor-pointer floating-thumb ${tunEnabled ? 'bg-secondary' : sysProxyEnabled ? 'bg-primary' : 'bg-default'} hover:opacity-hover rounded-full h-[calc(100%-4px)] aspect-square`} className={`app-nodrag cursor-pointer floating-thumb ${tunEnabled ? 'bg-secondary' : sysProxyEnabled ? 'bg-primary' : 'bg-default'} hover:opacity-hover rounded-full h-[calc(100%-4px)] aspect-square`}
> >
<MihomoIcon className="floating-icon text-primary-foreground h-full leading-full text-[22px] mx-auto" /> <MihomoIcon className="floating-icon text-primary-foreground h-full leading-full text-[22px] mx-auto" />

View File

@ -43,6 +43,7 @@ const GeneralConfig: React.FC = () => {
proxyInTray = true, proxyInTray = true,
disableTray = false, disableTray = false,
showFloatingWindow: showFloating = false, showFloatingWindow: showFloating = false,
spinFloatingIcon = true,
useWindowFrame = false, useWindowFrame = false,
autoQuitWithoutCore = false, autoQuitWithoutCore = false,
autoQuitWithoutCoreDelay = 60, autoQuitWithoutCoreDelay = 60,
@ -195,6 +196,16 @@ const GeneralConfig: React.FC = () => {
}} }}
/> />
</SettingItem> </SettingItem>
<SettingItem title="根据网速旋转悬浮窗图标" divider>
<Switch
size="sm"
isSelected={spinFloatingIcon}
onValueChange={async (v) => {
await patchAppConfig({ spinFloatingIcon: v })
window.electron.ipcRenderer.send('updateFloatingWindow')
}}
/>
</SettingItem>
{showFloating && ( {showFloating && (
<SettingItem title="禁用托盘图标" divider> <SettingItem title="禁用托盘图标" divider>
<Switch <Switch

View File

@ -212,6 +212,7 @@ interface IAppConfig {
proxyCols: 'auto' | '1' | '2' | '3' | '4' proxyCols: 'auto' | '1' | '2' | '3' | '4'
connectionDirection: 'asc' | 'desc' connectionDirection: 'asc' | 'desc'
connectionOrderBy: 'time' | 'upload' | 'download' | 'uploadSpeed' | 'downloadSpeed' connectionOrderBy: 'time' | 'upload' | 'download' | 'uploadSpeed' | 'downloadSpeed'
spinFloatingIcon?: boolean
disableTray?: boolean disableTray?: boolean
showFloatingWindow?: boolean showFloatingWindow?: boolean
connectionCardStatus?: CardStatus connectionCardStatus?: CardStatus