diff --git a/app/src/main/java/com/pixelized/rplexicon/facotry/LocationParser.kt b/app/src/main/java/com/pixelized/rplexicon/facotry/LocationParser.kt index e92089d..b959c5b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/facotry/LocationParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/facotry/LocationParser.kt @@ -49,7 +49,7 @@ class LocationParser @Inject constructor() { companion object { private val COLUMNS = listOf( - "nom", "carte" + "Nom", "Carte" ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/facotry/MarqueeParser.kt b/app/src/main/java/com/pixelized/rplexicon/facotry/MarqueeParser.kt index 7385abe..ed95fc6 100644 --- a/app/src/main/java/com/pixelized/rplexicon/facotry/MarqueeParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/facotry/MarqueeParser.kt @@ -1,5 +1,6 @@ package com.pixelized.rplexicon.facotry +import androidx.compose.ui.geometry.Offset import com.google.api.services.sheets.v4.model.ValueRange import com.pixelized.rplexicon.model.Location import com.pixelized.rplexicon.utilitary.extentions.checkSheetStructure @@ -30,12 +31,14 @@ class MarqueeParser @Inject constructor() { ?.toFloatOrNull() val description = item.getOrNull(structure.description) as? String? - if (map != null && name != null && x != null && y != null) { + if (map != null && name != null) { Location.Marquee( map = map, name = name, - x = x, - y = y, + position = when { + x != null && y != null -> Offset(x, y) + else -> Offset.Unspecified + }, description = description, ) } else { @@ -56,7 +59,7 @@ class MarqueeParser @Inject constructor() { companion object { private val COLUMNS = listOf( - "carte", "nom", "x", "y", "description" + "Carte", "Nom", "X", "Y", "Description" ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/model/Location.kt b/app/src/main/java/com/pixelized/rplexicon/model/Location.kt index 109bd08..bd82332 100644 --- a/app/src/main/java/com/pixelized/rplexicon/model/Location.kt +++ b/app/src/main/java/com/pixelized/rplexicon/model/Location.kt @@ -2,6 +2,7 @@ package com.pixelized.rplexicon.model import android.net.Uri import androidx.compose.runtime.Stable +import androidx.compose.ui.geometry.Offset @Stable data class Location( @@ -15,8 +16,7 @@ data class Location( data class Marquee( val map: String, val name: String, - val x: Float, - val y: Float, + val position: Offset, val description: String?, ) } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/FantasyMap.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/FantasyMap.kt index 67b795c..9632b7d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/FantasyMap.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/FantasyMap.kt @@ -6,6 +6,7 @@ import androidx.compose.animation.core.animateOffsetAsState import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.gestures.detectTransformGestures import androidx.compose.foundation.layout.Box +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState @@ -28,6 +29,7 @@ import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.ui.composable.AsyncImage +import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.skydoves.landscapist.ImageOptions @Composable @@ -40,6 +42,7 @@ fun FantasyMap( selectedItem: State, onMarquee: (MarqueeUio) -> Unit, ) { + val colorScheme = MaterialTheme.lexicon.colorScheme val animatedScale = animateFloatAsState(targetValue = state.scale, label = "ScaleAnimation") val animatedOffset = animateOffsetAsState(targetValue = state.offset, label = "OffsetAnimation") @@ -82,20 +85,33 @@ fun FantasyMap( .drawWithContent { drawContent() item.value.marquees.forEachIndexed { index, item -> - drawCircle( - color = when (selectedItem.value) { - index -> Color.Cyan - else -> Color.White - }, - radius = 12.dp.toPx() / animatedScale.value, - style = Stroke( - width = 2.dp.toPx() / animatedScale.value - ), - center = Offset( - x = size.width * item.position.x, - y = size.height * item.position.y + if (item.position != Offset.Unspecified) { + drawCircle( + color = colorScheme.shadow, + radius = 12.dp.toPx() / animatedScale.value, + style = Stroke( + width = 2.dp.toPx() / animatedScale.value, + ), + center = Offset( + x = size.width * item.position.x, + y = size.height * item.position.y + 2.dp.toPx() / animatedScale.value, + ) ) - ) + drawCircle( + color = when (selectedItem.value) { + index -> Color.Cyan + else -> Color.White + }, + radius = 12.dp.toPx() / animatedScale.value, + style = Stroke( + width = 2.dp.toPx() / animatedScale.value, + ), + center = Offset( + x = size.width * item.position.x, + y = size.height * item.position.y, + ) + ) + } } } .pointerInput("DetectTapGestures") { @@ -169,10 +185,12 @@ class FantasyMapState( fun pan( offset: Offset, ) { - _offset.value = Offset( - x = maxOf(minX, minOf(maxX, offset.x)), - y = maxOf(minY, minOf(maxY, offset.y)), - ) + if (offset != Offset.Unspecified) { + _offset.value = Offset( + x = maxOf(minX, minOf(maxX, offset.x)), + y = maxOf(minY, minOf(maxY, offset.y)), + ) + } } @Stable @@ -180,9 +198,13 @@ class FantasyMapState( origin: Offset, size: IntSize = imageSize, ): Offset { - return Offset( - x = (size.width / 2f - origin.x * size.width) * scale, - y = (size.height / 2f - origin.y * size.height) * scale, - ) + return when (origin != Offset.Unspecified) { + true -> Offset( + x = (size.width / 2f - origin.x * size.width) * scale, + y = (size.height / 2f - origin.y * size.height) * scale, + ) + + else -> origin + } } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailViewModel.kt index ffb0d8f..faccf3f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailViewModel.kt @@ -28,7 +28,7 @@ class LocationDetailViewModel @Inject constructor( marquees = source.marquees.map { marquee -> MarqueeUio( name = marquee.name, - position = Offset(x = marquee.x, y = marquee.y), + position = marquee.position, description = marquee.description, ) } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt index af27a6c..30a1374 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.graphics.Color @Immutable class LexiconColors( val base: ColorScheme, + val shadow: Color, val status: Color, val navigation: Color, val placeholder: Color, @@ -25,11 +26,13 @@ fun darkColorScheme( tertiary = BaseDark.Pink80, onPrimary = Color.White, ), + shadow: Color = ShadowPalette.shadow, status: Color = Color.Transparent, navigation: Color = Color.Transparent, placeholder: Color = Color(red = 49, green = 48, blue = 51), ) = LexiconColors( base = base, + shadow = shadow, status = status, navigation = navigation, placeholder = placeholder, @@ -44,11 +47,13 @@ fun lightColorScheme( tertiary = BaseLight.Pink40, onPrimary = Color.White, ), + shadow: Color = ShadowPalette.shadow, status: Color = Color.Transparent, navigation: Color = Color.Transparent, placeholder: Color = Color(red = 230, green = 225, blue = 229), ) = LexiconColors( base = base, + shadow = shadow, status = status, navigation = navigation, placeholder = placeholder, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/ShadowPalette.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/ShadowPalette.kt index 5269e9b..50d1336 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/ShadowPalette.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/ShadowPalette.kt @@ -5,6 +5,5 @@ import androidx.compose.ui.graphics.Color @Immutable object ShadowPalette { - val system: Color = Color.Black.copy(alpha = 0.37f) - val scrim: Color = Color.Black.copy(alpha = 0.37f) + val shadow: Color = Color.Black.copy(alpha = 0.25f) } \ No newline at end of file