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