Update the landing screen background & Clean import

This commit is contained in:
Andres Gomez, Thomas (ITDV RL) 2024-05-28 11:02:22 +02:00
parent 4b54e51b39
commit 223ae9f02b
53 changed files with 282 additions and 90 deletions

View file

@ -39,7 +39,7 @@ import com.pixelized.rplexicon.ui.screens.rolls.RollOverlay
import com.pixelized.rplexicon.ui.screens.rolls.RollOverlayViewModel
import com.pixelized.rplexicon.ui.screens.rolls.rememberBlurredRollOverlayHostState
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
import dagger.hilt.android.AndroidEntryPoint
val NO_WINDOW_INSETS = WindowInsets(0, 0, 0, 0)

View file

@ -5,7 +5,6 @@ import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.disk.DiskCache
import coil.memory.MemoryCache
import coil.size.Precision
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp

View file

@ -1,16 +1,14 @@
package com.pixelized.rplexicon.ui.composable
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.ColorMatrix
import androidx.compose.ui.graphics.painter.Painter
@ -20,17 +18,21 @@ import androidx.compose.ui.layout.ContentScale
@Composable
fun BackgroundImage(
modifier: Modifier = Modifier,
tint: Color = LocalContentColor.current,
background: Brush = rememberBackgroundGradient(),
alignment: Alignment = Alignment.TopCenter,
contentScale: ContentScale = ContentScale.Crop,
colorFilter: ColorFilter? = rememberSaturationFilter(saturation = 0f),
painter: Painter,
background: Brush = rememberBackgroundGradient(),
) {
Box(
modifier = modifier
) {
Icon(
Image(
modifier = Modifier.matchParentSize(),
tint = tint,
colorFilter = colorFilter,
painter = painter,
alignment = alignment,
contentScale = contentScale,
contentDescription = null,
)
Box(
@ -46,11 +48,7 @@ fun BackgroundImage(
modifier: Modifier = Modifier,
alignment: Alignment = Alignment.TopCenter,
contentScale: ContentScale = ContentScale.Crop,
colorFilter: ColorFilter? = remember {
ColorFilter.colorMatrix(
ColorMatrix().also { it.setToSaturation(0f) }
)
},
colorFilter: ColorFilter? = rememberSaturationFilter(saturation = 0f),
model: Any?,
background: Brush = rememberBackgroundGradient(),
) {
@ -72,6 +70,17 @@ fun BackgroundImage(
}
}
@Composable
fun rememberSaturationFilter(
saturation: Float = 0f,
): ColorFilter {
return remember {
ColorFilter.colorMatrix(
ColorMatrix().also { it.setToSaturation(saturation) }
)
}
}
@Composable
fun rememberBackgroundGradient(
from: Float = 0.5f,

View file

@ -25,8 +25,8 @@ import androidx.compose.ui.draw.BlurredEdgeTreatment
import androidx.compose.ui.draw.blur
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.utilitary.extentions.clickableInterceptor
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.clickableInterceptor
@Stable
interface BlurredOverlayHostState {

View file

@ -1,11 +1,31 @@
package com.pixelized.rplexicon.ui.composable
import androidx.compose.animation.*
import androidx.compose.animation.core.*
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkHorizontally
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.BoxWithConstraintsScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ButtonElevation
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember

View file

@ -27,8 +27,8 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.ViewModel
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.modifier.zoomable
import com.pixelized.rplexicon.utilitary.extentions.uri
import com.pixelized.rplexicon.utilitary.extentions.zoomable
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

View file

@ -34,8 +34,8 @@ import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.NumberPicker
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.toLabel
@Stable

View file

@ -25,8 +25,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.ui.composable.NumberPicker
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class SkillEditDialogUio(

View file

@ -26,8 +26,8 @@ import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.NumberPicker
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class SpellEditDialogUio(

View file

@ -8,16 +8,16 @@ import androidx.navigation.NavHostController
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import com.pixelized.rplexicon.ui.navigation.screens.composableLexicon
import com.pixelized.rplexicon.ui.navigation.screens.composableLocations
import com.pixelized.rplexicon.ui.navigation.screens.composableQuests
import com.pixelized.rplexicon.ui.navigation.screens.AUTHENTICATION_ROUTE
import com.pixelized.rplexicon.ui.navigation.screens.composableAuthentication
import com.pixelized.rplexicon.ui.navigation.screens.composableCharacterSheet
import com.pixelized.rplexicon.ui.navigation.screens.composableLanding
import com.pixelized.rplexicon.ui.navigation.screens.composableLexicon
import com.pixelized.rplexicon.ui.navigation.screens.composableLexiconDetail
import com.pixelized.rplexicon.ui.navigation.screens.composableLocationDetail
import com.pixelized.rplexicon.ui.navigation.screens.composableLocations
import com.pixelized.rplexicon.ui.navigation.screens.composableQuestDetail
import com.pixelized.rplexicon.ui.navigation.screens.composableQuests
import com.pixelized.rplexicon.ui.navigation.screens.composableSearch
import com.pixelized.rplexicon.ui.navigation.screens.composableSpellDetail
import com.pixelized.rplexicon.ui.navigation.screens.composableSummary

View file

@ -91,7 +91,7 @@ import com.pixelized.rplexicon.ui.screens.character.pages.proficiency.Proficienc
import com.pixelized.rplexicon.ui.screens.character.pages.proficiency.ProficiencyPreview
import com.pixelized.rplexicon.ui.screens.character.pages.proficiency.ProficiencyViewModel
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.lexiconShadow
import com.pixelized.rplexicon.utilitary.extentions.modifier.lexiconShadow
import kotlinx.coroutines.launch

View file

@ -9,7 +9,6 @@ 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.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.material.minimumInteractiveComponentSize
import androidx.compose.material3.Icon

View file

@ -11,7 +11,6 @@ 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.material.minimumInteractiveComponentSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text

View file

@ -17,7 +17,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.dashedBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.dashedBorder
@Composable
fun MasteryCircle(

View file

@ -25,7 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.toLabel
@Stable

View file

@ -12,8 +12,8 @@ import com.pixelized.rplexicon.ui.screens.character.composable.character.StatUio
import com.pixelized.rplexicon.ui.screens.character.pages.proficiency.CharacterSheetUio
import com.pixelized.rplexicon.utilitary.extentions.local.passivesBonus
import com.pixelized.rplexicon.utilitary.extentions.local.sum
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.masteryMultiplier
import com.pixelized.rplexicon.utilitary.extentions.modifier
import javax.inject.Inject
import kotlin.math.max

View file

@ -34,8 +34,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class SkillDetailUio(

View file

@ -10,10 +10,10 @@ import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.business.SpellBookUseCase
import com.pixelized.rplexicon.data.model.AssignedSpell
import com.pixelized.rplexicon.data.model.CharacterSheet
import com.pixelized.rplexicon.data.network.CharacterSheetFire
import com.pixelized.rplexicon.data.model.DiceThrow
import com.pixelized.rplexicon.data.model.Property
import com.pixelized.rplexicon.data.model.Throw
import com.pixelized.rplexicon.data.network.CharacterSheetFire
import com.pixelized.rplexicon.data.repository.authentication.FirebaseRepository
import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository
import com.pixelized.rplexicon.data.repository.character.SpellRepository

View file

@ -34,8 +34,8 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class AlterationDetailUio(

View file

@ -13,13 +13,10 @@ import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.ui.composable.CategoryHeader
import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItem

View file

@ -7,10 +7,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.rememberScrollState
@ -57,7 +54,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.character.StatUio
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberCharacterSheetStatePreview
import com.pixelized.rplexicon.ui.screens.character.pages.actions.HandleSkillDetailDialog
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class CharacterSheetUio(

View file

@ -24,7 +24,6 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource

View file

@ -2,7 +2,15 @@ package com.pixelized.rplexicon.ui.screens.landing
import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.RepeatMode
import androidx.compose.animation.core.animateFloat
import androidx.compose.animation.core.infiniteRepeatable
import androidx.compose.animation.core.rememberInfiniteTransition
import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@ -14,6 +22,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
@ -22,7 +31,12 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.composed
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
@ -31,7 +45,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.BackgroundImage
import com.pixelized.rplexicon.ui.composable.rememberBackgroundGradient
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexicon
@ -42,8 +56,7 @@ import com.pixelized.rplexicon.ui.navigation.screens.navigateToSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateMajWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.uri
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
@Composable
fun LandingScreen() {
@ -56,7 +69,7 @@ fun LandingScreen() {
modifier = Modifier
.fillMaxSize()
.navigationBarsPadding(),
padding = PaddingValues(
paddings = PaddingValues(
start = 16.dp,
top = MaterialTheme.lexicon.dimens.detailPadding,
end = 16.dp,
@ -82,8 +95,13 @@ fun LandingScreen() {
@Composable
private fun LandingContent(
modifier: Modifier = Modifier,
padding: PaddingValues = PaddingValues(16.dp),
scrollState: ScrollState = rememberScrollState(),
paddings: PaddingValues = PaddingValues(
start = 16.dp,
top = MaterialTheme.lexicon.dimens.detailPadding,
end = 16.dp,
bottom = 16.dp,
),
sectionPadding: Dp = 32.dp,
onCharacter: (String) -> Unit,
onSearch: () -> Unit,
@ -95,19 +113,46 @@ private fun LandingContent(
Box(
modifier = modifier.verticalScroll(scrollState),
) {
BackgroundImage(
Box(
modifier = Modifier
.fillMaxWidth()
.aspectRatio(1f)
.scrollOffset(scrollState) { it / 2 },
contentScale = ContentScale.Crop,
model = R.drawable.im_naderius.uri,
)
.clip(RectangleShape),
) {
Image(
modifier = Modifier
.matchParentSize()
.scrollOffset(scrollState) { it / 2 },
painter = painterResource(id = R.drawable.im_naderius_background),
contentDescription = null,
)
Image(
modifier = Modifier
.matchParentSize()
.scrollOffset(scrollState) { it / 3 },
painter = painterResource(id = R.drawable.im_naderius_foreground),
contentDescription = null,
)
Image(
modifier = Modifier
.matchParentSize()
.offset(y = (-16).dp)
.scrollOffset(scrollState) { it / 3 }
.magic(),
painter = painterResource(id = R.drawable.im_naderius_dice),
contentDescription = null,
)
Box(
modifier = Modifier
.matchParentSize()
.background(brush = rememberBackgroundGradient()),
)
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues = padding),
.padding(paddingValues = paddings),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
Text(
@ -302,6 +347,42 @@ private fun LandingContent(
}
}
private fun Modifier.magic(): Modifier = composed {
val transition = rememberInfiniteTransition(
label = "Magic transition",
)
val rotation = transition.animateFloat(
initialValue = 0f,
targetValue = 360f,
animationSpec = infiniteRepeatable(
animation = tween(
durationMillis = 12000,
easing = LinearEasing,
),
),
label = "Magic rotation",
)
val translationY = transition.animateFloat(
initialValue = -10f,
targetValue = -40f,
animationSpec = infiniteRepeatable(
animation = tween(
durationMillis = 8000,
),
repeatMode = RepeatMode.Reverse,
),
label = "Magic translationY",
)
return@composed this.graphicsLayer {
this.transformOrigin = TransformOrigin(
pivotFractionX = 0.375f,
pivotFractionY = 0.625f,
)
this.rotationZ = rotation.value
this.translationY = translationY.value
}
}
@Composable
@Preview(uiMode = UI_MODE_NIGHT_NO)
@Preview(uiMode = UI_MODE_NIGHT_YES)

View file

@ -61,7 +61,7 @@ import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith

View file

@ -39,10 +39,9 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.annotateMajWithDropCap
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.placeholder
import com.pixelized.rplexicon.utilitary.extentions.modifier.placeholder
@Stable
class LexiconGroupUio(

View file

@ -45,10 +45,10 @@ class LexiconViewModel @Inject constructor(
init {
viewModelScope.launch {
launch {
launch(Dispatchers.IO) {
orderRepository.data.combine(lexiconRepository.data) { _, lexicon -> lexicon }
.collect { items ->
_items.value = items
val lexicons = items
.sortedBy { it.name }
.groupBy(
keySelector = {
@ -74,6 +74,10 @@ class LexiconViewModel @Inject constructor(
)
}
.sortedBy { orderRepository.findLexiconOrder(quest = it.category) }
withContext(Dispatchers.Main) {
_items.value = lexicons
}
}
}
launch {

View file

@ -89,7 +89,7 @@ import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith

View file

@ -35,7 +35,7 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.placeholder
import com.pixelized.rplexicon.utilitary.extentions.modifier.placeholder
@Stable
data class LocationGroupUio(

View file

@ -67,7 +67,7 @@ import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith

View file

@ -36,7 +36,7 @@ import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.LOS_FULL
import com.pixelized.rplexicon.utilitary.LOS_HOLLOW
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.placeholder
import com.pixelized.rplexicon.utilitary.extentions.modifier.placeholder
@Stable
data class QuestGroupUio(

View file

@ -46,6 +46,9 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.criticalShader
import com.pixelized.rplexicon.utilitary.extentions.modifier.rememberITimeState
@Stable
data class RollDiceUio(
@ -122,8 +125,19 @@ private fun Dice(
animationSpec = it.animationSpec,
label = "AnimatedRotation"
)
val isCritical = animateFloatAsState(
targetValue = if (it.isCriticalSuccess) 1.0f else 0f,
label = "animatedCritical",
animationSpec = tween(1500),
)
Icon(
modifier = modifier.rotate(degrees = animatedRotation.value % 360),
modifier = modifier
.rotate(degrees = animatedRotation.value % 360)
.criticalShader(
iDefault = MaterialTheme.colorScheme.primary,
isCritical = isCritical.value,
iTime = rememberITimeState().value,
),
tint = MaterialTheme.colorScheme.primary,
painter = painterResource(id = it.icon),
contentDescription = null,

View file

@ -49,8 +49,8 @@ import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio.Throw.Type
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.annotatedSpan
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
import com.pixelized.rplexicon.utilitary.highlightRegex
import java.util.UUID

View file

@ -45,7 +45,7 @@ import com.pixelized.rplexicon.ui.screens.search.item.SearchItemUio.SpellSearchI
import com.pixelized.rplexicon.ui.screens.search.item.SpellSearchItem
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.PUC_FULL
import com.pixelized.rplexicon.utilitary.extentions.lexiconShadow
import com.pixelized.rplexicon.utilitary.extentions.modifier.lexiconShadow
@Stable
data class SearchFormUio(
@ -220,14 +220,14 @@ fun SearchScreenPreview() {
mutableStateOf(
listOf(
LocationSearchItemUio(
id = "",
id = "0",
category = AnnotatedString(text = "Cartes $PUC_FULL Région de Vallaki"),
title = AnnotatedString(text = "Vallaki"),
description = null,
destination = null,
),
LocationSearchItemUio(
id = "",
id = "1",
category = AnnotatedString(text = "Cartes $PUC_FULL Contré de la brume"),
title = AnnotatedString(text = "Barovie"),
description = AnnotatedString(text = "Contré sombre et maudite somise au joug de Stradh von Zarovich"),

View file

@ -29,9 +29,12 @@ import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
@ -47,7 +50,7 @@ import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith
@ -100,6 +103,7 @@ private fun SpellDetailContent(
val typography = MaterialTheme.lexicon.typography
val highlightRegex = remember(highlight) { highlightRegex(terms = highlight.searchCriterion()) }
val dropCapRegex = remember { dropCapRegex() }
val colorScheme = MaterialTheme.colorScheme
Scaffold(
modifier = modifier,
@ -131,7 +135,11 @@ private fun SpellDetailContent(
.fillMaxWidth()
.aspectRatio(ratio = 1f)
.scrollOffset(scrollState = state) { -it / 2 },
tint = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.2f),
alignment = Alignment.Center,
contentScale = ContentScale.Fit,
colorFilter = remember {
ColorFilter.tint(colorScheme.onSurface.copy(alpha = 0.2f))
},
painter = painterResource(id = detail.icon),
)
Column(

View file

@ -8,7 +8,6 @@ import androidx.lifecycle.viewModelScope
import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
import com.pixelized.rplexicon.data.repository.character.SpellRepository
import com.pixelized.rplexicon.ui.composable.error.FetchErrorUio
import com.pixelized.rplexicon.ui.navigation.screens.lexiconDetailArgument
import com.pixelized.rplexicon.ui.navigation.screens.spellDetailArgument
import com.pixelized.rplexicon.utilitary.extentions.local.icon
import com.pixelized.rplexicon.utilitary.extentions.local.label

View file

@ -25,7 +25,7 @@ import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRow
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberAttributesSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class AttributesSummaryUio(

View file

@ -26,7 +26,7 @@ import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRow
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberCharacteristicsSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class CharacteristicsSummaryUio(

View file

@ -25,7 +25,7 @@ import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRow
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberPassivesSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class PassivesSummaryUio(

View file

@ -25,7 +25,7 @@ import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRow
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberProficienciesSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class ProficiencySummaryUio(

View file

@ -25,7 +25,7 @@ import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRow
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberSavingThrowsSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class SavingThrowsSummaryUio(

View file

@ -26,7 +26,7 @@ import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRow
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberSpellsSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
@Stable
data class SpellSummaryUio(

View file

@ -37,9 +37,9 @@ import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.screens.summary.composable.preview.statistic.rememberStatusSummary
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.verticalDivider
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
import com.pixelized.rplexicon.utilitary.extentions.modifier.verticalDivider
@Stable
data class StatusSummaryUio(

View file

@ -25,7 +25,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.verticalDivider
import com.pixelized.rplexicon.utilitary.extentions.modifier.verticalDivider
@Stable
data class SummaryRowUio(

View file

@ -7,7 +7,6 @@ import androidx.compose.runtime.remember
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.screens.summary.composable.ProficiencySummaryUio
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryRowUio
import com.pixelized.rplexicon.ui.screens.summary.composable.common.SummaryCellUio
import com.pixelized.rplexicon.ui.screens.summary.composable.common.proficiency
@Composable

View file

@ -10,10 +10,8 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
@ -22,16 +20,13 @@ import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.screens.summary.composable.AttributesSummary
import com.pixelized.rplexicon.ui.screens.summary.composable.AttributesSummaryUio

View file

@ -28,8 +28,8 @@ import com.pixelized.rplexicon.utilitary.extentions.local.highestSpellLevel
import com.pixelized.rplexicon.utilitary.extentions.local.passivesBonus
import com.pixelized.rplexicon.utilitary.extentions.local.spell
import com.pixelized.rplexicon.utilitary.extentions.local.sum
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.masteryMultiplier
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.toLabel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers

View file

@ -0,0 +1,73 @@
package com.pixelized.rplexicon.utilitary.extentions.modifier
import android.graphics.Color.valueOf
import android.graphics.RuntimeShader
import android.os.Build
import androidx.compose.animation.core.withInfiniteAnimationFrameMillis
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
import androidx.compose.runtime.produceState
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.CompositingStrategy
import androidx.compose.ui.graphics.ShaderBrush
import androidx.compose.ui.graphics.graphicsLayer
import org.intellij.lang.annotations.Language
fun Modifier.criticalShader(
isCritical: Float,
iTime: Float,
iDefault: Color,
): Modifier = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this
.graphicsLayer {
compositingStrategy = CompositingStrategy.Offscreen
}
.drawWithCache {
val shader = RuntimeShader(CRITICAL_SHADER)
val shaderBrush = ShaderBrush(shader)
shader.setFloatUniform("iResolution", size.width, size.height)
shader.setFloatUniform("isCritical", isCritical)
shader.setColorUniform("iDefault", valueOf(iDefault.red, iDefault.green, iDefault.blue))
onDrawWithContent {
drawContent()
shader.setFloatUniform("iTime", iTime)
drawRect(brush = shaderBrush, blendMode = BlendMode.SrcAtop)
}
}
} else {
this
}
@Composable
@Stable
fun rememberITimeState(speed: Float = 1f): State<Float> {
return produceState(0f) {
while (true) {
withInfiniteAnimationFrameMillis {
value = it / 1000f * speed
}
}
}
}
@Language("AGSL")
val CRITICAL_SHADER = """
uniform float2 iResolution;
uniform float iTime;
uniform float isCritical;
layout(color) uniform half4 iDefault;
half4 main(float2 fragCoord) {
// Normalized pixel coordinates (from 0 to 1)
float2 uv = fragCoord.xy / iResolution;
// Time varying pixel color
float2 color = 0.5 + 0.5 * cos(iTime + uv.xy * 2.0 + float2(0, 3.14));
// Output to screen
return mix(iDefault, float4(color, 1.0, 1.0), isCritical);
}
""".trimIndent()

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.pixelized.rplexicon.utilitary.extentions
package com.pixelized.rplexicon.utilitary.extentions.modifier
import androidx.compose.foundation.BorderStroke
import androidx.compose.ui.Modifier

View file

@ -1,4 +1,4 @@
package com.pixelized.rplexicon.utilitary.extentions
package com.pixelized.rplexicon.utilitary.extentions.modifier
import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.Transition
@ -43,6 +43,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.google.accompanist.placeholder.PlaceholderHighlight
import com.google.accompanist.placeholder.placeholder
import com.pixelized.rplexicon.utilitary.extentions.lexicon
fun Modifier.placeholder(
color: Color = Color.Unspecified,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB