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