feat: live search with back navigation and animated transitions

This commit is contained in:
zarzet
2026-01-02 16:43:59 +07:00
parent 973c2e3b41
commit 39bcc2c547
17 changed files with 448 additions and 232 deletions
+4
View File
@@ -22,6 +22,7 @@ class DownloadItem {
final String? filePath;
final String? error;
final DateTime createdAt;
final String? qualityOverride; // Override quality for this specific download
const DownloadItem({
required this.id,
@@ -32,6 +33,7 @@ class DownloadItem {
this.filePath,
this.error,
required this.createdAt,
this.qualityOverride,
});
DownloadItem copyWith({
@@ -43,6 +45,7 @@ class DownloadItem {
String? filePath,
String? error,
DateTime? createdAt,
String? qualityOverride,
}) {
return DownloadItem(
id: id ?? this.id,
@@ -53,6 +56,7 @@ class DownloadItem {
filePath: filePath ?? this.filePath,
error: error ?? this.error,
createdAt: createdAt ?? this.createdAt,
qualityOverride: qualityOverride ?? this.qualityOverride,
);
}
+2
View File
@@ -17,6 +17,7 @@ DownloadItem _$DownloadItemFromJson(Map<String, dynamic> json) => DownloadItem(
filePath: json['filePath'] as String?,
error: json['error'] as String?,
createdAt: DateTime.parse(json['createdAt'] as String),
qualityOverride: json['qualityOverride'] as String?,
);
Map<String, dynamic> _$DownloadItemToJson(DownloadItem instance) =>
@@ -29,6 +30,7 @@ Map<String, dynamic> _$DownloadItemToJson(DownloadItem instance) =>
'filePath': instance.filePath,
'error': instance.error,
'createdAt': instance.createdAt.toIso8601String(),
'qualityOverride': instance.qualityOverride,
};
const _$DownloadStatusEnumMap = {
+4
View File
@@ -18,6 +18,7 @@ class AppSettings {
final String folderOrganization; // none, artist, album, artist_album
final bool convertLyricsToRomaji; // Convert Japanese lyrics to romaji
final String historyViewMode; // list, grid
final bool askQualityBeforeDownload; // Show quality picker before each download
const AppSettings({
this.defaultService = 'tidal',
@@ -34,6 +35,7 @@ class AppSettings {
this.folderOrganization = 'none', // Default: no folder organization
this.convertLyricsToRomaji = false, // Default: keep original Japanese
this.historyViewMode = 'grid', // Default: grid view
this.askQualityBeforeDownload = false, // Default: use preset quality
});
AppSettings copyWith({
@@ -51,6 +53,7 @@ class AppSettings {
String? folderOrganization,
bool? convertLyricsToRomaji,
String? historyViewMode,
bool? askQualityBeforeDownload,
}) {
return AppSettings(
defaultService: defaultService ?? this.defaultService,
@@ -67,6 +70,7 @@ class AppSettings {
folderOrganization: folderOrganization ?? this.folderOrganization,
convertLyricsToRomaji: convertLyricsToRomaji ?? this.convertLyricsToRomaji,
historyViewMode: historyViewMode ?? this.historyViewMode,
askQualityBeforeDownload: askQualityBeforeDownload ?? this.askQualityBeforeDownload,
);
}
+3 -1
View File
@@ -20,7 +20,8 @@ AppSettings _$AppSettingsFromJson(Map<String, dynamic> json) => AppSettings(
hasSearchedBefore: json['hasSearchedBefore'] as bool? ?? false,
folderOrganization: json['folderOrganization'] as String? ?? 'none',
convertLyricsToRomaji: json['convertLyricsToRomaji'] as bool? ?? false,
historyViewMode: json['historyViewMode'] as String? ?? 'list',
historyViewMode: json['historyViewMode'] as String? ?? 'grid',
askQualityBeforeDownload: json['askQualityBeforeDownload'] as bool? ?? false,
);
Map<String, dynamic> _$AppSettingsToJson(AppSettings instance) =>
@@ -39,4 +40,5 @@ Map<String, dynamic> _$AppSettingsToJson(AppSettings instance) =>
'folderOrganization': instance.folderOrganization,
'convertLyricsToRomaji': instance.convertLyricsToRomaji,
'historyViewMode': instance.historyViewMode,
'askQualityBeforeDownload': instance.askQualityBeforeDownload,
};