mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 21:48:14 -08:00
feat: Implement dynamic subtitle positioning based on menu height
This commit is contained in:
parent
1fdab92f1f
commit
2884a5fadc
4 changed files with 217 additions and 44 deletions
104
test/util/subtitle_position_calculator_test.dart
Normal file
104
test/util/subtitle_position_calculator_test.dart
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:fladder/models/settings/subtitle_settings_model.dart';
|
||||
import 'package:fladder/util/subtitle_position_calculator.dart';
|
||||
|
||||
void main() {
|
||||
group('SubtitlePositionCalculator', () {
|
||||
test('returns original offset when overlay is hidden', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.2);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: false,
|
||||
screenHeight: 800,
|
||||
menuHeight: 120,
|
||||
);
|
||||
|
||||
expect(result, equals(0.2));
|
||||
});
|
||||
|
||||
test('uses dynamic menu height when available', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.1);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: true,
|
||||
screenHeight: 800,
|
||||
menuHeight: 120, // 120/800 = 0.15 (15%)
|
||||
);
|
||||
|
||||
// Should position at menu height + dynamic padding = (120/800) + (-0.03) = 0.12
|
||||
expect(result, closeTo(0.12, 0.001));
|
||||
});
|
||||
|
||||
test('uses fallback when menu height unavailable', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.1);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: true,
|
||||
screenHeight: 800,
|
||||
menuHeight: null,
|
||||
);
|
||||
|
||||
// Should use fallback: 0.15 + 0.01 = 0.16
|
||||
expect(result, equals(0.16));
|
||||
});
|
||||
|
||||
test('preserves user offset when already above menu', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.3);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: true,
|
||||
screenHeight: 800,
|
||||
menuHeight: 120,
|
||||
);
|
||||
|
||||
// Should keep original 0.3 since it's above menu area (0.12)
|
||||
expect(result, equals(0.3));
|
||||
});
|
||||
|
||||
test('clamps to maximum offset', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.95);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: true,
|
||||
screenHeight: 800,
|
||||
menuHeight: 600, // Large menu that would push subtitles too high
|
||||
);
|
||||
|
||||
// Should clamp to max 0.85
|
||||
expect(result, equals(0.85));
|
||||
});
|
||||
|
||||
test('handles zero screen height gracefully', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.1);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: true,
|
||||
screenHeight: 0,
|
||||
menuHeight: 120,
|
||||
);
|
||||
|
||||
// Should use fallback when screen height is invalid
|
||||
expect(result, equals(0.16));
|
||||
});
|
||||
|
||||
test('clamps to minimum offset', () {
|
||||
const settings = SubtitleSettingsModel(verticalOffset: 0.05);
|
||||
|
||||
final result = SubtitlePositionCalculator.calculateOffset(
|
||||
settings: settings,
|
||||
showOverlay: true,
|
||||
screenHeight: 800,
|
||||
menuHeight: 120,
|
||||
);
|
||||
|
||||
// Should not go below 0.0
|
||||
expect(result, greaterThanOrEqualTo(0.0));
|
||||
});
|
||||
});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue