diff --git a/app/src/main/assets/deck_content.html b/app/src/main/assets/deck_content.html index 5d08685..9779e09 100644 --- a/app/src/main/assets/deck_content.html +++ b/app/src/main/assets/deck_content.html @@ -9,33 +9,44 @@ About this deck diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/DeepLinkerActivity.kt b/app/src/main/java/com/belmontCrest/cardCrafter/DeepLinkerActivity.kt index 81b1ecc..ddc43f0 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/DeepLinkerActivity.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/DeepLinkerActivity.kt @@ -23,13 +23,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.lifecycle.lifecycleScope import com.belmontCrest.cardCrafter.model.application.AppViewModelProvider -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.viewModels.DeepLinksViewModel import com.belmontCrest.cardCrafter.ui.theme.ColorSchemeClass import com.belmontCrest.cardCrafter.ui.theme.FlashcardsTheme import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import kotlinx.coroutines.launch import kotlin.getValue diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/MainActivity.kt b/app/src/main/java/com/belmontCrest/cardCrafter/MainActivity.kt index 9d0ba5b..93219f6 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/MainActivity.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/MainActivity.kt @@ -21,8 +21,8 @@ import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.navigation.navHosts.AppNavHost import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.EditingCardListViewModel import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.MainViewModel -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.viewModels.SupabaseViewModel import com.belmontCrest.cardCrafter.ui.theme.FlashcardsTheme import io.github.jan.supabase.annotations.SupabaseInternal diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/ResetPasswordActivity.kt b/app/src/main/java/com/belmontCrest/cardCrafter/ResetPasswordActivity.kt index 52582e3..c9bad7e 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/ResetPasswordActivity.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/ResetPasswordActivity.kt @@ -29,7 +29,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.lifecycleScope import com.belmontCrest.cardCrafter.model.application.AppViewModelProvider -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.viewModels.DeepLinksViewModel import com.belmontCrest.cardCrafter.ui.theme.ColorSchemeClass import com.belmontCrest.cardCrafter.ui.theme.FlashcardsTheme @@ -37,7 +37,7 @@ import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.scrollableBoxViewModifier import com.belmontCrest.cardCrafter.uiFunctions.CustomText import com.belmontCrest.cardCrafter.uiFunctions.PasswordTextField -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import kotlinx.coroutines.launch import kotlin.getValue diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CTConversionHandler.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CTConversionHandler.kt index 06b2569..8220b60 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CTConversionHandler.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CTConversionHandler.kt @@ -135,97 +135,44 @@ suspend fun redoACard( * (the redo card) hence we call this getRedoCard. */ is CT.Basic -> { - ct.card = cardDeckVM.getRedoCardType( - ct.card.id, - index - ).also { - dueCTs[index] = ct - } + ct.card = cardDeckVM.getRedoCardType(ct.card.id, index).also { dueCTs[index] = ct } } is CT.Hint -> { - ct.card = cardDeckVM.getRedoCardType( - ct.card.id, - index - ).also { - dueCTs[index] = ct - } + ct.card = cardDeckVM.getRedoCardType(ct.card.id, index).also { dueCTs[index] = ct } } is CT.ThreeField -> { - ct.card = cardDeckVM.getRedoCardType( - ct.card.id, - index - ).also { - dueCTs[index] = ct - } + ct.card = cardDeckVM.getRedoCardType(ct.card.id, index).also { dueCTs[index] = ct } } is CT.MultiChoice -> { - ct.card = cardDeckVM.getRedoCardType( - ct.card.id, - index - ).also { - dueCTs[index] = ct - } + ct.card = cardDeckVM.getRedoCardType(ct.card.id, index).also { dueCTs[index] = ct } } is CT.Notation -> { - ct.card = cardDeckVM.getRedoCardType( - ct.card.id, - index - ).also { - dueCTs[index] = ct - } + ct.card = cardDeckVM.getRedoCardType(ct.card.id, index).also { dueCTs[index] = ct } } } } fun showReviewsLeft(ct: CT): String { return when (ct) { - is CT.Basic -> { - ct.card.reviewsLeft.toString() - } - - is CT.Hint -> { - ct.card.reviewsLeft.toString() - } - - is CT.ThreeField -> { - ct.card.reviewsLeft.toString() - } - - is CT.MultiChoice -> { - ct.card.reviewsLeft.toString() - } - - is CT.Notation -> { - ct.card.reviewsLeft.toString() - } + is CT.Basic -> ct.card.reviewsLeft.toString() + is CT.Hint -> ct.card.reviewsLeft.toString() + is CT.ThreeField -> ct.card.reviewsLeft.toString() + is CT.MultiChoice -> ct.card.reviewsLeft.toString() + is CT.Notation -> ct.card.reviewsLeft.toString() } } fun returnReviewsLeft(ct: CT): Int { return when (ct) { - is CT.Basic -> { - ct.card.reviewsLeft - } - - is CT.Hint -> { - ct.card.reviewsLeft - } - - is CT.ThreeField -> { - ct.card.reviewsLeft - } - - is CT.MultiChoice -> { - ct.card.reviewsLeft - } - - is CT.Notation -> { - ct.card.reviewsLeft - } + is CT.Basic -> ct.card.reviewsLeft + is CT.Hint -> ct.card.reviewsLeft + is CT.ThreeField -> ct.card.reviewsLeft + is CT.MultiChoice -> ct.card.reviewsLeft + is CT.Notation -> ct.card.reviewsLeft } } diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardTypeHandler.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardTypeHandler.kt index 1ebd63d..29f741a 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardTypeHandler.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardTypeHandler.kt @@ -6,7 +6,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import com.belmontCrest.cardCrafter.localDatabase.tables.CT -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.views.cardViews.editCardViews.EditBasicCard import com.belmontCrest.cardCrafter.views.cardViews.editCardViews.EditHintCard diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdateErrorHandler.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdateErrorHandler.kt index b341cec..afb8506 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdateErrorHandler.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdateErrorHandler.kt @@ -2,7 +2,7 @@ package com.belmontCrest.cardCrafter.controller.cardHandlers import android.database.sqlite.SQLiteConstraintException import android.database.sqlite.SQLiteException -import com.belmontCrest.cardCrafter.model.uiModels.CardUpdateError +import com.belmontCrest.cardCrafter.model.ui.CardUpdateError import kotlinx.coroutines.TimeoutCancellationException import java.io.IOException diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdaterHandler.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdaterHandler.kt index 1796d9c..cb0a169 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdaterHandler.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/cardHandlers/CardUpdaterHandler.kt @@ -4,7 +4,7 @@ import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.CardDe import com.belmontCrest.cardCrafter.localDatabase.tables.Card import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.localDatabase.tables.SavedCard -import com.belmontCrest.cardCrafter.model.uiModels.CardState +import com.belmontCrest.cardCrafter.model.ui.CardState import java.util.Calendar import java.util.Date diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/CardOnClickActions.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/CardOnClickActions.kt index 919d407..809a1a1 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/CardOnClickActions.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/CardOnClickActions.kt @@ -10,13 +10,16 @@ import androidx.compose.ui.res.stringResource import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.EditCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.CT import com.belmontCrest.cardCrafter.localDatabase.tables.Card -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.deleteTextColor import kotlinx.coroutines.CoroutineScope import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.cardHandlers.toCard +import com.belmontCrest.cardCrafter.model.Type import com.belmontCrest.cardCrafter.navigation.NavViewModel +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import kotlinx.coroutines.launch fun saveCard( @@ -71,6 +74,7 @@ fun saveCard( return false } } + is CT.MultiChoice -> { if ( fields.question.value.isNotBlank() && @@ -83,7 +87,7 @@ fun saveCard( (fields.choices[3].value.isBlank() && fields.correct.value == 'd') ) && - fields.correct.value in 'a' .. 'd' + fields.correct.value in 'a'..'d' ) { editCardVM.updateMultiChoiceCard( ct.card.id, @@ -99,12 +103,14 @@ fun saveCard( return false } } + is CT.Notation -> { if (fields.question.value.isNotBlank() && fields.answer.value.isNotBlank() && - ( fields.stringList.isEmpty() || + (fields.stringList.isEmpty() || fields.stringList.all { it.value.isNotBlank() } - )) { + ) + ) { editCardVM.updateNotationCard( ct.card.id, fields.question.value, @@ -127,40 +133,43 @@ suspend fun updateCardType( fields: Fields, editCardVM: EditCardViewModel, ct: CT, - newType : String + newType: String ): Boolean { val card = ct.toCard() when (newType) { - "basic" -> { + Type.BASIC -> { if (fields.question.value.isNotBlank() && fields.answer.value.isNotBlank()) { - editCardVM.updateCardType(card.id,newType,fields,ct) + editCardVM.updateCardType(card.id, newType, fields, ct) return true } else { return false } } - "three" -> { + + Type.THREE -> { if (fields.question.value.isNotBlank() && fields.answer.value.isNotBlank() && fields.middleField.value.isNotBlank() ) { - editCardVM.updateCardType(card.id,newType,fields,ct) + editCardVM.updateCardType(card.id, newType, fields, ct) return true } else { return false } } - "hint" -> { + + Type.HINT -> { if (fields.question.value.isNotBlank() && fields.answer.value.isNotBlank() && fields.middleField.value.isNotBlank() ) { - editCardVM.updateCardType(card.id,newType,fields,ct) + editCardVM.updateCardType(card.id, newType, fields, ct) return true } else { return false } } - "multi" -> { + + Type.MULTI -> { if ( fields.question.value.isNotBlank() && fields.choices[0].value.isNotBlank() && @@ -172,21 +181,23 @@ suspend fun updateCardType( (fields.choices[3].value.isBlank() && fields.correct.value == 'd') ) && - fields.correct.value in 'a' .. 'd' + fields.correct.value in 'a'..'d' ) { - editCardVM.updateCardType(card.id,newType,fields,ct) + editCardVM.updateCardType(card.id, newType, fields, ct) return true } else { return false } } - "notation" -> { + + Type.NOTATION -> { if (fields.question.value.isNotBlank() && fields.answer.value.isNotBlank() && - ( fields.stringList.isEmpty() || + (fields.stringList.isEmpty() || fields.stringList.all { it.value.isNotBlank() } - )) { - editCardVM.updateCardType(card.id,newType,fields,ct) + ) + ) { + editCardVM.updateCardType(card.id, newType, fields, ct) return true } else { return false @@ -235,16 +246,37 @@ fun DeleteCard( } }, dismissButton = { - Button( - onClick = { pressed.value = false }, - colors = ButtonDefaults.buttonColors( - containerColor = getUIStyle.secondaryButtonColor(), - contentColor = getUIStyle.buttonTextColor() - ) - ) { - Text(stringResource(R.string.cancel)) - } + CancelButton(onClick = { pressed.value = false }, enabled = true, getUIStyle) + } + ) + } +} + +@Composable +fun DeleteCards( + showDialog: Boolean, onDismiss: (Boolean) -> Unit, + onDelete: () -> Unit, getUIStyle: GetUIStyle, enabled: Boolean +) { + if (showDialog) { + AlertDialog( + onDismissRequest = { if (enabled) onDismiss(false) }, + title = { Text(stringResource(R.string.delete_card_list)) }, + text = { + Text( + text = stringResource(R.string.sure_to_delete_card_list), + color = getUIStyle.titleColor() + ) + }, + confirmButton = { + SubmitButton( + onClick = { onDelete() }, enabled = enabled, + getUIStyle, stringResource(R.string.delete) + ) + }, + dismissButton = { + CancelButton(onClick = { onDismiss(false) }, enabled, getUIStyle) } ) } + } \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/DeckOnClickActions.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/DeckOnClickActions.kt index 4e1166c..a324b12 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/DeckOnClickActions.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/onClickActions/DeckOnClickActions.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.EditDeckViewModel -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.ui.theme.deleteTextColor import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/CardDeckViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/CardDeckViewModel.kt index 76755f0..c37d7a8 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/CardDeckViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/CardDeckViewModel.kt @@ -12,10 +12,10 @@ import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.CardT import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.FlashCardRepository import com.belmontCrest.cardCrafter.localDatabase.tables.Card import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.CardState -import com.belmontCrest.cardCrafter.model.uiModels.CardUpdateError -import com.belmontCrest.cardCrafter.model.uiModels.SavedCardUiState -import com.belmontCrest.cardCrafter.model.uiModels.SealedDueCTs +import com.belmontCrest.cardCrafter.model.ui.CardState +import com.belmontCrest.cardCrafter.model.ui.CardUpdateError +import com.belmontCrest.cardCrafter.model.ui.SavedCardUiState +import com.belmontCrest.cardCrafter.model.ui.SealedDueCTs import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.TimeoutCancellationException @@ -63,8 +63,7 @@ class CardDeckViewModel( */ private val _deckId = MutableStateFlow(savedStateHandle[DECK_ID] ?: 0) - private val state = - _deckId.flatMapLatest { id -> + private val state = _deckId.flatMapLatest { id -> flashCardRepository.getDueDeckDetails(id) }.flatMapLatest { dueDetails -> if (dueDetails == null) { @@ -279,8 +278,7 @@ class CardDeckViewModel( return@withContext true } else { viewModelScope.launch(Dispatchers.IO) { - flashCardRepository.updateCardsLeft( - deck.id, deck.cardsLeft, deck.cardsDone + flashCardRepository.updateCardsLeft(deck.id, deck.cardsLeft, deck.cardsDone ) } } @@ -294,9 +292,7 @@ class CardDeckViewModel( true } catch (e: Exception) { thisErrorState.value = returnError(e) - thisErrorState.value?.let { cardUE -> - callError(cardUE) - } + thisErrorState.value?.let { cardUE -> callError(cardUE) } false } } diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditCardViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditCardViewModel.kt index 98d6131..d8e833f 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditCardViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditCardViewModel.kt @@ -7,7 +7,7 @@ import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.Scien import com.belmontCrest.cardCrafter.localDatabase.tables.CT import com.belmontCrest.cardCrafter.localDatabase.tables.ListStringConverter import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditingCardListViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditingCardListViewModel.kt index a90cf0d..bc2bf43 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditingCardListViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/cardViewsModels/EditingCardListViewModel.kt @@ -6,11 +6,11 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.CardTypeRepository -import com.belmontCrest.cardCrafter.model.uiModels.SealedAllCTs +import com.belmontCrest.cardCrafter.localDatabase.tables.CT +import com.belmontCrest.cardCrafter.model.ui.SealedAllCTs import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map @@ -26,11 +26,12 @@ class EditingCardListViewModel( } private val deckId = MutableStateFlow(savedStateHandle["deckId"] ?: 0) - private val sealedUiState = deckId.flatMapLatest { id -> + + val sealedAllCTs = deckId.flatMapLatest { id -> if (id == 0) { flowOf(SealedAllCTs()) } else { - cardTypeRepository.getAllCardTypes(id).map { + cardTypeRepository.getAllCardTypesStream(id).map { SealedAllCTs(it.toMutableList()) } } @@ -39,17 +40,23 @@ class EditingCardListViewModel( initialValue = SealedAllCTs(), started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS) ) - var sealedAllCTs = sealedUiState - private val _searchQuery = MutableStateFlow(savedStateHandle["query"] ?: "") - val searchQuery = _searchQuery.asStateFlow() + val searchQuery = cardTypeRepository.searchQuery.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS), + initialValue = savedStateHandle["query"] ?: "" + ) + val selectedCards = cardTypeRepository.selectedCards.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS), + initialValue = emptyList() + ) - fun updateQuery(query : String) { + fun updateQuery(query: String) { savedStateHandle["query"] = query - _searchQuery.update { - query - } + cardTypeRepository.updateQuery(query) } + fun updateId( id: Int, ) { @@ -57,6 +64,13 @@ class EditingCardListViewModel( deckId.update { id } } + fun toggleCard(ct: CT) { + cardTypeRepository.toggleCard(ct) + } + + init { + updateQuery(savedStateHandle["query"] ?: "") + } } diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/deckViewsModels/MainViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/deckViewsModels/MainViewModel.kt index 18c6993..367eb2f 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/deckViewsModels/MainViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/controller/viewModels/deckViewsModels/MainViewModel.kt @@ -7,15 +7,15 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.FlashCardRepository -import com.belmontCrest.cardCrafter.model.uiModels.DeckUiState +import com.belmontCrest.cardCrafter.model.ui.DeckUiState import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -import com.belmontCrest.cardCrafter.model.uiModels.CardListUiCount -import com.belmontCrest.cardCrafter.model.uiModels.CardUpdateError -import com.belmontCrest.cardCrafter.model.uiModels.SavedCardUiState +import com.belmontCrest.cardCrafter.model.ui.CardListUiCount +import com.belmontCrest.cardCrafter.model.ui.CardUpdateError +import com.belmontCrest.cardCrafter.model.ui.SavedCardUiState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/CardTypesDao.kt b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/CardTypesDao.kt index 4e53236..57213ed 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/CardTypesDao.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/CardTypesDao.kt @@ -6,9 +6,16 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Transaction +import com.belmontCrest.cardCrafter.controller.cardHandlers.toBasicList +import com.belmontCrest.cardCrafter.controller.cardHandlers.toCardList +import com.belmontCrest.cardCrafter.controller.cardHandlers.toHintList +import com.belmontCrest.cardCrafter.controller.cardHandlers.toMultiChoiceList +import com.belmontCrest.cardCrafter.controller.cardHandlers.toNotationList +import com.belmontCrest.cardCrafter.controller.cardHandlers.toThreeFieldList import com.belmontCrest.cardCrafter.localDatabase.tables.AllCardTypes import com.belmontCrest.cardCrafter.localDatabase.tables.BasicCard import com.belmontCrest.cardCrafter.localDatabase.tables.CT +import com.belmontCrest.cardCrafter.localDatabase.tables.Card import com.belmontCrest.cardCrafter.localDatabase.tables.HintCard import com.belmontCrest.cardCrafter.localDatabase.tables.MultiChoiceCard import com.belmontCrest.cardCrafter.localDatabase.tables.NotationCard @@ -18,7 +25,7 @@ import com.belmontCrest.cardCrafter.model.Type.HINT import com.belmontCrest.cardCrafter.model.Type.MULTI import com.belmontCrest.cardCrafter.model.Type.NOTATION import com.belmontCrest.cardCrafter.model.Type.THREE -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import kotlinx.coroutines.flow.Flow @Dao @@ -40,15 +47,21 @@ interface CardTypesDao { ORDER BY nextReview ASC, partOfList DESC, reviewsLeft DESC LIMIT :cardAmount""" ) - fun getDueAllCardTypes(deckId: Int, cardAmount: Int, currentTime: Long): - List + fun getDueAllCardTypes(deckId: Int, cardAmount: Int, currentTime: Long): List @Transaction @Query( """SELECT * FROM cards WHERE deckId = :deckId ORDER BY cards.id""" ) - fun getAllCardTypes(deckId: Int): Flow> + fun getAllCardTypesStream(deckId: Int): Flow> + + @Transaction + @Query( + """SELECT * FROM cards WHERE deckId = :deckId + ORDER BY cards.id""" + ) + suspend fun getAllCardTypes(deckId: Int): List @Transaction @@ -180,4 +193,35 @@ interface CardTypesDao { } } } + + @Delete + suspend fun deleteCards(cards: List) + + @Delete + suspend fun deleteBasicCards(basicCards: List) + + @Delete + suspend fun deleteThreeCards(threeCards: List) + + @Delete + suspend fun deleteHintCards(hintCards: List) + + @Delete + suspend fun deleteMultiCards(multiCards: List) + + @Delete + suspend fun deleteNotationCards(notationCards: List) + + @Transaction + suspend fun deleteCardList(cts: List) { + val basicCards = cts.toBasicList() + val threeCards = cts.toThreeFieldList() + val hintCards = cts.toHintList() + val multiCards = cts.toMultiChoiceList() + val notationCards = cts.toNotationList() + val cards = cts.toCardList() + deleteCards(cards); deleteBasicCards(basicCards); deleteThreeCards(threeCards) + deleteHintCards(hintCards); deleteMultiCards(multiCards) + deleteNotationCards(notationCards) + } } \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/DeckDao.kt b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/DeckDao.kt index 7d576d7..8264413 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/DeckDao.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/daoInterfaces/deckAndCardDao/DeckDao.kt @@ -7,7 +7,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.DueDeckDetails +import com.belmontCrest.cardCrafter.model.ui.DueDeckDetails import kotlinx.coroutines.flow.Flow import java.util.Calendar import java.util.Date diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/CardTypeRepository.kt b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/CardTypeRepository.kt index ad041b5..2565e9d 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/CardTypeRepository.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/CardTypeRepository.kt @@ -6,12 +6,22 @@ import com.belmontCrest.cardCrafter.localDatabase.tables.HintCard import com.belmontCrest.cardCrafter.localDatabase.tables.MultiChoiceCard import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA import com.belmontCrest.cardCrafter.localDatabase.tables.ThreeFieldCard -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow import java.util.Date interface CardTypeRepository { + val selectedCards: StateFlow> + fun toggleCard(ct: CT) + fun clearSelection() + + suspend fun toggleAllCards(deckId: Int) + val searchQuery: StateFlow + fun updateQuery(query: String) + fun resetQuery() + suspend fun deleteBasicCard(basicCard: BasicCard) suspend fun deleteThreeCard(threeFieldCard: ThreeFieldCard) suspend fun deleteHintCard(hintCard: HintCard) @@ -20,43 +30,31 @@ interface CardTypeRepository { suspend fun updateBasicCard(id: Int, question: String, answer: String) suspend fun updateThreeCard( - id: Int, question: String, middle: String, - answer: String, isQOrA : PartOfQorA + id: Int, question: String, middle: String, answer: String, isQOrA: PartOfQorA ) - suspend fun updateHintCard( - id: Int, question: String, hint: String, - answer: String - ) + suspend fun updateHintCard(id: Int, question: String, hint: String, answer: String) suspend fun updateMultiChoiceCard( - id: Int, - newQuestion: String, - newChoiceA: String, - newChoiceB: String, - newChoiceC: String, - newChoiceD: String, - newCorrect: Char + id: Int, newQuestion: String, newChoiceA: String, newChoiceB: String, + newChoiceC: String, newChoiceD: String, newCorrect: Char ) - fun getAllCardTypes(deckId: Int): Flow> + suspend fun getAllCardTypes(deckId: Int): List - fun getAllDueCards( - deckId: Int, - cardAmount: Int, - currentTime: Long - ): Flow> + fun getAllCardTypesStream(deckId: Int): Flow> + + fun getAllDueCards(deckId: Int, cardAmount: Int, currentTime: Long): Flow> fun getDueAllCardTypes(deckId: Int, cardAmount: Int, currentTime: Long = Date().time): List fun getACardType(id: Int): CT - fun getACardTypeStream(id: Int) : Flow + fun getACardTypeStream(id: Int): Flow - suspend fun updateCT( - cardId: Int, type: String, fields: Fields, - deleteCT: CT - ) + suspend fun updateCT(cardId: Int, type: String, fields: Fields, deleteCT: CT) + + suspend fun deleteCTs() } \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/FlashCardRepository.kt b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/FlashCardRepository.kt index a9c7846..9099514 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/FlashCardRepository.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/FlashCardRepository.kt @@ -3,7 +3,7 @@ package com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories import com.belmontCrest.cardCrafter.localDatabase.tables.Card import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.localDatabase.tables.SavedCard -import com.belmontCrest.cardCrafter.model.uiModels.DueDeckDetails +import com.belmontCrest.cardCrafter.model.ui.DueDeckDetails import com.belmontCrest.cardCrafter.views.miscFunctions.details.CDetails import kotlinx.coroutines.flow.Flow import java.util.Date diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/OfflineCardTypeRepository.kt b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/OfflineCardTypeRepository.kt index de1a343..9833131 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/OfflineCardTypeRepository.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/localDatabase/dbInterface/repositories/OfflineCardTypeRepository.kt @@ -14,17 +14,65 @@ import com.belmontCrest.cardCrafter.localDatabase.tables.HintCard import com.belmontCrest.cardCrafter.localDatabase.tables.MultiChoiceCard import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA import com.belmontCrest.cardCrafter.localDatabase.tables.ThreeFieldCard -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.views.miscFunctions.details.toQuestion +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.update +import kotlin.text.isBlank class OfflineCardTypeRepository( private val cardTypesDao: CardTypesDao, private val basicCardDao: BasicCardDao, private val hintCardDao: HintCardDao, private val threeCardDao: ThreeCardDao, - private val multiChoiceCardDao: MultiChoiceCardDao + private val multiChoiceCardDao: MultiChoiceCardDao, ) : CardTypeRepository { + private val _selectedCards = MutableStateFlow(emptyList()) + override val selectedCards = _selectedCards.asStateFlow() + + private val _searchQuery = MutableStateFlow("") + override val searchQuery = _searchQuery.asStateFlow() + + override fun toggleCard(ct: CT) { + _selectedCards.update { cards -> + val mutableCards = cards.toMutableList() + if (!mutableCards.contains(ct)) { + mutableCards.add(ct) + } else { + mutableCards.remove(ct) + } + mutableCards + } + } + + override suspend fun toggleAllCards(deckId: Int) { + _selectedCards.update { + val cts = getAllCardTypes(deckId) + val filtered = cts.filter { ct -> + if (_searchQuery.value.isBlank()) return@filter true + + ct.toQuestion().contains(_searchQuery.value, ignoreCase = true) + } + Log.d("OfflineCTRepo", "${filtered.size}") + filtered + } + } + + override fun clearSelection() { + _selectedCards.update { emptyList() } + } + + override fun updateQuery(query: String) { + _searchQuery.update { query } + } + + override fun resetQuery() { + _searchQuery.update { "" } + } + override suspend fun deleteBasicCard(basicCard: BasicCard) = basicCardDao.deleteBasicCard(basicCard) @@ -64,18 +112,26 @@ class OfflineCardTypeRepository( newChoiceD: String, newCorrect: Char ) = multiChoiceCardDao.updateMultiChoiceCard( - id, newQuestion, newChoiceA, newChoiceB, - newChoiceC, newChoiceD, newCorrect + id, newQuestion, newChoiceA, newChoiceB, newChoiceC, newChoiceD, newCorrect ) - override fun getAllCardTypes(deckId: Int) = cardTypesDao.getAllCardTypes(deckId).map { + override fun getAllCardTypesStream(deckId: Int) = + cardTypesDao.getAllCardTypesStream(deckId).map { + try { + mapAllCardTypesToCTs(it) + } catch (e: IllegalStateException) { + Log.d("CardTypeRepository", "$e") + listOf() + } + } + + override suspend fun getAllCardTypes(deckId: Int) = try { - mapAllCardTypesToCTs(it) - } catch (e: IllegalStateException) { + mapAllCardTypesToCTs(cardTypesDao.getAllCardTypes(deckId)) + } catch (e: Exception) { Log.d("CardTypeRepository", "$e") listOf() } - } override fun getAllDueCards( deckId: Int, @@ -93,9 +149,7 @@ class OfflineCardTypeRepository( override fun getDueAllCardTypes( deckId: Int, cardAmount: Int, currentTime: Long ) = try { - mapAllCardTypesToCTs( - cardTypesDao.getDueAllCardTypes(deckId, cardAmount, currentTime) - ) + mapAllCardTypesToCTs(cardTypesDao.getDueAllCardTypes(deckId, cardAmount, currentTime)) } catch (e: IllegalStateException) { Log.d("CardTypeRepository", "$e") listOf() @@ -109,18 +163,17 @@ class OfflineCardTypeRepository( throw e } + /** Get flow of a single CT */ override fun getACardTypeStream(id: Int) = try { - cardTypesDao.getACardTypeStream(id).map { - mapACardTypeToCT(it) - } + cardTypesDao.getACardTypeStream(id).map { mapACardTypeToCT(it) } } catch (e: IllegalStateException) { Log.d("CardTypeRepository", "$e") throw e } - override suspend fun updateCT( - cardId: Int, type: String, fields: Fields, - deleteCT: CT + cardId: Int, type: String, fields: Fields, deleteCT: CT ) = cardTypesDao.updateCT(cardId, type, fields, deleteCT) + + override suspend fun deleteCTs() = cardTypesDao.deleteCardList(_selectedCards.value) } \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/CardUpdateError.kt b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/CardUpdateError.kt similarity index 96% rename from app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/CardUpdateError.kt rename to app/src/main/java/com/belmontCrest/cardCrafter/model/ui/CardUpdateError.kt index d8f2226..8dd9784 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/CardUpdateError.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/CardUpdateError.kt @@ -1,4 +1,4 @@ -package com.belmontCrest.cardCrafter.model.uiModels +package com.belmontCrest.cardCrafter.model.ui import android.util.Log diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/Fields.kt b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/Fields.kt similarity index 98% rename from app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/Fields.kt rename to app/src/main/java/com/belmontCrest/cardCrafter/model/ui/Fields.kt index 0c593b4..27bad7c 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/Fields.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/Fields.kt @@ -1,4 +1,4 @@ -package com.belmontCrest.cardCrafter.model.uiModels +package com.belmontCrest.cardCrafter.model.ui import android.os.Parcel import android.os.Parcelable diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/PreferencesManager.kt b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/PreferencesManager.kt similarity index 98% rename from app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/PreferencesManager.kt rename to app/src/main/java/com/belmontCrest/cardCrafter/model/ui/PreferencesManager.kt index 5144bfe..97060a9 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/PreferencesManager.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/PreferencesManager.kt @@ -1,4 +1,4 @@ -package com.belmontCrest.cardCrafter.model.uiModels +package com.belmontCrest.cardCrafter.model.ui import android.content.Context import androidx.compose.runtime.MutableIntState diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/UiStates.kt b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/UiStates.kt similarity index 97% rename from app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/UiStates.kt rename to app/src/main/java/com/belmontCrest/cardCrafter/model/ui/UiStates.kt index 1e9a39c..fbc0e3e 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/model/uiModels/UiStates.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/model/ui/UiStates.kt @@ -1,4 +1,4 @@ -package com.belmontCrest.cardCrafter.model.uiModels +package com.belmontCrest.cardCrafter.model.ui import android.os.Parcelable diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/NavViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/NavViewModel.kt index e78907f..23fa28b 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/NavViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/NavViewModel.kt @@ -11,10 +11,11 @@ import com.belmontCrest.cardCrafter.navigation.destinations.MainNavDestination import com.belmontCrest.cardCrafter.navigation.destinations.SupabaseDestination import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.FlashCardRepository import com.belmontCrest.cardCrafter.localDatabase.tables.Card -import com.belmontCrest.cardCrafter.model.uiModels.StringVar -import com.belmontCrest.cardCrafter.model.uiModels.SelectedCard -import com.belmontCrest.cardCrafter.model.uiModels.SelectedKeyboard -import com.belmontCrest.cardCrafter.model.uiModels.WhichDeck +import com.belmontCrest.cardCrafter.model.ui.StringVar +import com.belmontCrest.cardCrafter.model.ui.SelectedCard +import com.belmontCrest.cardCrafter.model.ui.SelectedKeyboard +import com.belmontCrest.cardCrafter.model.ui.WhichDeck +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted @@ -26,6 +27,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json @@ -40,14 +42,12 @@ class NavViewModel( private val savedStateHandle: SavedStateHandle ) : ViewModel() { companion object { + private const val NAV_VM = "NavViewModel" private const val TIMEOUT_MILLIS = 4_000L - - // private const val KEYBOARD_TYPE = "selected_kb_type" - // private const val KEYBOARD_INDEX = "selected_kb_index" private const val SHOW_KB = "showKB" private const val CT_TYPE = "CT_type" private const val KEY_SELECTED_KB = "selected_kb" - + private const val IS_SELECTING = "is_selecting" } private val deckId = MutableStateFlow(savedStateHandle["id"] ?: 0) @@ -57,9 +57,7 @@ class NavViewModel( if (id == 0) { flowOf(StringVar()) } else { - flashCardRepository.getDeckName(id).map { - StringVar(it ?: "") - } + flashCardRepository.getDeckName(id).map { StringVar(it ?: "") } } }.stateIn( scope = viewModelScope, @@ -106,18 +104,14 @@ class NavViewModel( fun updateStartingSBRoute(newRoute: String) { savedStateHandle["startSBRoute"] = newRoute - _startingSBRoute.update { - StringVar(newRoute) - } + _startingSBRoute.update { StringVar(newRoute) } } val wd: StateFlow = deckId.flatMapLatest { id -> if (id == 0) { flowOf(WhichDeck()) } else { - flashCardRepository.getDeckStream(id).map { - WhichDeck(it) - } + flashCardRepository.getDeckStream(id).map { WhichDeck(it) } } }.stateIn( scope = viewModelScope, @@ -155,12 +149,21 @@ class NavViewModel( fun getDeckById(id: Int) { savedStateHandle["id"] = id deckId.update { id } - } fun deleteCard(card: Card) { - viewModelScope.launch { - flashCardRepository.deleteCard(card) + viewModelScope.launch { flashCardRepository.deleteCard(card) } + } + + suspend fun deleteCardList(): Boolean { + return withContext(Dispatchers.IO) { + try { + cardTypeRepository.deleteCTs() + return@withContext true + } catch (e: Exception) { + Log.e(NAV_VM, "Error deleting card list: $e") + return@withContext false + } } } @@ -208,7 +211,6 @@ class NavViewModel( savedStateHandle.get(KEY_SELECTED_KB) ?.let { Json.decodeFromString(SelectedKeyboard.serializer(), it) } } - } fun toggleKeyboard() { @@ -229,4 +231,30 @@ class NavViewModel( savedStateHandle[SHOW_KB] = false _showKatexKeyboard.update { false } } + + private val _isSelecting = MutableStateFlow(savedStateHandle[IS_SELECTING] as Boolean? == true) + val isSelecting = _isSelecting.asStateFlow() + + fun isSelectingTrue() { + _isSelecting.update { true } + } + + fun selectAll() { + wd.value.deck?.let { deck -> + viewModelScope.launch { cardTypeRepository.toggleAllCards(deck.id) } + } + } + + fun clearSelection() { + cardTypeRepository.clearSelection() + } + + fun resetSearchQuery() { + cardTypeRepository.resetQuery() + } + + fun resetSelection() { + cardTypeRepository.clearSelection() + _isSelecting.update { false } + } } \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ActionsIconButton.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ActionsIconButton.kt index 316c004..b98cc60 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ActionsIconButton.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ActionsIconButton.kt @@ -15,8 +15,10 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavHostController @@ -29,7 +31,7 @@ import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.navigation.destinations.ViewAllCardsDestination import com.belmontCrest.cardCrafter.navigation.destinations.ViewDueCardsDestination import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.CardDeckViewModel -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.navigation.destinations.AddDeckDestination import com.belmontCrest.cardCrafter.navigation.destinations.CoOwnerRequestsDestination import com.belmontCrest.cardCrafter.navigation.destinations.DeckListDestination @@ -42,11 +44,13 @@ import com.belmontCrest.cardCrafter.supabase.view.exportDeck.CardPickerDropdown import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.backButtonModifier import com.belmontCrest.cardCrafter.ui.theme.redoButtonModifier -import com.belmontCrest.cardCrafter.uiFunctions.BackButton -import com.belmontCrest.cardCrafter.uiFunctions.CardOptionsButton -import com.belmontCrest.cardCrafter.uiFunctions.CardTypesButton -import com.belmontCrest.cardCrafter.uiFunctions.MailButton -import com.belmontCrest.cardCrafter.uiFunctions.RedoCardButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.BackButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CardListOptions +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CardOptionsButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CardTypesButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.MailButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.RedoCardButton +import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import kotlinx.coroutines.launch @RequiresApi(Build.VERSION_CODES.Q) @@ -64,12 +68,12 @@ fun ActionIconButton( val sc by navViewModel.card.collectAsStateWithLifecycle() val wd by navViewModel.wd.collectAsStateWithLifecycle() val coroutineScope = rememberCoroutineScope() + val context = LocalContext.current + val isSelecting by navViewModel.isSelecting.collectAsStateWithLifecycle() val onNavigateBack: () -> Unit = { fields.isEditing.value = false fields.inDeckClicked.value = false - coroutineScope.launch { - navViewModel.getCardById(0) - } + coroutineScope.launch { navViewModel.getCardById(0) } navViewModel.updateRoute(ViewAllCardsDestination.route) deckNavController?.navigate(ViewAllCardsDestination.route) } @@ -126,17 +130,39 @@ fun ActionIconButton( } ViewAllCardsDestination.route -> { - BackButton( - onBackClick = { - fields.inDeckClicked.value = false - navViewModel.updateRoute(DeckViewDestination.route) - deckNavController?.navigate(DeckViewDestination.route) - }, - modifier = Modifier - .padding(horizontal = 10.dp) - .backButtonModifier(), - getUIStyle = getUIStyle, - ) + if (!isSelecting) { + BackButton( + onBackClick = { + fields.inDeckClicked.value = false + navViewModel.updateRoute(DeckViewDestination.route) + deckNavController?.navigate(DeckViewDestination.route) + }, + modifier = Modifier + .padding(horizontal = 10.dp) + .backButtonModifier(), + getUIStyle = getUIStyle, + ) + } else { + var enabled by rememberSaveable { mutableStateOf(true) } + var showDialog by rememberSaveable { mutableStateOf(false) } + val expanded = rememberSaveable { mutableStateOf(false) } + CardListOptions( + onDelete = { + coroutineScope.launch { + enabled = false + val success = navViewModel.deleteCardList() + if (!success) showToastMessage(context, "Failed to delete cards") + showDialog = false + enabled = true + expanded.value = false + } + }, + onSelectAll = { coroutineScope.launch { navViewModel.selectAll() } }, + onClearSelection = { navViewModel.clearSelection() }, + getUIStyle, enabled = enabled, showDialog = showDialog, + onDialogToggle = { showDialog = it }, expanded = expanded + ) + } } AddCardDestination.route -> { diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CurrentRouteIconContent.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CurrentRouteIconContent.kt index 462593e..563596a 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CurrentRouteIconContent.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CurrentRouteIconContent.kt @@ -32,22 +32,21 @@ import com.belmontCrest.cardCrafter.model.FWProp import com.belmontCrest.cardCrafter.model.TAProp import com.belmontCrest.cardCrafter.model.TextProps import com.belmontCrest.cardCrafter.model.application.AppViewModelProvider -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.navigation.destinations.EditDeckDestination import com.belmontCrest.cardCrafter.navigation.destinations.SBNavDestination -import com.belmontCrest.cardCrafter.navigation.destinations.UserEDDestination import com.belmontCrest.cardCrafter.navigation.destinations.UserProfileDestination import com.belmontCrest.cardCrafter.navigation.destinations.ViewAllCardsDestination import com.belmontCrest.cardCrafter.supabase.controller.viewModels.PersonalDeckSyncViewModel import com.belmontCrest.cardCrafter.supabase.model.SyncStatus import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.settingsButtonModifier -import com.belmontCrest.cardCrafter.uiFunctions.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton import com.belmontCrest.cardCrafter.uiFunctions.ContentIcons import com.belmontCrest.cardCrafter.uiFunctions.CustomText -import com.belmontCrest.cardCrafter.uiFunctions.SettingsButton -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SettingsButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -64,10 +63,7 @@ fun MainDLRouteContent( when (val status = syncStatus) { is SyncStatus.Error -> { AlertDialog( - onDismissRequest = { - pdsVM.resetSyncStatus() - navViewModel.resetIsBlocking() - }, + onDismissRequest = { pdsVM.resetSyncStatus(); navViewModel.resetIsBlocking() }, title = { Text("Error") }, text = { CustomText(status.message, getUIStyle) }, confirmButton = { diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CustomNavigationDrawer.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CustomNavigationDrawer.kt index 2f3de16..3fc95f6 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CustomNavigationDrawer.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/CustomNavigationDrawer.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear import androidx.compose.material.icons.filled.Menu import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DrawerValue @@ -32,9 +33,11 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavHostController +import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.navigation.destinations.DeckListDestination import com.belmontCrest.cardCrafter.navigation.destinations.MainNavDestination import com.belmontCrest.cardCrafter.navigation.NavViewModel @@ -45,7 +48,7 @@ import com.belmontCrest.cardCrafter.navigation.destinations.ViewDueCardsDestinat import com.belmontCrest.cardCrafter.navigation.destinations.SupabaseDestination import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.CardDeckViewModel import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.updateCurrentTime -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.navigation.destinations.ExportSBDestination import com.belmontCrest.cardCrafter.supabase.controller.viewModels.SupabaseViewModel import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle @@ -67,35 +70,32 @@ fun CustomNavigationDrawer( ) { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val coroutineScope = rememberCoroutineScope() - - val modalContent = ModalContent( navController = mainNavController, fields = fields, getUIStyle = getUIStyle, navViewModel = navViewModel, cardDeckVM = cardDeckVM, supabaseVM = supabaseVM, cr = navViewModel.route.collectAsStateWithLifecycle().value, - wd = navViewModel.wd.collectAsStateWithLifecycle().value + wd = navViewModel.wd.collectAsStateWithLifecycle().value, + coroutineScope = coroutineScope ) - // Extract the current route. + + /** Current route */ val cr = navViewModel.route.collectAsStateWithLifecycle().value val stateSize = cardDeckVM.stateSize.collectAsStateWithLifecycle().value val stateIndex = cardDeckVM.stateIndex.collectAsStateWithLifecycle().value - val deckName by navViewModel.deckName.collectAsStateWithLifecycle() + val isSelecting by navViewModel.isSelecting.collectAsStateWithLifecycle() val owner by supabaseVM.owner.collectAsStateWithLifecycle() // Determine the title based on the current route. val titleText = when (cr.name) { - MainNavDestination.route -> "Decks" - DeckListDestination.route -> "Decks" + MainNavDestination.route -> stringResource(R.string.deck_list) + DeckListDestination.route -> stringResource(R.string.deck_list) SettingsDestination.route -> "Settings" ViewAllCardsDestination.route -> deckName.name - ViewDueCardsDestination.route -> if (stateSize == 0) { - "" - } else { - "Card ${stateIndex + 1} out of $stateSize" - } + ViewDueCardsDestination.route -> + if (stateSize == 0) "" else "Card ${stateIndex + 1} out of $stateSize" SBNavDestination.route -> "Online Decks" SupabaseDestination.route -> "Online Decks" @@ -112,9 +112,9 @@ fun CustomNavigationDrawer( modifier = Modifier .fillMaxWidth(0.50f) ) { - modalContent.Home(coroutineScope) - modalContent.Settings(coroutineScope) - modalContent.UserProfile(coroutineScope) + modalContent.Home() + modalContent.Settings() + modalContent.UserProfile() if (owner != null) { modalContent.ExportDecks() } @@ -155,16 +155,15 @@ fun CustomNavigationDrawer( } }, navigationIcon = { - IconButton( - onClick = { - coroutineScope.launch { - drawerState.open() - } - }) { - Icon( - imageVector = Icons.Filled.Menu, - contentDescription = "Localized description" - ) + if (isSelecting) { + IconButton(onClick = { + navViewModel.resetSelection() + } + ) { Icon(Icons.Filled.Clear, contentDescription = null) } + } else { + IconButton( + onClick = { coroutineScope.launch { drawerState.open() } } + ) { Icon(Icons.Filled.Menu, contentDescription = null) } } }, actions = { @@ -188,7 +187,9 @@ fun CustomNavigationDrawer( .pointerInput(Unit) { // swallow all touch events while visible awaitPointerEventScope { - while (true) { awaitPointerEvent() } + while (true) { + awaitPointerEvent() + } } } ) { diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ModalContent.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ModalContent.kt index cb0efdd..277ffe1 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ModalContent.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/drawer/ModalContent.kt @@ -34,12 +34,13 @@ import com.belmontCrest.cardCrafter.model.FSProp import com.belmontCrest.cardCrafter.model.paddingForModal import com.belmontCrest.cardCrafter.model.returnFontSizeBasedOnDp import com.belmontCrest.cardCrafter.model.toTextProp -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.StringVar -import com.belmontCrest.cardCrafter.model.uiModels.WhichDeck +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.StringVar +import com.belmontCrest.cardCrafter.model.ui.WhichDeck import com.belmontCrest.cardCrafter.navigation.destinations.AddCardDestination import com.belmontCrest.cardCrafter.navigation.destinations.EditingCardDestination import com.belmontCrest.cardCrafter.navigation.destinations.UserEDDestination +import com.belmontCrest.cardCrafter.navigation.destinations.ViewAllCardsDestination import com.belmontCrest.cardCrafter.supabase.controller.viewModels.SupabaseViewModel import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle @@ -58,26 +59,23 @@ class ModalContent( private val cardDeckVM: CardDeckViewModel, private val supabaseVM: SupabaseViewModel, private val cr: StringVar, - private val wd: WhichDeck + private val wd: WhichDeck, + private val coroutineScope: CoroutineScope ) { private val mdModifier = Modifier .padding(horizontal = 4.dp) .size(28.dp) - .background( - color = getUIStyle.buttonColor(), - shape = RoundedCornerShape(12.dp) - ) + .background(color = getUIStyle.buttonColor(), shape = RoundedCornerShape(12.dp)) .zIndex(2f) private val ci = ContentIcons(getUIStyle) @Composable - fun Home(coroutineScope: CoroutineScope) { + fun Home() { val fontSize = returnFontSizeBasedOnDp() CustomRow( onClick = { - updateCards(coroutineScope) + launchUpdates() fields.mainClicked.value = false - resetKeyboardStuff() launchHome(coroutineScope, navViewModel, cardDeckVM, fields) navViewModel.updateRoute(DeckListDestination.route) navController.navigate(DeckListDestination.route) @@ -92,7 +90,7 @@ class ModalContent( fun ExportDecks() { val fontSize = returnFontSizeBasedOnDp() CustomRow(onClick = { - resetKeyboardStuff() + launchUpdates() navViewModel.updateRoute(UserEDDestination.route) navViewModel.updateStartingSBRoute(UserEDDestination.route) navController.navigate(SBNavDestination.route) @@ -106,12 +104,11 @@ class ModalContent( } @Composable - fun Settings(coroutineScope: CoroutineScope) { + fun Settings() { val fontSize = returnFontSizeBasedOnDp() CustomRow( onClick = { - resetKeyboardStuff() - updateCards(coroutineScope) + launchUpdates() cardDeckVM.updateIndex(0) navViewModel.updateRoute(SettingsDestination.route) navController.navigate(SettingsDestination.route) @@ -125,22 +122,20 @@ class ModalContent( @RequiresApi(Build.VERSION_CODES.Q) @Composable - fun UserProfile(coroutineScope: CoroutineScope) { + fun UserProfile() { val fontSize = returnFontSizeBasedOnDp() val context = LocalContext.current CustomRow( onClick = { - resetKeyboardStuff() if (cr.name != UserProfileDestination.route) { - updateCards(coroutineScope) + launchUpdates() navViewModel.updateStartingSBRoute(UserProfileDestination.route) navViewModel.updateRoute(UserProfileDestination.route) navController.navigate(SBNavDestination.route) coroutineScope.launch { val result = supabaseVM.getGoogleId() - if (!result.first) { - showToastMessage(context, result.second) - } + if (!result.first) showToastMessage(context, result.second) + } } } @@ -150,7 +145,7 @@ class ModalContent( } } - private fun updateCards(coroutineScope: CoroutineScope) { + private fun updateCards() { if (cr.name == ViewDueCardsDestination.route) { wd.deck?.let { /** If the list is empty, no cards @@ -158,9 +153,7 @@ class ModalContent( * or the user finished the deck. */ println("updating cards!") - coroutineScope.launch(Dispatchers.IO) { - updateDecksCardList(it, cardDeckVM) - } + coroutineScope.launch(Dispatchers.IO) { updateDecksCardList(it, cardDeckVM) } } } } @@ -172,6 +165,18 @@ class ModalContent( } } + private fun resetSelectionAndQuery() { + if (cr.name == ViewAllCardsDestination.route) { + navViewModel.resetSelection() + navViewModel.resetSearchQuery() + } + } + + private fun launchUpdates() { + resetKeyboardStuff() + updateCards() + resetSelectionAndQuery() + } } @Composable @@ -182,12 +187,8 @@ fun CustomRow( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier .fillMaxWidth() - .clickable { - onClick() - } + .clickable { onClick() } .paddingForModal() ) - { - content() - } + { content() } } \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/BackNavHandler.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/BackNavHandler.kt index cf239f0..247ccd2 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/BackNavHandler.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/BackNavHandler.kt @@ -2,7 +2,7 @@ package com.belmontCrest.cardCrafter.navigation.navHosts import androidx.navigation.NavHostController import com.belmontCrest.cardCrafter.navigation.destinations.MainNavDestination -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields object BackNavHandler { fun returnToDeckListFromSB( diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/DeckNavHost.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/DeckNavHost.kt index 0659063..667b136 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/DeckNavHost.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/DeckNavHost.kt @@ -29,7 +29,7 @@ import com.belmontCrest.cardCrafter.navigation.destinations.ViewDueCardsDestinat import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.CardDeckViewModel import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.EditingCardListViewModel import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.updateCurrentTime -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.views.cardViews.addCardViews.AddCardView import com.belmontCrest.cardCrafter.views.cardViews.cardDeckViews.CardDeckView @@ -226,27 +226,25 @@ fun DeckNavHost( } } composable(ViewAllCardsDestination.route) { + val isSelecting by navViewModel.isSelecting.collectAsStateWithLifecycle() BackHandler { - fields.inDeckClicked.value = false - navViewModel.updateRoute(DeckViewDestination.route) - deckNavController.popBackStack( - DeckViewDestination.route, - inclusive = false - ) + if (isSelecting) { + navViewModel.resetSelection() + } else { + fields.inDeckClicked.value = false + navViewModel.resetSearchQuery() + navViewModel.updateRoute(DeckViewDestination.route) + deckNavController.popBackStack(DeckViewDestination.route, inclusive = false) + } } wd.deck?.let { thisDeck -> editCardsList.ViewFlashCards( + navVM = navViewModel, goToEditCard = { cardId -> fields.resetFields() - coroutineScope.launch { - navViewModel.getCardById(cardId) - } - navViewModel.updateRoute( - EditingCardDestination.route - ) - deckNavController.navigate( - EditingCardDestination.route - ) + coroutineScope.launch { navViewModel.getCardById(cardId) } + navViewModel.updateRoute(EditingCardDestination.route) + deckNavController.navigate(EditingCardDestination.route) } ) } diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/MainNavHost.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/MainNavHost.kt index 3a19a32..e6f24cd 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/MainNavHost.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/MainNavHost.kt @@ -38,8 +38,8 @@ import com.belmontCrest.cardCrafter.navigation.destinations.ViewDueCardsDestinat import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.EditingCardListViewModel import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.MainViewModel import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.CardDeckViewModel -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.viewModels.SupabaseViewModel import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.ui.theme.ColorSchemeClass diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/SBNavHost.kt b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/SBNavHost.kt index a52d0cf..cd6898e 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/SBNavHost.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/navigation/navHosts/SBNavHost.kt @@ -28,8 +28,8 @@ import com.belmontCrest.cardCrafter.navigation.destinations.UserEDDestination import com.belmontCrest.cardCrafter.navigation.destinations.UserProfileDestination import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.MainViewModel import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.updateCurrentTime -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.navigation.destinations.CoOwnerRequestsDestination import com.belmontCrest.cardCrafter.navigation.destinations.ForgotPasswordDestination import com.belmontCrest.cardCrafter.navigation.destinations.SBCardListDestination diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/ImportDeckViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/ImportDeckViewModel.kt index e0f3aac..c216b79 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/ImportDeckViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/ImportDeckViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.viewModelScope import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.checkIfDeckExists import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.checkIfDeckUUIDExists import com.belmontCrest.cardCrafter.localDatabase.dbInterface.repositories.FlashCardRepository -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.converters.cardColsCTToSBCT import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.BASIC_CT_ERROR import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.CANCELLED diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/SupabaseViewModel.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/SupabaseViewModel.kt index 895728d..e322dbc 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/SupabaseViewModel.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/controller/viewModels/SupabaseViewModel.kt @@ -10,7 +10,7 @@ import com.belmontCrest.cardCrafter.controller.cardHandlers.toCard import com.belmontCrest.cardCrafter.localDatabase.tables.CT import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.localDatabase.tables.ImportedDeckInfo -import com.belmontCrest.cardCrafter.model.uiModels.SealedAllCTs +import com.belmontCrest.cardCrafter.model.ui.SealedAllCTs import com.belmontCrest.cardCrafter.supabase.controller.networkConnectivityFlow import com.belmontCrest.cardCrafter.supabase.model.tables.FourSelectedCards import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.NULL_CARDS @@ -174,9 +174,7 @@ class SupabaseViewModel( fun updateCardsToDisplayUUID(uuid: String) { - _cardsToDisplay.update { - CardsToDisplay(deckUUID = uuid) - }.also { + _cardsToDisplay.update { CardsToDisplay(deckUUID = uuid) }.also { getOnlineCTD(uuid) } } @@ -220,9 +218,7 @@ class SupabaseViewModel( authRepository.getGoogleCredentials().let { credentials -> when (credentials) { is GoogleCredentials.Success -> { - _googleClientId.update { - credentials.credentials - } + _googleClientId.update { credentials.credentials } Pair(true, "") } @@ -240,9 +236,7 @@ class SupabaseViewModel( ): Boolean { return withContext(Dispatchers.IO) { authRepository.signInWithGoogle(googleIdToken, rawNonce).let { - _currentUser.update { - authRepository.getCurrentUser() - } + _currentUser.update { authRepository.getCurrentUser() } getOwner() it } @@ -266,9 +260,7 @@ class SupabaseViewModel( suspend fun signInWithEmail(email: String, password: String): String { return withContext(Dispatchers.IO) { authRepository.signInWithEmail(email, password).let { - _currentUser.update { - authRepository.getCurrentUser() - } + _currentUser.update { authRepository.getCurrentUser() } getOwner() it } diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/EnterAccountDetails.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/EnterAccountDetails.kt index bf12474..56af124 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/EnterAccountDetails.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/EnterAccountDetails.kt @@ -24,9 +24,9 @@ import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.supabase.controller.viewModels.SupabaseViewModel import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle -import com.belmontCrest.cardCrafter.uiFunctions.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton import com.belmontCrest.cardCrafter.uiFunctions.EditTextField -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import kotlinx.coroutines.launch @RequiresApi(Build.VERSION_CODES.Q) diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/SignUp.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/SignUp.kt index bf569d7..92d05b4 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/SignUp.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/SignUp.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.launch import java.security.MessageDigest import java.util.UUID import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton @RequiresApi(Build.VERSION_CODES.Q) @Composable diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/EmailView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/EmailView.kt index e1a0778..c48bc14 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/EmailView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/EmailView.kt @@ -34,7 +34,7 @@ import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.uiFunctions.EditTextField import com.belmontCrest.cardCrafter.uiFunctions.PasswordTextField -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/ForgotPassword.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/ForgotPassword.kt index 734c60b..fd12a62 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/ForgotPassword.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/authViews/email/ForgotPassword.kt @@ -23,7 +23,7 @@ import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.uiFunctions.CustomText import com.belmontCrest.cardCrafter.uiFunctions.EditTextField -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/FailedUpload.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/FailedUpload.kt index e3f640d..c55d731 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/FailedUpload.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/FailedUpload.kt @@ -31,7 +31,7 @@ import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.SUCCESS import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.UPDATED_ON_CONFLICT import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.CustomText -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/UploadThisDeck.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/UploadThisDeck.kt index 964f43d..c96dddf 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/UploadThisDeck.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/exportDeck/UploadThisDeck.kt @@ -48,10 +48,10 @@ import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.borderedModifier import com.belmontCrest.cardCrafter.ui.theme.scrollableBoxViewModifier -import com.belmontCrest.cardCrafter.uiFunctions.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton import com.belmontCrest.cardCrafter.uiFunctions.CustomText import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.views.miscFunctions.details.toCardDetails import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/importDeck/ImportDeck.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/importDeck/ImportDeck.kt index 75248ce..8563b4c 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/importDeck/ImportDeck.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/importDeck/ImportDeck.kt @@ -38,7 +38,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.viewModels.ImportDeckViewModel import com.belmontCrest.cardCrafter.supabase.model.ReturnValues import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.EMPTY_STRING @@ -48,9 +48,9 @@ import com.belmontCrest.cardCrafter.supabase.model.tables.SBDeckDto import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.scrollableBoxViewModifier -import com.belmontCrest.cardCrafter.uiFunctions.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton import com.belmontCrest.cardCrafter.uiFunctions.EditTextField -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.views.miscFunctions.details.toCardDetails import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/CardListView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/CardListView.kt index 2014cc0..4e4ffa4 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/CardListView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/CardListView.kt @@ -36,7 +36,7 @@ import com.belmontCrest.cardCrafter.model.TextProps import com.belmontCrest.cardCrafter.model.Type import com.belmontCrest.cardCrafter.model.cardListTextProp import com.belmontCrest.cardCrafter.model.toTextProp -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.supabase.controller.viewModels.UserExportedDecksViewModel import com.belmontCrest.cardCrafter.supabase.model.ReturnValues.SUCCESS import com.belmontCrest.cardCrafter.supabase.model.tables.CoOwnerWithUsername @@ -47,8 +47,8 @@ import com.belmontCrest.cardCrafter.ui.theme.borderedModifier import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.uiFunctions.CustomText import com.belmontCrest.cardCrafter.uiFunctions.EditTextField -import com.belmontCrest.cardCrafter.uiFunctions.PullDeck -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.PullDeck +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.views.miscFunctions.details.CardDetails import com.belmontCrest.cardCrafter.views.miscFunctions.details.toCardDetails diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/MyProfile.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/MyProfile.kt index 45f7e41..75897ae 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/MyProfile.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/MyProfile.kt @@ -36,7 +36,7 @@ import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.ui.theme.scrollableBoxViewModifier -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import kotlinx.coroutines.launch @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/RequestsView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/RequestsView.kt index c70ccc9..7396a6d 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/RequestsView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/RequestsView.kt @@ -41,9 +41,9 @@ import com.belmontCrest.cardCrafter.supabase.model.tables.SBCoOwnerWithDeck import com.belmontCrest.cardCrafter.supabase.model.tables.Status import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier -import com.belmontCrest.cardCrafter.uiFunctions.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton import com.belmontCrest.cardCrafter.uiFunctions.CustomText -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/UserExportedDecks.kt b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/UserExportedDecks.kt index dc1faa3..baf9663 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/UserExportedDecks.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/supabase/view/profile/UserExportedDecks.kt @@ -33,7 +33,7 @@ import com.belmontCrest.cardCrafter.supabase.view.authViews.CreateAccount import com.belmontCrest.cardCrafter.supabase.view.exportDeck.LocalDecks import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier -import com.belmontCrest.cardCrafter.uiFunctions.ExportDeckButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.ExportDeckButton @RequiresApi(Build.VERSION_CODES.Q) @Composable diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/Buttons.kt b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/Buttons.kt deleted file mode 100644 index 3d1013f..0000000 --- a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/Buttons.kt +++ /dev/null @@ -1,459 +0,0 @@ -package com.belmontCrest.cardCrafter.uiFunctions - -import android.util.Log -import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.outlined.ArrowBack -import androidx.compose.material.icons.filled.AddCircle -import androidx.compose.material.icons.filled.Delete -import androidx.compose.material.icons.filled.Edit -import androidx.compose.material.icons.filled.MailOutline -import androidx.compose.material.icons.filled.MoreVert -import androidx.compose.material.icons.outlined.Add -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.ExtendedFloatingActionButton -import androidx.compose.material3.FloatingActionButton -import androidx.compose.material3.FloatingActionButtonDefaults -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.TextUnit -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.belmontCrest.cardCrafter.controller.onClickActions.DeleteCard -import com.belmontCrest.cardCrafter.localDatabase.tables.Card -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle -import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.Type -import com.belmontCrest.cardCrafter.navigation.NavViewModel -import kotlinx.coroutines.delay - - -@Composable -fun PullDeck(modifier: Modifier, getUIStyle: GetUIStyle, onClick: () -> Unit) { - ExtendedFloatingActionButton( - onClick = { - onClick() - }, modifier = modifier - .padding(8.dp), - containerColor = getUIStyle.semiTransButtonColor(), - contentColor = getUIStyle.titleColor(), - elevation = FloatingActionButtonDefaults.elevation((Int.MAX_VALUE / 2).dp) - ) { - Icon( - painter = painterResource(R.drawable.merge), - contentDescription = "Merge deck", - ) - Text("Merge deck") - } -} - -@Composable -fun SmallAddButton( - onClick: () -> Unit, iconSize: Int = 45, - getUIStyle: GetUIStyle, modifier: Modifier -) { - FloatingActionButton( - onClick = { - onClick() - }, - modifier = modifier - .padding(16.dp), - containerColor = getUIStyle.buttonColor() - ) { - Icon( - Icons.Outlined.Add, - "Add Deck", - modifier = Modifier.size(iconSize.dp), - tint = getUIStyle.iconColor(), - ) - } -} - -@Composable -fun AddCardButton( - onClick: () -> Unit -) { - ExtendedFloatingActionButton( - onClick = { onClick() }, - modifier = Modifier - .padding(16.dp) - ) { - Icon(Icons.Outlined.Add, "Add Card") - Text(text = stringResource(R.string.add_card)) - } - -} - -@Composable -fun ExportDeckButton( - onClick: () -> Unit, - modifier: Modifier -) { - ExtendedFloatingActionButton( - onClick = { onClick() }, - modifier = modifier - .padding(8.dp) - ) { - Icon(Icons.Default.AddCircle, "Export Deck") - Text(text = "Export Deck") - } -} - -@Composable -fun BackButton( - onBackClick: () -> Unit, - modifier: Modifier = Modifier, - getUIStyle: GetUIStyle -) { - IconButton( - onClick = { - onBackClick() - }, - modifier = modifier - .background( - color = getUIStyle.buttonColor(), - shape = RoundedCornerShape(24.dp) - ) - .padding(6.dp) - ) { - Icon( - imageVector = Icons.AutoMirrored.Outlined.ArrowBack, - modifier = Modifier - .size(24.dp), - contentDescription = "Back", - tint = getUIStyle.iconColor() - ) - } -} - -@Composable -fun RedoCardButton( - onRedoClick: () -> Unit, - modifier: Modifier = Modifier, - getUIStyle: GetUIStyle -) { - IconButton( - onClick = { - onRedoClick() - }, - modifier = modifier - ) { - Icon( - painter = painterResource(R.drawable.return_arrow), - modifier = Modifier - .size(22.dp), - contentDescription = "Redo", - tint = getUIStyle.iconColor() - ) - } - -} - -@Composable -fun SettingsButton( - onNavigateToEditDeck: () -> Unit, - onNavigateToEditCards: () -> Unit, - modifier: Modifier = Modifier, - getUIStyle: GetUIStyle, - fields: Fields -) { - var expanded by remember { mutableStateOf(false) } - IconButton( - onClick = { - if (!fields.inDeckClicked.value) { - expanded = true - } - }, - modifier = modifier - .background( - color = getUIStyle.buttonColor(), - shape = RoundedCornerShape(24.dp) - ) - .padding(6.dp) - ) { - Icon( - imageVector = Icons.Filled.Edit, - modifier = Modifier - .size(24.dp), - contentDescription = "Settings", - tint = getUIStyle.iconColor() - ) - DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { - DropdownMenuItem( - onClick = { - expanded = false - fields.mainClicked.value = true - onNavigateToEditDeck() - }, - text = { Text(stringResource(R.string.edit_deck)) }) - DropdownMenuItem( - onClick = { - expanded = false - fields.mainClicked.value = true - onNavigateToEditCards() - - }, - text = { Text(stringResource(R.string.edit_flashcards)) }) - } - } -} - - -@Composable -fun CardOptionsButton( - navVM: NavViewModel, - getUIStyle: GetUIStyle, card: Card, - fields: Fields, - expanded: MutableState, - modifier: Modifier, - onDelete: () -> Unit, -) { - val coroutineScope = rememberCoroutineScope() - val showDialog = remember { mutableStateOf(false) } - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - ToggleKeyBoard(navVM, getUIStyle, fields.newType.value) - Box( - modifier = modifier - .wrapContentSize(Alignment.TopEnd) - ) { - IconButton( - onClick = { expanded.value = true }, - modifier = Modifier - .size(54.dp) - .align(Alignment.TopEnd) - ) { - Icon( - Icons.Default.MoreVert, - contentDescription = "Card Type", - tint = getUIStyle.titleColor() - ) - } - DropdownMenu(expanded = expanded.value, onDismissRequest = { expanded.value = false }) { - DropdownMenuItem( - onClick = { - resetKeyboardStuff(navVM, fields.newType.value) - fields.newType.value = Type.BASIC - }, - text = { Text(stringResource(R.string.basic_card)) }) - DropdownMenuItem( - onClick = { - resetKeyboardStuff(navVM, fields.newType.value) - fields.newType.value = Type.THREE - }, - text = { Text(stringResource(R.string.three_field_card)) }) - DropdownMenuItem( - onClick = { - resetKeyboardStuff(navVM, fields.newType.value) - fields.newType.value = Type.HINT - }, - text = { Text(stringResource(R.string.hint_card)) }) - DropdownMenuItem( - onClick = { - resetKeyboardStuff(navVM, fields.newType.value) - fields.newType.value = Type.MULTI - }, - text = { Text(stringResource(R.string.multi_choice_card)) }) - DropdownMenuItem( - onClick = { fields.newType.value = Type.NOTATION }, - text = { Text("Notation Card") } - ) - HorizontalDivider() - DropdownMenuItem( - onClick = { - showDialog.value = true - }, - text = { Text("Delete Card") }, - trailingIcon = { - Icon( - imageVector = Icons.Filled.Delete, - modifier = Modifier - .size(28.dp), - contentDescription = "Delete Card", - tint = getUIStyle.iconColor() - ) - } - ) - } - DeleteCard( - navVM, coroutineScope, - card, fields, showDialog, - onDelete, getUIStyle - ) - } - } -} - -private fun resetKeyboardStuff(navVM: NavViewModel, type: String) { - if (type == Type.NOTATION) { - navVM.resetKeyboardStuff() - } -} - -@Composable -fun CardTypesButton(getUIStyle: GetUIStyle, navVM: NavViewModel) { - var expanded by rememberSaveable { mutableStateOf(false) } - val type by navVM.type.collectAsState() - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - ToggleKeyBoard(navVM, getUIStyle, type) - Box( - Modifier - .wrapContentSize(Alignment.TopEnd) - ) { - IconButton( - onClick = { expanded = true }, - modifier = Modifier - .padding(4.dp) - .size(54.dp) - ) { - Icon( - Icons.Default.MoreVert, - contentDescription = "Card Type", - tint = getUIStyle.titleColor() - ) - } - DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { - DropdownMenuItem( - onClick = { navVM.updateType("basic") }, - text = { Text(stringResource(R.string.basic_card)) } - ) - DropdownMenuItem( - onClick = { navVM.updateType("three") }, - text = { Text(stringResource(R.string.three_field_card)) } - ) - DropdownMenuItem( - onClick = { navVM.updateType("hint") }, - text = { Text(stringResource(R.string.hint_card)) } - ) - DropdownMenuItem( - onClick = { navVM.updateType("multi") }, - text = { Text(stringResource(R.string.multi_choice_card)) } - ) - DropdownMenuItem( - onClick = { navVM.updateType("notation") }, - text = { Text("Notation Card") } - ) - } - } - } -} - -@Composable -fun ToggleKeyBoard( - navVM: NavViewModel, getUIStyle: GetUIStyle, type: String -) { - val showKB by navVM.showKatexKeyboard.collectAsStateWithLifecycle() - val selectedKB by navVM.selectedKB.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - navVM.retrieveKB() - delay(1400) - Log.d("card types", "type: $type\nshowKB: $showKB\nselectedKB: $selectedKB\n") - } - if (type == Type.NOTATION && selectedKB != null) { - Box( - modifier = Modifier - .size(30.dp) - .pointerInput(Unit) { - detectTapGestures( - onTap = { navVM.toggleKeyboard() }, - onLongPress = { navVM.resetOffset() } - ) - } - ) { - if (!showKB) { - Icon( - painterResource(R.drawable.twotone_keyboard), - contentDescription = "Keyboard", - tint = getUIStyle.titleColor() - ) - } else { - Icon( - painterResource(R.drawable.twotone_keyboard_hide), - contentDescription = "Hide Keyboard", - tint = getUIStyle.titleColor() - ) - } - } - } -} - -@Composable -fun CancelButton( - onClick: () -> Unit, enabled: Boolean, getUIStyle: GetUIStyle, - modifier: Modifier = Modifier, fontSize: TextUnit = TextUnit.Unspecified -) { - Button( - onClick = { - onClick() - }, - colors = ButtonDefaults.buttonColors( - containerColor = getUIStyle.secondaryButtonColor(), - contentColor = getUIStyle.buttonTextColor() - ), - enabled = enabled, modifier = modifier - ) { Text(text = stringResource(R.string.cancel), fontSize = fontSize) } -} - -@Composable -fun SubmitButton( - onClick: () -> Unit, enabled: Boolean, - getUIStyle: GetUIStyle, string: String, - modifier: Modifier = Modifier, fontSize: TextUnit = TextUnit.Unspecified, - innerModifier: Modifier = Modifier -) { - Button( - onClick = { - onClick() - }, enabled = enabled, - colors = ButtonDefaults.buttonColors( - containerColor = getUIStyle.secondaryButtonColor(), - contentColor = getUIStyle.buttonTextColor() - ), modifier = modifier - ) { - Text(text = string, fontSize = fontSize, modifier = innerModifier) - } -} - -@Composable -fun MailButton( - onClick: () -> Unit, getUIStyle: GetUIStyle -) { - val ci = ContentIcons(getUIStyle) - IconButton(onClick = { onClick() }) { - ci.ContentIcon("mail", icon = Icons.Default.MailOutline, Modifier) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/KeyboardInputs.kt b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/KeyboardInputs.kt index 3a64d61..8b54b65 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/KeyboardInputs.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/KeyboardInputs.kt @@ -161,8 +161,9 @@ fun LatexKeyboard( } catch (e : IsInsideException) { Log.e(kk, "$e") showToastMessage(context, "Cannot put notation inside a notation") + } finally { + onIdle() } - onIdle() return@LaunchedEffect } if (!isInside(text, text.length, textFieldValue.selection)) { @@ -179,8 +180,9 @@ fun LatexKeyboard( } } catch (e: IllegalStateException) { Log.e(kk, "$e") + } finally { + onIdle() } - onIdle() } } TextField( diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/buttons/Buttons.kt b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/buttons/Buttons.kt new file mode 100644 index 0000000..4f3344f --- /dev/null +++ b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/buttons/Buttons.kt @@ -0,0 +1,255 @@ +package com.belmontCrest.cardCrafter.uiFunctions.buttons + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.filled.AddCircle +import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.MailOutline +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.FloatingActionButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle +import com.belmontCrest.cardCrafter.R +import com.belmontCrest.cardCrafter.uiFunctions.ContentIcons + + +@Composable +fun PullDeck(modifier: Modifier, getUIStyle: GetUIStyle, onClick: () -> Unit) { + ExtendedFloatingActionButton( + onClick = { + onClick() + }, modifier = modifier + .padding(8.dp), + containerColor = getUIStyle.semiTransButtonColor(), + contentColor = getUIStyle.titleColor(), + elevation = FloatingActionButtonDefaults.elevation((Int.MAX_VALUE / 2).dp) + ) { + Icon( + painter = painterResource(R.drawable.merge), + contentDescription = "Merge deck", + ) + Text("Merge deck") + } +} + +@Composable +fun SmallAddButton( + onClick: () -> Unit, iconSize: Int = 45, + getUIStyle: GetUIStyle, modifier: Modifier +) { + FloatingActionButton( + onClick = { + onClick() + }, + modifier = modifier + .padding(16.dp), + containerColor = getUIStyle.buttonColor() + ) { + Icon( + Icons.Outlined.Add, + "Add Deck", + modifier = Modifier.size(iconSize.dp), + tint = getUIStyle.iconColor(), + ) + } +} + +@Composable +fun AddCardButton( + onClick: () -> Unit +) { + ExtendedFloatingActionButton( + onClick = { onClick() }, + modifier = Modifier + .padding(16.dp) + ) { + Icon(Icons.Outlined.Add, "Add Card") + Text(text = stringResource(R.string.add_card)) + } + +} + +@Composable +fun ExportDeckButton( + onClick: () -> Unit, + modifier: Modifier +) { + ExtendedFloatingActionButton( + onClick = { onClick() }, + modifier = modifier + .padding(8.dp) + ) { + Icon(Icons.Default.AddCircle, "Export Deck") + Text(text = "Export Deck") + } +} + +@Composable +fun BackButton( + onBackClick: () -> Unit, + modifier: Modifier = Modifier, + getUIStyle: GetUIStyle +) { + IconButton( + onClick = { + onBackClick() + }, + modifier = modifier + .background( + color = getUIStyle.buttonColor(), + shape = RoundedCornerShape(24.dp) + ) + .padding(6.dp) + ) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowBack, + modifier = Modifier + .size(24.dp), + contentDescription = "Back", + tint = getUIStyle.iconColor() + ) + } +} + +@Composable +fun RedoCardButton( + onRedoClick: () -> Unit, + modifier: Modifier = Modifier, + getUIStyle: GetUIStyle +) { + IconButton( + onClick = { + onRedoClick() + }, + modifier = modifier + ) { + Icon( + painter = painterResource(R.drawable.return_arrow), + modifier = Modifier + .size(22.dp), + contentDescription = "Redo", + tint = getUIStyle.iconColor() + ) + } + +} + +@Composable +fun SettingsButton( + onNavigateToEditDeck: () -> Unit, + onNavigateToEditCards: () -> Unit, + modifier: Modifier = Modifier, + getUIStyle: GetUIStyle, + fields: Fields +) { + var expanded by remember { mutableStateOf(false) } + IconButton( + onClick = { + if (!fields.inDeckClicked.value) { + expanded = true + } + }, + modifier = modifier + .background( + color = getUIStyle.buttonColor(), + shape = RoundedCornerShape(24.dp) + ) + .padding(6.dp) + ) { + Icon( + imageVector = Icons.Filled.Edit, + modifier = Modifier + .size(24.dp), + contentDescription = "Settings", + tint = getUIStyle.iconColor() + ) + DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + DropdownMenuItem( + onClick = { + expanded = false + fields.mainClicked.value = true + onNavigateToEditDeck() + }, + text = { Text(stringResource(R.string.edit_deck)) }) + DropdownMenuItem( + onClick = { + expanded = false + fields.mainClicked.value = true + onNavigateToEditCards() + + }, + text = { Text(stringResource(R.string.edit_flashcards)) }) + } + } +} + + +@Composable +fun CancelButton( + onClick: () -> Unit, enabled: Boolean, getUIStyle: GetUIStyle, + modifier: Modifier = Modifier, fontSize: TextUnit = TextUnit.Unspecified +) { + Button( + onClick = { + onClick() + }, + colors = ButtonDefaults.buttonColors( + containerColor = getUIStyle.secondaryButtonColor(), + contentColor = getUIStyle.buttonTextColor() + ), + enabled = enabled, modifier = modifier + ) { Text(text = stringResource(R.string.cancel), fontSize = fontSize) } +} + +@Composable +fun SubmitButton( + onClick: () -> Unit, enabled: Boolean, + getUIStyle: GetUIStyle, string: String, + modifier: Modifier = Modifier, fontSize: TextUnit = TextUnit.Unspecified, + innerModifier: Modifier = Modifier +) { + Button( + onClick = { + onClick() + }, enabled = enabled, + colors = ButtonDefaults.buttonColors( + containerColor = getUIStyle.secondaryButtonColor(), + contentColor = getUIStyle.buttonTextColor() + ), modifier = modifier + ) { + Text(text = string, fontSize = fontSize, modifier = innerModifier) + } +} + +@Composable +fun MailButton( + onClick: () -> Unit, getUIStyle: GetUIStyle +) { + val ci = ContentIcons(getUIStyle) + IconButton(onClick = { onClick() }) { + ci.ContentIcon("mail", icon = Icons.Default.MailOutline, Modifier) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/buttons/CardOptionsButtons.kt b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/buttons/CardOptionsButtons.kt new file mode 100644 index 0000000..a47e96e --- /dev/null +++ b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/buttons/CardOptionsButtons.kt @@ -0,0 +1,289 @@ +package com.belmontCrest.cardCrafter.uiFunctions.buttons + +import android.util.Log +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.belmontCrest.cardCrafter.R +import com.belmontCrest.cardCrafter.controller.onClickActions.DeleteCard +import com.belmontCrest.cardCrafter.controller.onClickActions.DeleteCards +import com.belmontCrest.cardCrafter.localDatabase.tables.Card +import com.belmontCrest.cardCrafter.model.Type +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.navigation.NavViewModel +import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle +import kotlinx.coroutines.delay + +@Composable +fun CardOptionsButton( + navVM: NavViewModel, + getUIStyle: GetUIStyle, card: Card, + fields: Fields, + expanded: MutableState, + modifier: Modifier, + onDelete: () -> Unit, +) { + val coroutineScope = rememberCoroutineScope() + val showDialog = remember { mutableStateOf(false) } + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + ToggleKeyBoard(navVM, getUIStyle, fields.newType.value) + Box( + modifier = modifier + .wrapContentSize(Alignment.TopEnd) + ) { + IconButton( + onClick = { expanded.value = true }, + modifier = Modifier + .size(54.dp) + .align(Alignment.TopEnd) + ) { + Icon( + Icons.Default.MoreVert, + contentDescription = "Card Type", + tint = getUIStyle.titleColor() + ) + } + DropdownMenu( + expanded = expanded.value, onDismissRequest = { expanded.value = false } + ) { + CardItems( + toBasic = { + resetKeyboardStuff(navVM, fields.newType.value) + fields.newType.value = Type.BASIC + }, + toThree = { + resetKeyboardStuff(navVM, fields.newType.value) + fields.newType.value = Type.THREE + }, + toHint = { + resetKeyboardStuff(navVM, fields.newType.value) + fields.newType.value = Type.HINT + }, + toMulti = { + resetKeyboardStuff(navVM, fields.newType.value) + fields.newType.value = Type.MULTI + }, + toNotation = { fields.newType.value = Type.NOTATION } + ) + HorizontalDivider() + DropdownMenuItem( + onClick = { + showDialog.value = true + }, + text = { Text(stringResource(R.string.delete_card)) }, + trailingIcon = { + Icon( + imageVector = Icons.Filled.Delete, + modifier = Modifier + .size(28.dp), + contentDescription = "Delete Card", + tint = getUIStyle.iconColor() + ) + } + ) + } + DeleteCard( + navVM, coroutineScope, + card, fields, showDialog, + onDelete, getUIStyle + ) + } + } +} + +private fun resetKeyboardStuff(navVM: NavViewModel, type: String) { + if (type == Type.NOTATION) { + navVM.resetKeyboardStuff() + } +} + +@Composable +fun CardTypesButton(getUIStyle: GetUIStyle, navVM: NavViewModel) { + var expanded by rememberSaveable { mutableStateOf(false) } + val type by navVM.type.collectAsState() + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + ToggleKeyBoard(navVM, getUIStyle, type) + Box( + Modifier + .wrapContentSize(Alignment.TopEnd) + ) { + IconButton( + onClick = { expanded = true }, + modifier = Modifier + .padding(4.dp) + .size(54.dp) + ) { + Icon( + Icons.Default.MoreVert, + contentDescription = "Card Type", + tint = getUIStyle.titleColor() + ) + } + DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + CardItems( + toBasic = { navVM.updateType(Type.BASIC) }, + toThree = { navVM.updateType(Type.THREE) }, + toHint = { navVM.updateType(Type.HINT) }, + toMulti = { navVM.updateType(Type.MULTI) }, + toNotation = { navVM.updateType(Type.NOTATION) } + ) + } + } + } +} + +@Composable +fun CardItems( + toBasic: () -> Unit, toThree: () -> Unit, toHint: () -> Unit, + toMulti: () -> Unit, toNotation: () -> Unit +) { + DropdownMenuItem( + onClick = { toBasic() }, + text = { Text(stringResource(R.string.basic_card)) } + ) + DropdownMenuItem( + onClick = { toThree() }, + text = { Text(stringResource(R.string.three_field_card)) } + ) + DropdownMenuItem( + onClick = { toHint() }, + text = { Text(stringResource(R.string.hint_card)) } + ) + DropdownMenuItem( + onClick = { toMulti() }, + text = { Text(stringResource(R.string.multi_choice_card)) } + ) + DropdownMenuItem( + onClick = { toNotation() }, + text = { Text("Notation Card") } + ) +} + +@Composable +fun ToggleKeyBoard( + navVM: NavViewModel, getUIStyle: GetUIStyle, type: String +) { + val showKB by navVM.showKatexKeyboard.collectAsStateWithLifecycle() + val selectedKB by navVM.selectedKB.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + navVM.retrieveKB() + delay(1400) + Log.d("card types", "type: $type\nshowKB: $showKB\nselectedKB: $selectedKB\n") + } + if (type == Type.NOTATION && selectedKB != null) { + Box( + modifier = Modifier + .size(30.dp) + .pointerInput(Unit) { + detectTapGestures( + onTap = { navVM.toggleKeyboard() }, + onLongPress = { navVM.resetOffset() } + ) + } + ) { + if (!showKB) { + Icon( + painterResource(R.drawable.twotone_keyboard), + contentDescription = "Keyboard", + tint = getUIStyle.titleColor() + ) + } else { + Icon( + painterResource(R.drawable.twotone_keyboard_hide), + contentDescription = "Hide Keyboard", + tint = getUIStyle.titleColor() + ) + } + } + } +} + +@Composable +fun CardListOptions( + onDelete: () -> Unit, + onSelectAll: () -> Unit, + onClearSelection: () -> Unit, + getUIStyle: GetUIStyle, + enabled: Boolean, + showDialog: Boolean, + onDialogToggle: (Boolean) -> Unit, + expanded: MutableState +) { + Box(Modifier.wrapContentSize(Alignment.TopEnd)) { + IconButton( + onClick = { expanded.value = true }, + modifier = Modifier + .padding(4.dp) + .size(54.dp) + ) { + Icon( + Icons.Default.MoreVert, contentDescription = null, + tint = getUIStyle.titleColor() + ) + } + DropdownMenu(expanded = expanded.value, onDismissRequest = { expanded.value = false }) { + DropdownMenuItem( + onClick = { onSelectAll() }, + text = { Text("Select all") }, + ) + DropdownMenuItem( + onClick = { onClearSelection() }, + text = { Text("Clear selection") } + ) + DropdownMenuItem( + onClick = { onDialogToggle(true) }, + text = { Text(stringResource(R.string.delete_card_list)) }, + trailingIcon = { + Icon( + imageVector = Icons.Filled.Delete, + modifier = Modifier + .size(28.dp), + contentDescription = "Delete Card", + tint = getUIStyle.iconColor() + ) + } + ) + + } + DeleteCards( + showDialog = showDialog, onDismiss = { onDialogToggle(it) }, + enabled = enabled, getUIStyle = getUIStyle, onDelete = { onDelete() } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/katex/SymbolDocumentation.kt b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/katex/SymbolDocumentation.kt index a0cffe6..8c79d53 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/katex/SymbolDocumentation.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/uiFunctions/katex/SymbolDocumentation.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.layout.positionInParent import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.unit.sp import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton @Composable fun SymbolDocumentation( diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddBasicCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddBasicCard.kt index d46c345..bd98f6c 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddBasicCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddBasicCard.kt @@ -28,7 +28,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.AddCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone import kotlinx.coroutines.delay diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddCardView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddCardView.kt index 86aa9ac..32026cb 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddCardView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddCardView.kt @@ -30,7 +30,7 @@ import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.AddCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.model.Type -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.views.miscFunctions.getSavableFields diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddHintCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddHintCard.kt index 78f1620..1146028 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddHintCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddHintCard.kt @@ -27,7 +27,7 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.AddCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone import com.belmontCrest.cardCrafter.R diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddMultiChoiceCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddMultiChoiceCard.kt index fb14794..c63fac8 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddMultiChoiceCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddMultiChoiceCard.kt @@ -29,7 +29,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.AddCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.uiFunctions.EditTextField import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddNotationCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddNotationCard.kt index 28becc4..2dd642b 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddNotationCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddNotationCard.kt @@ -41,13 +41,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.AddCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.SelectedKeyboard +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.SelectedKeyboard import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.katex.menu.KaTeXMenu import com.belmontCrest.cardCrafter.uiFunctions.LatexKeyboard -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.katex.menu.SelectedAnnotation import com.belmontCrest.cardCrafter.uiFunctions.katex.menu.getWebView import com.belmontCrest.cardCrafter.uiFunctions.showToastMessage diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddThreeCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddThreeCard.kt index 481508c..df0d82d 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddThreeCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/addCardViews/AddThreeCard.kt @@ -29,7 +29,7 @@ import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.AddCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone import com.belmontCrest.cardCrafter.uiFunctions.IsPartOfQOrA diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/cardDeckViews/CardDeckView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/cardDeckViews/CardDeckView.kt index ae02e22..7fb6540 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/cardDeckViews/CardDeckView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/cardDeckViews/CardDeckView.kt @@ -43,9 +43,9 @@ import com.belmontCrest.cardCrafter.controller.cardHandlers.toCard import com.belmontCrest.cardCrafter.controller.cardHandlers.updateCTCard import com.belmontCrest.cardCrafter.controller.cardHandlers.updateDecksCardList import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.CardDeckViewModel -import com.belmontCrest.cardCrafter.model.uiModels.CardState +import com.belmontCrest.cardCrafter.model.ui.CardState import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.views.miscFunctions.AgainText diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditBasicCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditBasicCard.kt index 29edd14..fa239d6 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditBasicCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditBasicCard.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone @Composable diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditChoiceCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditChoiceCard.kt index 7f8eca7..3495ea4 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditChoiceCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditChoiceCard.kt @@ -6,7 +6,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.EditTextField import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditHintCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditHintCard.kt index b62c766..43d4992 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditHintCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditHintCard.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone @Composable diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditNotationCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditNotationCard.kt index a959f5a..911ac17 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditNotationCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditNotationCard.kt @@ -25,8 +25,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.SelectedKeyboard +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.SelectedKeyboard import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.LatexKeyboard diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditThreeCard.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditThreeCard.kt index 23d1f5d..8d2c206 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditThreeCard.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditThreeCard.kt @@ -7,7 +7,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.uiFunctions.EditTextFieldNonDone import com.belmontCrest.cardCrafter.uiFunctions.IsPartOfQOrA diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardView.kt index 9673156..723f1de 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardView.kt @@ -42,13 +42,13 @@ import com.belmontCrest.cardCrafter.controller.onClickActions.saveCard import com.belmontCrest.cardCrafter.controller.onClickActions.updateCardType import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.EditCardViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.CT -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.ui.theme.editCardModifier -import com.belmontCrest.cardCrafter.uiFunctions.CancelButton -import com.belmontCrest.cardCrafter.uiFunctions.SubmitButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.CancelButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SubmitButton import com.belmontCrest.cardCrafter.uiFunctions.katex.menu.KaTeXMenu import com.belmontCrest.cardCrafter.uiFunctions.katex.menu.SelectedAnnotation import com.belmontCrest.cardCrafter.uiFunctions.katex.menu.getWebView diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardsList.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardsList.kt index 73efd59..d8843d4 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardsList.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/cardViews/editCardViews/EditingCardsList.kt @@ -1,16 +1,17 @@ package com.belmontCrest.cardCrafter.views.cardViews.editCardViews -import android.annotation.SuppressLint import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -24,18 +25,23 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.controller.cardHandlers.getCardId import com.belmontCrest.cardCrafter.controller.viewModels.cardViewsModels.EditingCardListViewModel import com.belmontCrest.cardCrafter.localDatabase.tables.CT import com.belmontCrest.cardCrafter.model.TAProp import com.belmontCrest.cardCrafter.model.toTextProp -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.navigation.NavViewModel import com.belmontCrest.cardCrafter.views.miscFunctions.CardSelector import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.uiFunctions.CustomText +import com.belmontCrest.cardCrafter.views.miscFunctions.details.toQuestion class EditCardsList( private var editingCardListVM: EditingCardListViewModel, @@ -43,36 +49,26 @@ class EditCardsList( private var listState: LazyListState, private var getUIStyle: GetUIStyle ) { - @SuppressLint("CoroutineCreationDuringComposition") @Composable fun ViewFlashCards( - goToEditCard: (Int) -> Unit + navVM: NavViewModel, goToEditCard: (Int) -> Unit ) { val sealedCardsList by editingCardListVM.sealedAllCTs.collectAsStateWithLifecycle() val searchQuery by editingCardListVM.searchQuery.collectAsStateWithLifecycle() val middleCard = rememberSaveable { mutableIntStateOf(0) } var enabled by remember { mutableStateOf(true) } - + val isSelecting by navVM.isSelecting.collectAsStateWithLifecycle() + val selectedCTL by editingCardListVM.selectedCards.collectAsStateWithLifecycle() val filtered = sealedCardsList.allCTs.filter { ct -> - if (searchQuery.isBlank()) { - return@filter true - } - val q = when (ct) { - is CT.Basic -> ct.basicCard.question - is CT.Hint -> ct.hintCard.question - is CT.ThreeField -> ct.threeFieldCard.question - is CT.MultiChoice -> ct.multiChoiceCard.question - is CT.Notation -> ct.notationCard.question - } - q.contains(searchQuery, ignoreCase = true) + if (searchQuery.isBlank()) return@filter true + + ct.toQuestion().contains(searchQuery, ignoreCase = true) } // Restore the scroll position when returning from editing LaunchedEffect(Unit) { snapshotFlow { listState.layoutInfo.visibleItemsInfo } - .collect { visibleItems -> - middleCard.intValue = visibleItems.size / 2 - } + .collect { visibleItems -> middleCard.intValue = visibleItems.size / 2 } getListState(listState, middleCard.intValue) } Column( @@ -81,14 +77,18 @@ class EditCardsList( verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.CenterHorizontally ) { + val text = + if (isSelecting) stringResource(R.string.keyboard_disabled) + else stringResource(R.string.search) OutlinedTextField( value = searchQuery, onValueChange = { editingCardListVM.updateQuery(it) }, - placeholder = { Text("Search…", color = getUIStyle.defaultIconColor()) }, + placeholder = { Text(text, color = getUIStyle.defaultIconColor()) }, singleLine = true, modifier = Modifier .fillMaxWidth() .padding(8.dp), + enabled = !isSelecting ) if (searchQuery.isNotEmpty() && filtered.isEmpty()) { CustomText( @@ -98,34 +98,60 @@ class EditCardsList( ) } LazyColumn( - modifier = Modifier - .fillMaxSize(), + modifier = Modifier.fillMaxSize(), state = listState ) { - items(filtered.size) { index -> - Button( - onClick = { - enabled = false - fields.scrollPosition.value = index - fields.isEditing.value = true - goToEditCard(filtered[index].getCardId()) - enabled = true - }, enabled = enabled, - colors = ButtonDefaults.buttonColors( - containerColor = getUIStyle.secondaryButtonColor(), - contentColor = getUIStyle.buttonTextColor() - ), - modifier = Modifier - .fillMaxWidth() - .padding(8.dp) - ) { - CardSelector(filtered, index) - } + items(filtered.size, key = { index -> filtered[index].getCardId() }) { index -> + val selected = selectedCTL.any { it.getCardId() == filtered[index].getCardId() } + + CardItem( + filtered, index, isSelecting = isSelecting, selected = selected, + onTap = { + if (enabled) { + if (isSelecting) { + editingCardListVM.toggleCard(filtered[index]) + } else { + enabled = false + fields.scrollPosition.value = index + fields.isEditing.value = true + goToEditCard(filtered[index].getCardId()) + enabled = true + } + } + }, + onLongPress = { + if (enabled) { + editingCardListVM.toggleCard(filtered[index]) + navVM.isSelectingTrue() + } + }) } } } } + @Composable + fun CardItem( + filtered: List, index: Int, onTap: () -> Unit, onLongPress: () -> Unit, + isSelecting: Boolean, selected: Boolean + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .background(getUIStyle.secondaryButtonColor(), RoundedCornerShape(16.dp)) + .padding(4.dp) + .pointerInput(Unit) { + detectTapGestures( + onTap = { onTap() }, + onLongPress = { onLongPress() } + ) + } + ) { + CardSelector(filtered, index, getUIStyle, isSelecting, selected) + } + } + private suspend fun getListState(listState: LazyListState, middleCard: Int) { if (fields.scrollPosition.value == 0) { Log.d("scrollPosition", "${fields.scrollPosition.value}") diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/DeckView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/DeckView.kt index c47dcd7..aa506e3 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/DeckView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/DeckView.kt @@ -36,8 +36,8 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.model.application.AppViewModelProvider import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.DeckViewModel -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.uiFunctions.AddCardButton +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.uiFunctions.buttons.AddCardButton import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.addButtonModifier import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/EditDeckView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/EditDeckView.kt index 27685aa..2d837bc 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/EditDeckView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/deckViews/EditDeckView.kt @@ -40,7 +40,7 @@ import com.belmontCrest.cardCrafter.controller.onClickActions.updateDeckName import com.belmontCrest.cardCrafter.controller.onClickActions.updateMultipliers import com.belmontCrest.cardCrafter.controller.onClickActions.updateReviewAmount import com.belmontCrest.cardCrafter.controller.viewModels.deckViewsModels.EditDeckViewModel -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.localDatabase.tables.Deck import com.belmontCrest.cardCrafter.uiFunctions.EditDoubleField import com.belmontCrest.cardCrafter.uiFunctions.EditTextField diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/GeneralSettings.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/GeneralSettings.kt index 95b418a..ff6fe10 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/GeneralSettings.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/GeneralSettings.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import com.belmontCrest.cardCrafter.R -import com.belmontCrest.cardCrafter.model.uiModels.PreferencesManager +import com.belmontCrest.cardCrafter.model.ui.PreferencesManager import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import kotlinx.coroutines.delay diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/MainView.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/MainView.kt index c34d485..c7f608c 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/MainView.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/mainViews/MainView.kt @@ -35,11 +35,11 @@ import androidx.compose.ui.window.Dialog import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.localDatabase.tables.Deck -import com.belmontCrest.cardCrafter.model.uiModels.Fields +import com.belmontCrest.cardCrafter.model.ui.Fields import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle import com.belmontCrest.cardCrafter.ui.theme.boxViewsModifier import com.belmontCrest.cardCrafter.ui.theme.mainViewModifier -import com.belmontCrest.cardCrafter.uiFunctions.SmallAddButton +import com.belmontCrest.cardCrafter.uiFunctions.buttons.SmallAddButton import java.text.SimpleDateFormat import java.util.Locale diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/CardSelector.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/CardSelector.kt index 364030a..12eb78a 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/CardSelector.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/CardSelector.kt @@ -1,84 +1,53 @@ package com.belmontCrest.cardCrafter.views.miscFunctions +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow -import com.belmontCrest.cardCrafter.localDatabase.tables.BasicCard +import com.belmontCrest.cardCrafter.R import com.belmontCrest.cardCrafter.localDatabase.tables.CT -import com.belmontCrest.cardCrafter.localDatabase.tables.HintCard -import com.belmontCrest.cardCrafter.localDatabase.tables.NotationCard -import com.belmontCrest.cardCrafter.localDatabase.tables.MultiChoiceCard -import com.belmontCrest.cardCrafter.localDatabase.tables.ThreeFieldCard - -@Composable -fun BasicCardQuestion(basicCard: BasicCard) { - Text( - text = basicCard.question, - maxLines = 3, - overflow = TextOverflow.Ellipsis - - ) -} - -@Composable -fun ThreeCardQuestion(threeFieldCard: ThreeFieldCard) { - Text( - text = threeFieldCard.question, - maxLines = 3, - overflow = TextOverflow.Companion.Ellipsis - - ) -} - -@Composable -fun HintCardQuestion(hintCard: HintCard) { - Text( - text = hintCard.question, - maxLines = 3, - overflow = TextOverflow.Companion.Ellipsis - - ) -} - -@Composable -fun ChoiceCardQuestion(multiChoiceCard: MultiChoiceCard) { - Text( - text = multiChoiceCard.question, - maxLines = 3, - overflow = TextOverflow.Companion.Ellipsis - ) -} - -@Composable -fun NotationCardQuestion(notationCard: NotationCard){ - Text( - text = notationCard.question, - maxLines = 3, - overflow = TextOverflow.Companion.Ellipsis - ) -} +import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle +import com.belmontCrest.cardCrafter.views.miscFunctions.details.toQuestion @Composable fun CardSelector( - allCTs: List, - index: Int + allCTs: List, index: Int, getUIStyle: GetUIStyle, isSelecting: Boolean, selected: Boolean ) { - val ct = allCTs[index] - when(ct){ - is CT.Basic -> { - BasicCardQuestion(ct.basicCard) - } - is CT.ThreeField -> { - ThreeCardQuestion(ct.threeFieldCard) - } - is CT.Hint -> { - HintCardQuestion(ct.hintCard) - } - is CT.MultiChoice -> { - ChoiceCardQuestion(ct.multiChoiceCard) - } - is CT.Notation -> { - NotationCardQuestion(ct.notationCard) + if (isSelecting) { + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + if (selected) { + Icon(painterResource(R.drawable.filled_square), contentDescription = null) + Text( + text = allCTs[index].toQuestion(), + maxLines = 3, + overflow = TextOverflow.Ellipsis, + color = getUIStyle.buttonTextColor() + ) + } else { + Icon(painterResource(R.drawable.outlined_square), contentDescription = null) + Text( + text = allCTs[index].toQuestion(), + maxLines = 3, + overflow = TextOverflow.Ellipsis, + color = getUIStyle.buttonTextColor() + ) + } } + } else { + Text( + text = allCTs[index].toQuestion(), + maxLines = 3, + overflow = TextOverflow.Ellipsis, + color = getUIStyle.buttonTextColor() + ) } } diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/Functions.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/Functions.kt index ebca808..536ef2c 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/Functions.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/Functions.kt @@ -32,8 +32,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import com.belmontCrest.cardCrafter.controller.cardHandlers.returnReviewsLeft import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA -import com.belmontCrest.cardCrafter.model.uiModels.Fields -import com.belmontCrest.cardCrafter.model.uiModels.SealedDueCTs +import com.belmontCrest.cardCrafter.model.ui.Fields +import com.belmontCrest.cardCrafter.model.ui.SealedDueCTs import com.belmontCrest.cardCrafter.ui.theme.GetUIStyle diff --git a/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/details/CardDetails.kt b/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/details/CardDetails.kt index 3993b79..96c1945 100644 --- a/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/details/CardDetails.kt +++ b/app/src/main/java/com/belmontCrest/cardCrafter/views/miscFunctions/details/CardDetails.kt @@ -2,13 +2,9 @@ package com.belmontCrest.cardCrafter.views.miscFunctions.details import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf -import com.belmontCrest.cardCrafter.localDatabase.tables.BasicCard import com.belmontCrest.cardCrafter.localDatabase.tables.CT -import com.belmontCrest.cardCrafter.localDatabase.tables.HintCard import com.belmontCrest.cardCrafter.localDatabase.tables.ListStringConverter -import com.belmontCrest.cardCrafter.localDatabase.tables.MultiChoiceCard import com.belmontCrest.cardCrafter.localDatabase.tables.PartOfQorA -import com.belmontCrest.cardCrafter.localDatabase.tables.ThreeFieldCard import com.belmontCrest.cardCrafter.supabase.model.tables.SBCardColsBasic import com.belmontCrest.cardCrafter.supabase.model.tables.SBCardColsHint import com.belmontCrest.cardCrafter.supabase.model.tables.SBCardColsMulti @@ -26,6 +22,14 @@ data class CardDetails( val isQorA: MutableState = mutableStateOf(PartOfQorA.Q) ) +fun CT.toQuestion(): String = when (this) { + is CT.Basic -> this.basicCard.question + is CT.Hint -> this.hintCard.question + is CT.MultiChoice -> this.multiChoiceCard.question + is CT.Notation -> this.notationCard.question + is CT.ThreeField -> this.threeFieldCard.question +} + private val listStringC = ListStringConverter() diff --git a/app/src/main/res/drawable/filled_square.xml b/app/src/main/res/drawable/filled_square.xml new file mode 100644 index 0000000..cf37fd4 --- /dev/null +++ b/app/src/main/res/drawable/filled_square.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/outlined_square.xml b/app/src/main/res/drawable/outlined_square.xml new file mode 100644 index 0000000..cbcfb78 --- /dev/null +++ b/app/src/main/res/drawable/outlined_square.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b551a92..af3e6c9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -7,6 +7,7 @@ Difícil Bueno Entregar + Borrar Guardar Cancelar Pregunta @@ -65,8 +66,8 @@ Multiplicador bueno debe ser mayor que 1.0 Fracaso en actualizar multiplicadores Multiplicadores actualizados! - Estas seguro/a que quiere borrar este mazo? - Estas seguro/a que quiere borrar esta carta? + ¿Estas seguro/a que quiere borrar este mazo? + ¿Estas seguro/a que quiere borrar esta carta? Revisiones restantes de la carta: Predeterminado: Cantidad de cartas @@ -83,4 +84,8 @@ No se puede iniciar sesión No hay credenciales No es el propietario ni copropietario de este mazo. + ¿Estás seguro de que quieres eliminar estas tarjetas? + Borrar Cartas + Teclado desactivado + Buscar… \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8db337..08db831 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ Hard Good Submit + Delete Save Cancel Question @@ -83,4 +84,8 @@ Couldn\'t sign in. No credentials available You are not the owner or a co-owner of this deck. + Are you sure you want to delete these cards? + Delete Cards + Keyboard Disabled + Search… \ No newline at end of file