Files
2026-07-14 11:11:36 +08:00

101 lines
3.1 KiB
Dart

part of 'player_page.dart';
extension _PlayerPageTopBar on _PlayerPageState {
String _buildTitleText(PlaybackSession session) {
final idx = session.context.itemIndexNumber;
final name = session.context.itemName;
final series = session.context.seriesName;
if (series != null && series.isNotEmpty) {
if (idx != null) return '$series ${formatEpisodeNumber(idx)} $name';
return '$series $name';
}
if (idx != null) return '${formatEpisodeNumber(idx)} $name';
return name;
}
MediaQualityInfo? _activeQualityInfo(PlaybackSession session) {
final srcId = session.context.mediaSourceId;
for (final src in session.context.allMediaSources) {
if (src.Id == srcId) return MediaQualityInfo.fromMediaSource(src);
}
if (session.context.allMediaSources.isNotEmpty) {
return MediaQualityInfo.fromMediaSource(
session.context.allMediaSources.first,
);
}
return null;
}
List<Widget> _buildTopBar(PlaybackSession session) {
if (_pip.isPip) {
return [
IconButton(
onPressed: _goBack,
icon: const Icon(Icons.arrow_back, color: Colors.white),
tooltip: '退出播放',
),
const Expanded(child: SizedBox.shrink()),
IconButton(
onPressed: () => unawaited(_pip.toggleAlwaysOnTop()),
icon: Icon(
_pip.isAlwaysOnTop ? Icons.push_pin : Icons.push_pin_outlined,
color: _pip.isAlwaysOnTop ? Colors.white : Colors.white54,
size: 20,
),
tooltip: _pip.isAlwaysOnTop ? '取消置顶' : '置顶',
),
IconButton(
onPressed: () => unawaited(windowManager.close()),
icon: const Icon(Icons.close, color: Colors.white, size: 20),
tooltip: '关闭',
),
];
}
return [
IconButton(
onPressed: _goBack,
icon: const Icon(Icons.arrow_back, color: Colors.white),
),
const SizedBox(width: 4),
Expanded(
child: SizedBox(
height: kMinInteractiveDimension,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
_buildTitleText(session),
style: const TextStyle(color: Colors.white, fontSize: 15),
overflow: TextOverflow.ellipsis,
),
),
),
),
const SizedBox(width: 8),
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Row(
mainAxisSize: MainAxisSize.min,
children: [
QualityBadge(quality: _activeQualityInfo(session)),
const SizedBox(width: 8),
NetworkSpeedIndicator(monitor: session.speedMonitor),
if (!_fullscreen.isFullscreen &&
!_pip.isPip &&
_isDesktopWindow) ...[
const SizedBox(width: 8),
const WindowControls.forDarkSurface(),
],
],
),
const SizedBox(height: 6),
const PlayerClockText(),
],
),
];
}
}