From 675ac84486174452f14bd66d848e49477aee804e Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:05:51 +0100 Subject: [PATCH] fix: use settings-style bottom sheet for browse grouping picker --- lib/i18n/da.i18n.json | 2 +- lib/i18n/de.i18n.json | 1 + lib/i18n/en.i18n.json | 1 + lib/i18n/es.i18n.json | 1 + lib/i18n/fr.i18n.json | 1 + lib/i18n/it.i18n.json | 1 + lib/i18n/ja.i18n.json | 1 + lib/i18n/ko.i18n.json | 1 + lib/i18n/nb.i18n.json | 1 + lib/i18n/nl.i18n.json | 1 + lib/i18n/pl.i18n.json | 1 + lib/i18n/pt.i18n.json | 1 + lib/i18n/ru.i18n.json | 1 + lib/i18n/strings.g.dart | 4 +- lib/i18n/strings_da.g.dart | 4 +- lib/i18n/strings_de.g.dart | 4 +- lib/i18n/strings_en.g.dart | 6 +- lib/i18n/strings_es.g.dart | 4 +- lib/i18n/strings_fr.g.dart | 4 +- lib/i18n/strings_it.g.dart | 4 +- lib/i18n/strings_ja.g.dart | 4 +- lib/i18n/strings_ko.g.dart | 4 +- lib/i18n/strings_nb.g.dart | 4 +- lib/i18n/strings_nl.g.dart | 4 +- lib/i18n/strings_pl.g.dart | 4 +- lib/i18n/strings_pt.g.dart | 4 +- lib/i18n/strings_ru.g.dart | 4 +- lib/i18n/strings_sv.g.dart | 4 +- lib/i18n/strings_zh.g.dart | 4 +- lib/i18n/sv.i18n.json | 1 + lib/i18n/zh.i18n.json | 1 + .../libraries/tabs/library_browse_tab.dart | 93 ++++++++++--------- 32 files changed, 114 insertions(+), 61 deletions(-) diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 17deb54d..ddff2551 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -300,7 +300,7 @@ "noCollections": "Ingen samlinger i dette bibliotek", "noFoldersFound": "Ingen mapper fundet", "folders": "mapper", "tabs": { "recommended": "Anbefalet", "browse": "Gennemse", "collections": "Samlinger", "playlists": "Playlister" }, - "groupings": { "all": "Alle", "movies": "Film", "shows": "TV-serier", "seasons": "Sæsoner", "episodes": "Episoder", "folders": "Mapper" } + "groupings": { "title": "Gruppering", "all": "Alle", "movies": "Film", "shows": "TV-serier", "seasons": "Sæsoner", "episodes": "Episoder", "folders": "Mapper" } }, "about": { "title": "Om", "openSourceLicenses": "Open source-licenser", "versionLabel": "Version ${version}", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 6e38bfca..60dd3908 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -519,6 +519,7 @@ "playlists": "Wiedergabelisten" }, "groupings": { + "title": "Gruppierung", "all": "Alle", "movies": "Filme", "shows": "Serien", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index cff9fb08..c31ffbaf 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -519,6 +519,7 @@ "playlists": "Playlists" }, "groupings": { + "title": "Grouping", "all": "All", "movies": "Movies", "shows": "TV Shows", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 32887324..b3dfe151 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -519,6 +519,7 @@ "playlists": "Listas" }, "groupings": { + "title": "Agrupación", "all": "Todo", "movies": "Películas", "shows": "Series", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index eac0d86e..f0d438cd 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -519,6 +519,7 @@ "playlists": "Playlists" }, "groupings": { + "title": "Regroupement", "all": "Tous", "movies": "Films", "shows": "Show TV", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index 072a16f3..36991ad8 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -519,6 +519,7 @@ "playlists": "Playlist" }, "groupings": { + "title": "Raggruppamento", "all": "Tutti", "movies": "Film", "shows": "Serie TV", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index e3ee2b14..4cd2b147 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -519,6 +519,7 @@ "playlists": "プレイリスト" }, "groupings": { + "title": "グループ", "all": "すべて", "movies": "映画", "shows": "テレビ番組", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index b6ef8420..79e4e684 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -519,6 +519,7 @@ "playlists": "재생 목록" }, "groupings": { + "title": "그룹", "all": "전체", "movies": "영화", "shows": "TV 프로그램", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 3dc1d46a..79e22553 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -519,6 +519,7 @@ "playlists": "Spillelister" }, "groupings": { + "title": "Gruppering", "all": "Alle", "movies": "Filmer", "shows": "TV-serier", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 54f4ec95..79461978 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -519,6 +519,7 @@ "playlists": "Afspeellijsten" }, "groupings": { + "title": "Groepering", "all": "Alles", "movies": "Films", "shows": "Series", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 789107fb..d99b2c6f 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -519,6 +519,7 @@ "playlists": "Playlisty" }, "groupings": { + "title": "Grupowanie", "all": "Wszystkie", "movies": "Filmy", "shows": "Seriale TV", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 944d3bc2..36d55730 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -519,6 +519,7 @@ "playlists": "Playlists" }, "groupings": { + "title": "Agrupamento", "all": "Todos", "movies": "Filmes", "shows": "Séries de TV", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 66227d33..67310895 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -519,6 +519,7 @@ "playlists": "Плейлисты" }, "groupings": { + "title": "Группировка", "all": "Все", "movies": "Фильмы", "shows": "Сериалы", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index b46f1599..82d4e1ee 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 15 -/// Strings: 12180 (812 per locale) +/// Strings: 12195 (813 per locale) /// -/// Built on 2026-03-11 at 13:56 UTC +/// Built on 2026-03-13 at 05:11 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 902ffb44..e8bc1955 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsDa implements TranslationsLibrariesGrouping final TranslationsDa _root; // ignore: unused_field // Translations + @override String get title => 'Gruppering'; @override String get all => 'Alle'; @override String get movies => 'Film'; @override String get shows => 'TV-serier'; @@ -1779,6 +1780,7 @@ extension on TranslationsDa { 'libraries.tabs.browse' => 'Gennemse', 'libraries.tabs.collections' => 'Samlinger', 'libraries.tabs.playlists' => 'Playlister', + 'libraries.groupings.title' => 'Gruppering', 'libraries.groupings.all' => 'Alle', 'libraries.groupings.movies' => 'Film', 'libraries.groupings.shows' => 'TV-serier', @@ -1820,9 +1822,9 @@ extension on TranslationsDa { 'liveTv.nowPlaying' => 'Afspiller nu', 'liveTv.noPrograms' => 'Ingen programdata tilgængelig', 'liveTv.channelNumber' => ({required Object number}) => 'Kn. ${number}', - 'liveTv.live' => 'LIVE', _ => null, } ?? switch (path) { + 'liveTv.live' => 'LIVE', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NY', 'liveTv.reloadGuide' => 'Genindlæs guide', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 11dc3daa..349cd4c0 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsDe implements TranslationsLibrariesGrouping final TranslationsDe _root; // ignore: unused_field // Translations + @override String get title => 'Gruppierung'; @override String get all => 'Alle'; @override String get movies => 'Filme'; @override String get shows => 'Serien'; @@ -1779,6 +1780,7 @@ extension on TranslationsDe { 'libraries.tabs.browse' => 'Durchsuchen', 'libraries.tabs.collections' => 'Sammlungen', 'libraries.tabs.playlists' => 'Wiedergabelisten', + 'libraries.groupings.title' => 'Gruppierung', 'libraries.groupings.all' => 'Alle', 'libraries.groupings.movies' => 'Filme', 'libraries.groupings.shows' => 'Serien', @@ -1820,9 +1822,9 @@ extension on TranslationsDe { 'liveTv.nowPlaying' => 'Läuft gerade', 'liveTv.noPrograms' => 'Keine Programmdaten verfügbar', 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', - 'liveTv.live' => 'LIVE', _ => null, } ?? switch (path) { + 'liveTv.live' => 'LIVE', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NEU', 'liveTv.reloadGuide' => 'Programmführer neu laden', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index ceb115aa..e12fa967 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -2679,6 +2679,9 @@ class TranslationsLibrariesGroupingsEn { // Translations + /// en: 'Grouping' + String get title => 'Grouping'; + /// en: 'All' String get all => 'All'; @@ -3410,6 +3413,7 @@ extension on Translations { 'libraries.tabs.browse' => 'Browse', 'libraries.tabs.collections' => 'Collections', 'libraries.tabs.playlists' => 'Playlists', + 'libraries.groupings.title' => 'Grouping', 'libraries.groupings.all' => 'All', 'libraries.groupings.movies' => 'Movies', 'libraries.groupings.shows' => 'TV Shows', @@ -3451,9 +3455,9 @@ extension on Translations { 'liveTv.nowPlaying' => 'Now Playing', 'liveTv.noPrograms' => 'No program data available', 'liveTv.channelNumber' => ({required Object number}) => 'Ch. ${number}', - 'liveTv.live' => 'LIVE', _ => null, } ?? switch (path) { + 'liveTv.live' => 'LIVE', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NEW', 'liveTv.reloadGuide' => 'Reload Guide', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index af0fa9d0..10a685b6 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsEs implements TranslationsLibrariesGrouping final TranslationsEs _root; // ignore: unused_field // Translations + @override String get title => 'Agrupación'; @override String get all => 'Todo'; @override String get movies => 'Películas'; @override String get shows => 'Series'; @@ -1779,6 +1780,7 @@ extension on TranslationsEs { 'libraries.tabs.browse' => 'Explorar', 'libraries.tabs.collections' => 'Colecciones', 'libraries.tabs.playlists' => 'Listas', + 'libraries.groupings.title' => 'Agrupación', 'libraries.groupings.all' => 'Todo', 'libraries.groupings.movies' => 'Películas', 'libraries.groupings.shows' => 'Series', @@ -1820,9 +1822,9 @@ extension on TranslationsEs { 'liveTv.nowPlaying' => 'Reproduciendo ahora', 'liveTv.noPrograms' => 'No hay datos de programación disponibles', 'liveTv.channelNumber' => ({required Object number}) => 'Canal ${number}', - 'liveTv.live' => 'EN VIVO', _ => null, } ?? switch (path) { + 'liveTv.live' => 'EN VIVO', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NUEVO', 'liveTv.reloadGuide' => 'Recargar guía', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 9c58044b..9aab6c73 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsFr implements TranslationsLibrariesGrouping final TranslationsFr _root; // ignore: unused_field // Translations + @override String get title => 'Regroupement'; @override String get all => 'Tous'; @override String get movies => 'Films'; @override String get shows => 'Show TV'; @@ -1779,6 +1780,7 @@ extension on TranslationsFr { 'libraries.tabs.browse' => 'Parcourir', 'libraries.tabs.collections' => 'Collections', 'libraries.tabs.playlists' => 'Playlists', + 'libraries.groupings.title' => 'Regroupement', 'libraries.groupings.all' => 'Tous', 'libraries.groupings.movies' => 'Films', 'libraries.groupings.shows' => 'Show TV', @@ -1820,9 +1822,9 @@ extension on TranslationsFr { 'liveTv.nowPlaying' => 'En cours de lecture', 'liveTv.noPrograms' => 'Aucune donnée de programme disponible', 'liveTv.channelNumber' => ({required Object number}) => 'Ch. ${number}', - 'liveTv.live' => 'EN DIRECT', _ => null, } ?? switch (path) { + 'liveTv.live' => 'EN DIRECT', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NOUVEAU', 'liveTv.reloadGuide' => 'Recharger le guide', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 8c8417e0..9e7eb4e7 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsIt implements TranslationsLibrariesGrouping final TranslationsIt _root; // ignore: unused_field // Translations + @override String get title => 'Raggruppamento'; @override String get all => 'Tutti'; @override String get movies => 'Film'; @override String get shows => 'Serie TV'; @@ -1779,6 +1780,7 @@ extension on TranslationsIt { 'libraries.tabs.browse' => 'Esplora', 'libraries.tabs.collections' => 'Raccolte', 'libraries.tabs.playlists' => 'Playlist', + 'libraries.groupings.title' => 'Raggruppamento', 'libraries.groupings.all' => 'Tutti', 'libraries.groupings.movies' => 'Film', 'libraries.groupings.shows' => 'Serie TV', @@ -1820,9 +1822,9 @@ extension on TranslationsIt { 'liveTv.nowPlaying' => 'In riproduzione', 'liveTv.noPrograms' => 'Nessun dato di programma disponibile', 'liveTv.channelNumber' => ({required Object number}) => 'Canale ${number}', - 'liveTv.live' => 'IN DIRETTA', _ => null, } ?? switch (path) { + 'liveTv.live' => 'IN DIRETTA', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NUOVO', 'liveTv.reloadGuide' => 'Ricarica guida', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index bfdaf02c..69e54b26 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsJa implements TranslationsLibrariesGrouping final TranslationsJa _root; // ignore: unused_field // Translations + @override String get title => 'グループ'; @override String get all => 'すべて'; @override String get movies => '映画'; @override String get shows => 'テレビ番組'; @@ -1779,6 +1780,7 @@ extension on TranslationsJa { 'libraries.tabs.browse' => 'ブラウズ', 'libraries.tabs.collections' => 'コレクション', 'libraries.tabs.playlists' => 'プレイリスト', + 'libraries.groupings.title' => 'グループ', 'libraries.groupings.all' => 'すべて', 'libraries.groupings.movies' => '映画', 'libraries.groupings.shows' => 'テレビ番組', @@ -1820,9 +1822,9 @@ extension on TranslationsJa { 'liveTv.nowPlaying' => '現在放送中', 'liveTv.noPrograms' => '番組データがありません', 'liveTv.channelNumber' => ({required Object number}) => 'Ch. ${number}', - 'liveTv.live' => 'ライブ', _ => null, } ?? switch (path) { + 'liveTv.live' => 'ライブ', 'liveTv.hd' => 'HD', 'liveTv.premiere' => '新着', 'liveTv.reloadGuide' => '番組表を再読込', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index c861990e..d9c61f9a 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsKo implements TranslationsLibrariesGrouping final TranslationsKo _root; // ignore: unused_field // Translations + @override String get title => '그룹'; @override String get all => '전체'; @override String get movies => '영화'; @override String get shows => 'TV 프로그램'; @@ -1779,6 +1780,7 @@ extension on TranslationsKo { 'libraries.tabs.browse' => '찾아보기', 'libraries.tabs.collections' => '컬렉션', 'libraries.tabs.playlists' => '재생 목록', + 'libraries.groupings.title' => '그룹', 'libraries.groupings.all' => '전체', 'libraries.groupings.movies' => '영화', 'libraries.groupings.shows' => 'TV 프로그램', @@ -1820,9 +1822,9 @@ extension on TranslationsKo { 'liveTv.nowPlaying' => '현재 재생 중', 'liveTv.noPrograms' => '프로그램 데이터가 없습니다', 'liveTv.channelNumber' => ({required Object number}) => '채널 ${number}', - 'liveTv.live' => '실시간', _ => null, } ?? switch (path) { + 'liveTv.live' => '실시간', 'liveTv.hd' => 'HD', 'liveTv.premiere' => '신규', 'liveTv.reloadGuide' => '편성표 새로고침', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 86eb60f9..e059929f 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsNb implements TranslationsLibrariesGrouping final TranslationsNb _root; // ignore: unused_field // Translations + @override String get title => 'Gruppering'; @override String get all => 'Alle'; @override String get movies => 'Filmer'; @override String get shows => 'TV-serier'; @@ -1779,6 +1780,7 @@ extension on TranslationsNb { 'libraries.tabs.browse' => 'Bla gjennom', 'libraries.tabs.collections' => 'Samlinger', 'libraries.tabs.playlists' => 'Spillelister', + 'libraries.groupings.title' => 'Gruppering', 'libraries.groupings.all' => 'Alle', 'libraries.groupings.movies' => 'Filmer', 'libraries.groupings.shows' => 'TV-serier', @@ -1820,9 +1822,9 @@ extension on TranslationsNb { 'liveTv.nowPlaying' => 'Spilles nå', 'liveTv.noPrograms' => 'Ingen programdata tilgjengelig', 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', - 'liveTv.live' => 'DIREKTE', _ => null, } ?? switch (path) { + 'liveTv.live' => 'DIREKTE', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NY', 'liveTv.reloadGuide' => 'Last inn programguide på nytt', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index f7ec08ba..3eae83a0 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsNl implements TranslationsLibrariesGrouping final TranslationsNl _root; // ignore: unused_field // Translations + @override String get title => 'Groepering'; @override String get all => 'Alles'; @override String get movies => 'Films'; @override String get shows => 'Series'; @@ -1779,6 +1780,7 @@ extension on TranslationsNl { 'libraries.tabs.browse' => 'Bladeren', 'libraries.tabs.collections' => 'Collecties', 'libraries.tabs.playlists' => 'Afspeellijsten', + 'libraries.groupings.title' => 'Groepering', 'libraries.groupings.all' => 'Alles', 'libraries.groupings.movies' => 'Films', 'libraries.groupings.shows' => 'Series', @@ -1820,9 +1822,9 @@ extension on TranslationsNl { 'liveTv.nowPlaying' => 'Nu aan het afspelen', 'liveTv.noPrograms' => 'Geen programmagegevens beschikbaar', 'liveTv.channelNumber' => ({required Object number}) => 'Kanaal ${number}', - 'liveTv.live' => 'LIVE', _ => null, } ?? switch (path) { + 'liveTv.live' => 'LIVE', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NIEUW', 'liveTv.reloadGuide' => 'Gids herladen', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 9788d4ed..083f2f50 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsPl implements TranslationsLibrariesGrouping final TranslationsPl _root; // ignore: unused_field // Translations + @override String get title => 'Grupowanie'; @override String get all => 'Wszystkie'; @override String get movies => 'Filmy'; @override String get shows => 'Seriale TV'; @@ -1779,6 +1780,7 @@ extension on TranslationsPl { 'libraries.tabs.browse' => 'Przeglądaj', 'libraries.tabs.collections' => 'Kolekcje', 'libraries.tabs.playlists' => 'Playlisty', + 'libraries.groupings.title' => 'Grupowanie', 'libraries.groupings.all' => 'Wszystkie', 'libraries.groupings.movies' => 'Filmy', 'libraries.groupings.shows' => 'Seriale TV', @@ -1820,9 +1822,9 @@ extension on TranslationsPl { 'liveTv.nowPlaying' => 'Teraz odtwarzane', 'liveTv.noPrograms' => 'Brak danych o programach', 'liveTv.channelNumber' => ({required Object number}) => 'Kn. ${number}', - 'liveTv.live' => 'NA ŻYWO', _ => null, } ?? switch (path) { + 'liveTv.live' => 'NA ŻYWO', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NOWE', 'liveTv.reloadGuide' => 'Odśwież przewodnik', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 42a0255f..d4756a88 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsPt implements TranslationsLibrariesGrouping final TranslationsPt _root; // ignore: unused_field // Translations + @override String get title => 'Agrupamento'; @override String get all => 'Todos'; @override String get movies => 'Filmes'; @override String get shows => 'Séries de TV'; @@ -1779,6 +1780,7 @@ extension on TranslationsPt { 'libraries.tabs.browse' => 'Navegar', 'libraries.tabs.collections' => 'Coleções', 'libraries.tabs.playlists' => 'Playlists', + 'libraries.groupings.title' => 'Agrupamento', 'libraries.groupings.all' => 'Todos', 'libraries.groupings.movies' => 'Filmes', 'libraries.groupings.shows' => 'Séries de TV', @@ -1820,9 +1822,9 @@ extension on TranslationsPt { 'liveTv.nowPlaying' => 'Reproduzindo Agora', 'liveTv.noPrograms' => 'Nenhum dado de programação disponível', 'liveTv.channelNumber' => ({required Object number}) => 'Ch. ${number}', - 'liveTv.live' => 'AO VIVO', _ => null, } ?? switch (path) { + 'liveTv.live' => 'AO VIVO', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NOVO', 'liveTv.reloadGuide' => 'Recarregar Guia', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index 96446052..9bb54f00 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsRu implements TranslationsLibrariesGrouping final TranslationsRu _root; // ignore: unused_field // Translations + @override String get title => 'Группировка'; @override String get all => 'Все'; @override String get movies => 'Фильмы'; @override String get shows => 'Сериалы'; @@ -1779,6 +1780,7 @@ extension on TranslationsRu { 'libraries.tabs.browse' => 'Обзор', 'libraries.tabs.collections' => 'Коллекции', 'libraries.tabs.playlists' => 'Плейлисты', + 'libraries.groupings.title' => 'Группировка', 'libraries.groupings.all' => 'Все', 'libraries.groupings.movies' => 'Фильмы', 'libraries.groupings.shows' => 'Сериалы', @@ -1820,9 +1822,9 @@ extension on TranslationsRu { 'liveTv.nowPlaying' => 'Сейчас воспроизводится', 'liveTv.noPrograms' => 'Нет данных о программах', 'liveTv.channelNumber' => ({required Object number}) => 'Кн. ${number}', - 'liveTv.live' => 'ЭФИР', _ => null, } ?? switch (path) { + 'liveTv.live' => 'ЭФИР', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'НОВОЕ', 'liveTv.reloadGuide' => 'Перезагрузить программу', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index af1d1876..5cad5e50 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsSv implements TranslationsLibrariesGrouping final TranslationsSv _root; // ignore: unused_field // Translations + @override String get title => 'Gruppering'; @override String get all => 'Alla'; @override String get movies => 'Filmer'; @override String get shows => 'Serier'; @@ -1779,6 +1780,7 @@ extension on TranslationsSv { 'libraries.tabs.browse' => 'Bläddra', 'libraries.tabs.collections' => 'Samlingar', 'libraries.tabs.playlists' => 'Spellistor', + 'libraries.groupings.title' => 'Gruppering', 'libraries.groupings.all' => 'Alla', 'libraries.groupings.movies' => 'Filmer', 'libraries.groupings.shows' => 'Serier', @@ -1820,9 +1822,9 @@ extension on TranslationsSv { 'liveTv.nowPlaying' => 'Spelas nu', 'liveTv.noPrograms' => 'Ingen programdata tillgänglig', 'liveTv.channelNumber' => ({required Object number}) => 'Kanal ${number}', - 'liveTv.live' => 'LIVE', _ => null, } ?? switch (path) { + 'liveTv.live' => 'LIVE', 'liveTv.hd' => 'HD', 'liveTv.premiere' => 'NY', 'liveTv.reloadGuide' => 'Ladda om programguide', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 6467c72a..e99a9bc8 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -1197,6 +1197,7 @@ class _TranslationsLibrariesGroupingsZh implements TranslationsLibrariesGrouping final TranslationsZh _root; // ignore: unused_field // Translations + @override String get title => '分组'; @override String get all => '全部'; @override String get movies => '电影'; @override String get shows => '剧集'; @@ -1779,6 +1780,7 @@ extension on TranslationsZh { 'libraries.tabs.browse' => '浏览', 'libraries.tabs.collections' => '合集', 'libraries.tabs.playlists' => '播放列表', + 'libraries.groupings.title' => '分组', 'libraries.groupings.all' => '全部', 'libraries.groupings.movies' => '电影', 'libraries.groupings.shows' => '剧集', @@ -1820,9 +1822,9 @@ extension on TranslationsZh { 'liveTv.nowPlaying' => '正在播放', 'liveTv.noPrograms' => '没有可用的节目数据', 'liveTv.channelNumber' => ({required Object number}) => '频道 ${number}', - 'liveTv.live' => '直播', _ => null, } ?? switch (path) { + 'liveTv.live' => '直播', 'liveTv.hd' => '高清', 'liveTv.premiere' => '新', 'liveTv.reloadGuide' => '重新加载节目指南', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index c8453603..841970ae 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -519,6 +519,7 @@ "playlists": "Spellistor" }, "groupings": { + "title": "Gruppering", "all": "Alla", "movies": "Filmer", "shows": "Serier", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 11ca1113..54816f3e 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -519,6 +519,7 @@ "playlists": "播放列表" }, "groupings": { + "title": "分组", "all": "全部", "movies": "电影", "shows": "剧集", diff --git a/lib/screens/libraries/tabs/library_browse_tab.dart b/lib/screens/libraries/tabs/library_browse_tab.dart index a2afc36c..214b2b72 100644 --- a/lib/screens/libraries/tabs/library_browse_tab.dart +++ b/lib/screens/libraries/tabs/library_browse_tab.dart @@ -27,6 +27,8 @@ import '../../../mixins/library_tab_focus_mixin.dart'; import '../folder_tree_view.dart'; import '../filters_bottom_sheet.dart'; import '../sort_bottom_sheet.dart'; +import '../../../widgets/app_icon.dart'; +import '../../../widgets/focusable_list_tile.dart'; import '../state_messages.dart'; import '../../../services/storage_service.dart'; import '../../../services/settings_service.dart' show ViewMode, EpisodePosterMode; @@ -609,49 +611,54 @@ class _LibraryBrowseTabState extends BaseLibraryTabState( - groupValue: pendingGrouping, - onChanged: (value) { - if (value == null) return; - setSheetState(() { - pendingGrouping = value; - }); - }, - child: ListView.builder( - shrinkWrap: true, - itemCount: options.length, - itemBuilder: (context, index) { - final grouping = options[index]; - return RadioListTile( - title: Text(_getGroupingLabel(grouping)), - value: grouping, - ); - }, - ), - ); - }, - ); - }, - ) - .then((_) { - if (!mounted) return; - if (pendingGrouping == _selectedGrouping) return; - setState(() { - _selectedGrouping = pendingGrouping; - }); - StorageService.getInstance().then((storage) { - storage.saveLibraryGrouping(widget.library.globalKey, pendingGrouping); - }); - _loadItems(); - _loadFirstCharacters(); - }); + final options = _getGroupingOptions(); + final controller = OverlaySheetController.of(context); + controller.show( + showDragHandle: true, + builder: (sheetContext) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(16, 4, 16, 8), + child: Text( + t.libraries.groupings.title, + style: Theme.of(sheetContext).textTheme.titleMedium, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Flexible( + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: options.map((grouping) { + final isSelected = _selectedGrouping == grouping; + return FocusableListTile( + dense: true, + leading: AppIcon( + isSelected ? Symbols.radio_button_checked_rounded : Symbols.radio_button_unchecked_rounded, + fill: 1, + ), + title: Text(_getGroupingLabel(grouping)), + onTap: () => controller.close(grouping), + ); + }).toList(), + ), + ), + ), + ], + ), + ).then((value) { + if (!mounted || value == null || value == _selectedGrouping) return; + setState(() { + _selectedGrouping = value; + }); + StorageService.getInstance().then((storage) { + storage.saveLibraryGrouping(widget.library.globalKey, value); + }); + _loadItems(); + _loadFirstCharacters(); + }); } void _showFiltersBottomSheet() {