fix(tv): push sidebar content without resizing

This commit is contained in:
edde746
2026-05-22 01:38:29 +02:00
parent 2ebd730201
commit afc94a50fc
11 changed files with 209 additions and 98 deletions
+12 -3
View File
@@ -131,7 +131,17 @@ void main() {
focusContent: () {},
isSidebarFocused: false,
sideNavigationWidth: sidebarOffset,
child: SizedBox(width: 1280, height: 720, child: DiscoverScreen(key: discoverKey)),
reservedSideNavigationWidth: sidebarOffset,
foregroundWidth: 1280 - sidebarOffset,
viewportWidth: 1280,
child: Align(
alignment: Alignment.centerLeft,
child: SizedBox(
width: 1280 - sidebarOffset,
height: 720,
child: DiscoverScreen(key: discoverKey),
),
),
),
),
),
@@ -147,7 +157,7 @@ void main() {
expect(spotlightBackground.contentLeft, closeTo(spotlightLeft + sidebarOffset, 0.001));
final railHeight = TvBrowseRailLayout.estimateHeight(
size: const Size(1280, 720),
size: const Size(1280 - sidebarOffset, 720),
hubs: [hub],
density: LibraryDensity.max,
episodePosterMode: settings.read(SettingsService.episodePosterMode),
@@ -168,7 +178,6 @@ void main() {
final browseRail = tester.widget<TvBrowseRail>(find.byType(TvBrowseRail));
expect(browseRail.backgroundBleedLeft, sidebarOffset);
expect(browseRail.visibleRightInset, sidebarOffset);
final backgroundPosition = tester.widget<Positioned>(
find.ancestor(of: find.byType(TvSpotlightBackground), matching: find.byType(Positioned)).first,
+42
View File
@@ -0,0 +1,42 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/screens/main_screen.dart';
import 'package:plezy/widgets/side_navigation_rail.dart';
void main() {
test('side navigation pushes stable foreground off-screen while temporarily expanded', () {
const viewportWidth = 1280.0;
const reservedWidth = SideNavigationRailState.tvCollapsedWidth;
final collapsed = mainScreenSideNavigationContentLayout(
viewportWidth: viewportWidth,
currentSideNavigationWidth: SideNavigationRailState.tvCollapsedWidth,
reservedSideNavigationWidth: reservedWidth,
);
final expanded = mainScreenSideNavigationContentLayout(
viewportWidth: viewportWidth,
currentSideNavigationWidth: SideNavigationRailState.expandedWidth,
reservedSideNavigationWidth: reservedWidth,
);
expect(collapsed.width, viewportWidth - SideNavigationRailState.tvCollapsedWidth);
expect(expanded.width, collapsed.width);
expect(collapsed.left, SideNavigationRailState.tvCollapsedWidth);
expect(expanded.left, SideNavigationRailState.expandedWidth);
expect(collapsed.left + collapsed.width, viewportWidth);
expect(expanded.left + expanded.width, viewportWidth + SideNavigationRailState.expandedWidth - reservedWidth);
});
test('side navigation reserves expanded width when always open', () {
const viewportWidth = 1280.0;
final expanded = mainScreenSideNavigationContentLayout(
viewportWidth: viewportWidth,
currentSideNavigationWidth: SideNavigationRailState.expandedWidth,
reservedSideNavigationWidth: SideNavigationRailState.expandedWidth,
);
expect(expanded.left, SideNavigationRailState.expandedWidth);
expect(expanded.width, viewportWidth - SideNavigationRailState.expandedWidth);
expect(expanded.left + expanded.width, viewportWidth);
});
}
+48
View File
@@ -12,6 +12,7 @@ import 'package:plezy/services/data_aggregation_service.dart';
import 'package:plezy/services/multi_server_manager.dart';
import 'package:plezy/services/settings_service.dart';
import 'package:plezy/theme/mono_theme.dart';
import 'package:plezy/widgets/side_navigation_rail.dart';
import 'package:plezy/widgets/tv_browse_rail.dart';
import 'package:provider/provider.dart';
@@ -648,6 +649,53 @@ void main() {
expect(tester.takeException(), isNull);
});
testWidgets('background gradient stays full bleed beside pushed foreground', (tester) async {
tester.view.devicePixelRatio = 1.0;
tester.view.physicalSize = const Size(1280, 720);
addTearDown(() {
tester.view.resetDevicePixelRatio();
tester.view.resetPhysicalSize();
});
final serverManager = MultiServerManager();
final item = MediaItem(id: 'movie_1', backend: MediaBackend.plex, kind: MediaKind.movie, title: 'Movie');
final hub = MediaHub(id: 'hub_1', title: 'Hub', type: 'movie', items: [item], size: 1);
await tester.pumpWidget(
ChangeNotifierProvider<MultiServerProvider>(
create: (_) => MultiServerProvider(serverManager, DataAggregationService(serverManager)),
child: MaterialApp(
theme: monoTheme(dark: true),
home: Scaffold(
body: SizedBox(
width: 1060,
height: 720,
child: TvBrowseRail(
hubs: [hub],
iconForHub: (_, _) => Icons.movie_rounded,
backgroundBleedLeft: SideNavigationRailState.expandedWidth,
),
),
),
),
),
);
await tester.pump();
final gradient = find.byWidgetPredicate(
(widget) =>
widget is DecoratedBox &&
widget.decoration is BoxDecoration &&
(widget.decoration as BoxDecoration).gradient is LinearGradient,
);
final backgroundPosition = tester.widget<Positioned>(
find.ancestor(of: gradient.first, matching: find.byType(Positioned)).first,
);
expect(backgroundPosition.left, -SideNavigationRailState.expandedWidth);
expect(backgroundPosition.width, 1280);
});
}
ScrollPosition _activeRailPosition(WidgetTester tester) {