diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_canva_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_canva_24dp.xml new file mode 100644 index 0000000..d5f7ce0 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/drawable/ic_canva_24dp.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_tiddlywiki_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_tiddlywiki_24dp.xml new file mode 100644 index 0000000..17bda21 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/drawable/ic_tiddlywiki_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 4e5d68a..2af9d3a 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -57,6 +57,11 @@ Spécial Critique + Ressources + Table de jeu + Règles de jeu + Carte du monde + Création de personnage Édition de personnage Identifiant du personnage diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/App.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/App.kt index acd03fc..c9c4fb8 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/App.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/App.kt @@ -1,8 +1,5 @@ package com.pixelized.desktop.lwa -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.ButtonDefaults import androidx.compose.material.MaterialTheme @@ -13,13 +10,11 @@ import androidx.compose.material.SnackbarDefaults import androidx.compose.material.SnackbarDuration import androidx.compose.material.SnackbarHost import androidx.compose.material.SnackbarHostState -import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember @@ -48,13 +43,10 @@ import com.pixelized.desktop.lwa.ui.navigation.window.WindowsNavHost import com.pixelized.desktop.lwa.ui.navigation.window.destination.CharacterSheetEditWindow import com.pixelized.desktop.lwa.ui.navigation.window.destination.CharacterSheetWindow import com.pixelized.desktop.lwa.ui.navigation.window.destination.GameMasterWindow -import com.pixelized.desktop.lwa.ui.navigation.window.destination.RollHistoryWindow import com.pixelized.desktop.lwa.ui.navigation.window.rememberMaxWindowHeight import com.pixelized.desktop.lwa.ui.overlay.roll.RollHostState import com.pixelized.desktop.lwa.ui.screen.characterSheet.CharacterSheetMainNavHost import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterNavHost -import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterScreen -import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryPage import com.pixelized.desktop.lwa.ui.theme.LwaTheme import com.pixelized.desktop.lwa.utils.InstallCoil import kotlinx.coroutines.launch @@ -182,8 +174,6 @@ private fun WindowsHandler( ), ) - is RollHistoryWindow -> RollHistoryPage() - is GameMasterWindow -> LwaScaffold { GameMasterNavHost() } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt index 543ac83..79f614f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt @@ -33,8 +33,8 @@ import com.pixelized.desktop.lwa.ui.composable.character.purse.PurseDialogFactor import com.pixelized.desktop.lwa.ui.composable.character.purse.PurseDialogViewModel import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlayViewModel import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel -import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory -import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkViewModel +import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.network.NetworkFactory +import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.network.NetworkViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.CharacterRibbonFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.sheet.CharacterDetailSheetFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanelViewModel @@ -45,6 +45,7 @@ import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerR import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.text.TextMessageFactory import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbarViewModel +import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.links.ResourcesViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetFactory import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditFactory @@ -69,7 +70,6 @@ import com.pixelized.desktop.lwa.ui.screen.gamemaster.item.list.GMItemFactory import com.pixelized.desktop.lwa.ui.screen.gamemaster.item.list.GMItemViewModel import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpFactory import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpViewModel -import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryViewModel import com.pixelized.desktop.lwa.ui.screen.settings.SettingsViewModel import com.pixelized.desktop.lwa.usecase.SettingsUseCase import com.pixelized.shared.lwa.model.campaign.factory.CampaignJsonFactory @@ -176,10 +176,10 @@ val viewModelDependencies get() = module { viewModelOf(::DataSyncViewModel) viewModelOf(::CampaignToolbarViewModel) + viewModelOf(::ResourcesViewModel) viewModelOf(::CharacterSheetViewModel) viewModelOf(::CharacterSheetEditViewModel) viewModelOf(::RollViewModel) - viewModelOf(::RollHistoryViewModel) viewModelOf(::NetworkViewModel) viewModelOf(::PlayerRibbonViewModel) viewModelOf(::NpcRibbonViewModel) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/window/destination/RollHistoryWindow.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/window/destination/RollHistoryWindow.kt deleted file mode 100644 index 9a352be..0000000 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/window/destination/RollHistoryWindow.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.pixelized.desktop.lwa.ui.navigation.window.destination - -import androidx.compose.runtime.Stable -import androidx.compose.ui.unit.DpSize -import androidx.compose.ui.unit.dp -import com.pixelized.desktop.lwa.ui.navigation.window.WindowController - -@Stable -class RollHistoryWindow( - title: String, - size: DpSize, -) : Window( - title = title, - size = size, -) - -fun WindowController.navigateToRollHistory( - title: String = "", -) { - showWindow( - window = RollHistoryWindow( - title = title, - size = DpSize( - width = 400.dp + 64.dp, - height = maxWindowHeight - 32.dp, - ) - ) - ) -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbar.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbar.kt index aa66eda..e07a816 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbar.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbar.kt @@ -3,18 +3,15 @@ package com.pixelized.desktop.lwa.ui.screen.campaign.toolbar import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.material.TopAppBar -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.MoreVert import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState @@ -29,15 +26,15 @@ import com.pixelized.desktop.lwa.repository.network.NetworkRepository import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController import com.pixelized.desktop.lwa.ui.navigation.screen.destination.navigateToSettings import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToGameMasterWindow -import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToRollHistory -import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkDialog +import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.links.ResourcesMenu +import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.network.NetworkMenu import com.pixelized.desktop.lwa.ui.theme.lwa import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.ic_link_24dp import lwacharactersheet.composeapp.generated.resources.ic_settings_24dp -import lwacharactersheet.composeapp.generated.resources.ic_timeline_24dp import lwacharactersheet.composeapp.generated.resources.ic_wifi_24dp import lwacharactersheet.composeapp.generated.resources.ic_wifi_off_24dp -import lwacharactersheet.composeapp.generated.resources.main_page__roll_history_action +import lwacharactersheet.composeapp.generated.resources.resources__content_descriptions import lwacharactersheet.composeapp.generated.resources.settings__title import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -50,7 +47,7 @@ fun CampaignToolbar( val windows = LocalWindowController.current val screen = LocalScreenController.current - val isOverflowMenuOpen = remember { mutableStateOf(false) } + val isResourcesMenuOpen = remember { mutableStateOf(false) } val isNetworkMenuOpen = remember { mutableStateOf(false) } val title = viewModel.title.collectAsState() @@ -62,29 +59,24 @@ fun CampaignToolbar( status = status, isAdmin = isAdmin, isNetworkMenuOpen = isNetworkMenuOpen, - isOverflowMenuOpen = isOverflowMenuOpen, + isResourcesMenuOpen = isResourcesMenuOpen, onAdmin = { windows.navigateToGameMasterWindow() }, onNetwork = { isNetworkMenuOpen.value = true }, - onOverflow = { - isOverflowMenuOpen.value = true - }, - onRollHistory = { - isOverflowMenuOpen.value = false - windows.navigateToRollHistory() + onResources = { + isResourcesMenuOpen.value = true }, onSettings = { - isOverflowMenuOpen.value = false screen.navigateToSettings() }, onDismissNetworkMenu = { isNetworkMenuOpen.value = false }, - onDismissOverflowMenu = { - isOverflowMenuOpen.value = false + onDismissResourcesMenu = { + isResourcesMenuOpen.value = false }, ) } @@ -96,14 +88,13 @@ private fun CampaignToolbarContent( status: State, isAdmin: State, isNetworkMenuOpen: State, - isOverflowMenuOpen: State, + isResourcesMenuOpen: State, onAdmin: () -> Unit, onNetwork: () -> Unit, - onOverflow: () -> Unit, - onRollHistory: () -> Unit, + onResources: () -> Unit, onSettings: () -> Unit, onDismissNetworkMenu: () -> Unit, - onDismissOverflowMenu: () -> Unit, + onDismissResourcesMenu: () -> Unit, ) { TopAppBar( modifier = modifier, @@ -127,6 +118,15 @@ private fun CampaignToolbarContent( ) } } + IconButton( + onClick = onResources, + ) { + Icon( + painter = painterResource(Res.drawable.ic_link_24dp), + tint = MaterialTheme.colors.primary, + contentDescription = stringResource(Res.string.resources__content_descriptions), + ) + } IconButton( onClick = onNetwork, ) { @@ -145,12 +145,12 @@ private fun CampaignToolbarContent( ) } IconButton( - onClick = onOverflow, + onClick = onSettings, ) { Icon( - imageVector = Icons.Default.MoreVert, + painter = painterResource(Res.drawable.ic_settings_24dp), tint = MaterialTheme.colors.primary, - contentDescription = null, + contentDescription = stringResource(Res.string.settings__title), ) } DropdownMenu( @@ -158,44 +158,19 @@ private fun CampaignToolbarContent( expanded = isNetworkMenuOpen.value, onDismissRequest = onDismissNetworkMenu, content = { - NetworkDialog( + NetworkMenu( modifier = Modifier.size(384.dp + 96.dp, 240.dp), ) }, ) DropdownMenu( - offset = remember { DpOffset(x = (-8).dp, y = 8.dp) }, - expanded = isOverflowMenuOpen.value, - onDismissRequest = onDismissOverflowMenu, + offset = remember { DpOffset(x = -(48.dp + 8.dp), y = 8.dp) }, + expanded = isResourcesMenuOpen.value, + onDismissRequest = onDismissResourcesMenu, content = { - DropdownMenuItem( - onClick = onRollHistory, - ) { - Icon( - painter = painterResource(Res.drawable.ic_timeline_24dp), - tint = MaterialTheme.lwa.colorScheme.base.primary, - contentDescription = null, - ) - Text( - modifier = Modifier.padding(start = 8.dp), - color = MaterialTheme.colors.primary, - text = stringResource(Res.string.main_page__roll_history_action), - ) - } - DropdownMenuItem( - onClick = onSettings, - ) { - Icon( - painter = painterResource(Res.drawable.ic_settings_24dp), - tint = MaterialTheme.lwa.colorScheme.base.primary, - contentDescription = null, - ) - Text( - modifier = Modifier.padding(start = 8.dp), - color = MaterialTheme.colors.primary, - text = stringResource(Res.string.settings__title), - ) - } + ResourcesMenu( + modifier = Modifier.width(384.dp + 96.dp), + ) }, ) }, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/links/ResourcesDialog.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/links/ResourcesDialog.kt new file mode 100644 index 0000000..2defca4 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/links/ResourcesDialog.kt @@ -0,0 +1,138 @@ +package com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.links + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.minimumInteractiveComponentSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.pixelized.desktop.lwa.ui.theme.lwa +import org.jetbrains.compose.resources.DrawableResource +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel + +@Stable +data class ResourcesDialogUio( + val resources: List, +) { + @Stable + data class LinkResource( + val icon: DrawableResource, + val tint: Boolean = false, + val name: StringResource, + val action: () -> Unit, + ) +} + +@Immutable +object ResourcesDialogDefault { + @Stable + val padding: PaddingValues = PaddingValues(vertical = 4.dp, horizontal = 8.dp) + + @Stable + val spacing: Dp = 4.dp +} + +@Immutable +object ResourcesItemDefault { + @Stable + val padding: PaddingValues = PaddingValues(vertical = 2.dp, horizontal = 8.dp) + + @Stable + val shape: Shape = RoundedCornerShape(8.dp) + + @Stable + val spacing: Dp = 8.dp +} + +@Composable +fun ResourcesMenu( + modifier: Modifier = Modifier, + viewModel: ResourcesViewModel = koinViewModel(), +) { + ResourcesContent( + modifier = modifier, + dialog = viewModel.dialog, + ) +} + +@Composable +private fun ResourcesContent( + modifier: Modifier = Modifier, + dialog: ResourcesDialogUio, + padding: PaddingValues = ResourcesDialogDefault.padding, + spacing: Dp = ResourcesDialogDefault.spacing, +) { + Column( + modifier = Modifier.padding(paddingValues = padding).then(other = modifier), + verticalArrangement = Arrangement.spacedBy(space = spacing), + ) { + dialog.resources.forEach { resource -> + ResourcesItem( + resource = resource, + onClick = resource.action, + ) + } + } +} + +@Composable +private fun ResourcesItem( + modifier: Modifier = Modifier, + padding: PaddingValues = ResourcesItemDefault.padding, + spacing: Dp = ResourcesItemDefault.spacing, + shape: Shape = ResourcesItemDefault.shape, + resource: ResourcesDialogUio.LinkResource, + onClick: () -> Unit, +) { + Row( + modifier = Modifier + .clip(shape = shape) + .clickable(onClick = onClick) + .minimumInteractiveComponentSize() + .fillMaxWidth() + .padding(paddingValues = padding) + .then(other = modifier), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(space = spacing), + ) { + Image( + modifier = Modifier.size(size = 24.dp), + colorFilter = when (resource.tint) { + true -> ColorFilter.tint(color = MaterialTheme.lwa.colorScheme.base.primary) + else -> null + }, + painter = painterResource(resource = resource.icon), + contentDescription = null, + ) + Text( + style = MaterialTheme.lwa.typography.base.body1, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.lwa.colorScheme.base.primary, + text = stringResource(resource = resource.name), + ) + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/links/ResourcesViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/links/ResourcesViewModel.kt new file mode 100644 index 0000000..8aa6327 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/links/ResourcesViewModel.kt @@ -0,0 +1,63 @@ +package com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.links + +import androidx.lifecycle.ViewModel +import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.ic_canva_24dp +import lwacharactersheet.composeapp.generated.resources.ic_link_24dp +import lwacharactersheet.composeapp.generated.resources.ic_tiddlywiki_24dp +import lwacharactersheet.composeapp.generated.resources.resources__map_title +import lwacharactersheet.composeapp.generated.resources.resources__rules__title +import lwacharactersheet.composeapp.generated.resources.resources__virtual_table__title +import java.awt.Desktop +import java.net.URI + + +class ResourcesViewModel : ViewModel() { + + val dialog = ResourcesDialogUio( + resources = createResources() + ) + + private fun createResources(): List { + return try { + if (Desktop.isDesktopSupported()) { + val desktop = Desktop.getDesktop() + if (desktop.isSupported(Desktop.Action.BROWSE)) { + listOf( + ResourcesDialogUio.LinkResource( + icon = Res.drawable.ic_canva_24dp, + name = Res.string.resources__virtual_table__title, + action = { desktop.browse(URI.create(CANVA)) }, + ), + ResourcesDialogUio.LinkResource( + icon = Res.drawable.ic_tiddlywiki_24dp, + name = Res.string.resources__rules__title, + action = { desktop.browse(URI.create(TIDDLY)) }, + ), + ResourcesDialogUio.LinkResource( + icon = Res.drawable.ic_link_24dp, + tint = true, + name = Res.string.resources__map_title, + action = { desktop.browse(URI.create(MAP)) }, + ), + ) + } else { + error("Desktop.Action.BROWSE is not supported") + } + } else { + error("Desktop.isDesktopSupported return false") + } + } catch (exception: Exception) { + emptyList() + } + } + + companion object { + private const val CANVA = + "https://www.canva.com/design/DAGSzwpIAAY/1YOfnIiazVWzGbKtzKdu5g/edit" + private const val TIDDLY = + "https://lwa-manuel-pj.tiddlyhost.com/" + private const val MAP = + "https://drive.google.com/file/d/1vuoyk1sfrerkMKtttf7kGPpnHpkjWvl5/view?usp=drive_link" + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkFactory.kt similarity index 91% rename from composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkFactory.kt rename to composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkFactory.kt index 3738445..f53e6b4 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkFactory.kt @@ -1,4 +1,4 @@ -package com.pixelized.desktop.lwa.ui.screen.campaign.network +package com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.network import com.pixelized.desktop.lwa.repository.network.NetworkRepository.Status diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkDialog.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkMenu.kt similarity index 99% rename from composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkDialog.kt rename to composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkMenu.kt index a2a34ea..8c1b044 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkMenu.kt @@ -1,4 +1,4 @@ -package com.pixelized.desktop.lwa.ui.screen.campaign.network +package com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.network import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility @@ -93,7 +93,7 @@ data class NetworkPageUio( } @Composable -fun NetworkDialog( +fun NetworkMenu( modifier: Modifier = Modifier, viewModel: NetworkViewModel = koinViewModel(), ) { diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkViewModel.kt similarity index 98% rename from composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkViewModel.kt rename to composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkViewModel.kt index 0ff50ae..06671b6 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/network/NetworkViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/network/NetworkViewModel.kt @@ -1,4 +1,4 @@ -package com.pixelized.desktop.lwa.ui.screen.campaign.network +package com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.network import androidx.compose.material.SnackbarDuration import androidx.compose.runtime.State diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryItem.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryItem.kt deleted file mode 100644 index 88f2abb..0000000 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryItem.kt +++ /dev/null @@ -1,127 +0,0 @@ -package com.pixelized.desktop.lwa.ui.screen.rollhistory - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Stable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import lwacharactersheet.composeapp.generated.resources.Res -import lwacharactersheet.composeapp.generated.resources.roll_history__item__difficulty -import lwacharactersheet.composeapp.generated.resources.roll_history__item__throw -import org.jetbrains.compose.resources.stringResource - - -@Stable -data class RollHistoryItemUio( - val character: String, - val skillLabel: String, - val rollDifficulty: String?, - val rollValue: Int, - val rollSuccessLimit: Int?, - val resultLabel: String?, -) - -@Composable -fun RollHistoryItem( - modifier: Modifier = Modifier, - roll: RollHistoryItemUio, -) { - Row( - modifier = modifier, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - ) { - Column( - modifier = Modifier.weight(1f) - ) { - Row( - horizontalArrangement = Arrangement.spacedBy(space = 4.dp), - ) { - Text( - modifier = Modifier.alignByBaseline(), - style = MaterialTheme.typography.body1, - fontWeight = FontWeight.Bold, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = roll.character, - ) - Text( - modifier = Modifier.alignByBaseline(), - style = MaterialTheme.typography.caption, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = stringResource(Res.string.roll_history__item__throw), - ) - Text( - modifier = Modifier.alignByBaseline(), - style = MaterialTheme.typography.body1, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = roll.skillLabel, - ) - } - Row( - horizontalArrangement = Arrangement.spacedBy(space = 4.dp), - ) { - roll.rollDifficulty?.let { - Text( - style = MaterialTheme.typography.caption, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = stringResource(Res.string.roll_history__item__difficulty), - ) - Text( - style = MaterialTheme.typography.caption, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = it, - ) - Text( - style = MaterialTheme.typography.caption, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = "-", - ) - } - roll.resultLabel?.let { - Text( - style = MaterialTheme.typography.caption, - fontWeight = FontWeight.Bold, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = it, - ) - } - } - } - Row( - horizontalArrangement = Arrangement.spacedBy(2.dp), - ) { - Text( - modifier = Modifier.alignByBaseline(), - style = MaterialTheme.typography.h5, - fontWeight = FontWeight.Bold, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = "${roll.rollValue}", - ) - roll.rollSuccessLimit?.let { - Text( - modifier = Modifier.alignByBaseline(), - style = MaterialTheme.typography.caption, - fontWeight = FontWeight.Light, - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = "/ $it", - ) - } - } - } -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryPage.kt deleted file mode 100644 index 420aea3..0000000 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryPage.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.pixelized.desktop.lwa.ui.screen.rollhistory - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.Scaffold -import androidx.compose.material.Surface -import androidx.compose.material.Text -import androidx.compose.material.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.runtime.collectAsState -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import lwacharactersheet.composeapp.generated.resources.Res -import lwacharactersheet.composeapp.generated.resources.roll_history__title -import org.jetbrains.compose.resources.stringResource -import org.koin.compose.viewmodel.koinViewModel - - -@Composable -fun RollHistoryPage( - viewModel: RollHistoryViewModel = koinViewModel(), -) { - val rolls = viewModel.rolls.collectAsState() - Surface( - modifier = Modifier.fillMaxSize(), - ) { - RollHistoryContent( - modifier = Modifier.fillMaxSize(), - rolls = rolls, - ) - } -} - -@Composable -private fun RollHistoryContent( - modifier: Modifier = Modifier, - rolls: State>, -) { - Scaffold( - modifier = modifier, - topBar = { - TopAppBar( - title = { - Text( - overflow = TextOverflow.Ellipsis, - maxLines = 1, - text = stringResource(Res.string.roll_history__title), - ) - }, - ) - }, - content = { - val state = rememberLazyListState() - - LazyColumn( - modifier = Modifier.fillMaxSize(), - state = state, - reverseLayout = true, - contentPadding = PaddingValues(all = 24.dp), - verticalArrangement = Arrangement.spacedBy(space = 16.dp) - ) { - items(items = rolls.value) { - RollHistoryItem( - modifier = Modifier.fillMaxWidth(), - roll = it - ) - } - } - } - ) -} - diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt deleted file mode 100644 index 4b31b6a..0000000 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.pixelized.desktop.lwa.ui.screen.rollhistory - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository -import com.pixelized.desktop.lwa.repository.roll_history.RollHistoryRepository -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.stateIn - -class RollHistoryViewModel( - characterRepository: CharacterSheetRepository, - rollRepository: RollHistoryRepository, -) : ViewModel() { - - private var _rolls: List = emptyList() - val rolls = combine( - characterRepository.characterSheetPreviewFlow(), - rollRepository.rolls(), - ) { sheets, message -> - val name = sheets.firstOrNull { it.characterSheetId == message.characterSheetId }?.name ?: "" - val roll = RollHistoryItemUio( - character = name, - skillLabel = message.skillLabel, - rollDifficulty = message.rollDifficulty, - resultLabel = message.resultLabel, - rollValue = message.rollValue, - rollSuccessLimit = message.rollSuccessLimit, - ) - _rolls = _rolls.toMutableList().also { - if (it.size == MAX_ROLL_HISTORY_SIZE) it.removeAt(index = it.lastIndex) - it.add(index = 0, element = roll) - } - _rolls - }.stateIn( - scope = viewModelScope, - started = SharingStarted.Eagerly, - initialValue = _rolls, - ) - - companion object { - const val MAX_ROLL_HISTORY_SIZE = 100 - } -} \ No newline at end of file