Skip to content

Commit

Permalink
feat: pinch in/out to scale lrc font size
Browse files Browse the repository at this point in the history
ref #128
  • Loading branch information
MSOB7YY committed Feb 18, 2024
1 parent 15de106 commit 044f010
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 2 deletions.
9 changes: 9 additions & 0 deletions lib/controller/settings_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,8 @@ class SettingsController with SettingsFileWriter {
MediaType.folder: false,
}.obs;

double fontScaleLRC = 1.0;

bool canAskForBatteryOptimizations = true;
bool didSupportNamida = false;

Expand Down Expand Up @@ -476,6 +478,8 @@ class SettingsController with SettingsFileWriter {
final mediaItemsTrackSortingReverseInStorage = json["mediaItemsTrackSortingReverse"] as Map? ?? {};
mediaItemsTrackSortingReverse.value = {for (final e in mediaItemsTrackSortingReverseInStorage.entries) MediaType.values.getEnum(e.key) ?? MediaType.track: e.value};

fontScaleLRC = json['fontScaleLRC'] ?? fontScaleLRC;

canAskForBatteryOptimizations = json['canAskForBatteryOptimizations'] ?? canAskForBatteryOptimizations;
} catch (e) {
printy(e, isError: true);
Expand Down Expand Up @@ -632,6 +636,8 @@ class SettingsController with SettingsFileWriter {
'mediaItemsTrackSorting': mediaItemsTrackSorting.map((key, value) => MapEntry(key.convertToString, value.map((e) => e.convertToString).toList())),
'mediaItemsTrackSortingReverse': mediaItemsTrackSortingReverse.map((key, value) => MapEntry(key.convertToString, value)),

'fontScaleLRC': fontScaleLRC,

'canAskForBatteryOptimizations': canAskForBatteryOptimizations,
};

Expand Down Expand Up @@ -781,6 +787,7 @@ class SettingsController with SettingsFileWriter {
MostPlayedTimeRange? ytMostPlayedTimeRange,
DateRange? ytMostPlayedCustomDateRange,
bool? ytMostPlayedCustomisStartOfDay,
double? fontScaleLRC,
bool? didSupportNamida,
bool? canAskForBatteryOptimizations,
}) {
Expand Down Expand Up @@ -1007,6 +1014,8 @@ class SettingsController with SettingsFileWriter {
if (ytMostPlayedCustomDateRange != null) this.ytMostPlayedCustomDateRange.value = ytMostPlayedCustomDateRange;
if (ytMostPlayedCustomisStartOfDay != null) this.ytMostPlayedCustomisStartOfDay.value = ytMostPlayedCustomisStartOfDay;

if (fontScaleLRC != null) this.fontScaleLRC = fontScaleLRC;

if (didSupportNamida != null) this.didSupportNamida = didSupportNamida;
if (canAskForBatteryOptimizations != null) this.canAskForBatteryOptimizations = canAskForBatteryOptimizations;
_writeToStorage();
Expand Down
15 changes: 13 additions & 2 deletions lib/packages/lyrics_lrc_parsed_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:lrc/lrc.dart';
import 'package:namida/controller/lyrics_controller.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';

import 'package:namida/class/track.dart';
import 'package:namida/controller/current_color.dart';
import 'package:namida/controller/lyrics_controller.dart';
import 'package:namida/controller/player_controller.dart';
import 'package:namida/controller/settings_controller.dart';
import 'package:namida/core/extensions.dart';
import 'package:namida/core/icon_fonts/broken_icons.dart';
import 'package:namida/packages/miniplayer.dart';
Expand Down Expand Up @@ -161,6 +162,9 @@ class LyricsLRCParsedViewState extends State<LyricsLRCParsedView> {
var lyrics = <LrcLine>[];
final timestampsMap = <Duration, (int, LrcLine)>{};

late double _previousFontMultiplier = settings.fontScaleLRC;
late double _fontMultiplier = settings.fontScaleLRC;

@override
void dispose() {
_latestUpdatedLineIndex.close();
Expand All @@ -173,7 +177,7 @@ class LyricsLRCParsedViewState extends State<LyricsLRCParsedView> {
Widget build(BuildContext context) {
final fullscreen = widget.isFullScreenView;
final initialFontSize = fullscreen ? 25.0 : 15.0;
final normalTextStyle = context.textTheme.displayMedium!.copyWith(fontSize: initialFontSize.multipliedFontScale);
final normalTextStyle = context.textTheme.displayMedium!.copyWith(fontSize: _fontMultiplier * initialFontSize.multipliedFontScale);

return Stack(
alignment: Alignment.center,
Expand Down Expand Up @@ -429,6 +433,13 @@ class LyricsLRCParsedViewState extends State<LyricsLRCParsedView> {
),
),
),
Positioned.fill(
child: ScaleDetector(
onScaleStart: (details) => _previousFontMultiplier = _fontMultiplier,
onScaleUpdate: (details) => setState(() => _fontMultiplier = (details.scale * _previousFontMultiplier).clamp(0.5, 2.0)),
onScaleEnd: (details) => settings.save(fontScaleLRC: _fontMultiplier),
),
),
],
);
}
Expand Down
38 changes: 38 additions & 0 deletions lib/ui/widgets/custom_widgets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3704,3 +3704,41 @@ class TapDetector extends StatelessWidget {
);
}
}

class ScaleDetector extends StatelessWidget {
final GestureScaleStartCallback? onScaleStart;
final GestureScaleUpdateCallback? onScaleUpdate;
final GestureScaleEndCallback? onScaleEnd;
final Widget? child;
final HitTestBehavior? behavior;

const ScaleDetector({
super.key,
this.onScaleStart,
this.onScaleUpdate,
this.onScaleEnd,
this.child,
this.behavior,
});

@override
Widget build(BuildContext context) {
final Map<Type, GestureRecognizerFactory> gestures = <Type, GestureRecognizerFactory>{};
gestures[ScaleGestureRecognizer] = GestureRecognizerFactoryWithHandlers<ScaleGestureRecognizer>(
() => ScaleGestureRecognizer(debugOwner: this),
(ScaleGestureRecognizer instance) {
instance
..onStart = onScaleStart
..onUpdate = onScaleUpdate
..onEnd = onScaleEnd
..gestureSettings = MediaQuery.maybeGestureSettingsOf(context);
},
);

return RawGestureDetector(
behavior: behavior,
gestures: gestures,
child: child,
);
}
}

0 comments on commit 044f010

Please sign in to comment.