From 4f9f8919258972c4b987f367bbb57c88c0c15f29 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 4 Jul 2025 19:01:43 +0200 Subject: [PATCH 1/5] Update TextVM.kt --- .../io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt index c277433..e60ee08 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt @@ -129,12 +129,11 @@ open class TextVM() : ViewModel() { // todo: report this to google open fun onValueChange(v: TextFieldValue) { - // don't bloat history with different selection - if (content.value.text == v.text) { + if (history.size == 1 && content.value.text == v.text) { _content.value = v.copy() + history[0] = v.copy() return } - _content.value = v.copy() val historyManager = historyManager.value From 4ec545ac0e4f8b040306e2717df2edf95dc87a70 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 4 Jul 2025 19:38:35 +0200 Subject: [PATCH 2/5] Update TextVM.kt --- .../gitnote/ui/viewmodel/edit/TextVM.kt | 71 +++++++++++++------ 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt index e60ee08..3c76bd0 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt @@ -60,7 +60,11 @@ open class TextVM() : ViewModel() { private val _content = mutableStateOf(TextFieldValue()) val content: State get() = _content - private val history = mutableListOf() + private data class HistoryItem( + val v: TextFieldValue, + val flagDoNotRemove: Boolean = false, + ) + private val history = mutableListOf() private val _historyManager: MutableStateFlow = MutableStateFlow(History(index = 0, size = 1)) @@ -89,7 +93,7 @@ open class TextVM() : ViewModel() { ) _content.value = textFieldValue.copy() - history.add(textFieldValue) + history.add(HistoryItem(textFieldValue)) Log.d(TAG, "init: $previousNote, $editType") } @@ -112,11 +116,17 @@ open class TextVM() : ViewModel() { ) _content.value = textFieldValue.copy() - history.add(textFieldValue) + history.add(HistoryItem(textFieldValue)) Log.d(TAG, "init saved: $previousNote, $editType") } + enum class IsSimilarResult { + Yes, + No, + FlagDoNotRemove + } + // https://medium.com/androiddevelopers/effective-state-management-for-textfield-in-compose-d6e5b070fbe5 // even if we are not doing anything async, sometime, when we long press enter for example, // the value v will not be the last one set by `content.value`. This will instead by an internal copy @@ -131,7 +141,7 @@ open class TextVM() : ViewModel() { if (history.size == 1 && content.value.text == v.text) { _content.value = v.copy() - history[0] = v.copy() + history[0] = HistoryItem(v.copy()) return } _content.value = v.copy() @@ -144,30 +154,41 @@ open class TextVM() : ViewModel() { i-- } - fun isSimilar(v1: TextFieldValue, v2: TextFieldValue): Boolean { + fun isSimilar(v1: HistoryItem, v2: HistoryItem, firstPass: Boolean): IsSimilarResult { + + if (v2.flagDoNotRemove) { + return IsSimilarResult.No + } + + if (firstPass) { + if ((v1.v.selection.start - v2.v.selection.start).absoluteValue > 1 + || (v1.v.selection.end - v2.v.selection.end).absoluteValue > 1) + return IsSimilarResult.FlagDoNotRemove + } + - if (v1.text.endsWith(".")) { - return false + if (v1.v.text.endsWith(".")) { + return IsSimilarResult.No } - if (!v1.text.endsWith(". ") && v1.text.endsWith(" ")) { - return false + if (!v1.v.text.endsWith(". ") && v1.v.text.endsWith(" ")) { + return IsSimilarResult.No } - if (v1.text.endsWith("\n")) { - return false + if (v1.v.text.endsWith("\n")) { + return IsSimilarResult.No } - if (v1.text.endsWith("-")) { - return false + if (v1.v.text.endsWith("-")) { + return IsSimilarResult.No } - if ((v1.text.length - v2.text.length).absoluteValue >= 10) - return false + if ((v1.v.text.length - v2.v.text.length).absoluteValue >= 10) + return IsSimilarResult.No - return true + return IsSimilarResult.Yes } - history.add(v) + history.add(HistoryItem(v.copy())) fun cleanHistory() { // we don't want to remove the last and first index of the history @@ -177,9 +198,15 @@ open class TextVM() : ViewModel() { var last = history.size - 1 val secondLast = last - 1 - if (isSimilar(history[last], history[secondLast])) { - if (isSimilar(history[secondLast - 1], history[secondLast])) { - history.removeAt(secondLast) + when (isSimilar(history[last], history[secondLast], true)) { + IsSimilarResult.Yes -> { + if (isSimilar(history[secondLast - 1], history[secondLast], false) == IsSimilarResult.Yes) { + history.removeAt(secondLast) + } + } + IsSimilarResult.No -> { } + IsSimilarResult.FlagDoNotRemove -> { + history[last] = history[last].copy(flagDoNotRemove = true) } } } @@ -207,7 +234,7 @@ open class TextVM() : ViewModel() { ) ) } - _content.value = history[historyManager.index - 1].copy() + _content.value = history[historyManager.index - 1].v.copy() } fun redo() { @@ -220,7 +247,7 @@ open class TextVM() : ViewModel() { ) ) } - _content.value = history[historyManager.index + 1].copy() + _content.value = history[historyManager.index + 1].v.copy() } fun setReadOnlyMode(value: Boolean) { From f56b4c3e6cd1cbaa218c4ae2aa0f87793ef7dacb Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 4 Jul 2025 20:18:17 +0200 Subject: [PATCH 3/5] Update TextVM.kt --- .../gitnote/ui/viewmodel/edit/TextVM.kt | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt index 3c76bd0..8f86118 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt @@ -64,6 +64,7 @@ open class TextVM() : ViewModel() { val v: TextFieldValue, val flagDoNotRemove: Boolean = false, ) + private val history = mutableListOf() private val _historyManager: MutableStateFlow = @@ -156,33 +157,34 @@ open class TextVM() : ViewModel() { fun isSimilar(v1: HistoryItem, v2: HistoryItem, firstPass: Boolean): IsSimilarResult { - if (v2.flagDoNotRemove) { + if (v1.flagDoNotRemove) { return IsSimilarResult.No } if (firstPass) { - if ((v1.v.selection.start - v2.v.selection.start).absoluteValue > 1 - || (v1.v.selection.end - v2.v.selection.end).absoluteValue > 1) + if ((v2.v.selection.start - v1.v.selection.start).absoluteValue > 1 + || (v2.v.selection.end - v1.v.selection.end).absoluteValue > 1 + ) return IsSimilarResult.FlagDoNotRemove - } - if (v1.v.text.endsWith(".")) { - return IsSimilarResult.No - } + if (v2.v.text.endsWith(".")) { + return IsSimilarResult.No + } - if (!v1.v.text.endsWith(". ") && v1.v.text.endsWith(" ")) { - return IsSimilarResult.No - } + if (!v2.v.text.endsWith(". ") && v2.v.text.endsWith(" ")) { + return IsSimilarResult.No + } - if (v1.v.text.endsWith("\n")) { - return IsSimilarResult.No + if (v2.v.text.endsWith("-")) { + return IsSimilarResult.No + } } - if (v1.v.text.endsWith("-")) { + + if (v2.v.text.endsWith("\n")) { return IsSimilarResult.No } - - if ((v1.v.text.length - v2.v.text.length).absoluteValue >= 10) + if ((v2.v.text.length - v1.v.text.length).absoluteValue >= 10) return IsSimilarResult.No return IsSimilarResult.Yes @@ -191,6 +193,7 @@ open class TextVM() : ViewModel() { history.add(HistoryItem(v.copy())) fun cleanHistory() { + // we don't want to remove the last and first index of the history // [_,a,ab] -> the size is 3, "a" will be removed if (history.size < 3) return @@ -198,13 +201,19 @@ open class TextVM() : ViewModel() { var last = history.size - 1 val secondLast = last - 1 - when (isSimilar(history[last], history[secondLast], true)) { + when (isSimilar(history[secondLast], history[last], true)) { IsSimilarResult.Yes -> { - if (isSimilar(history[secondLast - 1], history[secondLast], false) == IsSimilarResult.Yes) { + if (isSimilar( + history[secondLast - 1], + history[secondLast], + false + ) == IsSimilarResult.Yes + ) { history.removeAt(secondLast) } } - IsSimilarResult.No -> { } + + IsSimilarResult.No -> {} IsSimilarResult.FlagDoNotRemove -> { history[last] = history[last].copy(flagDoNotRemove = true) } From d38e044a5ab0e15720735be1f87934e70c04e017 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 4 Jul 2025 20:25:15 +0200 Subject: [PATCH 4/5] Update TextVM.kt --- .../io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt index 8f86118..859889e 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt @@ -157,7 +157,7 @@ open class TextVM() : ViewModel() { fun isSimilar(v1: HistoryItem, v2: HistoryItem, firstPass: Boolean): IsSimilarResult { - if (v1.flagDoNotRemove) { + if (v2.flagDoNotRemove) { return IsSimilarResult.No } @@ -198,8 +198,8 @@ open class TextVM() : ViewModel() { // [_,a,ab] -> the size is 3, "a" will be removed if (history.size < 3) return + val secondLast = history.size - 2 var last = history.size - 1 - val secondLast = last - 1 when (isSimilar(history[secondLast], history[last], true)) { IsSimilarResult.Yes -> { From 8e43ef526a422c00011fe4807c49ff93148bdf70 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 4 Jul 2025 20:49:06 +0200 Subject: [PATCH 5/5] ff --- .../gitnote/data/platform/FileSystem.kt | 2 +- .../wiiznokes/gitnote/ui/component/AppPage.kt | 3 +- .../wiiznokes/gitnote/ui/screen/app/AppNav.kt | 4 +-- .../gitnote/ui/screen/settings/SettingsNav.kt | 2 +- .../gitnote/ui/screen/setup/SetupNav.kt | 4 +-- .../ui/screen/setup/remote/PickRepoScreen.kt | 2 +- .../ui/screen/setup/remote/RemoteNav.kt | 2 +- .../gitnote/ui/{util => utils}/Fuzzy.kt | 2 +- .../ui/{util => utils}/rememberWindowInfo.kt | 2 +- .../gitnote/ui/{util => utils}/utils.kt | 14 +------- .../gitnote/ui/viewmodel/GridViewModel.kt | 4 +-- .../gitnote/ui/viewmodel/edit/TextVM.kt | 20 +++++++---- .../{util/LazySuspend.kt => utils/utils.kt} | 34 +++++++++++++++++-- 13 files changed, 59 insertions(+), 36 deletions(-) rename app/src/main/java/io/github/wiiznokes/gitnote/ui/{util => utils}/Fuzzy.kt (96%) rename app/src/main/java/io/github/wiiznokes/gitnote/ui/{util => utils}/rememberWindowInfo.kt (96%) rename app/src/main/java/io/github/wiiznokes/gitnote/ui/{util => utils}/utils.kt (63%) rename app/src/main/java/io/github/wiiznokes/gitnote/{util/LazySuspend.kt => utils/utils.kt} (58%) diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/data/platform/FileSystem.kt b/app/src/main/java/io/github/wiiznokes/gitnote/data/platform/FileSystem.kt index eb545bd..a2ad11c 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/data/platform/FileSystem.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/data/platform/FileSystem.kt @@ -5,7 +5,7 @@ import io.github.wiiznokes.gitnote.MyApp import io.github.wiiznokes.gitnote.R import io.github.wiiznokes.gitnote.data.removeFirstAndLastSlash import io.github.wiiznokes.gitnote.ui.model.FileExtension -import io.github.wiiznokes.gitnote.util.toResult +import io.github.wiiznokes.gitnote.utils.toResult import java.io.File import java.nio.file.Path import java.nio.file.Paths diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/component/AppPage.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/component/AppPage.kt index 8587480..ccde038 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/component/AppPage.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/component/AppPage.kt @@ -17,7 +17,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults @@ -28,7 +27,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import io.github.wiiznokes.gitnote.ui.util.conditional +import io.github.wiiznokes.gitnote.ui.utils.conditional @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/AppNav.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/AppNav.kt index 05a24ee..9362765 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/AppNav.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/AppNav.kt @@ -16,8 +16,8 @@ import io.github.wiiznokes.gitnote.ui.destination.SettingsDestination import io.github.wiiznokes.gitnote.ui.screen.app.edit.EditScreen import io.github.wiiznokes.gitnote.ui.screen.app.grid.GridScreen import io.github.wiiznokes.gitnote.ui.screen.settings.SettingsNav -import io.github.wiiznokes.gitnote.ui.util.crossFade -import io.github.wiiznokes.gitnote.ui.util.slide +import io.github.wiiznokes.gitnote.ui.utils.crossFade +import io.github.wiiznokes.gitnote.ui.utils.slide private const val TAG = "AppScreen" diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/settings/SettingsNav.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/settings/SettingsNav.kt index 1710c29..29ecd34 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/settings/SettingsNav.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/settings/SettingsNav.kt @@ -12,7 +12,7 @@ import dev.olshevski.navigation.reimagined.NavTransitionSpec import dev.olshevski.navigation.reimagined.pop import dev.olshevski.navigation.reimagined.rememberNavController import io.github.wiiznokes.gitnote.ui.destination.SettingsDestination -import io.github.wiiznokes.gitnote.ui.util.slide +import io.github.wiiznokes.gitnote.ui.utils.slide import io.github.wiiznokes.gitnote.ui.viewmodel.SettingsViewModel diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/SetupNav.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/SetupNav.kt index 748650f..6384700 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/SetupNav.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/SetupNav.kt @@ -16,8 +16,8 @@ import io.github.wiiznokes.gitnote.ui.destination.SetupDestination import io.github.wiiznokes.gitnote.ui.destination.NewRepoMethod import io.github.wiiznokes.gitnote.ui.model.StorageConfiguration import io.github.wiiznokes.gitnote.ui.screen.setup.remote.RemoteScreen -import io.github.wiiznokes.gitnote.ui.util.crossFade -import io.github.wiiznokes.gitnote.ui.util.slide +import io.github.wiiznokes.gitnote.ui.utils.crossFade +import io.github.wiiznokes.gitnote.ui.utils.slide import io.github.wiiznokes.gitnote.ui.viewmodel.SetupViewModel import io.github.wiiznokes.gitnote.ui.viewmodel.viewModelFactory import kotlinx.coroutines.flow.SharedFlow diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/PickRepoScreen.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/PickRepoScreen.kt index 524798d..c3a63f5 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/PickRepoScreen.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/PickRepoScreen.kt @@ -35,7 +35,7 @@ import io.github.wiiznokes.gitnote.ui.component.NextButton import io.github.wiiznokes.gitnote.ui.component.SetupPage import io.github.wiiznokes.gitnote.ui.model.StorageConfiguration import io.github.wiiznokes.gitnote.ui.viewmodel.SetupViewModel -import io.github.wiiznokes.gitnote.util.contains +import io.github.wiiznokes.gitnote.utils.contains sealed class Selected { diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt index f68554b..2370c8a 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/setup/remote/RemoteNav.kt @@ -20,7 +20,7 @@ import io.github.wiiznokes.gitnote.ui.destination.RemoteDestination.SelectGenera import io.github.wiiznokes.gitnote.ui.destination.RemoteDestination.SelectProvider import io.github.wiiznokes.gitnote.ui.destination.RemoteDestination.SelectSetupAutomatically import io.github.wiiznokes.gitnote.ui.model.StorageConfiguration -import io.github.wiiznokes.gitnote.ui.util.slide +import io.github.wiiznokes.gitnote.ui.utils.slide import io.github.wiiznokes.gitnote.ui.viewmodel.SetupViewModel diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/util/Fuzzy.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/Fuzzy.kt similarity index 96% rename from app/src/main/java/io/github/wiiznokes/gitnote/ui/util/Fuzzy.kt rename to app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/Fuzzy.kt index 47a95c3..89ee347 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/util/Fuzzy.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/Fuzzy.kt @@ -1,4 +1,4 @@ -package io.github.wiiznokes.gitnote.ui.util +package io.github.wiiznokes.gitnote.ui.utils import io.github.wiiznokes.gitnote.data.room.Note import java.util.Vector diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/util/rememberWindowInfo.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/rememberWindowInfo.kt similarity index 96% rename from app/src/main/java/io/github/wiiznokes/gitnote/ui/util/rememberWindowInfo.kt rename to app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/rememberWindowInfo.kt index 636d616..3320613 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/util/rememberWindowInfo.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/rememberWindowInfo.kt @@ -1,4 +1,4 @@ -package io.github.wiiznokes.gitnote.ui.util +package io.github.wiiznokes.gitnote.ui.utils import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalConfiguration diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/util/utils.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/utils.kt similarity index 63% rename from app/src/main/java/io/github/wiiznokes/gitnote/ui/util/utils.kt rename to app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/utils.kt index c3052e8..288d046 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/util/utils.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/utils/utils.kt @@ -1,4 +1,4 @@ -package io.github.wiiznokes.gitnote.ui.util +package io.github.wiiznokes.gitnote.ui.utils import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn @@ -8,8 +8,6 @@ import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.togetherWith import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.transform @Composable fun Modifier.conditional( @@ -35,13 +33,3 @@ fun slide(backWard: Boolean = false) = slideInHorizontally( } ) -/** - * This is similar to the map function, but the flow that was - * mapped is also included in the result: - * flow1.mapAndCombine(f(flow1) -> flow3) - * will return: flow(1, 3) - */ -inline fun Flow.mapAndCombine(crossinline transform: suspend (value: T) -> R): Flow> = - transform { value -> - return@transform emit(Pair(value, transform(value))) - } \ No newline at end of file diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/GridViewModel.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/GridViewModel.kt index 164bbfe..18e4f3d 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/GridViewModel.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/GridViewModel.kt @@ -18,8 +18,8 @@ import io.github.wiiznokes.gitnote.ui.model.SortOrder.Descending import io.github.wiiznokes.gitnote.ui.model.SortType.AlphaNumeric import io.github.wiiznokes.gitnote.ui.model.SortType.Modification import io.github.wiiznokes.gitnote.ui.screen.app.DrawerFolderModel -import io.github.wiiznokes.gitnote.ui.util.fuzzySort -import io.github.wiiznokes.gitnote.ui.util.mapAndCombine +import io.github.wiiznokes.gitnote.ui.utils.fuzzySort +import io.github.wiiznokes.gitnote.utils.mapAndCombine import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt index 859889e..425f6b1 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/edit/TextVM.kt @@ -21,6 +21,7 @@ import io.github.wiiznokes.gitnote.ui.destination.EditParams import io.github.wiiznokes.gitnote.ui.model.EditType import io.github.wiiznokes.gitnote.ui.model.FileExtension import io.github.wiiznokes.gitnote.ui.viewmodel.viewModelFactory +import io.github.wiiznokes.gitnote.utils.endsWith import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -164,28 +165,33 @@ open class TextVM() : ViewModel() { if (firstPass) { if ((v2.v.selection.start - v1.v.selection.start).absoluteValue > 1 || (v2.v.selection.end - v1.v.selection.end).absoluteValue > 1 - ) + ) { return IsSimilarResult.FlagDoNotRemove + } - - if (v2.v.text.endsWith(".")) { + if (v2.v.text.endsWith(".", startIndex = v2.v.selection.max)) { return IsSimilarResult.No } - if (!v2.v.text.endsWith(". ") && v2.v.text.endsWith(" ")) { + if (!v2.v.text.endsWith( + ". ", + startIndex = v2.v.selection.max + ) && v2.v.text.endsWith(" ", startIndex = v2.v.selection.max) + ) { return IsSimilarResult.No } - if (v2.v.text.endsWith("-")) { + if (v2.v.text.endsWith("-", startIndex = v2.v.selection.max)) { return IsSimilarResult.No } } - if (v2.v.text.endsWith("\n")) { + if (v2.v.text.endsWith("\n", startIndex = v2.v.selection.max)) { return IsSimilarResult.No } - if ((v2.v.text.length - v1.v.text.length).absoluteValue >= 10) + if ((v2.v.text.length - v1.v.text.length).absoluteValue >= 10) { return IsSimilarResult.No + } return IsSimilarResult.Yes } diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/util/LazySuspend.kt b/app/src/main/java/io/github/wiiznokes/gitnote/utils/utils.kt similarity index 58% rename from app/src/main/java/io/github/wiiznokes/gitnote/util/LazySuspend.kt rename to app/src/main/java/io/github/wiiznokes/gitnote/utils/utils.kt index 6a5e9dc..39fdab5 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/util/LazySuspend.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/utils/utils.kt @@ -1,5 +1,7 @@ -package io.github.wiiznokes.gitnote.util +package io.github.wiiznokes.gitnote.utils +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.transform import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlin.Result.Companion.failure @@ -58,4 +60,32 @@ fun MutableList.remove(predicate: (T) -> Boolean): Result { } fun Iterable.contains(predicate: (T) -> Boolean): Boolean = - firstOrNull(predicate) != null \ No newline at end of file + firstOrNull(predicate) != null + +fun String.endsWith( + suffix: String, + ignoreCase: Boolean = false, + startIndex: Int = this.length +): Boolean { + if (startIndex < 0 || startIndex > this.length) return false + if (startIndex < suffix.length) return false + + return regionMatches( + startIndex - suffix.length, + suffix, + 0, + suffix.length, + ignoreCase = ignoreCase + ) +} + +/** + * This is similar to the map function, but the flow that was + * mapped is also included in the result: + * flow1.mapAndCombine(f(flow1) -> flow3) + * will return: flow(1, 3) + */ +inline fun Flow.mapAndCombine(crossinline transform: suspend (value: T) -> R): Flow> = + transform { value -> + return@transform emit(Pair(value, transform(value))) + }