From 62627155e819e6b6d1840c56448615a35f1c8dc9 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Tue, 9 Sep 2025 15:21:32 -0500 Subject: [PATCH 1/2] add rapidfuzz for sorting my inputs --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/ui/library.rs | 43 ++++++++++++++++++++++++++++++++++--------- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d50f6aa..69fa67e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3858,6 +3858,7 @@ dependencies = [ "libcosmic", "miette", "pretty_assertions", + "rapidfuzz", "rapidhash", "rayon", "resvg 0.45.1", @@ -5343,6 +5344,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +[[package]] +name = "rapidfuzz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "270e04e5ea61d40841942bb15e451c29ee1618637bcf97fc7ede5dd4a9b1601b" + [[package]] name = "rapidhash" version = "4.0.0" diff --git a/Cargo.toml b/Cargo.toml index 8ab9d45..df13e63 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ rayon = "1.11.0" resvg = "0.45.1" image = "0.25.8" rapidhash = "4.0.0" +rapidfuzz = "0.5.0" # femtovg = { version = "0.16.0", features = ["wgpu"] } # wgpu = "26.0.1" # mupdf = "0.5.0" diff --git a/src/ui/library.rs b/src/ui/library.rs index c5d2717..941c253 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -14,6 +14,7 @@ use cosmic::{ Element, Task, }; use miette::{IntoDiagnostic, Result}; +use rapidfuzz::distance::levenshtein; use sqlx::{pool::PoolConnection, Sqlite, SqlitePool}; use tracing::{debug, error, warn}; @@ -570,15 +571,39 @@ impl<'a> Library { &self, query: String, ) -> Vec { - let song1 = Song { - title: "Death Was Arrested".to_string(), - ..Default::default() - }; - let song2 = Song { - title: "Smelly_Belly".to_string(), - ..Default::default() - }; - vec![ServiceItem::from(&song1), ServiceItem::from(&song2)] + let mut items: Vec = self + .song_library + .items + .iter() + .filter(|song| song.title.contains(&query)) + .map(|song| song.to_service_item()) + .collect(); + let videos: Vec = self + .video_library + .items + .iter() + .filter(|vid| vid.title.contains(&query)) + .map(|vid| vid.to_service_item()) + .collect(); + let images: Vec = self + .image_library + .items + .iter() + .filter(|image| image.title.contains(&query)) + .map(|image| image.to_service_item()) + .collect(); + let presentations: Vec = self + .presentation_library + .items + .iter() + .filter(|pres| pres.title.contains(&query)) + .map(|pres| pres.to_service_item()) + .collect(); + items.extend(videos); + items.extend(images); + items.extend(presentations); + items.sort_by(|a, b| todo!()); + items } // fn update_item(self, item: C) -> Task { From ffe770b35596751656c53b0b64d11a6b81294dcc Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Tue, 9 Sep 2025 15:27:49 -0500 Subject: [PATCH 2/2] closer --- src/ui/library.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/ui/library.rs b/src/ui/library.rs index 941c253..69fc177 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -602,8 +602,21 @@ impl<'a> Library { items.extend(videos); items.extend(images); items.extend(presentations); - items.sort_by(|a, b| todo!()); - items + let mut items: Vec<(usize, ServiceItem)> = items + .into_iter() + .map(|item| { + ( + levenshtein::distance( + query.bytes(), + item.title.bytes(), + ), + item, + ) + }) + .collect(); + + items.sort_by(|a, b| a.0.cmp(&b.0)); + items.into_iter().map(|item| item.1).collect() } // fn update_item(self, item: C) -> Task {