mirror of
https://github.com/Dr-Blank/Vaani.git
synced 2026-02-16 22:39:34 +00:00
一堆乱七八糟的修改
播放页面增加桌面版
This commit is contained in:
parent
aee1fbde88
commit
3ba35b31b8
116 changed files with 1238 additions and 2592 deletions
|
|
@ -79,3 +79,8 @@ extension ContentUrl on LibraryFile {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
extension PlaybackSessionConversion on PlaybackSession {
|
||||
PlaybackSessionExpanded get asExpanded =>
|
||||
PlaybackSessionExpanded.fromJson(toJson());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:shelfsdk/audiobookshelf_api.dart' as shelfsdk;
|
||||
import 'package:vaani/settings/models/api_settings.dart';
|
||||
import 'package:vaani/settings/models/audiobookshelf_server.dart';
|
||||
import 'package:vaani/settings/models/authenticated_user.dart';
|
||||
import 'package:vaani/features/settings/models/api_settings.dart';
|
||||
import 'package:vaani/features/settings/models/audiobookshelf_server.dart';
|
||||
import 'package:vaani/features/settings/models/authenticated_user.dart';
|
||||
|
||||
// bool kReleaseMode = true;
|
||||
|
||||
|
|
|
|||
26
lib/shared/utils/error_response.dart
Normal file
26
lib/shared/utils/error_response.dart
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
import 'package:http/http.dart' as http;
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:vaani/shared/extensions/obfuscation.dart';
|
||||
|
||||
final _logger = Logger('ErrorResponse');
|
||||
|
||||
class ErrorResponseHandler {
|
||||
String? name;
|
||||
http.Response _response;
|
||||
bool logRawResponse;
|
||||
|
||||
ErrorResponseHandler({
|
||||
this.name,
|
||||
http.Response? response,
|
||||
this.logRawResponse = false,
|
||||
}) : _response = response ?? http.Response('', 418);
|
||||
|
||||
void storeError(http.Response response, [Object? error]) {
|
||||
if (logRawResponse) {
|
||||
_logger.fine('for $name got response: ${response.obfuscate()}');
|
||||
}
|
||||
_response = response;
|
||||
}
|
||||
|
||||
http.Response get response => _response;
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ import 'dart:io';
|
|||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
class Utils {
|
||||
class Helper {
|
||||
static isAndroid() {
|
||||
return !kIsWeb && Platform.isAndroid;
|
||||
}
|
||||
|
|
@ -12,10 +12,10 @@ import 'package:vaani/api/library_item_provider.dart' show libraryItemProvider;
|
|||
import 'package:vaani/constants/hero_tag_conventions.dart';
|
||||
import 'package:vaani/features/item_viewer/view/library_item_actions.dart';
|
||||
import 'package:vaani/features/player/providers/player_status_provider.dart';
|
||||
import 'package:vaani/features/player/providers/session_provider.dart';
|
||||
import 'package:vaani/features/player/providers/audiobook_player.dart';
|
||||
import 'package:vaani/router/models/library_item_extras.dart';
|
||||
import 'package:vaani/router/router.dart';
|
||||
import 'package:vaani/settings/app_settings_provider.dart';
|
||||
import 'package:vaani/features/settings/app_settings_provider.dart';
|
||||
import 'package:vaani/shared/extensions/model_conversions.dart';
|
||||
import 'package:vaani/shared/widgets/shelves/home_shelf.dart';
|
||||
import 'package:vaani/theme/providers/theme_from_cover_provider.dart';
|
||||
|
|
|
|||
125
lib/shared/widgets/tray_manager.dart
Normal file
125
lib/shared/widgets/tray_manager.dart
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:tray_manager/tray_manager.dart';
|
||||
import 'package:vaani/features/player/providers/audiobook_player.dart';
|
||||
import 'package:vaani/globals.dart';
|
||||
import 'package:vaani/shared/utils/helper.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
|
||||
class TrayManager extends ConsumerStatefulWidget {
|
||||
final Widget child;
|
||||
const TrayManager(this.child, {super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<TrayManager> createState() => _TrayManagerState();
|
||||
}
|
||||
|
||||
class _TrayManagerState extends ConsumerState<TrayManager>
|
||||
with TrayListener, WindowListener {
|
||||
@override
|
||||
void initState() {
|
||||
windowManager.addListener(this);
|
||||
_init();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
trayManager.removeListener(this);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _init() async {
|
||||
await trayManager.setIcon(
|
||||
Helper.isWindows() ? 'assets/icon/logo.ico' : 'assets/icon/logo.png',
|
||||
);
|
||||
await trayManager.setToolTip(appName);
|
||||
Menu menu = Menu(
|
||||
items: [
|
||||
MenuItem(
|
||||
key: 'show_window',
|
||||
// label: 'Show Window',
|
||||
label: '显示主窗口',
|
||||
onClick: (menuItem) => windowManager.show(),
|
||||
),
|
||||
MenuItem.separator(),
|
||||
MenuItem(
|
||||
key: 'play_pause',
|
||||
label: '播放/暂停',
|
||||
onClick: (menuItem) => ref.read(playerProvider).togglePlayPause(),
|
||||
),
|
||||
MenuItem(
|
||||
key: 'previous',
|
||||
label: '上一个',
|
||||
onClick: (menuItem) => ref.read(playerProvider).skipToPrevious(),
|
||||
),
|
||||
MenuItem(
|
||||
key: 'next',
|
||||
label: '下一个',
|
||||
onClick: (menuItem) => ref.read(playerProvider).skipToNext(),
|
||||
),
|
||||
MenuItem.separator(),
|
||||
MenuItem(
|
||||
key: 'exit_app',
|
||||
// label: 'Exit App',
|
||||
label: '退出',
|
||||
onClick: (menuItem) => windowManager.destroy(),
|
||||
),
|
||||
],
|
||||
);
|
||||
await trayManager.setContextMenu(menu);
|
||||
trayManager.addListener(this);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return widget.child;
|
||||
}
|
||||
|
||||
@override
|
||||
void onTrayIconMouseDown() {
|
||||
// do something, for example pop up the menu
|
||||
// print('onTrayIconMouseDown');
|
||||
windowManager.show();
|
||||
}
|
||||
|
||||
@override
|
||||
void onTrayIconMouseUp() {
|
||||
// do something, for example pop up the menu
|
||||
// print('onTrayIconMouseUp');
|
||||
}
|
||||
|
||||
@override
|
||||
void onTrayIconRightMouseDown() {
|
||||
// do something
|
||||
// print('onTrayIconRightMouseDown');
|
||||
trayManager.popUpContextMenu(bringAppToFront: true);
|
||||
}
|
||||
|
||||
@override
|
||||
void onTrayIconRightMouseUp() {
|
||||
// do something
|
||||
// print('onTrayIconRightMouseUp');
|
||||
}
|
||||
|
||||
// @override
|
||||
// void onTrayMenuItemClick(MenuItem menuItem) {
|
||||
// print(menuItem.key);
|
||||
// if (menuItem.key == 'show_window') {
|
||||
// // do something
|
||||
// } else if (menuItem.key == 'exit_app') {
|
||||
// // do something
|
||||
|
||||
// } else if (menuItem.key == 'play_pause'){
|
||||
|
||||
// }
|
||||
// }
|
||||
|
||||
@override
|
||||
void onWindowClose() async {
|
||||
final isPreventClose = await windowManager.isPreventClose();
|
||||
if (isPreventClose) {
|
||||
windowManager.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue