diff --git a/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt index 56b7f5c..042dcea 100644 --- a/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt @@ -12,7 +12,6 @@ import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepositor import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.data.repository.character.EquipmentRepository import com.pixelized.rplexicon.data.repository.character.ItemsRepository -import com.pixelized.rplexicon.data.repository.character.ObjectActionRepository import com.pixelized.rplexicon.data.repository.character.SkillRepository import com.pixelized.rplexicon.data.repository.character.SpellRepository import com.pixelized.rplexicon.data.repository.firebase.RemoteConfigRepository @@ -41,7 +40,6 @@ class LauncherViewModel @Inject constructor( alterationRepository: AlterationRepository, characterSheetRepository: CharacterSheetRepository, actionRepository: ActionRepository, - objectActionRepository: ObjectActionRepository, spellRepository: SpellRepository, skillRepository: SkillRepository, descriptionRepository: DescriptionRepository, @@ -148,14 +146,6 @@ class LauncherViewModel @Inject constructor( _error.emit(FetchErrorUio.Structure(type = Type.SKILL)) } } - val objects = async { - try { - objectActionRepository.fetchObjectAction() - } catch (exception: Exception) { - Log.e(TAG, exception.message, exception) - _error.emit(FetchErrorUio.Structure(type = Type.OBJECT)) - } - } val spell = async { try { spellRepository.fetchSpells() @@ -166,7 +156,7 @@ class LauncherViewModel @Inject constructor( } awaitAll(order, lexicon, location, quest) - awaitAll(description, inventory, equipment, alteration, action, objects, spell, skill) + awaitAll(description, inventory, equipment, alteration, action, spell, skill) withContext(Dispatchers.Main) { isLoading = false diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt index 6279f7f..d4b137f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt @@ -3,7 +3,6 @@ package com.pixelized.rplexicon.data.model import android.net.Uri import com.pixelized.rplexicon.data.model.roll.Throw import com.pixelized.rplexicon.script.Script -import com.pixelized.rplexicon.utilitary.ImageCache.attackIcon data class Attack( @@ -13,10 +12,8 @@ data class Attack( val hit: Throw?, val damage: Throw?, val script: Script?, - private val iconUri: Uri?, + val icon: Uri?, ) { - val icon: Any? get() = this.iconUri ?: attackIcon(name = title) - enum class Type(val key: String) { PHYSICAL_MELEE_ATTACK("Mêlée"), PHYSICAL_RANGE_ATTACK("Distance"); diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/ObjectAction.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/ObjectAction.kt deleted file mode 100644 index a62b13f..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/ObjectAction.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.pixelized.rplexicon.data.model - -import android.net.Uri -import com.pixelized.rplexicon.data.model.roll.Throw -import com.pixelized.rplexicon.utilitary.ImageCache.objectIcon - -data class ObjectAction( - val prefix: String?, - val name: String, - val effect: Throw?, - private val iconUri: Uri?, -) { - val icon: Any? get() = iconUri ?: objectIcon(name = "${prefix ?: ""}${name}") -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/Skill.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/Skill.kt index 551e451..324fb7b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/Skill.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/Skill.kt @@ -3,7 +3,6 @@ package com.pixelized.rplexicon.data.model import android.net.Uri import com.pixelized.rplexicon.data.model.roll.Throw import com.pixelized.rplexicon.script.Script -import com.pixelized.rplexicon.utilitary.ImageCache.skillIcon data class Skill( val name: String, @@ -13,7 +12,5 @@ data class Skill( val effect: Throw?, val passive: Boolean, val script: Script?, - private val iconUri: Uri?, -) { - val icon: Any? get() = iconUri ?: skillIcon(name = name) -} \ No newline at end of file + val icon: Uri?, +) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/Spell.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/Spell.kt index 5359947..26cb09b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/Spell.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/Spell.kt @@ -1,7 +1,6 @@ package com.pixelized.rplexicon.data.model import android.net.Uri -import com.pixelized.rplexicon.utilitary.ImageCache.spellIcon data class Spell( val name: String, @@ -12,10 +11,8 @@ data class Spell( val requirement: String, val duration: String, val ritual: Boolean, - private val iconUri: Uri?, + val icon: Uri?, ) { - val icon: Any? get() = iconUri ?: spellIcon(name = name) - enum class School(val key: String) { ABJURATION("Abjuration"), DIVINATION("Divination"), diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/alteration/Alteration.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/alteration/Alteration.kt index a611f38..5334d7d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/alteration/Alteration.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/alteration/Alteration.kt @@ -5,7 +5,6 @@ import com.pixelized.rplexicon.data.model.Property import com.pixelized.rplexicon.data.model.roll.Dice import com.pixelized.rplexicon.data.model.roll.Flat import com.pixelized.rplexicon.script.Script -import com.pixelized.rplexicon.utilitary.ImageCache.alterationIcon data class Alteration( val name: String, @@ -13,10 +12,8 @@ data class Alteration( val target: String, val script: Script?, val status: Map, - private val iconUri: Uri?, + val icon: Uri?, ) { - val icon: Any? get() = iconUri ?: alterationIcon(name = name) - data class Status( val name: String, val advantage: Boolean = false, diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt index ee0f524..041a493 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt @@ -31,13 +31,13 @@ class AttackParser @Inject constructor( val title = row.parse(column = NAME) if (characterSheet != null && title != null) { val attack = Attack( - iconUri = row.parseUri(column = ICON), title = title, type = parseType(value = row.parse(column = TYPE)), range = row.parse(column = RANGE), script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) }, hit = throwParser.parse(value = row.parse(column = HIT)), damage = throwParser.parse(value = row.parse(column = DAMAGE)), + icon = row.parseUri(column = ICON), ) actions .getOrPut(characterSheet.name) { mutableListOf() } diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/ObjectActionParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/ObjectActionParser.kt deleted file mode 100644 index 52df857..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/ObjectActionParser.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.pixelized.rplexicon.data.parser - -import com.google.api.services.sheets.v4.model.ValueRange -import com.pixelized.rplexicon.data.model.ObjectAction -import com.pixelized.rplexicon.data.parser.roll.ThrowParser -import com.pixelized.rplexicon.utilitary.exceptions.IncompatibleSheetStructure -import javax.inject.Inject - -class ObjectActionParser @Inject constructor( - private val throwParser: ThrowParser, -) { - @Throws(IncompatibleSheetStructure::class) - fun parse(data: ValueRange): Map> = parserScope { - val objects = hashMapOf>() - - data.forEachRowIndexed { index, row -> - when { - index == 0 -> updateStructure(row = row, columns = COLUMNS) - - row.isNotEmpty() -> { - val character = row[0]?.toItem() - val name = row.parse(column = NAME) - if (character != null && name != null) { - objects.getOrPut(character) { mutableListOf() }.add( - ObjectAction( - prefix = row.parse(column = PREFIX), - iconUri = row.parseUri(column = ICON), - name = name, - effect = throwParser.parse(value = row.parse(column = EFFECT)), - ) - ) - } - } - } - } - - return@parserScope objects - } - - companion object { - private val PREFIX = column("Préfix") - private val NAME = column("Nom") - private val EFFECT = column("Effet") - private val ICON = column("Icone") - private val COLUMNS = listOf(PREFIX, NAME, EFFECT, ICON) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/SkillParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/SkillParser.kt index bc5b323..1321371 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/SkillParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/SkillParser.kt @@ -34,7 +34,7 @@ class SkillParser @Inject constructor( cost = row.parse(column = COST), effect = throwParser.parse(row.parse(column = EFFECT)), passive = row.parseBool(column = PASSIVE) ?: false, - iconUri = row.parseUri(column = ICON), + icon = row.parseUri(column = ICON), script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) }, ) skills.getOrPut(characterSheet.name) { mutableListOf() }.add(skill) diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/alteration/AlterationParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/alteration/AlterationParser.kt index 068bd2c..7dbd344 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/alteration/AlterationParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/alteration/AlterationParser.kt @@ -35,7 +35,7 @@ class AlterationParser @Inject constructor( val target = row.parse(column = TARGET) if (name != null && source != null && target != null) { val alteration = Alteration( - iconUri = row.parseUri(column = ICON), + icon = row.parseUri(column = ICON), name = name, source = source, target = target, diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/spell/SpellBookParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/spell/SpellBookParser.kt index bc61b55..58962f0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/spell/SpellBookParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/spell/SpellBookParser.kt @@ -42,7 +42,7 @@ class SpellBookParser @Inject constructor() { requirement = requirement, duration = duration, ritual = row.parseBool(column = RITUAL) ?: false, - iconUri = icon, + icon = icon, ) spells.add(spell) } diff --git a/app/src/main/java/com/pixelized/rplexicon/data/repository/character/ObjectActionRepository.kt b/app/src/main/java/com/pixelized/rplexicon/data/repository/character/ObjectActionRepository.kt deleted file mode 100644 index fa1dd5f..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/data/repository/character/ObjectActionRepository.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.pixelized.rplexicon.data.repository.character - -import com.pixelized.rplexicon.data.model.ObjectAction -import com.pixelized.rplexicon.data.parser.ObjectActionParser -import com.pixelized.rplexicon.data.repository.CharacterBinder -import com.pixelized.rplexicon.data.repository.GoogleSheetServiceRepository -import com.pixelized.rplexicon.utilitary.Update -import com.pixelized.rplexicon.utilitary.exceptions.IncompatibleSheetStructure -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -@Deprecated("use item repository instead") -class ObjectActionRepository @Inject constructor( - private val googleRepository: GoogleSheetServiceRepository, - private val parser: ObjectActionParser -) { - private val _data = MutableStateFlow>>(emptyMap()) - val data: StateFlow>> get() = _data - - var lastSuccessFullUpdate: Update = Update.INITIAL - private set - - fun find(character: String?): List = - _data.value[character] ?: emptyList() - - fun find(character: String?, item: String): ObjectAction? = - find(character).firstOrNull { it.name == item } - - @Throws(IncompatibleSheetStructure::class, Exception::class) - suspend fun fetchObjectAction() { - googleRepository.fetch { sheet -> - val request = sheet.get(CharacterBinder.ID, CharacterBinder.OBJECT) - val data = parser.parse(data = request.execute()) - _data.tryEmit(data) - lastSuccessFullUpdate = Update.currentTime() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/AsyncImage.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/AsyncImage.kt index 9671121..07e3d10 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/AsyncImage.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/AsyncImage.kt @@ -1,7 +1,12 @@ package com.pixelized.rplexicon.ui.composable.images +import android.net.Uri +import androidx.annotation.DrawableRes import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box 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.graphics.ColorFilter @@ -11,10 +16,32 @@ import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +@Stable +@Immutable +sealed class ImageUio { + @Stable + @Immutable + class Resources( + @DrawableRes val res: Int, + ) : ImageUio() + + @Stable + @Immutable + class Uri( + val uri: String, + ) : ImageUio() { + constructor(uri: android.net.Uri) : this(uri.toString()) + } +} + +fun Uri.toImage(): ImageUio = ImageUio.Uri(uri = this) +fun String.toImage(): ImageUio = ImageUio.Uri(uri = this) +fun Int.toImage(): ImageUio = ImageUio.Resources(res = this) + @Composable fun AsyncImage( modifier: Modifier = Modifier, - model: Any?, + model: ImageUio?, contentDescription: String? = null, alignment: Alignment = Alignment.Center, contentScale: ContentScale = ContentScale.Fit, @@ -23,9 +50,9 @@ fun AsyncImage( filterQuality: FilterQuality = DrawScope.DefaultFilterQuality, ) { when (model) { - is Int -> Image( + is ImageUio.Resources -> Image( modifier = modifier, - painter = painterResource(id = model), + painter = painterResource(id = model.res), contentDescription = contentDescription, alignment = alignment, contentScale = contentScale, @@ -33,9 +60,9 @@ fun AsyncImage( colorFilter = colorFilter, ) - else -> coil.compose.AsyncImage( + is ImageUio.Uri -> coil.compose.AsyncImage( modifier = modifier, - model = model, + model = model.uri, contentDescription = contentDescription, alignment = alignment, contentScale = contentScale, @@ -43,5 +70,7 @@ fun AsyncImage( colorFilter = colorFilter, filterQuality = filterQuality, ) + + else -> Box(modifier = Modifier) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt index b81c802..3de1d59 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt @@ -49,7 +49,7 @@ fun BackgroundImage( alignment: Alignment = Alignment.TopCenter, contentScale: ContentScale = ContentScale.Crop, colorFilter: ColorFilter? = rememberSaturationFilter(saturation = 0f), - model: Any?, + model: ImageUio?, background: Brush = rememberBackgroundGradient(), ) { Box( diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/ImageDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/ImageDialog.kt index 5b97f8f..3225c80 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/ImageDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/ImageDialog.kt @@ -11,8 +11,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -33,11 +31,11 @@ import javax.inject.Inject @HiltViewModel class FullScreenImageViewModel @Inject constructor() : ViewModel() { - private val _url = mutableStateOf(null) - val url: State get() = _url + private val _url = mutableStateOf(null) + val url: State get() = _url - fun showDetail(url: Any) { - _url.value = url + fun showDetail(image: ImageUio) { + _url.value = image } fun hideDetail() { @@ -57,11 +55,10 @@ fun FullScreenImageHandler( @Composable fun ImageDialog( - url: State, + url: State, onDismissRequest: () -> Unit, ) { - val uri by url - if (uri != null) { + url.value?.let { model -> Dialog( properties = remember { DialogProperties( @@ -78,7 +75,7 @@ fun ImageDialog( .zoomable() .padding(all = 16.dp), contentScale = ContentScale.Fit, - model = uri, + model = model, filterQuality = FilterQuality.Medium, ) @@ -102,7 +99,11 @@ fun ImageDialog( private fun ImageDialogPreview() { LexiconTheme { ImageDialog( - url = remember { mutableIntStateOf(R.drawable.im_brulkhai) }, + url = remember { + mutableStateOf( + R.drawable.im_brulkhai.toImage() + ) + }, onDismissRequest = { }, ) } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/animatedComposable.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/animatedComposable.kt index 39a3d29..43393db 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/animatedComposable.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/animatedComposable.kt @@ -34,7 +34,7 @@ fun NavGraphBuilder.animatedComposable( ) } -sealed class NavigationAnimation constructor( +sealed class NavigationAnimation( val enterTransition: EnterAnimation?, val exitTransition: ExitAnimation?, val popEnterTransition: EnterAnimation?, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBook.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBook.kt index ae42666..e08775d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBook.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBook.kt @@ -27,8 +27,10 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient import com.pixelized.rplexicon.ui.composable.images.rememberSaturationFilter +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -36,7 +38,7 @@ import com.pixelized.rplexicon.utilitary.extentions.lexicon @Stable data class AdventureBookUio( val bookTitle: String, - val bookIcon: Any?, + val bookIcon: ImageUio?, val documentId: String, val adventureTitle: String?, val updating: Boolean, @@ -107,14 +109,14 @@ private fun AdventureItemPreview( private class AdventureItemProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( AdventureBookUio( - bookIcon = R.drawable.icbg_book_generic_c_unfaded, + bookIcon = R.drawable.icbg_book_generic_c_unfaded.toImage(), bookTitle = "Les chroniques d'une orc", documentId = "", updating = true, adventureTitle = null, ), AdventureBookUio( - bookIcon = R.drawable.icbg_book_generic_c_unfaded, + bookIcon = R.drawable.icbg_book_generic_c_unfaded.toImage(), bookTitle = "Les chroniques d'une orc", documentId = "", updating = false, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBooksViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBooksViewModel.kt index 623d1be..dcdbba6 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBooksViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/book/AdventureBooksViewModel.kt @@ -11,6 +11,8 @@ import com.pixelized.rplexicon.data.repository.adventure.AdventureRepository import com.pixelized.rplexicon.ui.composable.error.FetchErrorUio import com.pixelized.rplexicon.ui.composable.error.FetchErrorUio.Structure import com.pixelized.rplexicon.ui.composable.error.FetchErrorUio.Structure.Type.ADVENTURE +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow @@ -36,7 +38,7 @@ class AdventureBooksViewModel @Inject constructor( .map { book -> AdventureBookUio( bookTitle = book.title, - bookIcon = book.icon, + bookIcon = book.icon?.toImage(), documentId = book.documentId, updating = book.updating, adventureTitle = book.stories.takeIf { it.size == 1 }?.firstOrNull()?.title diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailScreen.kt index 56d68e2..da41fb6 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailScreen.kt @@ -58,7 +58,9 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.Toolbar import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.screens.adventure.detail.AdventureLineUio.Style.CHAPTER import com.pixelized.rplexicon.ui.screens.adventure.detail.AdventureLineUio.Style.LEGEND @@ -121,7 +123,7 @@ private fun AdventureDetailContent( isLoading: State, title: State, titleIndex: State, - background: State, + background: State, adventures: State>, onBack: () -> Unit, onRefresh: () -> Unit, @@ -340,7 +342,9 @@ private fun AdventureDetailPreview() { mutableIntStateOf(0) }, background = remember { - mutableIntStateOf(R.drawable.im_brulkhai) + mutableStateOf( + R.drawable.im_brulkhai.toImage() + ) }, adventures = remember { mutableStateOf( diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailViewModel.kt index fa5c672..d564cc0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/adventure/detail/AdventureDetailViewModel.kt @@ -1,6 +1,5 @@ package com.pixelized.rplexicon.ui.screens.adventure.detail -import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.State @@ -13,12 +12,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pixelized.rplexicon.data.model.adventure.AdventureLineFormat import com.pixelized.rplexicon.data.repository.adventure.AdventureRepository +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.navigation.screens.adventureDetailArgument import com.pixelized.rplexicon.ui.screens.adventure.detail.AdventureLineUio.Style import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -43,11 +45,11 @@ class AdventureDetailViewModel @Inject constructor( private val _isLoading = mutableStateOf(false) val isLoading: State get() = _isLoading - val background: State + val background: State @Composable @Stable get() = remember(detail) { - detail.map { it?.background } + detail.mapNotNull { it?.background?.toImage() } }.collectAsState(initial = null) val adventure: State> diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt index 4788254..00561b0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt @@ -12,7 +12,6 @@ import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepositor import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.data.repository.character.EquipmentRepository import com.pixelized.rplexicon.data.repository.character.ItemsRepository -import com.pixelized.rplexicon.data.repository.character.ObjectActionRepository import com.pixelized.rplexicon.data.repository.character.SkillRepository import com.pixelized.rplexicon.data.repository.character.SpellRepository import com.pixelized.rplexicon.data.repository.firebase.CharacterFireSheetRepository @@ -36,7 +35,6 @@ class CharacterSheetViewModel @Inject constructor( private val itemsRepository: ItemsRepository, private val equipmentRepository: EquipmentRepository, private val actionRepository: ActionRepository, - private val objectRepository: ObjectActionRepository, private val spellRepository: SpellRepository, private val skillRepository: SkillRepository, private val firebaseRepository: CharacterFireSheetRepository, @@ -136,16 +134,6 @@ class CharacterSheetViewModel @Inject constructor( } } } - val objects = async { - if (force || objectRepository.lastSuccessFullUpdate.shouldUpdate()) { - try { - objectRepository.fetchObjectAction() - } catch (exception: Exception) { - Log.e(TAG, exception.message, exception) - _error.emit(FetchErrorUio.Structure(type = Type.OBJECT)) - } - } - } val spells = async { if (force || spellRepository.lastSuccessFullUpdate.shouldUpdate()) { try { @@ -156,7 +144,7 @@ class CharacterSheetViewModel @Inject constructor( } } } - awaitAll(description, alterations, inventory, equipment, actions, objects, spells, skills) + awaitAll(description, alterations, inventory, equipment, actions, spells, skills) _isLoading.value = false } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/AlterationItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/AlterationItem.kt index cd951af..8858a51 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/AlterationItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/AlterationItem.kt @@ -36,16 +36,18 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.AsyncImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable data class AlterationItemUio( - val icon: Any?, val label: String, val source: String, val subLabel: String?, val checked: Boolean, val override: Boolean, + val icon: ImageUio?, ) @Composable @@ -137,7 +139,7 @@ private fun RollAlterationPreview( private class RollAlterationPreviewProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( AlterationItemUio( - icon = R.drawable.icbg_bless, + icon = R.drawable.icbg_bless.toImage(), label = "Bénédiction", subLabel = "Bless", source = "Clerc", @@ -145,7 +147,7 @@ private class RollAlterationPreviewProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( AttackUio( - icon = R.drawable.icbg_main_hand_attack, + icon = R.drawable.icbg_main_hand_attack.toImage(), name = "Sans arme", type = R.string.attack_type_melee, range = "5 ft reach", @@ -172,7 +174,7 @@ private class WeaponPreviewProvider : PreviewParameterProvider { damage = AttackUio.Action.Flat(label = "1"), ), AttackUio( - icon = R.drawable.icbg_ranged_attack, + icon = R.drawable.icbg_ranged_attack.toImage(), name = "Long bow", type = R.string.attack_type_range, range = "30 ft reach", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/EquipmentItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/EquipmentItem.kt index 645c6b2..fa61b3b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/EquipmentItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/EquipmentItem.kt @@ -39,12 +39,13 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable data class EquipmentItemUio( - val silhouette: Any? = null, val head: String? = null, val face: String? = null, val shoulder: String? = null, @@ -59,6 +60,7 @@ data class EquipmentItemUio( val ringLeft: String? = null, val mainHand: String? = null, val offHand: String? = null, + val silhouette: ImageUio? = null, ) @Composable @@ -285,7 +287,7 @@ private fun InventoryItemPreview() { EquipmentItem( modifier = Modifier.fillMaxWidth(), equipments = EquipmentItemUio( - silhouette = R.drawable.ic_woman_archer_256, + silhouette = R.drawable.ic_woman_archer_256.toImage(), shoulder = "Cloak of Protection", mainHand = "Battleaxe", offHand = "Shield", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/SkillItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/SkillItem.kt index 60ffc0c..58046a2 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/SkillItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/actions/SkillItem.kt @@ -30,6 +30,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.AsyncImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.screens.character.composable.common.CounterButton import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue @@ -37,7 +39,6 @@ import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable data class SkillItemUio( - val icon: Any?, val label: String, val translate: String?, val rest: String?, @@ -46,6 +47,7 @@ data class SkillItemUio( val value: Int?, val max: Int?, val haveDetail: Boolean, + val icon: ImageUio?, ) { @Stable sealed class Action { @@ -192,7 +194,7 @@ fun rememberSkillsListStatePreview(): State> = remember { private class CounterItemPreviewProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( SkillItemUio( - icon = R.drawable.icbg_relentless_endurance, + icon = R.drawable.icbg_relentless_endurance.toImage(), label = "Endurance Implacable", translate = "Relentless Endurance", rest = "Récupération repos long", @@ -203,7 +205,7 @@ private class CounterItemPreviewProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( SpellUio( - icon = R.drawable.icbg_fireball, + icon = R.drawable.icbg_fireball.toImage(), school = Spell.School.EVOCATION, name = "Trait de feu", translated = "Fire Bolt", @@ -288,7 +291,7 @@ private class SpellPreviewProvider : PreviewParameterProvider { ritual = false, ), SpellUio( - icon = R.drawable.icbg_vicious_mockery, + icon = R.drawable.icbg_vicious_mockery.toImage(), school = Spell.School.ENCHANTMENT, name = "Moquerie cruelle", translated = "Vicious Mockery", @@ -305,7 +308,7 @@ private class SpellPreviewProvider : PreviewParameterProvider { ritual = false, ), SpellUio( - icon = R.drawable.icbg_cure_wounds, + icon = R.drawable.icbg_cure_wounds.toImage(), school = Spell.School.EVOCATION, name = "Soins", translated = "Cure Wounds", @@ -322,7 +325,7 @@ private class SpellPreviewProvider : PreviewParameterProvider { ritual = true, ), SpellUio( - icon = R.drawable.icbg_cure_wounds, + icon = R.drawable.icbg_cure_wounds.toImage(), school = Spell.School.EVOCATION, name = "Soins", translated = "Cure Wounds", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/chooser/SpellLevelChooser.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/chooser/SpellLevelChooser.kt index b9e53f9..0a0c175 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/chooser/SpellLevelChooser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/chooser/SpellLevelChooser.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.ui.composable.Handle import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelItem import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelUio import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberSpellLevelChooserState @@ -39,7 +40,7 @@ import com.pixelized.rplexicon.utilitary.extentions.lexicon data class SpellChooserUio( val name: String, val original: String?, - val icon: Any?, + val icon: ImageUio?, val spells: List, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/AlterationDetailDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/AlterationDetailDialog.kt index 8b13892..1d054f1 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/AlterationDetailDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/AlterationDetailDialog.kt @@ -33,6 +33,8 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -40,12 +42,12 @@ import com.pixelized.rplexicon.utilitary.extentions.modifier.doubleBorder @Stable data class AlterationDialogDetailUio( - val icon: Any?, val name: String, val original: String?, val source: String, val target: String, val description: String, + val icon: ImageUio?, ) @Composable @@ -150,7 +152,7 @@ private fun AlterationDetailPreview() { LexiconTheme { AlterationDetailDialogContent( detail = AlterationDialogDetailUio( - icon = R.drawable.icbg_rage_bear_heart, + icon = R.drawable.icbg_rage_bear_heart.toImage(), name = "Rage", original = "Rage", source = "Barbare", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SkillDetailDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SkillDetailDialog.kt index ae62f70..3e74604 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SkillDetailDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SkillDetailDialog.kt @@ -31,6 +31,8 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -38,10 +40,10 @@ import com.pixelized.rplexicon.utilitary.extentions.modifier.doubleBorder @Stable data class SkillDialogDetailUio( - val icon: Any?, val name: String, val original: String?, val description: String, + val icon: ImageUio?, ) @Composable @@ -136,7 +138,7 @@ private fun AlterationDetailPreview() { LexiconTheme { SkillDetailDialogContent( detail = SkillDialogDetailUio( - icon = R.drawable.icbg_relentless_endurance, + icon = R.drawable.icbg_relentless_endurance.toImage(), name = "Endurance implacable", original = "Relentless Endurance", description = "Lorsque vous tombez à 0 point de vie, mais que vous n'êtes pas tué sur le coup, vous pouvez passer à 1 point de vie à la place. Vous devez terminer un repos long avant de pouvoir utiliser cette capacité de nouveau." diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SpellDetailDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SpellDetailDialog.kt index eaabbd8..5474198 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SpellDetailDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/dialogs/SpellDetailDialog.kt @@ -36,6 +36,8 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -43,7 +45,6 @@ import com.pixelized.rplexicon.utilitary.extentions.modifier.doubleBorder @Stable data class SpellDialogDetailUio( - val icon: Any?, val name: String, val translated: String, val level: String, @@ -54,6 +55,7 @@ data class SpellDialogDetailUio( val duration: String, val description: String, val ritual: Boolean, + val icon: ImageUio?, ) @Composable @@ -253,7 +255,7 @@ private fun SpellDetailDialogPreview() { LexiconTheme { SpellDetailDialogContent( detail = SpellDialogDetailUio( - icon = R.drawable.icbg_hellish_rebuke, + icon = R.drawable.icbg_hellish_rebuke.toImage(), name = "Représailles infernales", translated = "Hellish Rebuke", level = "1", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberAttackListStatePreview.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberAttackListStatePreview.kt index a9377cf..11098d0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberAttackListStatePreview.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberAttackListStatePreview.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.screens.character.composable.actions.AttackUio @Stable @@ -14,7 +15,7 @@ fun rememberAttackListStatePreview(): State> = remember { mutableStateOf( listOf( AttackUio( - icon = R.drawable.icbg_main_hand_attack, + icon = R.drawable.icbg_main_hand_attack.toImage(), name = "Unarmed attack", type = R.string.attack_type_melee, range = "5 ft reach", @@ -27,7 +28,7 @@ fun rememberAttackListStatePreview(): State> = remember { ), ), AttackUio( - icon = R.drawable.icbg_ranged_attack, + icon = R.drawable.icbg_ranged_attack.toImage(), name = "Long bow", type = R.string.attack_type_range, range = "30 ft reach", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberEquipmentState.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberEquipmentState.kt index 93b7ff2..3d67641 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberEquipmentState.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberEquipmentState.kt @@ -6,8 +6,8 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.screens.character.composable.actions.EquipmentItemUio -import com.pixelized.rplexicon.utilitary.extentions.uri @Composable @Stable @@ -15,7 +15,7 @@ fun rememberEquipmentState(): State { return remember { mutableStateOf( EquipmentItemUio( - silhouette = R.drawable.ic_woman_archer_256.uri, + silhouette = R.drawable.ic_woman_archer_256.toImage(), shoulder = "Cloak of Protection", mainHand = "Battleaxe", offHand = "Shield", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberSpellLevelChooserState.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberSpellLevelChooserState.kt index ecce695..55eed52 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberSpellLevelChooserState.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/preview/rememberSpellLevelChooserState.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelUio import com.pixelized.rplexicon.ui.screens.character.composable.chooser.SpellChooserUio @@ -15,7 +16,7 @@ fun rememberSpellLevelChooserState() = remember { SpellChooserUio( name = "Soin", original = "Cure wounds", - icon = R.drawable.icbg_cure_wounds, + icon = R.drawable.icbg_cure_wounds.toImage(), spells = listOf( SpellLevelUio( spell = "", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt index 876793a..93f332a 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt @@ -6,6 +6,7 @@ import com.pixelized.rplexicon.data.model.CharacterSheet import com.pixelized.rplexicon.data.model.Property import com.pixelized.rplexicon.data.model.alteration.Alteration import com.pixelized.rplexicon.ui.screens.character.composable.actions.AttackUio +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.modifier import com.pixelized.rplexicon.utilitary.extentions.toLabel @@ -82,7 +83,7 @@ class AttackUioFactory @Inject constructor() { return AttackUio( id = attack, - icon = attack.icon, + icon = ImageCache.cache(attack.icon), name = attack.title, type = when (attack.type) { Attack.Type.PHYSICAL_MELEE_ATTACK -> R.string.attack_type_melee diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt index b0528ed..c58c65a 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt @@ -6,6 +6,7 @@ import com.pixelized.rplexicon.data.model.Skill import com.pixelized.rplexicon.data.network.CharacterSheetFire import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItemUio +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.local.base import com.pixelized.rplexicon.utilitary.extentions.local.primary @@ -46,7 +47,7 @@ class SkillFactoryUioFactory @Inject constructor( val modifier = effectModifier + effectFlat SkillItemUio( - icon = skill.icon, + icon = ImageCache.cache(uri = skill.icon), label = skill.name, translate = description?.original, rest = skill.rest, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt index b56f95a..49d592c 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt @@ -6,6 +6,7 @@ import com.pixelized.rplexicon.data.model.CharacterSheet import com.pixelized.rplexicon.data.model.Property import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellUio +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.modifier import com.pixelized.rplexicon.utilitary.extentions.toLabel @@ -99,7 +100,7 @@ class SpellUioFactory @Inject constructor( } } return SpellUio( - icon = assignedSpell.spell.icon, + icon = ImageCache.cache(uri = assignedSpell.spell.icon), school = assignedSpell.spell.school, name = assignedSpell.spell.name, translated = descriptionRepository.getDescription(name = assignedSpell.spell.name)?.original, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt index 8e96971..d79f0ef 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt @@ -19,6 +19,7 @@ import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItemUio import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.SkillDialogDetailUio import com.pixelized.rplexicon.ui.screens.character.factory.SkillFactoryUioFactory +import com.pixelized.rplexicon.utilitary.ImageCache import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest @@ -86,7 +87,7 @@ class SkillsViewModel @Inject constructor( val skill = skillRepository.find(character = character, skill = item) if (skill != null && description != null) { _skillDetailDialog.value = SkillDialogDetailUio( - icon = skill.icon, + icon = ImageCache.cache(uri = skill.icon), name = skill.name, original = description.original, description = description.description diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt index fd3b500..d8eac21 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt @@ -25,6 +25,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLeve import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellUio import com.pixelized.rplexicon.ui.screens.character.composable.chooser.SpellChooserUio import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.SpellDialogDetailUio +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.local.firstSpellSlot import com.pixelized.rplexicon.utilitary.extentions.local.highestSpellLevel @@ -119,7 +120,7 @@ class SpellsViewModel @Inject constructor( _preparedSpellLevel.value = SpellChooserUio( name = name, original = description?.original, - icon = assignedSpell.spell.icon, + icon = ImageCache.cache(uri = assignedSpell.spell.icon), spells = List( size = max(0, character.highestSpellLevel() + 1 - assignedSpell.spell.level) ) { index -> @@ -192,7 +193,7 @@ class SpellsViewModel @Inject constructor( val spell = spellRepository.findSpell(name = item) if (spell != null && description != null) { _spellDetailDialog.value = SpellDialogDetailUio( - icon = spell.icon, + icon = ImageCache.cache(uri = spell.icon), name = spell.name, translated = description.original, level = "${spell.level}", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt index 97b8c2d..c5c9e51 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt @@ -21,6 +21,7 @@ import com.pixelized.rplexicon.data.repository.firebase.CharacterFireSheetReposi import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.AlterationDialogDetailUio import com.pixelized.rplexicon.ui.screens.rolls.factory.AlterationFactory +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.context import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -116,7 +117,7 @@ class AlterationViewModel @Inject constructor( name = alteration.name, ) _alterationDetailDialog.value = AlterationDialogDetailUio( - icon = alteration.icon, + icon = ImageCache.cache(uri = alteration.icon), name = id, original = description?.original, source = alteration.source, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryFactory.kt index 442860e..a11bd01 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryFactory.kt @@ -5,6 +5,7 @@ import com.pixelized.rplexicon.R import com.pixelized.rplexicon.data.model.CharacterSheet import com.pixelized.rplexicon.data.model.item.Item import com.pixelized.rplexicon.data.repository.firebase.inventory.FireItem +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.screens.character.pages.inventory.composable.InventoryContainerUio import com.pixelized.rplexicon.ui.screens.character.pages.inventory.composable.InventoryItemUio import com.pixelized.rplexicon.ui.screens.character.pages.inventory.composable.draggable.DraggableContainer @@ -24,8 +25,8 @@ class InventoryFactory @Inject constructor() { characterSheet?.let { InventoryContainerUio( id = null, - icon = it.characterClass.firstOrNull()?.icon - ?: R.drawable.icbg_generic_darkness_icon, + icon = (it.characterClass.firstOrNull()?.icon + ?: R.drawable.icbg_generic_darkness_icon).toImage(), order = -1, ) } @@ -85,7 +86,6 @@ class InventoryFactory @Inject constructor() { else -> listOf(key) } + values.mapIndexed { index, (fire, item) -> // presort then use index instead of order to avoid duplicate order values - Log.d("pouet", "$index - ${item.name}") InventoryItemUio( id = item.id, icon = ImageCache.cache(item.icon), diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryPage.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryPage.kt index aab401b..b1e79be 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryPage.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryPage.kt @@ -41,6 +41,7 @@ import com.pixelized.rplexicon.LocalRollOverlay import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.CategoryHeader import com.pixelized.rplexicon.ui.composable.FloatingActionButton +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.screens.character.pages.inventory.composable.InventoryContainer import com.pixelized.rplexicon.ui.screens.character.pages.inventory.composable.InventoryContainerUio import com.pixelized.rplexicon.ui.screens.character.pages.inventory.composable.InventoryItem @@ -389,22 +390,22 @@ fun rememberContainerPreview(): State> = remember { listOf( InventoryContainerUio( id = "0", - icon = R.drawable.icbg_class_barbarian, + icon = R.drawable.icbg_class_barbarian.toImage(), order = 0, ), InventoryContainerUio( id = "1", - icon = R.drawable.icbg_backpack_a_unfaded, + icon = R.drawable.icbg_backpack_a_unfaded.toImage(), order = 1, ), InventoryContainerUio( id = "2", - icon = R.drawable.icbg_leather_pouch_a_unfaded, + icon = R.drawable.icbg_leather_pouch_a_unfaded.toImage(), order = 2, ), InventoryContainerUio( id = "3", - icon = R.drawable.icbg_keychain_unfaded, + icon = R.drawable.icbg_keychain_unfaded.toImage(), order = 3, ), ) @@ -426,7 +427,7 @@ fun rememberItemPreview(): State>> = remember { context = null, order = 0, usable = true, - icon = R.drawable.icbg_scroll_of_bless_unfaded, + icon = R.drawable.icbg_scroll_of_bless_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -435,7 +436,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 1, usable = true, - icon = R.drawable.icbg_book_signedtradebisa_unfaded, + icon = R.drawable.icbg_book_signedtradebisa_unfaded.toImage(), ), "Potions & Flasks & Consumable", InventoryItemUio( @@ -445,7 +446,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 0, usable = true, - icon = R.drawable.icbg_potion_of_superior_healing_unfaded, + icon = R.drawable.icbg_potion_of_superior_healing_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -454,7 +455,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 1, usable = true, - icon = R.drawable.icbg_pot_potion_of_healing_unfaded, + icon = R.drawable.icbg_pot_potion_of_healing_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -463,7 +464,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 2, usable = true, - icon = R.drawable.icbg_grn_holy_water_unfaded, + icon = R.drawable.icbg_grn_holy_water_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -472,7 +473,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 3, usable = true, - icon = R.drawable.icbg_food_goodberry_unfaded, + icon = R.drawable.icbg_food_goodberry_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -481,7 +482,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 4, usable = true, - icon = R.drawable.icbg_worg_fang_unfaded, + icon = R.drawable.icbg_worg_fang_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -490,7 +491,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 5, usable = true, - icon = R.drawable.icbg_haste_spore_grenade_unfaded, + icon = R.drawable.icbg_haste_spore_grenade_unfaded.toImage(), ), "Magic items", InventoryItemUio( @@ -500,7 +501,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 0, usable = false, - icon = R.drawable.ic_drive_lantern_of_revealing, + icon = R.drawable.ic_drive_lantern_of_revealing.toImage(), ), "Equipments", InventoryItemUio( @@ -510,7 +511,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 0, usable = false, - icon = R.drawable.icbg_leather_armour_rogue_unfaded, + icon = R.drawable.icbg_leather_armour_rogue_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -519,7 +520,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 1, usable = false, - icon = R.drawable.icbg_battleaxe_plus_one_unfaded, + icon = R.drawable.icbg_battleaxe_plus_one_unfaded.toImage(), ), InventoryItemUio( id = "${id++}", @@ -528,7 +529,7 @@ fun rememberItemPreview(): State>> = remember { quantity = 1, order = 2, usable = false, - icon = R.drawable.icbg_hand_crossbow_unfaded, + icon = R.drawable.icbg_hand_crossbow_unfaded.toImage(), ), ) ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryViewModel.kt index 2a359c5..53144e6 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/InventoryViewModel.kt @@ -1,6 +1,5 @@ package com.pixelized.rplexicon.ui.screens.character.pages.inventory -import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.State @@ -122,22 +121,22 @@ class InventoryViewModel @Inject constructor( } fun isItemDraggable(element: Element, feedback: HapticFeedback): Boolean { - Log.d("InventoryViewModel", "isItemDraggable(element:${element}") return when (val item = getItem(element = element)) { is InventoryItemUio -> { feedback.performHapticFeedback(HapticFeedbackType.LongPress) true } + is InventoryContainerUio -> { feedback.performHapticFeedback(HapticFeedbackType.LongPress) item.id != null } + else -> false } } fun isItemsMovable(from: Element, to: Element): Boolean { - Log.d("InventoryViewModel", "isItemsMovable(from:${from}, to:${to})") return if (from != to) { val fromItem = getItem(from) val toItem = getItem(to) @@ -165,7 +164,6 @@ class InventoryViewModel @Inject constructor( fun onItemMove(from: Element, to: Element, feedback: HapticFeedback) { if (from != to) { - Log.d("InventoryViewModel", "onItemMove(from:${from}, to:${to})") val fromItem: Any? = getItem(element = from) val toItem: Any? = getItem(element = to) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryContainerItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryContainerItem.kt index 2c6d272..1fb3c85 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryContainerItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryContainerItem.kt @@ -21,13 +21,15 @@ import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.AsyncImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable data class InventoryContainerUio( val id: String?, - val icon: Any, val order: Int, + val icon: ImageUio, ) object InventoryContainerDefault { @@ -77,7 +79,7 @@ private fun InventoryBagItemPreview() { size = DpSize(64.dp, 80.dp), bag = InventoryContainerUio( id = "", - icon = R.drawable.icbg_backpack_a_unfaded, + icon = R.drawable.icbg_backpack_a_unfaded.toImage(), order = 0, ), onClick = { }, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryItem.kt index cb6fd4d..0a4f694 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/composable/InventoryItem.kt @@ -28,6 +28,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.AsyncImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable @@ -38,7 +40,7 @@ data class InventoryItemUio( val quantity: Int, val order: Int, val usable: Boolean, - val icon: Any, + val icon: ImageUio, ) @Composable @@ -139,7 +141,7 @@ private class InventoryItemProvider : PreviewParameterProvider override val values: Sequence = sequenceOf( InventoryItemUio( id = "0", - icon = R.drawable.icbg_backpack_a_unfaded, + icon = R.drawable.icbg_backpack_a_unfaded.toImage(), label = "Sac à dos", context = null, quantity = 1, @@ -148,7 +150,7 @@ private class InventoryItemProvider : PreviewParameterProvider ), InventoryItemUio( id = "1", - icon = R.drawable.icbg_pot_potion_of_healing_unfaded, + icon = R.drawable.icbg_pot_potion_of_healing_unfaded.toImage(), label = "Potion of healing (minor)", context = "Heal 2d4+2 HP.", quantity = 2, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_detail/ItemDetailDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_detail/ItemDetailDialog.kt index 9c38cf8..b01bd31 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_detail/ItemDetailDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_detail/ItemDetailDialog.kt @@ -76,6 +76,8 @@ import androidx.compose.ui.window.DialogProperties import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.BackgroundImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -87,13 +89,13 @@ data class ItemDetailUio( val name: String, val original: String?, val description: String?, - val icon: Any?, val quantity: Int?, val quantityRange: IntRange, val showQuantitySelector: Boolean = false, val showThrowAction: Boolean = false, val inputType: InputType, val mode: Mode, + val icon: ImageUio?, ) { @Stable enum class InputType { @@ -453,7 +455,7 @@ private class ItemDetailProvider : PreviewParameterProvider { get() = sequenceOf( ItemDetailUio( id = "1", - icon = R.drawable.icbg_pot_potion_of_healing_unfaded, + icon = R.drawable.icbg_pot_potion_of_healing_unfaded.toImage(), name = "Potion de soin", original = "Potion of healing", showQuantitySelector = true, @@ -465,7 +467,7 @@ private class ItemDetailProvider : PreviewParameterProvider { ), ItemDetailUio( id = "2", - icon = R.drawable.icbg_pot_potion_of_healing_unfaded, + icon = R.drawable.icbg_pot_potion_of_healing_unfaded.toImage(), name = "Potion de soin", original = "Potion of healing", showQuantitySelector = true, @@ -477,7 +479,7 @@ private class ItemDetailProvider : PreviewParameterProvider { ), ItemDetailUio( id = "2", - icon = R.drawable.icbg_pot_potion_of_healing_unfaded, + icon = R.drawable.icbg_pot_potion_of_healing_unfaded.toImage(), name = "Potion de soin", original = "Potion of healing", showQuantitySelector = true, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/Item.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/Item.kt index 30bcde1..c041c66 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/Item.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/Item.kt @@ -33,6 +33,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.images.AsyncImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable @@ -40,8 +42,8 @@ data class ItemUio( val id: String, val name: String, val context: String?, - val icon: Any?, val quantity: String?, + val icon: ImageUio?, ) @Composable @@ -134,14 +136,14 @@ private class ItemProvider : PreviewParameterProvider { id = "7d27561b-f2f4-4899-a2fc-df3501b1b66b", name = "Bourse", context = "Un petite bourse.", - icon = R.drawable.icbg_pouch_a_unfaded, + icon = R.drawable.icbg_pouch_a_unfaded.toImage(), quantity = null, ), ItemUio( id = "2ecf41c2-06b1-4f2d-a6d9-b6adcaf05aba", name = "Sac à dos", context = null, - icon = R.drawable.icbg_backpack_b_unfaded, + icon = R.drawable.icbg_backpack_b_unfaded.toImage(), quantity = "1", ), ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/ItemListDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/ItemListDialog.kt index 28d17d0..6307a1e 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/ItemListDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/inventory/item_list/ItemListDialog.kt @@ -60,6 +60,7 @@ import androidx.compose.ui.window.DialogProperties import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.composable.CategoryHeader +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.theme.LexiconTheme @Stable @@ -293,28 +294,28 @@ private fun ItemLisPreview() { id = "70d0bcbe-47af-48ba-a9e5-9f9b97bc25a1", name = "Bourse", context = "Une petite bourse en cuir.", - icon = R.drawable.icbg_leather_pouch_a_unfaded, + icon = R.drawable.icbg_leather_pouch_a_unfaded.toImage(), quantity = "1", ), ItemUio( id = "7d27561b-f2f4-4899-a2fc-df3501b1b66b", name = "Bourse", context = "Une petite bourse.", - icon = R.drawable.icbg_pouch_a_unfaded, + icon = R.drawable.icbg_pouch_a_unfaded.toImage(), quantity = null, ), ItemUio( id = "2ecf41c2-06b1-4f2d-a6d9-b6adcaf05aba", name = "Sac à dos", context = "Sac à dos pour aventurier.", - icon = R.drawable.icbg_backpack_a_unfaded, + icon = R.drawable.icbg_backpack_a_unfaded.toImage(), quantity = null, ), ItemUio( id = "43424bbc-0117-44f8-b512-6d469a05e6c2", name = "Sac à dos", context = "Sac à dos pour aventurier.", - icon = R.drawable.icbg_backpack_b_unfaded, + icon = R.drawable.icbg_backpack_b_unfaded.toImage(), quantity = null, ), ), @@ -326,14 +327,14 @@ private fun ItemLisPreview() { id = "471266fb-15a8-4346-9da0-d1c44e4c1569", name = "Parchemin d'Arme spirituelle", context = null, - icon = R.drawable.icbg_book_signedtradebisa_unfaded, + icon = R.drawable.icbg_book_signedtradebisa_unfaded.toImage(), quantity = null, ), ItemUio( id = "eda09856-5a91-4411-ac75-248a16ce1060", name = "Parchemin de Bénédiction", context = null, - icon = R.drawable.icbg_scroll_of_bless_unfaded, + icon = R.drawable.icbg_scroll_of_bless_unfaded.toImage(), quantity = null, ), ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/proficiency/ProficiencyViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/proficiency/ProficiencyViewModel.kt index f7221c9..f5aa9db 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/proficiency/ProficiencyViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/proficiency/ProficiencyViewModel.kt @@ -25,6 +25,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.character.StatUio import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.SkillDialogDetailUio import com.pixelized.rplexicon.ui.screens.character.factory.CharacterSheetUioFactory import com.pixelized.rplexicon.ui.screens.character.factory.SkillFactoryUioFactory +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.local.toStatus import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -158,7 +159,7 @@ class ProficiencyViewModel @Inject constructor( val skill = skillRepository.find(character = character, skill = item) if (skill != null && description != null) { _skillDetailDialog.value = SkillDialogDetailUio( - icon = skill.icon, + icon = ImageCache.cache(uri = skill.icon), name = skill.name, original = description.original, description = description.description diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt index 87a2925..2db47a8 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt @@ -63,7 +63,9 @@ import com.pixelized.rplexicon.ui.composable.images.AsyncImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet import com.pixelized.rplexicon.ui.theme.LexiconTheme @@ -82,10 +84,10 @@ data class LexiconDetailUio( val race: String?, val status: String?, val location: String?, - val portrait: List, val description: String?, val history: String?, val tags: String?, + val portrait: List, ) @Stable @@ -134,7 +136,7 @@ private fun LexiconDetailContent( haveCharacterSheet: State, onBack: () -> Unit, onCharacterSheet: (String) -> Unit, - onIllustration: (Any) -> Unit, + onIllustration: (ImageUio) -> Unit, ) { val typography = MaterialTheme.lexicon.typography val highlightRegex = remember(highlight) { highlightRegex(terms = highlight.searchCriterion()) } @@ -359,7 +361,7 @@ private fun LexiconDetailContent( } private fun Modifier.backgroundPadding( - background: MutableState, + background: MutableState, padding: Dp, ): Modifier { return this.padding( @@ -418,7 +420,7 @@ private fun AnimatedToolBar( @Composable private fun BackgroundPortrait( modifier: Modifier = Modifier, - background: MutableState, + background: MutableState, animatedValues: AnimatedValues, state: ScrollState ) { @@ -523,7 +525,7 @@ private fun LexiconDetailPreview() { race = "Half-orc", status = "Vivante", location = "Manoir Durst", - portrait = listOf(R.drawable.im_brulkhai), + portrait = listOf(R.drawable.im_brulkhai.toImage()), description = "Brulkhai, ou plus simplement Bru, est solidement bâti. Elle mesure 192 cm pour 110 kg de muscles lorsqu’elle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. D’un tempérament taciturne, elle parle peu et de façon concise. Elle est parfois brutale, aussi bien physiquement que verbalement, Elle ne prend cependant aucun plaisir à malmener ceux qu’elle considère plus faibles qu’elle. D’une nature simple et honnête, elle ne mâche pas ses mots et ne dissimule généralement pas ses pensées. Son intelligence modeste est plus le reflet d’un manque d’éducation et d’une capacité limitée à gérer ses émotions qu’à une débilité congénitale. Elle voue à la force un culte car c’est par son expression qu’elle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux qu’elle nomme foshnu (bébé, chouineur en commun).", history = null, tags = "protagoniste, brute", diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailViewModel.kt index 4f7bb62..2922d51 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.viewModelScope import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository import com.pixelized.rplexicon.data.repository.lexicon.LexiconRepository import com.pixelized.rplexicon.ui.navigation.screens.lexiconDetailArgument +import com.pixelized.rplexicon.utilitary.ImageCache import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -45,7 +46,7 @@ class LexiconDetailViewModel @Inject constructor( diminutive = source.diminutive?.let { "./ $it" }, gender = source.gender, race = source.race, - portrait = source.portrait, + portrait = source.portrait.map { ImageCache.cache(uri = it) }, status = source.status, location = source.location, description = source.description, 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 15cb663..6a01f50 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 @@ -32,6 +32,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.images.AsyncImage +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -39,7 +40,7 @@ import com.pixelized.rplexicon.utilitary.extentions.lexicon fun FantasyMap( modifier: Modifier = Modifier, state: FantasyMapState, - model: Any?, + model: ImageUio?, contentScale: ContentScale = ContentScale.Fit, items: State>, highlight: State, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt index 1b1c58c..7837ae7 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt @@ -79,7 +79,9 @@ import com.pixelized.rplexicon.ui.composable.images.AsyncImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel +import com.pixelized.rplexicon.ui.composable.images.ImageUio import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail import com.pixelized.rplexicon.ui.theme.LexiconTheme @@ -99,10 +101,10 @@ import kotlinx.coroutines.launch @Stable data class LocationDetailUio( val name: String, - val map: Any?, val description: String?, - val illustrations: List, val marquees: List, + val map: ImageUio?, + val illustrations: List, ) @Composable @@ -225,7 +227,7 @@ private fun LocationContent( selectedIndex: State, mapHighlight: State, onBack: () -> Unit, - onIllustration: (Any) -> Unit, + onIllustration: (ImageUio) -> Unit, onMarquee: (MarqueeUio) -> Unit, onDestination: (MarqueeUio) -> Unit, onMapTap: (Offset) -> Unit, @@ -580,7 +582,7 @@ private fun LocationPreview() { mutableStateOf( LocationDetailUio( name = "Barovie", - map = R.drawable.ic_empty, + map = R.drawable.ic_empty.toImage(), description = "Contrée sombre et maudite soumise au joug de Stradh von Zarovith", illustrations = emptyList(), marquees = listOf( 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 70bab15..11d96fc 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 @@ -11,8 +11,10 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.pixelized.rplexicon.data.repository.lexicon.LocationRepository +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.navigation.screens.lexiconDetailArgument import com.pixelized.rplexicon.ui.navigation.screens.locationDetailArgument +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.cells import com.pixelized.rplexicon.utilitary.line import com.pixelized.rplexicon.utilitary.table @@ -61,9 +63,9 @@ class LocationDetailViewModel @Inject constructor( repository.getByIdFlow(id = argument.id).collect { source -> val location = LocationDetailUio( name = source.name, - map = source.map, + map = source.map?.toImage(), description = source.description, - illustrations = source.illustrations, + illustrations = source.illustrations.map { ImageCache.cache(uri = it) }, marquees = source.child.map { child -> MarqueeUio( id = child.id, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt index 4709b43..c9aad1e 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt @@ -1,7 +1,6 @@ package com.pixelized.rplexicon.ui.screens.quest.detail import android.content.res.Configuration -import android.net.Uri import androidx.compose.foundation.ScrollState import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -57,6 +56,8 @@ import com.pixelized.rplexicon.ui.composable.images.AsyncImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail @@ -75,7 +76,7 @@ import com.pixelized.rplexicon.utilitary.styleWith @Stable data class QuestDetailUio( val id: String, - val background: Any?, + val background: ImageUio?, val completed: Boolean, val title: String, val steps: List, @@ -89,7 +90,7 @@ data class QuestDetailUio( val place: String? = null, val globalReward: String? = null, val individualReward: String? = null, - val images: List = emptyList(), + val images: List = emptyList(), val description: String, ) } @@ -128,7 +129,7 @@ private fun QuestDetailContent( onBack: () -> Unit, onGiver: (String) -> Unit, onLocation: (String) -> Unit, - onImage: (Uri) -> Unit, + onImage: (ImageUio) -> Unit, ) { val typography = MaterialTheme.lexicon.typography val highlightRegex = remember(highlight) { highlightRegex(terms = highlight.searchCriterion()) } @@ -234,7 +235,7 @@ private fun QuestStep( dropCapRegex: Regex, onGiver: (String) -> Unit, onLocation: (String) -> Unit, - onImage: (Uri) -> Unit, + onImage: (ImageUio) -> Unit, ) { Column( modifier = modifier, @@ -399,7 +400,7 @@ private class QuestDetailPreviewProvider : PreviewParameterProvider QuestDetailUio.QuestStep( @@ -50,7 +53,7 @@ class QuestDetailViewModel @Inject constructor( globalReward = entry.groupReward, individualReward = entry.individualReward, description = entry.description, - images = entry.illustrations, + images = entry.illustrations.map { ImageCache.cache(uri = it) }, ) }, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt index cbaf08a..d363ef7 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt @@ -31,6 +31,7 @@ import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowCardFactory import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio import com.pixelized.rplexicon.ui.screens.rolls.factory.AlterationFactory import com.pixelized.rplexicon.ui.screens.rolls.factory.DiceFactory +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.context import com.pixelized.rplexicon.utilitary.extentions.switch import dagger.hilt.android.lifecycle.HiltViewModel @@ -242,7 +243,7 @@ class RollOverlayViewModel @Inject constructor( ) if (alteration != null) { _alterationDetailDialog.value = AlterationDialogDetailUio( - icon = alteration.icon, + icon = ImageCache.cache(uri = alteration.icon), name = id, original = description?.original, source = alteration.source, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt index ceb5521..4c97297 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt @@ -9,6 +9,7 @@ import com.pixelized.rplexicon.data.repository.character.AlterationRepository import com.pixelized.rplexicon.data.repository.character.SkillRepository import com.pixelized.rplexicon.data.repository.character.SpellRepository import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio +import com.pixelized.rplexicon.utilitary.ImageCache import kotlinx.coroutines.flow.firstOrNull import javax.inject.Inject @@ -25,7 +26,7 @@ class AlterationFactory @Inject constructor( ): List { return alterations.map { alteration -> AlterationItemUio( - icon = alteration.icon, + icon = ImageCache.cache(uri = alteration.icon), label = alteration.name, source = alteration.source, subLabel = description[alteration.name]?.original, @@ -148,7 +149,7 @@ class AlterationFactory @Inject constructor( .firstOrNull() ?.map { alteration -> AlterationItemUio( - icon = alteration.icon, + icon = ImageCache.cache(uri = alteration.icon), label = alteration.name, subLabel = description[alteration.name]?.original, source = alteration.source, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt index 2a1017f..7422b27 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt @@ -13,6 +13,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.Alteratio import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowCardFactory import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio import com.pixelized.rplexicon.ui.screens.summary.composable.ClassHeaderSummaryUio +import com.pixelized.rplexicon.utilitary.ImageCache import com.pixelized.rplexicon.utilitary.extentions.context import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -71,7 +72,7 @@ class StatisticViewModel @Inject constructor( if (alteration != null) { _alterationDetailDialog.value = AlterationDialogDetailUio( - icon = alteration.icon, + icon = ImageCache.cache(uri = alteration.icon), name = name, original = description?.original, source = alteration.source, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/animation/LexiconAnimation.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/animation/LexiconAnimation.kt index ed66447..b0b5f90 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/animation/LexiconAnimation.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/animation/LexiconAnimation.kt @@ -8,7 +8,7 @@ import androidx.compose.animation.togetherWith import androidx.compose.runtime.Stable @Stable -data class LexiconAnimation constructor( +data class LexiconAnimation( val itemList: AnimatedContentTransitionScope<*>.() -> ContentTransform, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/ImageCache.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/ImageCache.kt index f5a077f..26f5d5e 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/ImageCache.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/ImageCache.kt @@ -2,8 +2,9 @@ package com.pixelized.rplexicon.utilitary import android.net.Uri import android.util.Log -import androidx.annotation.DrawableRes import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.composable.images.ImageUio +import com.pixelized.rplexicon.ui.composable.images.toImage object ImageCache { // https://bg3.wiki/wiki/Category:Controller_UI_Icons @@ -12,42 +13,92 @@ object ImageCache { "https://bg3.wiki/w/images/0/01/Instrument_PanFlute_Unfaded.png" to R.drawable.icbg_instrument_panflute_unfaded, "https://bg3.wiki/w/images/0/02/Shortsword_Unfaded.png" to R.drawable.icbg_shortsword_unfaded, "https://bg3.wiki/w/images/0/07/Camp_Rich_G_Green_Unfaded.png" to R.drawable.icbg_camp_rich_g_green_unfaded, + "https://bg3.wiki/w/images/0/07/Forest_Icon.webp" to R.drawable.icbg_forest, "https://bg3.wiki/w/images/0/08/Instrument_Lute_Unfaded.png" to R.drawable.icbg_instrument_lute_unfaded, + "https://bg3.wiki/w/images/0/09/Multiattack_Defense_Icon.webp" to R.drawable.icbg_multiattack_defense, + "https://bg3.wiki/w/images/0/0a/Bardic_Inspiration_Icon.webp" to R.drawable.icbg_bardic_inspiration, + "https://bg3.wiki/w/images/0/0b/Warden_of_Vitality_Icon.webp" to R.drawable.icbg_warden_of_vitality, "https://bg3.wiki/w/images/0/0c/ELX_Tadpole_Elixir_Unfaded.png" to R.drawable.icbg_elk_tadpole_elixir_unfaded, "https://bg3.wiki/w/images/0/0d/Barbarian_Clothes_Unfaded.png" to R.drawable.icbg_barbarian_clothes_unfaded, + "https://bg3.wiki/w/images/0/0d/Darkvision_Icon.webp" to R.drawable.icbg_darkvision, "https://bg3.wiki/w/images/0/0f/Clutter_Bedroll_Unfaded.webp" to R.drawable.icbg_clutter_bedroll_unfaded, + "https://bg3.wiki/w/images/1/12/Draconic_Ancestry_Copper_Acid_Icon.webp" to R.drawable.icbg_draconic_ancestry_copper_acid, "https://bg3.wiki/w/images/1/14/Spear_PlusOne_Unfaded.png" to R.drawable.icbg_shortsword_plusone_unfaded, "https://bg3.wiki/w/images/1/14/Spear_PlusOne_Unfaded.png" to R.drawable.icbg_spear_plusone_unfaded, "https://bg3.wiki/w/images/1/15/Silver_Ingot_Unfaded.png" to R.drawable.icbg_silver_ingot_unfaded, + "https://bg3.wiki/w/images/1/16/Indomitable_Icon.webp" to R.drawable.icbg_indomitable, + "https://bg3.wiki/w/images/1/16/Sacred_Flame_Icon.webp" to R.drawable.icbg_sacred_flame, "https://bg3.wiki/w/images/1/17/Rope_Unfaded.png" to R.drawable.icbg_rope_unfaded, + "https://bg3.wiki/w/images/1/19/Brace_Ranged_Icon.webp" to R.drawable.icbg_brace_ranged, + "https://bg3.wiki/w/images/1/19/Heroism_Icon.webp" to R.drawable.icbg_heroism, + "https://bg3.wiki/w/images/1/19/Jack_of_All_Trades_Icon.webp" to R.drawable.icbg_jack_of_all_trades, "https://bg3.wiki/w/images/1/19/Partner_Ring_A_Unfaded.png" to R.drawable.icbg_partner_ring_a_unfaded, + "https://bg3.wiki/w/images/1/1c/Mortal_Reminder_Icon.webp" to R.drawable.icbg_mortal_reminder, "https://bg3.wiki/w/images/1/1d/Alchemy_Pouch_Unfaded.webp" to R.drawable.icbg_alchemy_pouch_unfaded, "https://bg3.wiki/w/images/1/1d/Item_WPN_HUM_Shield_D_0_Unfaded.png" to R.drawable.icbg_item_wpm_hum_shield_unfaded, + "https://bg3.wiki/w/images/1/1e/Focused_Conjuration_Icon.webp" to R.drawable.icbg_focused_conjuration, + "https://bg3.wiki/w/images/1/1f/Misty_Step_Icon.webp" to R.drawable.icbg_misty_step, "https://bg3.wiki/w/images/2/20/Water_Wicker_B_Unfaded.png" to R.drawable.icbg_water_wicker_b_unfaded, + "https://bg3.wiki/w/images/2/21/Partial_Ceremorphosis_Icon.webp" to R.drawable.icbg_partial_ceremorphosis, + "https://bg3.wiki/w/images/2/21/Reckless_Attack_Icon.webp" to R.drawable.icbg_reckless_attack, "https://bg3.wiki/w/images/2/23/Heavy_Crossbow_Unfaded.png" to R.drawable.icbg_heavy_crossbow_unfaded, + "https://bg3.wiki/w/images/2/24/Intimidating_Presence_Icon.webp" to R.drawable.icbg_intimidating_presence, + "https://bg3.wiki/w/images/2/24/Speak_with_Animals_Icon.webp" to R.drawable.icbg_speak_with_animals, + "https://bg3.wiki/w/images/2/27/Unarmoured_Defence_Barbarian_Icon.webp" to R.drawable.icbg_unarmoured_defence_barbarian, + "https://bg3.wiki/w/images/2/2a/Heavily_Armoured_Icon.webp" to R.drawable.icbg_heavily_armoured, + "https://bg3.wiki/w/images/2/2a/Naturally_Stealthy_Icon.webp" to R.drawable.icbg_naturally_stealthy, "https://bg3.wiki/w/images/2/2a/Thieves_Tools_Unfaded.png" to R.drawable.icbg_thieves_tools_unfaded, + "https://bg3.wiki/w/images/2/2b/Pass_Without_Trace_Icon.webp" to R.drawable.icbg_pass_without_trace, + "https://bg3.wiki/w/images/2/2c/Command_Flee_Icon.webp" to R.drawable.icbg_command_flee, + "https://bg3.wiki/w/images/2/2c/Flaming_Blade_Icon.webp" to R.drawable.icbg_flaming_blade, "https://bg3.wiki/w/images/2/2d/Dagger_Unfaded.png" to R.drawable.icbg_dagger_unfaded, "https://bg3.wiki/w/images/2/2e/GRN_Holy_Water_Unfaded.png" to R.drawable.icbg_grn_holy_water_unfaded, "https://bg3.wiki/w/images/2/2f/Chain_Shirt_3_Unfaded.png" to R.drawable.icbg_chain_shirt_3_unfaded, + "https://bg3.wiki/w/images/3/34/Ancient_Grudges_Icon.webp" to R.drawable.icbg_ancient_grudges, + "https://bg3.wiki/w/images/3/36/Animal_Friendship_Icon.webp" to R.drawable.icbg_animal_friendship, "https://bg3.wiki/w/images/3/37/Quill_Unfaded.png" to R.drawable.icbg_quill_unfaded, "https://bg3.wiki/w/images/3/39/Backpack_A_Unfaded.webp" to R.drawable.icbg_backpack_a_unfaded, "https://bg3.wiki/w/images/3/39/Battleaxe_Unfaded.png" to R.drawable.icbg_battleaxe_unfaded, "https://bg3.wiki/w/images/3/39/Mace_Unfaded.png" to R.drawable.icbg_mace_unfaded, + "https://bg3.wiki/w/images/3/3a/Generic_Control_Icon.webp" to R.drawable.icbg_generic_control, + "https://bg3.wiki/w/images/3/3a/Relentless_Endurance_Icon.webp" to R.drawable.icbg_relentless_endurance, + "https://bg3.wiki/w/images/4/40/Cure_Wounds_Icon.webp" to R.drawable.icbg_cure_wounds, "https://bg3.wiki/w/images/4/40/Incense_Bowl_B_Unfaded.png" to R.drawable.icbg_incense_bowl_b_unfaded, + "https://bg3.wiki/w/images/4/40/Unarmed_Strike_Icon.webp" to R.drawable.icbg_unarmed_strike, "https://bg3.wiki/w/images/4/41/Rapier_Unfaded.png" to R.drawable.icbg_rapier_unfaded, + "https://bg3.wiki/w/images/4/42/Goodberry_Icon.webp" to R.drawable.icbg_goodberry, "https://bg3.wiki/w/images/4/45/Studded_Shield_Unfaded.png" to R.drawable.icbg_studded_shield_unfaded, "https://bg3.wiki/w/images/4/46/MISC_Arrow_Unfaded.png" to R.drawable.icbg_misc_arrow_unfaded, "https://bg3.wiki/w/images/4/46/POT_Potion_of_Greater_Healing_Unfaded.png" to R.drawable.icbg_potion_of_greater_healing_unfaded, "https://bg3.wiki/w/images/4/47/Enriched_Infernal_Iron_Unfaded.png" to R.drawable.icbg_enriched_infernal_iron_unfaded, + "https://bg3.wiki/w/images/4/48/Bolstering_Magic_Boon_Icon.webp" to R.drawable.icbg_bolstering_magic_boon, "https://bg3.wiki/w/images/4/49/Arrow_of_Piercing_Unfaded.png" to R.drawable.icbg_arrow_of_piercing_unfaded, + "https://bg3.wiki/w/images/4/4b/Daylight_Sphere_Icon.webp" to R.drawable.icbg_daylight_sphere, + "https://bg3.wiki/w/images/4/4c/Turn_Undead_Icon.webp" to R.drawable.icbg_turn_undead, + "https://bg3.wiki/w/images/4/4d/Uncanny_Dodge_Icon.webp" to R.drawable.icbg_uncanny_dodge, + "https://bg3.wiki/w/images/4/4e/Feral_Instinct_Icon.webp" to R.drawable.icbg_feral_instinct, "https://bg3.wiki/w/images/4/4e/Leather_Pouch_Old_Unfaded.webp" to R.drawable.icbg_leather_pouch_old_unfaded, + "https://bg3.wiki/w/images/4/4f/Fast_Movement_Icon.webp" to R.drawable.icbg_fast_movement, + "https://bg3.wiki/w/images/5/50/Aid_Icon.webp" to R.drawable.icbg_aid, + "https://bg3.wiki/w/images/5/50/Throw_Weapon_Icon.webp" to R.drawable.icbg_throw_weapon, + "https://bg3.wiki/w/images/5/52/Improvised_Melee_Weapon_Icon.webp" to R.drawable.icbg_improvised_melee_weapon, + "https://bg3.wiki/w/images/5/56/Break_of_Dawn_Icon.webp" to R.drawable.icbg_break_of_dawn, "https://bg3.wiki/w/images/5/56/Generic_Darkness_Icon.webp" to R.drawable.icbg_generic_darkness_icon, + "https://bg3.wiki/w/images/5/58/Spiritual_Weapon_Maul_Icon.webp" to R.drawable.icbg_spiritual_weapon_maul, + "https://bg3.wiki/w/images/5/5a/Extra_Attack_Icon.webp" to R.drawable.icbg_extra_attack, + "https://bg3.wiki/w/images/5/5a/Wild_Magic_Teleport_Activate_Barbarian_Icon.webp" to R.drawable.icbg_wild_magic_teleport_activate_barbarian, "https://bg3.wiki/w/images/5/5b/Leather_Pouch_A_Unfaded.webp" to R.drawable.icbg_leather_pouch_a_unfaded, + "https://bg3.wiki/w/images/5/5c/Light_Icon.webp" to R.drawable.icbg_light, "https://bg3.wiki/w/images/5/5d/Battleaxe_PlusOne_Unfaded.png" to R.drawable.icbg_battleaxe_plus_one_unfaded, + "https://bg3.wiki/w/images/5/5d/Protection_from_Missiles_Icon.webp" to R.drawable.icbg_protection_from_missiles, "https://bg3.wiki/w/images/5/5f/Soap_Bar_Unfaded.png" to R.drawable.icbg_soap_bar_unfaded, + "https://bg3.wiki/w/images/6/60/Ensnaring_Strike_Ranged_Icon.webp" to R.drawable.icbg_ensnaring_strike_ranged, + "https://bg3.wiki/w/images/6/61/Divine_Intervention_Sunder_the_Heretical_Icon.webp" to R.drawable.icbg_divine_intervention_sunder_the_heretical, + "https://bg3.wiki/w/images/6/63/Bite_Icon.webp" to R.drawable.icbg_bite, "https://bg3.wiki/w/images/6/63/Dagger_PlusOne_Unfaded.png" to R.drawable.icbg_dagger_plusone_unfaded, "https://bg3.wiki/w/images/6/64/Book_Tome_W_Unfaded.png" to R.drawable.icbg_book_tome_w_unfaded, "https://bg3.wiki/w/images/6/66/Book_Parchment_I_Unfaded.png" to R.drawable.icbg_book_parchment_i_unfaded, + "https://bg3.wiki/w/images/6/66/Flaming_Sphere_Icon.webp" to R.drawable.icbg_flaming_sphere, "https://bg3.wiki/w/images/6/68/Scale_Mail_Unfaded.png" to R.drawable.icbg_scale_mail_unfaded, "https://bg3.wiki/w/images/6/6d/Backpack_B_Unfaded.webp" to R.drawable.icbg_backpack_b_unfaded, "https://bg3.wiki/w/images/6/6e/FOOD_Goodberry_Unfaded.png" to R.drawable.icbg_food_goodberry_unfaded, @@ -56,21 +107,37 @@ object ImageCache { "https://bg3.wiki/w/images/7/73/POT_Potion_of_Superior_Healing_Unfaded.png" to R.drawable.icbg_potion_of_superior_healing_unfaded, "https://bg3.wiki/w/images/7/74/Candle_Unfaded.png" to R.drawable.icbg_candle_unfaded, "https://bg3.wiki/w/images/7/74/Light_Crossbow_Unfaded.png" to R.drawable.icbg_light_crossbow_unfaded, + "https://bg3.wiki/w/images/7/75/Friends_Icon.webp" to R.drawable.icbg_friends, + "https://bg3.wiki/w/images/7/75/Hold_Person_Icon.webp" to R.drawable.icbg_hold_person, "https://bg3.wiki/w/images/7/77/Ink_Pot_Unfaded.png" to R.drawable.icbg_ink_pot_unfaded, "https://bg3.wiki/w/images/7/78/Book_Generic_D_Unfaded.png" to R.drawable.icbg_book_generic_d_unfaded, "https://bg3.wiki/w/images/7/78/POT_Potion_of_Supreme_Healing_Unfaded.png" to R.drawable.icbg_potion_of_supreme_healing_unfaded, "https://bg3.wiki/w/images/7/78/VAL_MISC_Silver_Spoon_Unfaded.png" to R.drawable.icbg_val_misc_silver_spoon_unfaded, "https://bg3.wiki/w/images/7/7c/GRN_Haste_Spore_Grenade_Unfaded.png" to R.drawable.icbg_haste_spore_grenade_unfaded, + "https://bg3.wiki/w/images/7/7f/Guidance_Icon.webp" to R.drawable.icbg_guidance, "https://bg3.wiki/w/images/7/7f/Torch_Unfaded.png" to R.drawable.icbg_torch_unfaded, + "https://bg3.wiki/w/images/8/81/Patient_Defence_Icon.webp" to R.drawable.icbg_patient_defence, + "https://bg3.wiki/w/images/8/83/Aspect_of_the_Beast_Bear_Icon.webp" to R.drawable.icbg_aspect_of_the_beast_bear, + "https://bg3.wiki/w/images/8/84/Savage_Attacks_Icon.webp" to R.drawable.icbg_savage_attacks, "https://bg3.wiki/w/images/8/85/Cloak_Of_Protection_Unfaded.png" to R.drawable.icbg_cloak_of_protection_unfaded, + "https://bg3.wiki/w/images/8/89/Help_Icon.webp" to R.drawable.icbg_help, "https://bg3.wiki/w/images/8/8b/Key_Flower_B_Unfaded.png" to R.drawable.icbg_key_flower_b_unfaded, "https://bg3.wiki/w/images/8/8c/Book_Tome_O_Unfaded.png" to R.drawable.icbg_book_tome_o_unfaded, + "https://bg3.wiki/w/images/8/8e/Scorching_Ray_Icon.webp" to R.drawable.icbg_scorching_ray, "https://bg3.wiki/w/images/8/8f/Scroll_of_Bless_Unfaded.png" to R.drawable.icbg_scroll_of_bless_unfaded, + "https://bg3.wiki/w/images/9/92/Bolt_of_Celestial_Light_Icon.webp" to R.drawable.icbg_bolt_of_celestial_light, "https://bg3.wiki/w/images/9/92/Shortsword_PlusOne_Unfaded.png" to R.drawable.icbg_shortsword_plusone_unfaded, + "https://bg3.wiki/w/images/9/93/Danger_Sense_Icon.webp" to R.drawable.icbg_danger_sense, + "https://bg3.wiki/w/images/9/95/Second_Wind_Icon.webp" to R.drawable.icbg_second_wind, + "https://bg3.wiki/w/images/9/98/Off-Hand_Attack_Melee_Icon.webp" to R.drawable.icbg_off_hand_attack_melee, "https://bg3.wiki/w/images/9/9a/Pike_PlusOne_Unfaded.png" to R.drawable.icbg_pike_plusone_unfaded, + "https://bg3.wiki/w/images/9/9c/Magic_Weapon_Icon.webp" to R.drawable.icbg_magic_weapon, + "https://bg3.wiki/w/images/9/9d/Rage_Bear_Heart_Icon.webp" to R.drawable.icbg_rage_bear_heart, "https://bg3.wiki/w/images/9/9e/Bed_Linen_Unfaded.png" to R.drawable.icbg_bed_linen_unfaded, "https://bg3.wiki/w/images/a/a0/Book_Note_J_Unfaded.png" to R.drawable.icbg_book_note_j_unfaded, "https://bg3.wiki/w/images/a/a1/Arrow_of_Many_Targets_Unfaded.png" to R.drawable.icbg_arrow_of_many_targets_unfaded, + "https://bg3.wiki/w/images/a/a1/Faerie_Fire_Icon.webp" to R.drawable.icbg_faerie_fire, + "https://bg3.wiki/w/images/a/a2/Healing_Radiance_Icon.webp" to R.drawable.icbg_healing_radiance, "https://bg3.wiki/w/images/a/a6/Jeweled_Chest_B_Unfaded.webp" to R.drawable.icbg_jeweled_chest_b_unfaded, "https://bg3.wiki/w/images/a/a9/VAL_MISC_Incense_Pile_A_Unfaded.png" to R.drawable.icbg_val_misc_incense_pile_a_unfaded, "https://bg3.wiki/w/images/a/aa/Amulet_Necklace_A_Silver_A_Unfaded.png" to R.drawable.icbg_amulet_necklace_a_silver_a_unfaded, @@ -79,316 +146,118 @@ object ImageCache { "https://bg3.wiki/w/images/b/b1/Longbow_Unfaded.png" to R.drawable.icbg_longbow_unfaded, "https://bg3.wiki/w/images/b/b5/Dryad_Staff_Unfaded.png" to R.drawable.icbg_dryad_staff_unfaded, "https://bg3.wiki/w/images/b/b7/Book_Parchment_K_Unfaded.png" to R.drawable.icbg_book_parchment_k_unfaded, + "https://bg3.wiki/w/images/b/bc/Charm_Person_Icon.webp" to R.drawable.icbg_charm_person, "https://bg3.wiki/w/images/b/bc/Clutter_Wooden_Bowl_Unfaded.webp" to R.drawable.icbg_clutter_wooden_bowl_unfaded, "https://bg3.wiki/w/images/b/bd/Club_Unfaded.png" to R.drawable.icbg_club_unfaded, + "https://bg3.wiki/w/images/b/bd/Nature%27s_Ward_Icon.webp" to R.drawable.icbg_natures_ward, + "https://bg3.wiki/w/images/b/be/Cutting_Words_passive_feature_Icon.webp" to R.drawable.icbg_cutting_words_passive_feature, "https://bg3.wiki/w/images/b/bf/Gemless_Ring_Unfaded.png" to R.drawable.icbg_gemless_ring_unfaded, "https://bg3.wiki/w/images/c/c0/Keychain_Unfaded.png" to R.drawable.icbg_keychain_unfaded, + "https://bg3.wiki/w/images/c/c1/Sanctuary_Icon.webp" to R.drawable.icbg_sanctuary, + "https://bg3.wiki/w/images/c/c3/Ranged_Attack_Icon.webp" to R.drawable.icbg_ranged_attack, + "https://bg3.wiki/w/images/c/c4/Bless_Icon.webp" to R.drawable.icbg_bless, "https://bg3.wiki/w/images/c/c6/Pouch_A_Unfaded.webp" to R.drawable.icbg_pouch_a_unfaded, "https://bg3.wiki/w/images/c/c8/ALCH_Arkhen%27s_Hoard_Unfaded.png" to R.drawable.icbg_alch_arkhens_hoard_unfaded, + "https://bg3.wiki/w/images/c/c9/Class_Druid_Badge_Icon.png" to R.drawable.icbg_class_druid, "https://bg3.wiki/w/images/c/c9/Homely_Clothes_Unfaded.png" to R.drawable.icbg_homely_clothes_unfaded, + "https://bg3.wiki/w/images/c/c9/Step_of_the_Wind_Dash_Icon.webp" to R.drawable.icbg_step_of_the_wind_dash, + "https://bg3.wiki/w/images/c/ca/Main_Hand_Attack_Icon.webp" to R.drawable.icbg_main_hand_attack, + "https://bg3.wiki/w/images/c/cb/Fireball_Icon.webp" to R.drawable.icbg_fireball, "https://bg3.wiki/w/images/c/ce/POT_Potion_of_Healing_Unfaded.png" to R.drawable.icbg_pot_potion_of_healing_unfaded, + "https://bg3.wiki/w/images/c/ce/Trip_Attack_Melee_Icon.webp" to R.drawable.icbg_trip_attack_melee, + "https://bg3.wiki/w/images/c/cf/Burning_Hands_Icon.webp" to R.drawable.icbg_burning_hands, + "https://bg3.wiki/w/images/d/d1/Create_Water_Icon.webp" to R.drawable.icbg_create_water, "https://bg3.wiki/w/images/d/d4/Leather_Armour_Rogue_Unfaded.png" to R.drawable.icbg_leather_armour_rogue_unfaded, "https://bg3.wiki/w/images/d/d6/ALCH_Farsea_Marshwine_Unfaded.png" to R.drawable.icbg_alch_farsea_marshwine_unfaded, "https://bg3.wiki/w/images/d/d6/Javelin_Unfaded.png" to R.drawable.icbg_javelin_unfaded, + "https://bg3.wiki/w/images/d/d6/Spirit_Guardians_Icon.webp" to R.drawable.icbg_spirit_guardians, "https://bg3.wiki/w/images/d/db/BOOK_SignedTradeVisa_Unfaded.png" to R.drawable.icbg_book_signedtradebisa_unfaded, "https://bg3.wiki/w/images/d/dc/ALCH_Ashaba_Dusk_Unfaded.png" to R.drawable.icbg_alch_ashaba_dusk_unfaded, "https://bg3.wiki/w/images/d/dd/Elaborate_Slate_Unfaded.png" to R.drawable.icbg_elaborate_slate_unfaded, "https://bg3.wiki/w/images/d/df/FOOD_Treacle_Tart_Unfaded.png" to R.drawable.icbg_food_treacle_tart_unfaded, "https://bg3.wiki/w/images/d/df/Toy_Block_B_Unfaded.png" to R.drawable.icbg_toy_block_b_unfaded, + "https://bg3.wiki/w/images/e/e4/Lesser_Restoration_Icon.webp" to R.drawable.icbg_lesser_restoration, "https://bg3.wiki/w/images/e/e5/Amulet_of_Lost_Voices_Unfaded.png" to R.drawable.icbg_amulet_of_lost_voices_unfaded, + "https://bg3.wiki/w/images/e/e9/Crossbow_Expert_Wounding_Icon.webp" to R.drawable.icbg_crossbow_expert_wounding, + "https://bg3.wiki/w/images/e/ee/Frenzied_Strike_Icon.webp" to R.drawable.icbg_frenzied_strike, + "https://bg3.wiki/w/images/e/ef/Healing_Word_Icon.webp" to R.drawable.icbg_healing_word, "https://bg3.wiki/w/images/f/f1/Camp_Patriars_A_Green_Unfaded.png" to R.drawable.icbg_camp_patriars_a_green_unfaded, + "https://bg3.wiki/w/images/f/f2/Bestial_Fury_Icon.webp" to R.drawable.icbg_bestial_fury, "https://bg3.wiki/w/images/f/f4/Cauldron_A_Unfaded.png" to R.drawable.icbg_cauldron_a_unfaded, "https://bg3.wiki/w/images/f/f5/Copper_Coin_Pile_Unfaded.png" to R.drawable.ic_copper_coin_pile_unfaded, + "https://bg3.wiki/w/images/f/f6/Hunter%27s_Mark_Icon.webp" to R.drawable.icbg_hunters_mark, "https://bg3.wiki/w/images/f/fb/Camp_Rich_B_Purple_Unfaded.png" to R.drawable.icbg_camp_rich_b_purple_unfaded, + "https://drive.google.com/uc?export=view&id=15D3Jum_X_nw4tWfbaLbEvhTQQbmYCMwf" to R.drawable.ic_dice_advantage, "https://drive.google.com/uc?export=view&id=17MrL-HAlpqPI5c6APjz5arGYrfma42on" to R.drawable.ic_drive_orc_mask, "https://drive.google.com/uc?export=view&id=1AeSHg792EwVbkjCNjJaqzC4v0uNj9NRn" to R.drawable.ic_drive_fire_starter, "https://drive.google.com/uc?export=view&id=1ctLycJc23XP6CP3jSaIPQGQJnobEqpQY" to R.drawable.ic_drive_wetstone, "https://drive.google.com/uc?export=view&id=1Dc0hBGXTNP8dnYqHJlSsK1WgWAsWtCV9" to R.drawable.ic_drive_lantern_of_revealing, "https://drive.google.com/uc?export=view&id=1FX7HpnxLUXFPqrKGvCYyJNkUSwFacKh9" to R.drawable.ic_silver_coin_pile_unfaded, - "https://drive.google.com/uc?export=view&id=1jJkltHU5HzCuU5ixVly_J5Dr0stEawEV" to R.drawable.ic_drive_deck_of_card, "https://drive.google.com/uc?export=view&id=1JhUikzOesAyGCtCL9bFW_HRdqM8hj1sf" to R.drawable.ic_drive_bear_trap, + "https://drive.google.com/uc?export=view&id=1jJkltHU5HzCuU5ixVly_J5Dr0stEawEV" to R.drawable.ic_drive_deck_of_card, "https://drive.google.com/uc?export=view&id=1Jo0Nk_Mj4j-VKvBe0W6_73uE_tKUgPUF" to R.drawable.ic_drive_kitsune, "https://drive.google.com/uc?export=view&id=1KPlgQK1C3lfZn3ZHTHd-dqiSINjQpnH9" to R.drawable.ic_drive_ring_of_kazan, + "https://drive.google.com/uc?export=view&id=1KPUEOf2RYLhxkz95-2_O2JhAAVR7qTmV" to R.drawable.ic_dice_emphase, "https://drive.google.com/uc?export=view&id=1KVXSKHI8JgU1Wnhp9rmEZ1f4rsUfoV2a" to R.drawable.ic_gold_coin_pile_unfaded, "https://drive.google.com/uc?export=view&id=1lLu7o1h1pkXuNRbHJ2dnxQLKyrNRxV3P" to R.drawable.ic_drive_bear_claw_neckless, + "https://drive.google.com/uc?export=view&id=1N5tb0eshLeLOwCXd9o7Hlo-QvShQQ1eT" to R.drawable.ic_dice_disadvantage, "https://drive.google.com/uc?export=view&id=1nazdbGFLyiGNMYvPhVXiZoeyBxDtYMtI" to R.drawable.ic_electrum_coin_pile_unfaded, "https://drive.google.com/uc?export=view&id=1p5OSYPeeKa-niiTa9GFChdpnu0FqkswG" to R.drawable.ic_drive_harlequin, - "https://drive.google.com/uc?export=view&id=1TDTCkVZb520gdndC4FmAneWDGgf9wmDM" to R.drawable.ic_drive_chalk_stick, "https://drive.google.com/uc?export=view&id=1PlhfW61aSncyX3Ml1oPDPokHTR7U8O2y" to R.drawable.ic_drive_quiver, + "https://drive.google.com/uc?export=view&id=1TDTCkVZb520gdndC4FmAneWDGgf9wmDM" to R.drawable.ic_drive_chalk_stick, "https://drive.google.com/uc?export=view&id=1WSpydN6AVjQrS6J_F8EFT00McQqCCxCw" to R.drawable.ic_drive_stake, "https://drive.google.com/uc?export=view&id=1ywDHw0C6exwxNCu-qNgQ0X2Sx9LfqSNH" to R.drawable.ic_drive_bird_skull, "https://drive.google.com/uc?export=view&id=1YYgZ2SlSn6TkRiphpIf62KgwTZWQZHQJ" to R.drawable.ic_drive_tome_of_strahd, + "https://bg3.wiki/w/images/0/01/Darkvision_spell_Icon.webp" to R.drawable.icbg_darkvision_spell, + "https://bg3.wiki/w/images/0/03/Bone_Chill_Icon.webp" to R.drawable.icbg_bone_chill, + "https://bg3.wiki/w/images/0/03/Draconic_Ancestry_Brass_Fire_Icon.webp" to R.drawable.icbg_draconic_ancestry_brass_fire, + "https://bg3.wiki/w/images/0/04/Thunderwave_Icon.webp" to R.drawable.icbg_thunderwave, + "https://bg3.wiki/w/images/2/24/Command_Approach_Icon.webp" to R.drawable.icbg_command_approach, + "https://bg3.wiki/w/images/3/35/Protection_from_Evil_and_Good_Icon.webp" to R.drawable.icbg_protection_from_evil_and_good, + "https://bg3.wiki/w/images/3/3f/Thaumaturgy_Icon.webp" to R.drawable.icbg_thaumaturgy, + "https://bg3.wiki/w/images/4/45/Grant_Flight_Icon.webp" to R.drawable.icbg_grant_flight, + "https://bg3.wiki/w/images/4/47/Fey_Presence_Icon.webp" to R.drawable.icbg_fey_presence, + "https://bg3.wiki/w/images/4/4c/Hellish_Resistance_Icon.webp" to R.drawable.icbg_hellish_resistance, + "https://bg3.wiki/w/images/4/4d/Crusader%27s_Mantle_Icon.webp" to R.drawable.icbg_crusaders_mantle, + "https://bg3.wiki/w/images/6/60/Hex_Charisma_Icon.webp" to R.drawable.icbg_hex_charisma, + "https://bg3.wiki/w/images/6/62/Bane_Spell_Icon.webp" to R.drawable.icbg_bane_spell, + "https://bg3.wiki/w/images/6/66/Vicious_Mockery_Icon.webp" to R.drawable.icbg_vicious_mockery, + "https://bg3.wiki/w/images/7/77/Armour_of_Agathys_Icon.webp" to R.drawable.icbg_armour_of_agathys, + "https://bg3.wiki/w/images/7/78/Silence_Icon.webp" to R.drawable.icbg_silence, + "https://bg3.wiki/w/images/7/7a/Globe_of_Invulnerability_Icon.webp" to R.drawable.icbg_globe_of_invulnerability, + "https://bg3.wiki/w/images/8/82/Hellish_Rebuke_Icon.webp" to R.drawable.icbg_hellish_rebuke, + "https://bg3.wiki/w/images/8/85/Vampiric_Touch_Icon.webp" to R.drawable.icbg_vampiric_touch, + "https://bg3.wiki/w/images/8/8b/Find_Familiar_Cat_Icon.webp" to R.drawable.icbg_find_familiar_cat, + "https://bg3.wiki/w/images/8/8c/Iron_Mind_Icon.webp" to R.drawable.icbg_iron_mind, + "https://bg3.wiki/w/images/9/9d/Agonising_Blast_Icon.webp" to R.drawable.icbg_agonising_blast, + "https://bg3.wiki/w/images/9/9d/Minor_Illusion_Icon.webp" to R.drawable.icbg_minor_illusion, + "https://bg3.wiki/w/images/a/a3/Bardic_Defence_Icon.webp" to R.drawable.icbg_bardic_defence, + "https://bg3.wiki/w/images/a/ad/Plant_Growth_Icon.webp" to R.drawable.icbg_plant_growth, + "https://bg3.wiki/w/images/b/b1/Song_of_Rest_Icon.webp" to R.drawable.icbg_song_of_rest, + "https://bg3.wiki/w/images/b/b3/Blink_Icon.webp" to R.drawable.icbg_blink, + "https://bg3.wiki/w/images/b/bf/Psionic_Suggestion_Hush_Icon.webp" to R.drawable.icbg_psionic_suggestion_hush, + "https://bg3.wiki/w/images/c/c3/Generic_Psychic_Icon.webp" to R.drawable.icbg_generic_psychic, + "https://bg3.wiki/w/images/d/d5/Invisibility_Icon.webp" to R.drawable.icbg_invisibility, + "https://bg3.wiki/w/images/d/db/Eldritch_Blast_Icon.webp" to R.drawable.icbg_eldritch_blast, + "https://bg3.wiki/w/images/f/f7/Magic_Initiate_Bard_Icon.webp" to R.drawable.icbg_magic_initiate_bard, + "https://bg3.wiki/w/images/f/f9/Mage_Hand_Icon.webp" to R.drawable.icbg_mage_hand, + "https://bg3.wiki/w/images/thumb/0/0a/Unshackling_Strike_Icon.webp/144px-Unshackling_Strike_Icon.webp.png" to R.drawable.icbg_unshackling_strike, ) - private val alterations = hashMapOf( - "Arme enflammée" to R.drawable.icbg_flaming_blade, - "Critique" to R.drawable.icbg_frenzied_strike, - "Esquiver" to R.drawable.icbg_uncanny_dodge, - "Aspect de la bête" to R.drawable.icbg_aspect_of_the_beast_bear, - "Attaque téméraire" to R.drawable.icbg_reckless_attack, - "Défense sans armure" to R.drawable.icbg_unarmoured_defence_barbarian, - "Instinct sauvage" to R.drawable.icbg_feral_instinct, - "Rage" to R.drawable.icbg_rage_bear_heart, - "Déplacement rapide" to R.drawable.icbg_fast_movement, - "Sens du danger" to R.drawable.icbg_danger_sense, - "Attaques sauvages" to R.drawable.icbg_savage_attacks, - "Dé de supériorité - d6" to R.drawable.icbg_generic_control, - "Dé de supériorité - d8" to R.drawable.icbg_generic_control, - "Inspiration bardique" to R.drawable.icbg_bardic_inspiration, - "Touche à tout" to R.drawable.icbg_jack_of_all_trades, - "Aide" to R.drawable.icbg_aid, - "Assistance" to R.drawable.icbg_guidance, - "Bénédiction" to R.drawable.icbg_bless, - "Discours motivant" to R.drawable.icbg_heroism, - "Frappes épouvantables" to R.drawable.icbg_bolt_of_celestial_light, - "Style de combat: Archerie" to R.drawable.icbg_brace_ranged, - "Style de combat : Archerie" to R.drawable.icbg_brace_ranged, - "Style de combat : Défense" to R.drawable.icbg_heavily_armoured, - "Style de combat : Technique supérieur" to R.drawable.icbg_wild_magic_teleport_activate_barbarian, - "Volonté astucieuse" to R.drawable.icbg_cutting_words_passive_feature, - "Frappe du zéphyr" to R.drawable.icbg_step_of_the_wind_dash, - "Marque du chasseur" to R.drawable.icbg_hunters_mark, - "Arme magique" to R.drawable.icbg_magic_weapon, - "Passage sans trace" to R.drawable.icbg_pass_without_trace, - "Tireur d'élite" to R.drawable.icbg_crossbow_expert_wounding, - "Forme sauvage : Loup" to R.drawable.icbg_wild_shape, - "Odorat et ouïe aiguisés" to R.drawable.icbg_wild_shape_wolf, - "Tactique de groupe" to R.drawable.icbg_pack_tactics, - "Forme sauvage : Chat" to R.drawable.icbg_wild_shape_cat, - "Ouïe aiguisés" to R.drawable.icbg_wild_shape_cat, - "Dague" to R.drawable.icbg_dagger_unfaded, - "Hache de guerre en argent" to R.drawable.icbg_battleaxe_plus_one_unfaded, - "Bouclier" to R.drawable.icbg_studded_shield_unfaded, - "Cape de protection" to R.drawable.icbg_cloak_of_protection_unfaded, - "Armure d'écailles" to R.drawable.icbg_scale_mail_unfaded, - "Armure de cuir" to R.drawable.icbg_leather_armour_rogue_unfaded, - "Avantage" to R.drawable.ic_dice_advantage, - "Désavantage" to R.drawable.ic_dice_disadvantage, - "Emphase" to R.drawable.ic_dice_emphase, - "Touché par le néant" to R.drawable.icbg_partial_ceremorphosis, - "Amateurisme retrouvé" to R.drawable.icbg_iron_mind, - "Morsure de vampire" to R.drawable.icbg_bite, - "Abri (partiel)" to R.drawable.icbg_patient_defence, - "Abri (important)" to R.drawable.icbg_multiattack_defense, - "Abri (total)" to R.drawable.icbg_protection_from_missiles, - "Arme spirituelle" to R.drawable.icbg_spiritual_weapon_maul, - "Epée courte" to R.drawable.icbg_shortsword_unfaded, - "Rapière" to R.drawable.icbg_rapier_unfaded, - "Arbalète légère" to R.drawable.icbg_light_crossbow_unfaded, - "Arbalète de poing" to R.drawable.icbg_hand_crossbow_unfaded, - ) + fun cache(uri: Uri?): ImageUio = when (uri) { + null -> { + R.drawable.icbg_generic_darkness_icon.toImage() + } - private val attacks = hashMapOf( - "Hache de guerre en argent" to R.drawable.icbg_reckless_attack, - "Hache de guerre en argent (2 mains)" to R.drawable.icbg_reckless_attack, - "Dague" to R.drawable.icbg_main_hand_attack, - "Masse d'armes" to R.drawable.icbg_main_hand_attack, - "Attaque à mains nues" to R.drawable.icbg_unarmed_strike, - "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, - "Lancé de javelot" to R.drawable.icbg_throw_weapon, - "Lancé de dague" to R.drawable.icbg_throw_weapon, - "Masse d'armes" to R.drawable.icbg_main_hand_attack, - "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, - "Epée courte argentée" to R.drawable.icbg_main_hand_attack, - "Epée courte (main gauche)" to R.drawable.icbg_off_hand_attack_melee, - "Arc long" to R.drawable.icbg_ranged_attack, - "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, - "Morsure" to R.drawable.icbg_bite_wolf, - "Griffer" to R.drawable.icbg_claws_cat, - "Dague" to R.drawable.icbg_main_hand_attack, - "Dague (main gauche)" to R.drawable.icbg_off_hand_attack_melee, - "Arbalète légère" to R.drawable.icbg_ranged_attack, - "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, - "Rapière" to R.drawable.icbg_main_hand_attack, - "Épée courte (main gauche)" to R.drawable.icbg_off_hand_attack_melee, - "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, - "Arbalète légère" to R.drawable.icbg_ranged_attack, - "Arbalète de poing" to R.drawable.icbg_ranged_attack, - "Arbalète de poing (main gauche)" to R.drawable.icbg_off_hand_attack_ranged, - "Arme spirituelle (invocation)" to R.drawable.icbg_spiritual_weapon_maul, - "Arme spirituelle" to R.drawable.icbg_spiritual_weapon_maul, - "Dague en argent" to R.drawable.icbg_main_hand_attack, - "Épée courte" to R.drawable.icbg_main_hand_attack, - ) + else -> when (val cache = ImageCache.uri[uri.toString()]) { + is Int -> { + cache.toImage() + } - private val objects = hashMapOf( - "Parchemin de Bénédiction" to R.drawable.icbg_scroll_of_bless_unfaded, - "Parchemin d'Arme spirituelle" to R.drawable.icbg_book_signedtradebisa_unfaded, - "Potion de guérison" to R.drawable.icbg_pot_potion_of_healing_unfaded, - "Potion de soin (Supérieur)" to R.drawable.icbg_potion_of_superior_healing_unfaded, - "Eau bénite" to R.drawable.icbg_grn_holy_water_unfaded, - "Baies nourricières" to R.drawable.icbg_food_goodberry_unfaded, - "Dent de loup d'hiver" to R.drawable.icbg_worg_fang_unfaded, - "Lanterne de révélation" to R.drawable.ic_drive_lantern_of_revealing, - "Poussière de disparition" to R.drawable.icbg_haste_spore_grenade_unfaded, - ) - - private val equipments = hashMapOf( - "Dague" to R.drawable.icbg_dagger_unfaded, - "Hache de guerre en argent" to R.drawable.icbg_battleaxe_plus_one_unfaded, - "Bouclier" to R.drawable.icbg_studded_shield_unfaded, - "Cape de protection" to R.drawable.icbg_cloak_of_protection_unfaded, - "Armure d'écailles" to R.drawable.icbg_scale_mail_unfaded, - "Armure de cuir" to R.drawable.icbg_leather_armour_rogue_unfaded, - ) - - private val skills = hashMapOf( - "Dé de vie (Barbare)" to R.drawable.icbg_bolstering_magic_boon, - "Dé de vie (Guerrier)" to R.drawable.icbg_bolstering_magic_boon, - "Dé de vie (Rodeur)" to R.drawable.icbg_bolstering_magic_boon, - "Dé de vie (Druide)" to R.drawable.icbg_bolstering_magic_boon, - "Dé de vie (Clerc)" to R.drawable.icbg_bolstering_magic_boon, - "Dé de vie" to R.drawable.icbg_bolstering_magic_boon, - "Inspiration" to R.drawable.icbg_indomitable, - "Touché par le néant" to R.drawable.icbg_partial_ceremorphosis, - "C'était inévitable" to R.drawable.icbg_ancient_grudges, - "Rage" to R.drawable.icbg_rage_bear_heart, - "Endurance implacable" to R.drawable.icbg_relentless_endurance, - "Vision dans le noir (Orc)" to R.drawable.icbg_darkvision, - "Menaçant" to R.drawable.icbg_intimidating_presence, - "Attaques sauvages" to R.drawable.icbg_savage_attacks, - "Défense sans armure" to R.drawable.icbg_unarmoured_defence_barbarian, - "Sens du danger" to R.drawable.icbg_danger_sense, - "Second souffle" to R.drawable.icbg_second_wind, - "Technique supérieur" to R.drawable.icbg_wild_magic_teleport_activate_barbarian, - "Dé de supériorité - d6" to R.drawable.icbg_generic_control, - "Croc-en-jambe" to R.drawable.icbg_trip_attack_melee, - "Conduit divin" to R.drawable.icbg_divine_intervention_sunder_the_heretical, - "Illumination protectrice" to R.drawable.icbg_warden_of_vitality, - "Renvoi des morts-vivants" to R.drawable.icbg_turn_undead, - "Radiance de l'aube" to R.drawable.icbg_break_of_dawn, - "Forme sauvage" to R.drawable.icbg_wild_shape, - "Ennemi juré" to R.drawable.icbg_mortal_reminder, - "Explorateur né" to R.drawable.icbg_forest, - "Ascendance féerique" to R.drawable.icbg_draconic_ancestry_copper_acid, - "Cachette naturelle" to R.drawable.icbg_naturally_stealthy, - "Vigilance primitive (variante)" to R.drawable.icbg_bestial_fury, - "Vision dans le noir (Elfe)" to R.drawable.icbg_darkvision, - "Transe" to R.drawable.icbg_focused_conjuration, - "Attaque supplémentaire" to R.drawable.icbg_extra_attack, - "Apanage de la Noblesse" to R.drawable.icbg_natures_ward, - "Druidique" to R.drawable.icbg_class_druid, - "Appel de familier" to R.drawable.icbg_find_familiar_cat, - "Détection de la magie" to R.drawable.icbg_generic_psychic, - "Vision dans le noir (Tieffelin)" to R.drawable.icbg_darkvision, - "Résistance infernale." to R.drawable.icbg_hellish_resistance, - "Ascendance infernale" to R.drawable.icbg_draconic_ancestry_brass_fire, - "Décharge déchirante" to R.drawable.icbg_agonising_blast, - "Vision occulte" to R.drawable.icbg_generic_psychic, - "Sombre présage" to R.drawable.icbg_hex_charisma, - "Malédiction" to R.drawable.icbg_hex_charisma, - "Ténèbres" to R.drawable.icbg_darkvision_spell, - "Représailles infernales" to R.drawable.icbg_hellish_rebuke, - "Présence féerique" to R.drawable.icbg_fey_presence, - "Échappatoire brumeuse" to R.drawable.icbg_misty_step, - "Inspiration" to R.drawable.icbg_indomitable, - "Inspiration bardique" to R.drawable.icbg_bardic_inspiration, - "Représentation envoûtante" to R.drawable.icbg_psionic_suggestion_hush, - "Apparence inspirante" to R.drawable.icbg_magic_initiate_bard, - "Apparence majestueuse" to R.drawable.icbg_crusaders_mantle, - "Chant reposant" to R.drawable.icbg_song_of_rest, - "Fléau" to R.drawable.icbg_bane_spell, - "Foulée brumeuse" to R.drawable.icbg_misty_step, - "Amateurisme retrouvé" to R.drawable.icbg_iron_mind, - "Vision dans le noir (Elfe)" to R.drawable.icbg_darkvision, - "Ascendance féerique" to R.drawable.icbg_draconic_ancestry_copper_acid, - "Source d'inspiration" to R.drawable.icbg_bardic_defence, - "Touche à tout" to R.drawable.icbg_jack_of_all_trades, - "Style de combat : Technique supérieur" to R.drawable.icbg_wild_magic_teleport_activate_barbarian, - "Style de combat : Défense" to R.drawable.icbg_heavily_armoured, - ) - - private val spells = hashMapOf( - "Aide" to R.drawable.icbg_aid, - "Alarme" to R.drawable.icbg_command_halt, - "Appel de familier" to R.drawable.icbg_find_familiar_cat, - "Arme spirituelle" to R.drawable.icbg_spiritual_weapon_maul, - "Armure d'Agathys" to R.drawable.icbg_armour_of_agathys, - "Assistance" to R.drawable.icbg_guidance, - "Bénédiction" to R.drawable.icbg_bless, - "Charme-personne" to R.drawable.icbg_charm_person, - "Communication avec les animaux" to R.drawable.icbg_speak_with_animals, - "Contact glacial" to R.drawable.icbg_bone_chill, - "Décharge occulte" to R.drawable.icbg_eldritch_blast, - "Détection de la magie" to R.drawable.icbg_generic_psychic, - "Espièglerie de Nathair" to R.drawable.icbg_tashas_hideous_laughter, - "Esprits gardiens" to R.drawable.icbg_spirit_guardians, - "Flamme sacrée" to R.drawable.icbg_sacred_flame, - "Fléau" to R.drawable.icbg_bane_spell, - "Foulée brumeuse" to R.drawable.icbg_misty_step, - "Frappe du zéphyr" to R.drawable.icbg_step_of_the_wind_dash, - "Illusion mineure" to R.drawable.icbg_minor_illusion, - "Image silencieuse" to R.drawable.icbg_blink, - "Immobilisation de personne" to R.drawable.icbg_hold_person, - "Injonction" to R.drawable.icbg_command_flee, - "Invisibilité" to R.drawable.icbg_invisibility, - "Lueurs féeriques" to R.drawable.icbg_faerie_fire, - "Lumière" to R.drawable.icbg_light, - "Main de mage" to R.drawable.icbg_mage_hand, - "Mains brûlantes" to R.drawable.icbg_burning_hands, - "Marque du chasseur" to R.drawable.icbg_hunters_mark, - "Message" to R.drawable.icbg_levitate, - "Moquerie cruelle" to R.drawable.icbg_vicious_mockery, - "Nuée de dagues" to R.drawable.icbg_cloud_of_daggers, - "Prière de guérison" to R.drawable.icbg_prayer_of_healing, - "Rayon ardent" to R.drawable.icbg_scorching_ray, - "Restauration partielle" to R.drawable.icbg_lesser_restoration, - "Sanctuaire" to R.drawable.icbg_sanctuary, - "Sens animal" to R.drawable.icbg_animal_friendship, - "Silence" to R.drawable.icbg_silence, - "Soins" to R.drawable.icbg_cure_wounds, - "Sommeil" to R.drawable.icbg_sleep, - "Sphère de feu" to R.drawable.icbg_flaming_sphere, - "Stabilisation" to R.drawable.icbg_help, - "Suggestion" to R.drawable.icbg_command_approach, - "Thaumaturgie" to R.drawable.icbg_thaumaturgy, - "Vague tonnante" to R.drawable.icbg_thunderwave, - "Passage sans trace" to R.drawable.icbg_pass_without_trace, - "Croissance d'épines" to R.drawable.icbg_spike_growth, - "Arme magique" to R.drawable.icbg_magic_weapon, - "Baies nourricières" to R.drawable.icbg_goodberry, - "Frappe piègeuse" to R.drawable.icbg_ensnaring_strike_ranged, - "Petite hutte de Léomund" to R.drawable.icbg_globe_of_invulnerability, - "Communication avec les plantes" to R.drawable.icbg_plant_growth, - "Boule de feu" to R.drawable.icbg_fireball, - "Lumière du jour" to R.drawable.icbg_daylight_sphere, - "Aura de vitalité" to R.drawable.icbg_healing_radiance, - "Malédiction" to R.drawable.icbg_hex_charisma, - "Toucher du vampire" to R.drawable.icbg_vampiric_touch, - "Amis" to R.drawable.icbg_friends, - "Discours motivant" to R.drawable.icbg_heroism, - "Ténèbres" to R.drawable.icbg_darkvision_spell, - "Représailles infernales" to R.drawable.icbg_hellish_rebuke, - "Mot de guérison" to R.drawable.icbg_healing_word, - "Façonnage de l'eau" to R.drawable.icbg_create_water, - "Vol" to R.drawable.icbg_grant_flight, - "Dissipation de la magie" to R.drawable.icbg_unshackling_strike, - "Protection contre le mal et le bien" to R.drawable.icbg_protection_from_evil_and_good, - ) - - @DrawableRes - fun attackIcon(name: String): Int? = attacks[name] - - @DrawableRes - fun objectIcon(name: String): Int? = objects[name] - - @DrawableRes - fun equipmentsIcon(name: String): Int? = equipments[name] - - @DrawableRes - fun alterationIcon(name: String): Int? = alterations[name] - - @DrawableRes - fun skillIcon(name: String): Int? = skills[name] - - @DrawableRes - fun spellIcon(name: String): Int? = spells[name] - - fun cache(uri: Uri?): Any = when (uri) { - null -> R.drawable.icbg_generic_darkness_icon - else -> ImageCache.uri[uri.toString()] ?: kotlin.run { - Log.v("ImageCache", "$uri") - uri + else -> { + Log.v("ImageCache", "$uri") + uri.toImage() + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/local/SchoolEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/local/SchoolEx.kt index 89f51b8..ffca4b7 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/local/SchoolEx.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/local/SchoolEx.kt @@ -2,6 +2,10 @@ package com.pixelized.rplexicon.utilitary.extentions.local import com.pixelized.rplexicon.R import com.pixelized.rplexicon.data.model.Spell +import com.pixelized.rplexicon.ui.composable.images.ImageUio + +val Spell.School.image: ImageUio + get() = ImageUio.Resources(icon) val Spell.School.icon: Int get() = when (this) {