Skip to content

Commit d2609d4

Browse files
feat: support more sorting methods for playlists
1 parent 9bcb751 commit d2609d4

File tree

14 files changed

+119
-26
lines changed

14 files changed

+119
-26
lines changed

android/src/main/kotlin/project/pipepipe/app/ui/screens/playlistdetail/PlaylistContent.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import project.pipepipe.app.ui.component.ErrorComponent
3434
import project.pipepipe.app.ui.item.CommonItem
3535
import project.pipepipe.app.ui.item.DisplayType
3636
import project.pipepipe.app.ui.viewmodel.PlaylistDetailViewModel
37+
import project.pipepipe.app.uistate.PlaylistSortMode
3738
import project.pipepipe.app.uistate.PlaylistType
3839
import project.pipepipe.app.uistate.PlaylistUiState
3940
import sh.calvin.reorderable.ReorderableItem
@@ -166,7 +167,8 @@ fun PlaylistContent(
166167
item = streamItem,
167168
isGridLayout = true,
168169
isDragging = isDragging,
169-
showDragHandle = uiState.playlistType == PlaylistType.LOCAL && !isSearchActive,
170+
showDragHandle = uiState.playlistType == PlaylistType.LOCAL && !isSearchActive
171+
&& uiState.sortMode in listOf(PlaylistSortMode.ORIGIN, PlaylistSortMode.ORIGIN_REVERSE),
170172
showNewItemBorder = uiState.playlistType == PlaylistType.FEED && streamItem.isNew,
171173
onClick = {
172174
focusManager.clearFocus()
@@ -295,7 +297,8 @@ fun PlaylistContent(
295297
CommonItem(
296298
item = streamItem,
297299
isDragging = isDragging,
298-
showDragHandle = uiState.playlistType == PlaylistType.LOCAL && !isSearchActive,
300+
showDragHandle = uiState.playlistType == PlaylistType.LOCAL && !isSearchActive
301+
&& uiState.sortMode in listOf(PlaylistSortMode.ORIGIN, PlaylistSortMode.ORIGIN_REVERSE),
299302
showNewItemBorder = uiState.playlistType == PlaylistType.FEED && streamItem.isNew,
300303
onClick = {
301304
focusManager.clearFocus()

android/src/main/kotlin/project/pipepipe/app/ui/screens/playlistdetail/PlaylistDetailScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,8 @@ fun PlaylistDetailScreen(
372372
)
373373
}
374374
}
375-
if (uiState.playlistType == PlaylistType.LOCAL) {
375+
if (uiState.playlistType == PlaylistType.LOCAL ||
376+
(uiState.playlistType == PlaylistType.REMOTE && url.getType() != "trending")) {
376377
SortMenuButton(
377378
currentSortMode = uiState.sortMode,
378379
onSortModeChange = { viewModel.updateSortMode(it) }

android/src/main/kotlin/project/pipepipe/app/ui/screens/playlistdetail/PlaylistMenus.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,46 @@ fun SortMenuButton(
5555
{ Icon(Icons.Default.Check, contentDescription = null) }
5656
} else null
5757
)
58+
DropdownMenuItem(
59+
text = { Text(MR.strings.sort_upload_time_ascending.desc().toString(context = context)) },
60+
onClick = {
61+
onSortModeChange(PlaylistSortMode.UPLOAD_TIME_ASCENDING)
62+
showSortMenu = false
63+
},
64+
leadingIcon = if (currentSortMode == PlaylistSortMode.UPLOAD_TIME_ASCENDING) {
65+
{ Icon(Icons.Default.Check, contentDescription = null) }
66+
} else null
67+
)
68+
DropdownMenuItem(
69+
text = { Text(MR.strings.sort_upload_time_descending.desc().toString(context = context)) },
70+
onClick = {
71+
onSortModeChange(PlaylistSortMode.UPLOAD_TIME_DESCENDING)
72+
showSortMenu = false
73+
},
74+
leadingIcon = if (currentSortMode == PlaylistSortMode.UPLOAD_TIME_DESCENDING) {
75+
{ Icon(Icons.Default.Check, contentDescription = null) }
76+
} else null
77+
)
78+
DropdownMenuItem(
79+
text = { Text(MR.strings.sort_duration_ascending.desc().toString(context = context)) },
80+
onClick = {
81+
onSortModeChange(PlaylistSortMode.DURATION_ASCENDING)
82+
showSortMenu = false
83+
},
84+
leadingIcon = if (currentSortMode == PlaylistSortMode.DURATION_ASCENDING) {
85+
{ Icon(Icons.Default.Check, contentDescription = null) }
86+
} else null
87+
)
88+
DropdownMenuItem(
89+
text = { Text(MR.strings.sort_duration_descending.desc().toString(context = context)) },
90+
onClick = {
91+
onSortModeChange(PlaylistSortMode.DURATION_DESCENDING)
92+
showSortMenu = false
93+
},
94+
leadingIcon = if (currentSortMode == PlaylistSortMode.DURATION_DESCENDING) {
95+
{ Icon(Icons.Default.Check, contentDescription = null) }
96+
} else null
97+
)
5898
}
5999
}
60100
}

library/src/commonMain/kotlin/project/pipepipe/app/uistate/BaseUiState.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ data class ChannelUiState(
122122

123123
enum class PlaylistSortMode{
124124
ORIGIN,
125-
ORIGIN_REVERSE
125+
ORIGIN_REVERSE,
126+
UPLOAD_TIME_ASCENDING,
127+
UPLOAD_TIME_DESCENDING,
128+
DURATION_ASCENDING,
129+
DURATION_DESCENDING
126130
}
127131
enum class PlaylistType {
128132
LOCAL,

library/src/commonMain/kotlin/project/pipepipe/app/viewmodel/PlaylistDetailViewModel.kt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ class PlaylistDetailViewModel : BaseViewModel<PlaylistUiState>(PlaylistUiState()
202202
rawItems
203203
}
204204

205+
val sortMode = runCatching{ PlaylistSortMode.valueOf(SharedContext.settingsManager.getString("playlist_sort_mode_key")) }
206+
.getOrDefault(PlaylistSortMode.ORIGIN)
205207
setState {
206208
it.copy(
207209
common = it.common.copy(
@@ -214,9 +216,12 @@ class PlaylistDetailViewModel : BaseViewModel<PlaylistUiState>(PlaylistUiState()
214216
itemList = items,
215217
nextPageUrl = result.pagedData?.nextPageUrl
216218
),
217-
displayItems = items
219+
sortMode = sortMode
218220
)
219221
}
222+
setState {
223+
it.copy(displayItems = sortedItems)
224+
}
220225
}
221226

222227
suspend fun loadRemotePlaylistMoreItems(serviceId: String) {
@@ -272,10 +277,10 @@ class PlaylistDetailViewModel : BaseViewModel<PlaylistUiState>(PlaylistUiState()
272277
list = it.list.copy(
273278
itemList = finalList,
274279
nextPageUrl = result.pagedData?.nextPageUrl
275-
),
276-
displayItems = finalList
280+
)
277281
)
278282
}
283+
updateDisplayItems()
279284

280285
}
281286

@@ -340,7 +345,7 @@ class PlaylistDetailViewModel : BaseViewModel<PlaylistUiState>(PlaylistUiState()
340345
val totalItems = state.list.itemList.size
341346
return when (state.sortMode) {
342347
PlaylistSortMode.ORIGIN_REVERSE -> totalItems - 1 - actualIndex
343-
PlaylistSortMode.ORIGIN -> actualIndex
348+
else -> actualIndex
344349
}
345350
}
346351
fun StreamInfo.matchFilter(query: String): Boolean {
@@ -354,6 +359,10 @@ class PlaylistDetailViewModel : BaseViewModel<PlaylistUiState>(PlaylistUiState()
354359
return when (uiState.value.sortMode) {
355360
PlaylistSortMode.ORIGIN -> uiState.value.list.itemList
356361
PlaylistSortMode.ORIGIN_REVERSE -> uiState.value.list.itemList.reversed()
362+
PlaylistSortMode.UPLOAD_TIME_ASCENDING -> uiState.value.list.itemList.sortedBy { it.uploadDate ?: Long.MAX_VALUE }
363+
PlaylistSortMode.UPLOAD_TIME_DESCENDING -> uiState.value.list.itemList.sortedByDescending { it.uploadDate ?: Long.MIN_VALUE }
364+
PlaylistSortMode.DURATION_ASCENDING -> uiState.value.list.itemList.sortedBy { it.duration ?: Long.MAX_VALUE }
365+
PlaylistSortMode.DURATION_DESCENDING -> uiState.value.list.itemList.sortedByDescending { it.duration ?: Long.MIN_VALUE }
357366
}
358367
}
359368

library/src/commonMain/moko-resources/base/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,12 @@
6868
<string name="sort">Sort</string>
6969
<string name="playlist_action_more">More</string>
7070
<string name="play_all">Play All</string>
71-
<string name="sort_origin">Original</string>
72-
<string name="sort_origin_reverse">Original (Reverse)</string>
71+
<string name="sort_origin">Adding time (Ascending)</string>
72+
<string name="sort_origin_reverse">Adding time (Descending)</string>
73+
<string name="sort_upload_time_ascending">Upload Time (Ascending)</string>
74+
<string name="sort_upload_time_descending">Upload Time (Descending)</string>
75+
<string name="sort_duration_ascending">Duration (Ascending)</string>
76+
<string name="sort_duration_descending">Duration (Descending)</string>
7377
<string name="playlist_menu_rename">Rename Playlist</string>
7478
<string name="playlist_menu_delete">Delete Playlist</string>
7579
<string name="playlist_menu_pin">Pin to DashBoard</string>

library/src/commonMain/moko-resources/de/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
<string name="clear">Löschen</string>
2424
<string name="sort">Sortieren</string>
2525
<string name="play_all">Alle abspielen</string>
26-
<string name="sort_origin">Original</string>
27-
<string name="sort_origin_reverse">Original (umgekehrt)</string>
26+
<string name="sort_origin">Hinzufügezeit (Aufsteigend)</string>
27+
<string name="sort_origin_reverse">Hinzufügezeit (Absteigend)</string>
2828
<string name="delete">Löschen</string>
2929
<string name="error_snackbar_message">Entschuldigung, etwas ist schiefgelaufen.</string>
3030
<string name="error_snackbar_action">Melden</string>
@@ -494,4 +494,8 @@
494494
<string name="download_paused_status">Pausiert</string>
495495
<string name="no_downloads">Keine Downloads</string>
496496
<string name="download_select_audio_format">Audioformat auswählen</string>
497+
<string name="sort_duration_ascending">Dauer (Aufsteigend)</string>
498+
<string name="sort_upload_time_ascending">Upload-Zeit (Aufsteigend)</string>
499+
<string name="sort_upload_time_descending">Upload-Zeit (Absteigend)</string>
500+
<string name="sort_duration_descending">Dauer (Absteigend)</string>
497501
</resources>

library/src/commonMain/moko-resources/es/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
<string name="clear">Limpiar</string>
2424
<string name="sort">Ordenar</string>
2525
<string name="play_all">Reproducir todo</string>
26-
<string name="sort_origin">Original-es</string>
27-
<string name="sort_origin_reverse">Original (reverse-es)</string>
26+
<string name="sort_origin">Tiempo de adición (Ascendente)</string>
27+
<string name="sort_origin_reverse">Tiempo de adición (Descendente)</string>
2828
<string name="delete">Eliminar</string>
2929
<string name="error_snackbar_message">Lo siento, algo salió mal.</string>
3030
<string name="error_snackbar_action">Reportar</string>
@@ -494,4 +494,8 @@
494494
<string name="download_paused_status">Pausado</string>
495495
<string name="no_downloads">No hay descargas</string>
496496
<string name="download_select_audio_format">Seleccionar formato de audio</string>
497+
<string name="sort_duration_ascending">Duración (Ascendente)</string>
498+
<string name="sort_upload_time_ascending">Tiempo de subida (Ascendente)</string>
499+
<string name="sort_upload_time_descending">Tiempo de subida (Descendente)</string>
500+
<string name="sort_duration_descending">Duración (Descendente)</string>
497501
</resources>

library/src/commonMain/moko-resources/fr/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
<string name="clear">Effacer</string>
2424
<string name="sort">Trier</string>
2525
<string name="play_all">Tout lire</string>
26-
<string name="sort_origin">Original</string>
27-
<string name="sort_origin_reverse">Original (inversé)</string>
26+
<string name="sort_origin">Heure d\'ajout (Croissant)</string>
27+
<string name="sort_origin_reverse">Heure d\'ajout (Décroissant)</string>
2828
<string name="delete">Supprimer</string>
2929
<string name="error_snackbar_message">Désolé, quelque chose a mal tourné.</string>
3030
<string name="error_snackbar_action">Signaler</string>
@@ -494,4 +494,8 @@
494494
<string name="download_paused_status">En pause</string>
495495
<string name="no_downloads">Aucun téléchargement</string>
496496
<string name="download_select_audio_format">Sélectionner le format audio</string>
497+
<string name="sort_duration_ascending">Durée (Croissant)</string>
498+
<string name="sort_upload_time_ascending">Heure de téléchargement (Croissant)</string>
499+
<string name="sort_upload_time_descending">Heure de téléchargement (Décroissant)</string>
500+
<string name="sort_duration_descending">Durée (Décroissant)</string>
497501
</resources>

library/src/commonMain/moko-resources/it/strings.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
<string name="clear">Cancella</string>
2424
<string name="sort">Ordina</string>
2525
<string name="play_all">Riproduci tutto</string>
26-
<string name="sort_origin">Originale</string>
27-
<string name="sort_origin_reverse">Originale (invertito)</string>
26+
<string name="sort_origin">Ora di aggiunta (crescente)</string>
27+
<string name="sort_origin_reverse">Ora di aggiunta (decrescente)</string>
2828
<string name="delete">Elimina</string>
2929
<string name="error_snackbar_message">Ci scusiamo, qualcosa è andato storto.</string>
3030
<string name="error_snackbar_action">Segnala</string>
@@ -494,4 +494,8 @@
494494
<string name="download_paused_status">In pausa</string>
495495
<string name="no_downloads">Nessun download</string>
496496
<string name="download_select_audio_format">Seleziona formato audio</string>
497+
<string name="sort_duration_ascending">Durata (Crescente)</string>
498+
<string name="sort_upload_time_ascending">Ora di caricamento (Crescente)</string>
499+
<string name="sort_upload_time_descending">Ora di caricamento (Decrescente)</string>
500+
<string name="sort_duration_descending">Durata (Decrescente)</string>
497501
</resources>

0 commit comments

Comments
 (0)