mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-09-30 13:19:44 +02:00
fix(ui): correct glass shader coordinates on scaled tablets
Use native window metrics for glass shaders while preserving scaled layout metrics for their content. Cover fullscreen tablet orientations and resizing to a compact window. Fixes #597
This commit is contained in:
1 parent
b40ba27cd6
commit
55a390d679
4 files changed
+292
-147
No files matched your search
@@ -0,0 +1,106 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:liquid_glass_easy/liquid_glass_easy.dart';
|
||||
import 'package:spotiflac_android/theme/mornye_theme.dart';
|
||||
import 'package:spotiflac_android/utils/adaptive_layout.dart';
|
||||
import 'package:spotiflac_android/widgets/app_switch.dart';
|
||||
import 'package:spotiflac_android/widgets/mornye_chrome.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('glass uses window pixels while tablet content keeps its scale', (
|
||||
tester,
|
||||
) async {
|
||||
tester.view.devicePixelRatio = 2;
|
||||
tester.view.padding = const FakeViewPadding(bottom: 40);
|
||||
addTearDown(tester.view.resetPhysicalSize);
|
||||
addTearDown(tester.view.resetDevicePixelRatio);
|
||||
addTearDown(tester.view.resetPadding);
|
||||
MediaQueryData? contentMetrics;
|
||||
|
||||
Future<void> pumpAt(Size size) async {
|
||||
tester.view.physicalSize = size * 2;
|
||||
await tester.pumpWidget(
|
||||
ProviderScope(
|
||||
child: MaterialApp(
|
||||
theme: MornyeTheme.build(Brightness.dark),
|
||||
builder: (context, child) => AdaptiveUiScaler(child: child!),
|
||||
home: Scaffold(
|
||||
body: Column(
|
||||
children: [
|
||||
MornyeGlass(
|
||||
blurEnabled: true,
|
||||
child: Builder(
|
||||
builder: (context) {
|
||||
contentMetrics = MediaQuery.of(context);
|
||||
return const SizedBox(width: 200, height: 50);
|
||||
},
|
||||
),
|
||||
),
|
||||
MornyeSegmentedControl(
|
||||
labels: const ['One', 'Two'],
|
||||
selectedIndex: 0,
|
||||
onChanged: (_) {},
|
||||
),
|
||||
AppSwitch(value: true, onChanged: (_) {}),
|
||||
MornyeTabBar(
|
||||
destinations: const [
|
||||
NavigationDestination(
|
||||
icon: Icon(Icons.home),
|
||||
label: 'Home',
|
||||
),
|
||||
NavigationDestination(
|
||||
icon: Icon(Icons.music_note),
|
||||
label: 'Library',
|
||||
),
|
||||
],
|
||||
selectedIndex: 0,
|
||||
onSelected: (_) {},
|
||||
blurEnabled: true,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
// Full-screen tablet in both orientations, compact tablet, then a pop-up
|
||||
// window and back. Resizing must update the shader without disabling glass.
|
||||
for (final size in [
|
||||
const Size(1400, 876),
|
||||
const Size(876, 1400),
|
||||
const Size(700, 1000),
|
||||
const Size(430, 850),
|
||||
const Size(1400, 876),
|
||||
]) {
|
||||
await pumpAt(size);
|
||||
final scale = adaptiveUiScaleForSize(size);
|
||||
expect(contentMetrics!.size, size / scale);
|
||||
expect(contentMetrics!.devicePixelRatio, 2 * scale);
|
||||
expect(contentMetrics!.padding.bottom, closeTo(20 / scale, 0.01));
|
||||
for (final type in [
|
||||
LiquidGlassLens,
|
||||
LiquidGlassTabBar,
|
||||
LiquidGlassSwitch,
|
||||
]) {
|
||||
final glass = find.byType(type);
|
||||
expect(glass, findsWidgets);
|
||||
for (final element in glass.evaluate()) {
|
||||
final metrics = MediaQuery.of(element);
|
||||
expect(metrics.size, size, reason: '$type at $size');
|
||||
expect(metrics.devicePixelRatio, 2, reason: '$type at $size');
|
||||
expect(metrics.textScaler, contentMetrics!.textScaler);
|
||||
expect(metrics.highContrast, contentMetrics!.highContrast);
|
||||
expect(metrics.disableAnimations, contentMetrics!.disableAnimations);
|
||||
}
|
||||
}
|
||||
final content = tester.getRect(find.byType(MornyeGlass).first);
|
||||
expect(content.width, closeTo(200 * scale, 0.01));
|
||||
expect(content.height, closeTo(50 * scale, 0.01));
|
||||
expect(tester.takeException(), isNull);
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user