Dynamic alteartion sorting
This commit is contained in:
		
							parent
							
								
									ae6581219b
								
							
						
					
					
						commit
						70ae338e23
					
				
					 3 changed files with 52 additions and 17 deletions
				
			
		| 
						 | 
					@ -103,4 +103,22 @@ class AlterationRepository @Inject constructor(
 | 
				
			||||||
            lastSuccessFullUpdate = Update.currentTime()
 | 
					            lastSuccessFullUpdate = Update.currentTime()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    companion object {
 | 
				
			||||||
 | 
					        fun sort(sheet: CharacterSheet?): Comparator<String> {
 | 
				
			||||||
 | 
					            return compareByDescending<String> {
 | 
				
			||||||
 | 
					                sheet?.name == it
 | 
				
			||||||
 | 
					            }.thenByDescending {
 | 
				
			||||||
 | 
					                PLAYER == it
 | 
				
			||||||
 | 
					            }.thenByDescending {
 | 
				
			||||||
 | 
					                sheet?.characterClass?.any { clazz -> clazz.value == it }
 | 
				
			||||||
 | 
					            }.thenByDescending {
 | 
				
			||||||
 | 
					                sheet?.race == it
 | 
				
			||||||
 | 
					            }.thenBy {
 | 
				
			||||||
 | 
					                it
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private const val PLAYER = "Joueur"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -8,18 +8,21 @@ import androidx.lifecycle.SavedStateHandle
 | 
				
			||||||
import androidx.lifecycle.viewModelScope
 | 
					import androidx.lifecycle.viewModelScope
 | 
				
			||||||
import com.pixelized.rplexicon.R
 | 
					import com.pixelized.rplexicon.R
 | 
				
			||||||
import com.pixelized.rplexicon.data.repository.character.AlterationRepository
 | 
					import com.pixelized.rplexicon.data.repository.character.AlterationRepository
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository
 | 
				
			||||||
import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
 | 
					import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
 | 
				
			||||||
import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument
 | 
					import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.rolls.factory.AlterationFactory
 | 
					import com.pixelized.rplexicon.ui.screens.rolls.factory.AlterationFactory
 | 
				
			||||||
import com.pixelized.rplexicon.utilitary.extentions.context
 | 
					import com.pixelized.rplexicon.utilitary.extentions.context
 | 
				
			||||||
import dagger.hilt.android.lifecycle.HiltViewModel
 | 
					import dagger.hilt.android.lifecycle.HiltViewModel
 | 
				
			||||||
import kotlinx.coroutines.Dispatchers
 | 
					import kotlinx.coroutines.Dispatchers
 | 
				
			||||||
 | 
					import kotlinx.coroutines.flow.combine
 | 
				
			||||||
import kotlinx.coroutines.launch
 | 
					import kotlinx.coroutines.launch
 | 
				
			||||||
import kotlinx.coroutines.withContext
 | 
					import kotlinx.coroutines.withContext
 | 
				
			||||||
import javax.inject.Inject
 | 
					import javax.inject.Inject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@HiltViewModel
 | 
					@HiltViewModel
 | 
				
			||||||
class AlterationViewModel @Inject constructor(
 | 
					class AlterationViewModel @Inject constructor(
 | 
				
			||||||
 | 
					    private val characterSheetRepository: CharacterSheetRepository,
 | 
				
			||||||
    private val alterationRepository: AlterationRepository,
 | 
					    private val alterationRepository: AlterationRepository,
 | 
				
			||||||
    private val descriptionRepository: DescriptionRepository,
 | 
					    private val descriptionRepository: DescriptionRepository,
 | 
				
			||||||
    private val factory: AlterationFactory,
 | 
					    private val factory: AlterationFactory,
 | 
				
			||||||
| 
						 | 
					@ -37,23 +40,32 @@ class AlterationViewModel @Inject constructor(
 | 
				
			||||||
    init {
 | 
					    init {
 | 
				
			||||||
        viewModelScope.launch {
 | 
					        viewModelScope.launch {
 | 
				
			||||||
            launch(Dispatchers.IO) {
 | 
					            launch(Dispatchers.IO) {
 | 
				
			||||||
                alterationRepository.assignedAlterations.collect { alterationMaps ->
 | 
					                characterSheetRepository.data
 | 
				
			||||||
                    val alterations = alterationMaps[character] ?: emptyList()
 | 
					                    .combine(alterationRepository.assignedAlterations) { sheet, alterations ->
 | 
				
			||||||
                    val data = alterations
 | 
					                        sheet[character] to alterations
 | 
				
			||||||
                        .groupBy { alteration -> alteration.source }
 | 
					                    }
 | 
				
			||||||
                        .map {
 | 
					                    .collect { entry ->
 | 
				
			||||||
                            AlterationGroupUio(
 | 
					                        val (sheet, alterationMaps) = entry
 | 
				
			||||||
                                name = it.key,
 | 
					                        val alterations = alterationMaps[character] ?: emptyList()
 | 
				
			||||||
                                alterations = factory.convert(character = character, alterations = it.value)
 | 
					                        val data = alterations
 | 
				
			||||||
                                    .sortedBy { alteration -> alteration.label }
 | 
					                            .groupBy { alteration -> alteration.source }
 | 
				
			||||||
                            )
 | 
					                            .toSortedMap(AlterationRepository.sort(sheet = sheet))
 | 
				
			||||||
                        }
 | 
					                            .map {
 | 
				
			||||||
                        .sortedBy { it.name }
 | 
					                                AlterationGroupUio(
 | 
				
			||||||
 | 
					                                    name = it.key,
 | 
				
			||||||
                    withContext(Dispatchers.Main) {
 | 
					                                    alterations = factory.convert(
 | 
				
			||||||
                        _alterations.value = data
 | 
					                                        character = character,
 | 
				
			||||||
 | 
					                                        alterations = it.value
 | 
				
			||||||
 | 
					                                    ).sortedBy { alteration ->
 | 
				
			||||||
 | 
					                                        alteration.label
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        withContext(Dispatchers.Main) {
 | 
				
			||||||
 | 
					                            _alterations.value = data
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,8 +8,10 @@ import androidx.lifecycle.AndroidViewModel
 | 
				
			||||||
import androidx.lifecycle.viewModelScope
 | 
					import androidx.lifecycle.viewModelScope
 | 
				
			||||||
import com.pixelized.rplexicon.R
 | 
					import com.pixelized.rplexicon.R
 | 
				
			||||||
import com.pixelized.rplexicon.business.DiceThrowUseCase
 | 
					import com.pixelized.rplexicon.business.DiceThrowUseCase
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.data.model.CharacterSheet
 | 
				
			||||||
import com.pixelized.rplexicon.data.model.DiceThrow
 | 
					import com.pixelized.rplexicon.data.model.DiceThrow
 | 
				
			||||||
import com.pixelized.rplexicon.data.repository.character.AlterationRepository
 | 
					import com.pixelized.rplexicon.data.repository.character.AlterationRepository
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository
 | 
				
			||||||
import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
 | 
					import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio
 | 
					import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.character.pages.alteration.AlterationDetailUio
 | 
					import com.pixelized.rplexicon.ui.screens.character.pages.alteration.AlterationDetailUio
 | 
				
			||||||
| 
						 | 
					@ -28,6 +30,7 @@ import javax.inject.Inject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@HiltViewModel
 | 
					@HiltViewModel
 | 
				
			||||||
class RollOverlayViewModel @Inject constructor(
 | 
					class RollOverlayViewModel @Inject constructor(
 | 
				
			||||||
 | 
					    private val characterSheetRepository: CharacterSheetRepository,
 | 
				
			||||||
    private val alterationRepository: AlterationRepository,
 | 
					    private val alterationRepository: AlterationRepository,
 | 
				
			||||||
    private val descriptionRepository: DescriptionRepository,
 | 
					    private val descriptionRepository: DescriptionRepository,
 | 
				
			||||||
    private val rollUseCase: DiceThrowUseCase,
 | 
					    private val rollUseCase: DiceThrowUseCase,
 | 
				
			||||||
| 
						 | 
					@ -35,6 +38,7 @@ class RollOverlayViewModel @Inject constructor(
 | 
				
			||||||
    private val alterationFactory: AlterationFactory,
 | 
					    private val alterationFactory: AlterationFactory,
 | 
				
			||||||
    application: Application,
 | 
					    application: Application,
 | 
				
			||||||
) : AndroidViewModel(application) {
 | 
					) : AndroidViewModel(application) {
 | 
				
			||||||
 | 
					    private var sheet: CharacterSheet? = null
 | 
				
			||||||
    private var diceThrow: DiceThrow? = null
 | 
					    private var diceThrow: DiceThrow? = null
 | 
				
			||||||
    private var rollJob: Job? = null
 | 
					    private var rollJob: Job? = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,13 +46,13 @@ class RollOverlayViewModel @Inject constructor(
 | 
				
			||||||
    val alterations: State<List<AlterationGroupUio>> = derivedStateOf {
 | 
					    val alterations: State<List<AlterationGroupUio>> = derivedStateOf {
 | 
				
			||||||
        _alterations.value
 | 
					        _alterations.value
 | 
				
			||||||
            .groupBy { it.source }
 | 
					            .groupBy { it.source }
 | 
				
			||||||
 | 
					            .toSortedMap(AlterationRepository.sort(sheet = sheet))
 | 
				
			||||||
            .map { entry ->
 | 
					            .map { entry ->
 | 
				
			||||||
                AlterationGroupUio(
 | 
					                AlterationGroupUio(
 | 
				
			||||||
                    name = entry.key,
 | 
					                    name = entry.key,
 | 
				
			||||||
                    alterations = entry.value.sortedBy { it.label }
 | 
					                    alterations = entry.value.sortedBy { it.label }
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            .sortedBy { it.name }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private val _dice = mutableStateOf<RollDiceUio?>(null)
 | 
					    private val _dice = mutableStateOf<RollDiceUio?>(null)
 | 
				
			||||||
| 
						 | 
					@ -66,6 +70,7 @@ class RollOverlayViewModel @Inject constructor(
 | 
				
			||||||
    fun prepareRoll(diceThrow: DiceThrow) {
 | 
					    fun prepareRoll(diceThrow: DiceThrow) {
 | 
				
			||||||
        this.diceThrow = diceThrow
 | 
					        this.diceThrow = diceThrow
 | 
				
			||||||
        _card.value = null
 | 
					        _card.value = null
 | 
				
			||||||
 | 
					        sheet = characterSheetRepository.find(name = diceThrow.character)
 | 
				
			||||||
        _dice.value = diceFactory.convertDiceThrow(diceThrow)
 | 
					        _dice.value = diceFactory.convertDiceThrow(diceThrow)
 | 
				
			||||||
        _alterations.value = alterationFactory.convertDiceThrow(diceThrow)
 | 
					        _alterations.value = alterationFactory.convertDiceThrow(diceThrow)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue