mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
80 lines
1.7 KiB
Dart
80 lines
1.7 KiB
Dart
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:spotube/provider/tray_manager/tray_menu.dart';
|
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
|
import 'package:spotube/utils/platform.dart';
|
|
import 'package:tray_manager/tray_manager.dart';
|
|
import 'package:window_manager/window_manager.dart';
|
|
|
|
class SystemTrayManager with TrayListener {
|
|
final Ref ref;
|
|
final bool enabled;
|
|
|
|
SystemTrayManager(
|
|
this.ref, {
|
|
required this.enabled,
|
|
}) {
|
|
initialize();
|
|
}
|
|
|
|
Future<void> initialize() async {
|
|
if (!kIsDesktop) return;
|
|
|
|
if (enabled) {
|
|
await trayManager.setIcon(
|
|
kIsWindows
|
|
? 'assets/spotube-logo.ico'
|
|
: kIsFlatpak
|
|
? 'com.github.KRTirtho.Spotube'
|
|
: 'assets/spotube-logo.png',
|
|
);
|
|
trayManager.addListener(this);
|
|
} else {
|
|
await trayManager.destroy();
|
|
}
|
|
}
|
|
|
|
void dispose() {
|
|
trayManager.removeListener(this);
|
|
}
|
|
|
|
@override
|
|
onTrayIconMouseDown() {
|
|
if (kIsWindows) {
|
|
windowManager.show();
|
|
} else {
|
|
trayManager.popUpContextMenu();
|
|
}
|
|
}
|
|
|
|
@override
|
|
onTrayIconRightMouseDown() {
|
|
if (!kIsWindows) {
|
|
windowManager.show();
|
|
} else {
|
|
trayManager.popUpContextMenu();
|
|
}
|
|
}
|
|
}
|
|
|
|
final trayManagerProvider = Provider(
|
|
(ref) {
|
|
final enabled = ref.watch(
|
|
userPreferencesProvider.select((s) => s.showSystemTrayIcon),
|
|
);
|
|
|
|
ref.listen(trayMenuProvider, (_, menu) {
|
|
if (!enabled || !kIsDesktop) return;
|
|
trayManager.setContextMenu(menu);
|
|
});
|
|
|
|
final manager = SystemTrayManager(
|
|
ref,
|
|
enabled: enabled,
|
|
);
|
|
|
|
ref.onDispose(manager.dispose);
|
|
|
|
return manager;
|
|
},
|
|
);
|