Skip to content

Commit

Permalink
Split ZmqSpMsPlayerService, add FormFactor, add sidebar
Browse files Browse the repository at this point in the history
  • Loading branch information
toasterofbread committed Dec 5, 2023
1 parent 601fb82 commit b65cb85
Show file tree
Hide file tree
Showing 41 changed files with 760 additions and 439 deletions.
2 changes: 1 addition & 1 deletion ComposeKit
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import androidx.compose.ui.unit.dp
import com.toasterofbread.spmp.model.mediaitem.MediaItem
import com.toasterofbread.spmp.model.mediaitem.MediaItemData
import com.toasterofbread.spmp.platform.AppContext
import com.toasterofbread.spmp.platform.isLargeFormFactor
import com.toasterofbread.spmp.platform.form_factor
import com.toasterofbread.spmp.resources.uilocalisation.LocalisedString
import com.toasterofbread.spmp.ui.component.mediaitemlayout.MediaItemGrid
import com.toasterofbread.spmp.ui.component.mediaitemlayout.MediaItemList
Expand All @@ -23,7 +23,7 @@ import com.toasterofbread.spmp.youtubeapi.RadioBuilderModifier

@Composable
fun getDefaultMediaItemPreviewSize(): DpSize =
if (LocalPlayerState.current.isLargeFormFactor()) DpSize(180.dp, 200.dp)
if (LocalPlayerState.current.form_factor.is_large) DpSize(180.dp, 200.dp)
else DpSize(100.dp, 120.dp)

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ data object YoutubeAuthSettings: SettingsCategory("ytauth") {
override fun getTitleItem(context: AppContext): SettingsItem? =
getYtmAuthItem(
context,
SettingsValueState<Set<String>>(Key.YTM_AUTH.getName())
.init(context.getPrefs(), Settings::provideDefault),
SettingsValueState<Set<String>>(Key.YTM_AUTH.getName()).init(context.getPrefs(), Settings::provideDefault),
true
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import com.google.gson.GsonBuilder
import com.google.gson.TypeAdapter
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonWriter
import com.toasterofbread.composekit.platform.Platform
import com.toasterofbread.composekit.platform.PlatformContext
import com.toasterofbread.composekit.platform.PlatformPreferences
import com.toasterofbread.composekit.platform.PlatformPreferencesListener
Expand All @@ -32,8 +31,6 @@ import com.toasterofbread.spmp.ui.layout.apppage.mainpage.PlayerState
import com.toasterofbread.spmp.youtubeapi.YoutubeApi
import java.util.Locale

private const val MIN_PORTRAIT_RATIO: Float = 1f / 1.2f

internal class ThemeImpl(private val context: AppContext): Theme(getString("theme_title_system")) {
private val gson: Gson
get() = GsonBuilder().let { builder ->
Expand Down Expand Up @@ -119,21 +116,10 @@ expect class AppContext: PlatformContext {
fun getPrefs(): PlatformPreferences
}

fun PlayerState.isPortrait(): Boolean {
return (screen_size.width / screen_size.height) <= MIN_PORTRAIT_RATIO
}

fun PlayerState.isLargeFormFactor(): Boolean {
return when (Platform.current) {
Platform.ANDROID -> false
Platform.DESKTOP -> screen_size.width >= 500.dp && screen_size.height >= 500.dp
}
}

@Composable
fun PlayerState.getDefaultHorizontalPadding(): Dp = if (isLargeFormFactor()) 30.dp else 10.dp
fun PlayerState.getDefaultHorizontalPadding(): Dp = if (form_factor.is_large) 30.dp else 10.dp
@Composable
fun PlayerState.getDefaultVerticalPadding(): Dp = if (isLargeFormFactor()) 30.dp else 10.dp // TODO
fun PlayerState.getDefaultVerticalPadding(): Dp = if (form_factor.is_large) 30.dp else 10.dp // TODO

@Composable
fun PlayerState.getDefaultPaddingValues(): PaddingValues = PaddingValues(horizontal = getDefaultHorizontalPadding(), vertical = getDefaultVerticalPadding())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.toasterofbread.spmp.platform

import com.toasterofbread.composekit.platform.Platform
import com.toasterofbread.spmp.ui.layout.apppage.mainpage.PlayerState

private const val MIN_PORTRAIT_RATIO: Float = 1f / 2f

enum class FormFactor {
PORTRAIT,
LANDSCAPE,
DESKTOP;

val is_large: Boolean get() = this != PORTRAIT
}

val PlayerState.form_factor: FormFactor
get() {
if (isPortrait()) {
return FormFactor.PORTRAIT
}

return when (Platform.current) {
Platform.ANDROID -> FormFactor.LANDSCAPE
Platform.DESKTOP -> FormFactor.DESKTOP
}
}

private fun PlayerState.isPortrait(): Boolean =
(screen_size.width / screen_size.height) <= MIN_PORTRAIT_RATIO
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import com.toasterofbread.spmp.model.mediaitem.playlist.LocalPlaylistDefaultThum
import com.toasterofbread.spmp.model.mediaitem.playlist.LocalPlaylistRef
import com.toasterofbread.spmp.model.mediaitem.playlist.Playlist
import com.toasterofbread.spmp.ui.layout.apppage.mainpage.PlayerState
import kotlinx.coroutines.CoroutineScope

private suspend inline fun MediaItem.loadThumb(
player: PlayerState,
Expand Down Expand Up @@ -74,9 +75,9 @@ fun MediaItem.Thumbnail(
) {
require(this !is LocalPlaylistRef) { "LocalPlaylistRef must be loaded and passed as a LocalPlaylistData" }

val player = LocalPlayerState.current
var loading by remember { mutableStateOf(true) }
val coroutine_scope = rememberCoroutineScope()
val player: PlayerState = LocalPlayerState.current
var loading: Boolean by remember { mutableStateOf(true) }
val coroutine_scope: CoroutineScope = rememberCoroutineScope()

val custom_image_url: State<String?>? = (this as? Playlist)?.CustomImageUrl?.observe(player.database)
val thumbnail_provider: MediaItemThumbnailProvider? by ThumbnailProvider.observe(player.database)
Expand All @@ -85,7 +86,7 @@ fun MediaItem.Thumbnail(
provider_override ?: custom_image_url?.value?.let { MediaItemThumbnailProvider.fromImageUrl(it) } ?: thumbnail_provider

var image: Pair<ImageBitmap, Quality>? by remember(id) {
val provider = getThumbnailProvider()
val provider: MediaItemThumbnailProvider? = getThumbnailProvider()
if (provider != null) {
for (quality in Quality.byQuality(target_quality)) {
val loaded_image = MediaItemThumbnailLoader.getLoadedItemThumbnail(this@Thumbnail, quality, provider)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ import com.toasterofbread.spmp.model.mediaitem.layout.getDefaultMediaItemPreview
import com.toasterofbread.spmp.model.mediaitem.layout.getMediaItemPreviewSquareAdditionalHeight
import com.toasterofbread.spmp.model.mediaitem.layout.shouldShowTitleBar
import com.toasterofbread.spmp.model.mediaitem.rememberFilteredItems
import com.toasterofbread.spmp.platform.isLargeFormFactor
import com.toasterofbread.spmp.platform.form_factor
import com.toasterofbread.spmp.resources.uilocalisation.LocalisedString
import com.toasterofbread.spmp.ui.component.mediaitempreview.MEDIA_ITEM_PREVIEW_LONG_HEIGHT_DP
import com.toasterofbread.spmp.ui.component.mediaitempreview.MEDIA_ITEM_PREVIEW_SQUARE_LINE_HEIGHT_SP
Expand Down Expand Up @@ -119,7 +119,7 @@ fun MediaItemGrid(
val expanded_row_count: Int = rows?.second ?: row_count

val item_spacing: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(
(if (alt_style) 7.dp else 15.dp) * (if (player.isLargeFormFactor()) 3f else 1f)
(if (alt_style) 7.dp else 15.dp) * (if (player.form_factor.is_large) 3f else 1f)
)
val item_size: DpSize =
if (alt_style) DpSize(0.dp, MEDIA_ITEM_PREVIEW_LONG_HEIGHT_DP.dp)
Expand Down Expand Up @@ -186,7 +186,7 @@ fun MediaItemGrid(
val item = filtered_items[i].item
val preview_modifier = Modifier.animateItemPlacement().then(
if (alt_style)
if (player.isLargeFormFactor()) Modifier.width(300.dp)
if (player.form_factor.is_large) Modifier.width(300.dp)
else Modifier.width(maxWidth * 0.9f)
else Modifier.size(item_size)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,8 @@ import com.toasterofbread.spmp.model.mediaitem.playlist.PlaylistFileConverter
import com.toasterofbread.spmp.model.mediaitem.song.Song
import com.toasterofbread.spmp.platform.AppContext
import com.toasterofbread.spmp.platform.download.DownloadStatus
import com.toasterofbread.spmp.platform.download.PlayerDownloadManager
import com.toasterofbread.spmp.platform.isLargeFormFactor
import com.toasterofbread.spmp.platform.download.rememberDownloadStatus
import com.toasterofbread.spmp.platform.form_factor
import com.toasterofbread.spmp.resources.getString
import com.toasterofbread.spmp.ui.component.Thumbnail
import com.toasterofbread.spmp.ui.component.longpressmenu.LongPressMenuData
Expand All @@ -61,9 +60,9 @@ import com.toasterofbread.spmp.ui.component.multiselect.MediaItemMultiSelectCont
import com.toasterofbread.spmp.ui.layout.apppage.mainpage.PlayerState

val MEDIA_ITEM_PREVIEW_LONG_HEIGHT_DP: Float
@Composable get() = if (LocalPlayerState.current.isLargeFormFactor()) 100f else 50f
@Composable get() = if (LocalPlayerState.current.form_factor.is_large) 100f else 50f
val MEDIA_ITEM_PREVIEW_SQUARE_FONT_SIZE_SP: Float
@Composable get() = if (LocalPlayerState.current.isLargeFormFactor()) 15f else 12f
@Composable get() = if (LocalPlayerState.current.form_factor.is_large) 15f else 12f

const val MEDIA_ITEM_PREVIEW_SQUARE_LINE_HEIGHT_SP: Float = 20f
private const val INFO_SPLITTER: String = "\u2022"
Expand Down Expand Up @@ -171,7 +170,7 @@ fun MediaItemPreviewSquare(
}

val item_title: String? by loaded_item.observeActiveTitle()
val max_lines: Int = max_text_rows ?: if (player.isLargeFormFactor()) 2 else 1
val max_lines: Int = max_text_rows ?: if (player.form_factor.is_large) 2 else 1

Text(
item_title ?: "",
Expand All @@ -181,7 +180,7 @@ fun MediaItemPreviewSquare(
lineHeight = line_height,
maxLines = max_lines,
overflow = if (max_lines == 1) TextOverflow.Ellipsis else TextOverflow.Clip,
textAlign = if (player.isLargeFormFactor()) TextAlign.Start else TextAlign.Center
textAlign = if (player.form_factor.is_large) TextAlign.Start else TextAlign.Center
)

val download_status: DownloadStatus? by (loaded_item as? Song)?.rememberDownloadStatus()
Expand Down Expand Up @@ -210,7 +209,7 @@ fun MediaItemPreviewLong(
show_artist: Boolean = true,
show_download_indicator: Boolean = true,
title_lines: Int = 1,
font_size: TextUnit = if (LocalPlayerState.current.isLargeFormFactor()) 20.sp else 15.sp,
font_size: TextUnit = if (LocalPlayerState.current.form_factor.is_large) 20.sp else 15.sp,
getExtraInfo: (@Composable () -> List<String>)? = null,
multiselect_context: MediaItemMultiSelectContext? = null,
multiselect_key: Int? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
import com.toasterofbread.spmp.model.mediaitem.enums.MediaItemType
import com.toasterofbread.spmp.platform.isLargeFormFactor
import com.toasterofbread.spmp.platform.form_factor

fun getSongThumbShape(): Shape =
if (SpMp.player_state.isLargeFormFactor()) RoundedCornerShape(4.dp)
if (SpMp.player_state.form_factor.is_large) RoundedCornerShape(4.dp)
else RoundedCornerShape(10.dp)
fun getArtistThumbShape(): Shape = RoundedCornerShape(50)
fun getPlaylistThumbShape(): Shape = RoundedCornerShape(10.dp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.toasterofbread.composekit.platform.composable.ScrollBarLazyRow
import com.toasterofbread.spmp.model.mediaitem.MediaItemHolder
import com.toasterofbread.spmp.platform.isLargeFormFactor
import com.toasterofbread.spmp.platform.form_factor
import com.toasterofbread.spmp.ui.component.multiselect.MediaItemMultiSelectContext

abstract class AppPageWithItem : AppPage() {
Expand All @@ -26,39 +26,13 @@ abstract class AppPage {
abstract val state: AppPageState

@Composable
fun ColumnScope.Page(
multiselect_context: MediaItemMultiSelectContext,
modifier: Modifier,
content_padding: PaddingValues,
close: () -> Unit
) {
val player = LocalPlayerState.current
if (player.isLargeFormFactor()) {
LFFPage(multiselect_context, modifier, content_padding, close)
}
else {
SFFPage(multiselect_context, modifier, content_padding, close)
}
}

@Composable
abstract fun ColumnScope.SFFPage(
abstract fun ColumnScope.Page(
multiselect_context: MediaItemMultiSelectContext,
modifier: Modifier,
content_padding: PaddingValues,
close: () -> Unit
)

@Composable
open fun ColumnScope.LFFPage(
multiselect_context: MediaItemMultiSelectContext,
modifier: Modifier,
content_padding: PaddingValues,
close: () -> Unit
) {
SFFPage(multiselect_context, modifier, content_padding, close)
}

@Composable
open fun showTopBar() = false

Expand Down
Loading

0 comments on commit b65cb85

Please sign in to comment.