Skip to content

Commit 9914002

Browse files
committed
fix: small player fixes
1 parent 8d47d9b commit 9914002

File tree

7 files changed

+97
-189
lines changed

7 files changed

+97
-189
lines changed

lib/Screens/Info/Tabs/Watch/Anime/AnimeWatchScreen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class AnimeWatchScreenState extends BaseWatchScreen<AnimeWatchScreen> {
8686
Container(
8787
margin: const EdgeInsets.symmetric(horizontal: 18, vertical: 4),
8888
child: Obx(() {
89-
List<List<Episode>> reversed = _viewModel.reversed.value
89+
var reversed = _viewModel.reversed.value
9090
? chunks.map((element) => element.reversed.toList())
9191
.toList()
9292
: chunks;

lib/Screens/Info/Tabs/Watch/Anime/Player/Platform/AndroidPlayer.dart

Lines changed: 0 additions & 102 deletions
This file was deleted.

lib/Screens/Info/Tabs/Watch/Anime/Player/Player.dart

Lines changed: 61 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'dart:math';
55
import 'package:dantotsu/Preferences/HiveDataClasses/DefaultPlayerSettings/DefaultPlayerSettings.dart';
66
import 'package:dantotsu/Preferences/PrefManager.dart';
77
import 'package:dantotsu/Preferences/Preferences.dart';
8+
import 'package:flutter/foundation.dart';
89
import 'package:flutter/material.dart';
910
import 'package:flutter/services.dart';
1011
import 'package:get/get.dart';
@@ -93,16 +94,14 @@ class MediaPlayerState extends State<MediaPlayer>
9394

9495
final _isCursorVisible = true.obs;
9596
Timer? _hideCursorTimer;
96-
97-
void _onMouseMoved(PointerEvent event) {
97+
void _onMouseMoved() {
9898
if (!_isCursorVisible.value) {
9999
_isCursorVisible.value = true;
100100
showControls.value = true;
101101
}
102102
_hideCursorTimer?.cancel();
103103
_hideCursorTimer = Timer(const Duration(seconds: 3), () {
104104
_isCursorVisible.value = false;
105-
106105
showControls.value = false;
107106
});
108107
}
@@ -146,7 +145,7 @@ class MediaPlayerState extends State<MediaPlayer>
146145
if (state) {
147146
SystemChrome.setPreferredOrientations(
148147
[DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
149-
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
148+
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
150149
} else {
151150
SystemChrome.setPreferredOrientations([
152151
DeviceOrientation.portraitUp,
@@ -161,53 +160,59 @@ class MediaPlayerState extends State<MediaPlayer>
161160
@override
162161
Widget build(BuildContext context) {
163162
return Obx(
164-
() {
165-
return MouseRegion(
166-
onHover: _onMouseMoved,
167-
cursor: _isCursorVisible.value
168-
? SystemMouseCursors.basic
169-
: SystemMouseCursors.none,
170-
child: Scaffold(
171-
body: LayoutBuilder(
172-
builder: (context, constraints) {
173-
const double minWidth = 250;
174-
final double availableWidth = constraints.maxWidth;
175-
176-
double episodePanelWidth =
177-
(availableWidth / 3).clamp(minWidth, availableWidth);
178-
179-
return StatefulBuilder(
180-
builder: (context, setState) {
181-
return Row(
182-
crossAxisAlignment: CrossAxisAlignment.start,
183-
children: [
184-
_buildVideoPlayer(availableWidth, episodePanelWidth),
185-
Obx(() {
186-
if (!showEpisodes.value) {
187-
return const SizedBox();
188-
}
189-
return GestureDetector(
190-
onHorizontalDragUpdate: (details) {
191-
setState(
192-
() => episodePanelWidth =
193-
(episodePanelWidth - details.delta.dx)
194-
.clamp(minWidth, availableWidth),
195-
);
196-
},
197-
child: SizedBox(
198-
width: episodePanelWidth,
199-
child: SingleChildScrollView(
200-
padding: const EdgeInsets.all(8.0),
201-
child: _buildEpisodeList(),
163+
() {
164+
return GestureDetector(
165+
onTap: _onMouseMoved,
166+
onPanUpdate: (_) => _onMouseMoved(),
167+
child: MouseRegion(
168+
onHover:(_) => _onMouseMoved(),
169+
cursor: defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.windows
170+
? (_isCursorVisible.value
171+
? SystemMouseCursors.basic
172+
: SystemMouseCursors.none)
173+
: SystemMouseCursors.basic,
174+
child: Scaffold(
175+
body: LayoutBuilder(
176+
builder: (context, constraints) {
177+
const double minWidth = 250;
178+
final double availableWidth = constraints.maxWidth;
179+
180+
double episodePanelWidth =
181+
(availableWidth / 3).clamp(minWidth, availableWidth);
182+
183+
return StatefulBuilder(
184+
builder: (context, setState) {
185+
return Row(
186+
crossAxisAlignment: CrossAxisAlignment.start,
187+
children: [
188+
_buildVideoPlayer(availableWidth, episodePanelWidth),
189+
Obx(() {
190+
if (!showEpisodes.value) {
191+
return const SizedBox();
192+
}
193+
return GestureDetector(
194+
onHorizontalDragUpdate: (details) {
195+
setState(
196+
() => episodePanelWidth =
197+
(episodePanelWidth - details.delta.dx)
198+
.clamp(minWidth, availableWidth),
199+
);
200+
},
201+
child: SizedBox(
202+
width: episodePanelWidth,
203+
child: SingleChildScrollView(
204+
padding: const EdgeInsets.all(8.0),
205+
child: _buildEpisodeList(),
206+
),
202207
),
203-
),
204-
);
205-
}),
206-
],
207-
);
208-
},
209-
);
210-
},
208+
);
209+
}),
210+
],
211+
);
212+
},
213+
);
214+
},
215+
),
211216
),
212217
),
213218
);
@@ -483,9 +488,10 @@ class MediaPlayerState extends State<MediaPlayer>
483488
}
484489

485490
Widget _buildEpisodeList() {
486-
Map<String, Episode> episodeList = widget.media.anime?.episodes ?? {};
491+
var episodeList = widget.media.anime?.episodes ?? {};
487492
var (chunk, initChunkIndex) =
488493
buildChunks(context, episodeList, widget.media.userProgress.toString());
494+
489495
RxInt selectedChunkIndex = (-1).obs;
490496
selectedChunkIndex =
491497
selectedChunkIndex.value == -1 ? initChunkIndex : selectedChunkIndex;
@@ -506,7 +512,7 @@ class MediaPlayerState extends State<MediaPlayer>
506512
),
507513
Obx(
508514
() {
509-
List<List<Episode>> reversed = reverse.value
515+
var reversed = reverse.value
510516
? chunk.map((element) => element.reversed.toList()).toList()
511517
: chunk;
512518
return EpisodeAdaptor(
@@ -540,7 +546,7 @@ class MediaPlayerState extends State<MediaPlayer>
540546
maxLines: 1,
541547
),
542548
IconButton(
543-
onPressed: () => settingsDialog(context, widget.media),
549+
onPressed: () => settingsDialog(),
544550
icon: Icon(
545551
Icons.menu_rounded,
546552
color: Theme.of(context).colorScheme.onSurface,
@@ -551,10 +557,10 @@ class MediaPlayerState extends State<MediaPlayer>
551557
);
552558
}
553559

554-
void settingsDialog(BuildContext context, m.Media media) =>
560+
void settingsDialog() =>
555561
AnimeCompactSettings(
556562
context,
557-
media,
563+
widget.media,
558564
(i) {
559565
viewType.value = i.recyclerStyle!;
560566
reverse.value = i.recyclerReversed;

lib/Screens/Info/Tabs/Watch/Anime/Player/PlayerController.dart

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
import 'dart:io';
22

3+
import 'package:dantotsu/Adaptor/Episode/EpisodeAdaptor.dart';
4+
import 'package:dantotsu/DataClass/Episode.dart';
5+
import 'package:dantotsu/DataClass/Media.dart' as m;
6+
import 'package:dantotsu/Functions/Function.dart';
37
import 'package:dantotsu/Functions/string_extensions.dart';
8+
import 'package:dantotsu/Preferences/HiveDataClasses/DefaultPlayerSettings/DefaultPlayerSettings.dart';
49
import 'package:dantotsu/Preferences/PrefManager.dart';
510
import 'package:dantotsu/Preferences/Preferences.dart';
611
import 'package:dantotsu/Widgets/AlertDialogBuilder.dart';
12+
import 'package:dantotsu/Widgets/CustomBottomDialog.dart';
13+
import 'package:dantotsu/api/Mangayomi/Eval/dart/model/video.dart' as v;
14+
import 'package:dantotsu/api/Mangayomi/Model/Source.dart';
715
import 'package:file_picker/file_picker.dart';
816
import 'package:flutter/material.dart';
917
import 'package:get/get.dart';
1018
import 'package:provider/provider.dart';
1119
import 'package:wakelock_plus/wakelock_plus.dart';
1220
import 'package:window_manager/window_manager.dart';
13-
import 'package:dantotsu/Adaptor/Episode/EpisodeAdaptor.dart';
14-
import 'package:dantotsu/DataClass/Episode.dart';
15-
import 'package:dantotsu/DataClass/Media.dart' as m;
16-
import 'package:dantotsu/Functions/Function.dart';
17-
import 'package:dantotsu/Preferences/HiveDataClasses/DefaultPlayerSettings/DefaultPlayerSettings.dart';
18-
import 'package:dantotsu/Widgets/CustomBottomDialog.dart';
19-
import 'package:dantotsu/api/Mangayomi/Eval/dart/model/video.dart' as v;
20-
import 'package:dantotsu/api/Mangayomi/Model/Source.dart';
21+
2122
import '../../../../../../Services/ServiceSwitcher.dart';
2223
import '../../../../../../api/Discord/Discord.dart';
2324
import '../../../../../../api/Discord/DiscordService.dart';
@@ -85,30 +86,11 @@ class _PlayerControllerState extends State<PlayerController> {
8586
while (_controller.maxTime.value == '00:00') {
8687
await Future.delayed(const Duration(milliseconds: 100));
8788
}
88-
setDiscordRpc();
8989

90-
timeStamps.value = await AniSkip.getResult(
91-
malId: media.idMAL,
92-
episodeNumber: currentEpisode.number.toInt(),
93-
episodeLength:
94-
_timeStringToSeconds(_controller.maxTime.value).toInt(),
95-
useProxyForTimeStamps: false,
96-
) ??
97-
[];
90+
setDiscordRpc();
91+
setTimeStamps();
9892

9993
_controller.seek(Duration(seconds: currentProgress ?? 0));
100-
_controller.currentPosition.listen((v) {
101-
if (v.inSeconds > 0) {
102-
_saveProgress(v.inSeconds);
103-
timeStampsText.value = timeStamps
104-
.firstWhereOrNull((e) =>
105-
e.interval.startTime <= v.inSeconds &&
106-
e.interval.endTime >= v.inSeconds)
107-
?.getType() ??
108-
'';
109-
}
110-
});
111-
11294
var list = PrefManager.getCustomVal<List<int>>("continueAnimeList") ?? [];
11395
if (list.contains(media.id)) list.remove(media.id);
11496

@@ -129,6 +111,28 @@ class _PlayerControllerState extends State<PlayerController> {
129111
_timeStringToSeconds(maxProgress).toInt());
130112
}
131113

114+
Future<void> setTimeStamps() async {
115+
timeStamps.value = await AniSkip.getResult(
116+
malId: media.idMAL,
117+
episodeNumber: currentEpisode.number.toInt(),
118+
episodeLength:
119+
_timeStringToSeconds(_controller.maxTime.value).toInt(),
120+
useProxyForTimeStamps: false,
121+
) ??
122+
[];
123+
124+
_controller.currentPosition.listen((v) {
125+
if (v.inSeconds > 0) {
126+
_saveProgress(v.inSeconds);
127+
timeStampsText.value = timeStamps
128+
.firstWhereOrNull((e) =>
129+
e.interval.startTime <= v.inSeconds &&
130+
e.interval.endTime >= v.inSeconds,
131+
)?.getType() ?? '';
132+
}
133+
});
134+
}
135+
132136
Future<void> setDiscordRpc() async {
133137
Discord.setRpc(
134138
media,

lib/Screens/Settings/SettingsCommonScreen.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class SettingsCommonScreenState extends BaseSettingsScreen {
3333
@override
3434
List<Widget> get settingsList {
3535
return [
36+
languageSwitcher(context),
3637
Text(
3738
getString.anilist,
3839
style: const TextStyle(

0 commit comments

Comments
 (0)