fix lyrics delta + fix translation color in lyrics
This commit is contained in:
parent
cf3829e103
commit
99fb6521f2
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -71,3 +71,7 @@ testfiles/
|
||||||
translations/crowdin.zip
|
translations/crowdin.zip
|
||||||
translations/freezer.json
|
translations/freezer.json
|
||||||
translations/exp
|
translations/exp
|
||||||
|
|
||||||
|
# Ignore flatpak builds
|
||||||
|
flatpak/build-dir
|
||||||
|
flatpak/.flatpak-builder
|
|
@ -14,9 +14,10 @@ executableName=freezer
|
||||||
|
|
||||||
# ------------------------------- Build Flatpak ----------------------------- #
|
# ------------------------------- Build Flatpak ----------------------------- #
|
||||||
|
|
||||||
# Extract portable Flutter build.
|
# Find and extract portable build
|
||||||
mkdir -p $projectName
|
mkdir -p $projectName
|
||||||
tar -xf $projectName-linux.tar.gz -C $projectName
|
EXTRACT_DIR=`pwd`"/$projectName"
|
||||||
|
tar -xf "../build/linux/x64/release/$projectName-linux-*.tar.gz" -C "$EXTRACT_DIR"
|
||||||
|
|
||||||
# Copy the portable app to the Flatpak-based location.
|
# Copy the portable app to the Flatpak-based location.
|
||||||
cp -r $projectName /app/
|
cp -r $projectName /app/
|
||||||
|
|
|
@ -88,6 +88,7 @@ class DeezerAudioSource extends StreamAudioSource {
|
||||||
|
|
||||||
if (_downloadUrl != null && quality != newQuality) {
|
if (_downloadUrl != null && quality != newQuality) {
|
||||||
// update currentUrl to get tracks with new quality
|
// update currentUrl to get tracks with new quality
|
||||||
|
_deezerAudio.quality = newQuality;
|
||||||
_downloadUrl = null;
|
_downloadUrl = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -658,6 +658,7 @@ class AudioPlayerTask extends BaseAudioHandler {
|
||||||
Future customAction(String name, [Map<String, dynamic>? extras]) async {
|
Future customAction(String name, [Map<String, dynamic>? extras]) async {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'updateQuality':
|
case 'updateQuality':
|
||||||
|
_logger.fine('updateQuality($extras)');
|
||||||
//Pass wifi & mobile quality by custom action
|
//Pass wifi & mobile quality by custom action
|
||||||
//Isolate can't access globals
|
//Isolate can't access globals
|
||||||
wifiQuality = extras!['wifiQuality'] as AudioQuality;
|
wifiQuality = extras!['wifiQuality'] as AudioQuality;
|
||||||
|
|
|
@ -108,7 +108,7 @@ class Settings {
|
||||||
@HiveField(26)
|
@HiveField(26)
|
||||||
bool colorGradientBackground = false;
|
bool colorGradientBackground = false;
|
||||||
@HiveField(27)
|
@HiveField(27)
|
||||||
bool blurPlayerBackground = false;
|
bool blurPlayerBackground = true;
|
||||||
@HiveField(28)
|
@HiveField(28)
|
||||||
String font = 'System';
|
String font = 'System';
|
||||||
@HiveField(29)
|
@HiveField(29)
|
||||||
|
@ -117,8 +117,8 @@ class Settings {
|
||||||
int? displayMode;
|
int? displayMode;
|
||||||
@HiveField(31, defaultValue: true)
|
@HiveField(31, defaultValue: true)
|
||||||
bool enableFilledPlayButton = true;
|
bool enableFilledPlayButton = true;
|
||||||
@HiveField(32, defaultValue: false)
|
@HiveField(32, defaultValue: true)
|
||||||
bool playerBackgroundOnLyrics = false;
|
bool playerBackgroundOnLyrics = true;
|
||||||
@HiveField(33, defaultValue: NavigatorRouteType.material)
|
@HiveField(33, defaultValue: NavigatorRouteType.material)
|
||||||
NavigatorRouteType navigatorRouteType = NavigatorRouteType.material;
|
NavigatorRouteType navigatorRouteType = NavigatorRouteType.material;
|
||||||
|
|
||||||
|
@ -161,8 +161,8 @@ class Settings {
|
||||||
@HiveField(45, defaultValue: false)
|
@HiveField(45, defaultValue: false)
|
||||||
bool materialYouAccent = false;
|
bool materialYouAccent = false;
|
||||||
|
|
||||||
@HiveField(46, defaultValue: true)
|
@HiveField(46, defaultValue: false)
|
||||||
bool playerAlbumArtDropShadow = true;
|
bool playerAlbumArtDropShadow = false;
|
||||||
|
|
||||||
@HiveField(47, defaultValue: false)
|
@HiveField(47, defaultValue: false)
|
||||||
bool seekAsSkip = false;
|
bool seekAsSkip = false;
|
||||||
|
|
|
@ -282,12 +282,11 @@ class _LyricsWidgetState extends State<LyricsWidget>
|
||||||
if (_showTranslation)
|
if (_showTranslation)
|
||||||
Text(_lyrics!.lyrics![i].translated!,
|
Text(_lyrics!.lyrics![i].translated!,
|
||||||
textAlign: TextAlign.start,
|
textAlign: TextAlign.start,
|
||||||
style: TextStyle(
|
style: lyricsStyle.getTextStyle(
|
||||||
color: Color.lerp(
|
isActive,
|
||||||
Theme.of(context).colorScheme.onBackground,
|
Color.lerp(textColor, Colors.black, 0.25)!
|
||||||
Colors.black,
|
.withOpacity(isActive ? 1.0 : 0.25),
|
||||||
0.12),
|
20.0)),
|
||||||
fontSize: 20.0)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)));
|
)));
|
||||||
|
@ -296,6 +295,7 @@ class _LyricsWidgetState extends State<LyricsWidget>
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final lyricsStyle = LyricsStyle.fromIndex(settings.lyricsStyle);
|
final lyricsStyle = LyricsStyle.fromIndex(settings.lyricsStyle);
|
||||||
|
var extentBefore = 0.0;
|
||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
_error != null
|
_error != null
|
||||||
|
@ -305,45 +305,63 @@ class _LyricsWidgetState extends State<LyricsWidget>
|
||||||
_loading
|
_loading
|
||||||
? const Center(child: CircularProgressIndicator())
|
? const Center(child: CircularProgressIndicator())
|
||||||
: LayoutBuilder(builder: (context, constraints) {
|
: LayoutBuilder(builder: (context, constraints) {
|
||||||
return NotificationListener<ScrollStartNotification>(
|
return NotificationListener<ScrollNotification>(
|
||||||
onNotification: (notification) {
|
onNotification: (notification) {
|
||||||
if (!_syncedLyrics) return false;
|
if (!_syncedLyrics) return false;
|
||||||
final extentDelta =
|
|
||||||
(notification.metrics.extentBefore -
|
|
||||||
notification.metrics.extentAfter)
|
|
||||||
.abs();
|
|
||||||
// avoid accidental clicks
|
// avoid accidental clicks
|
||||||
const extentThreshold = 9000.0;
|
final extentDelta =
|
||||||
print('delta: $extentDelta');
|
(notification.metrics.pixels - extentBefore)
|
||||||
if (extentDelta >= extentThreshold &&
|
.abs();
|
||||||
!_animatedScroll &&
|
extentBefore = notification.metrics.pixels;
|
||||||
|
const extentThreshold = 20.0;
|
||||||
|
if (!_animatedScroll &&
|
||||||
|
!_freeScroll &&
|
||||||
!_loading &&
|
!_loading &&
|
||||||
!_freeScroll) {
|
extentDelta >= extentThreshold) {
|
||||||
setState(() => _freeScroll = true);
|
setState(() => _freeScroll = true);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
child: ScrollConfiguration(
|
child: ScrollConfiguration(
|
||||||
behavior: _scrollBehavior,
|
behavior: _scrollBehavior,
|
||||||
child: FadingEdgeScrollView.fromScrollView(
|
child: _syncedLyrics
|
||||||
gradientFractionOnStart: 0.25,
|
? FadingEdgeScrollView.fromScrollView(
|
||||||
gradientFractionOnEnd: 0.25,
|
gradientFractionOnStart: 0.25,
|
||||||
child: ListView.builder(
|
gradientFractionOnEnd: 0.25,
|
||||||
padding: EdgeInsets.symmetric(
|
child: ListView.builder(
|
||||||
horizontal: 8.0,
|
padding: EdgeInsets.symmetric(
|
||||||
vertical: constraints.maxHeight / 2 -
|
horizontal: 8.0,
|
||||||
height / 2),
|
vertical: !_syncedLyrics
|
||||||
controller: _controller,
|
? 4.0
|
||||||
itemCount: _lyrics!.lyrics!.length + 1,
|
: constraints.maxHeight / 2 -
|
||||||
itemBuilder: (BuildContext context, int i) {
|
height / 2),
|
||||||
return AutoScrollTag(
|
controller: _controller,
|
||||||
key: ValueKey(i),
|
itemCount: _lyrics!.lyrics!.length + 1,
|
||||||
controller: _controller,
|
itemBuilder:
|
||||||
index: i,
|
(BuildContext context, int i) {
|
||||||
child:
|
return AutoScrollTag(
|
||||||
_buildLyricWidget(i, lyricsStyle));
|
key: ValueKey(i),
|
||||||
},
|
controller: _controller,
|
||||||
))));
|
index: i,
|
||||||
|
child: _buildLyricWidget(
|
||||||
|
i, lyricsStyle));
|
||||||
|
},
|
||||||
|
))
|
||||||
|
: FadingEdgeScrollView
|
||||||
|
.fromSingleChildScrollView(
|
||||||
|
gradientFractionOnStart: 0.25,
|
||||||
|
gradientFractionOnEnd: 0.25,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
controller: _controller,
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.all(8.0),
|
||||||
|
child: Text(
|
||||||
|
_lyrics!.lyrics![0].text!,
|
||||||
|
style:
|
||||||
|
TextStyle(fontSize: 20.0),
|
||||||
|
),
|
||||||
|
)))));
|
||||||
}),
|
}),
|
||||||
if (_availableTranslation)
|
if (_availableTranslation)
|
||||||
Positioned(
|
Positioned(
|
||||||
|
|
Loading…
Reference in a new issue