fix(tv): push sidebar content without resizing
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user