Parcourir la source

apps menu search relevance improvement

milan jurkulák il y a 1 an
Parent
commit
70598d1d43

+ 3 - 2
src/main/kotlin/eu/mjdev/desktop/components/appsmenu/AppsMenu.kt

@@ -37,6 +37,7 @@ import eu.mjdev.desktop.extensions.Compose.rememberComputed
 import eu.mjdev.desktop.extensions.Compose.rememberState
 import eu.mjdev.desktop.extensions.Compose.removeLast
 import eu.mjdev.desktop.extensions.Custom.flowBlock
+import eu.mjdev.desktop.extensions.Custom.sortByRelevance
 import eu.mjdev.desktop.extensions.Custom.trimIsNotEmpty
 import eu.mjdev.desktop.extensions.Modifier.dropShadow
 import eu.mjdev.desktop.helpers.animation.Animations.AppsMenuEnterAnimation
@@ -74,10 +75,10 @@ fun AppsMenu(
     val appCategories by flowBlock(emptyList()) { appCategories }
     val items by rememberComputed(searchTextState.value, category) {
         when {
-            // todo fuzzy sort
+            // todo fuzzy sort, simlify
             searchTextState.trimIsNotEmpty() -> allApps.filter { app ->
                 app.desktopData.contains(searchTextState.value, ignoreCase = true)
-            }
+            }.sortByRelevance(searchTextState.value) { name }
 
             category.isNotEmpty() -> allApps.filter { app ->
                 app.categories.contains(category)

+ 12 - 0
src/main/kotlin/eu/mjdev/desktop/extensions/Custom.kt

@@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.channelFlow
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.launch
+import me.xdrop.fuzzywuzzy.FuzzySearch
 import org.jetbrains.skia.FilterBlurMode.NORMAL
 import org.jetbrains.skia.MaskFilter.Companion.makeBlur
 import java.io.BufferedReader
@@ -245,6 +246,17 @@ object Custom {
         maskFilter = makeBlur(NORMAL, blurRadius / 2, true)
     }
 
+    fun <E> List<E>.sortByRelevance(
+        value: String,
+        block: E.() -> String = { toString() }
+    ): List<E> = map { e ->
+        Pair(FuzzySearch.ratio(block(e), value), e)
+    }.sortedByDescending { p ->
+        p.first
+    }.map { p ->
+        p.second
+    }
+
     val dateFlow
         @Composable
         get() = channelFlow {