diff --git a/src/file_model.rs b/src/file_model.rs index aa739cd..3a67ac6 100644 --- a/src/file_model.rs +++ b/src/file_model.rs @@ -101,13 +101,7 @@ impl LpFileModel { }); // Then sort by name. - vec.sort_by(|file_a, file_b| { - let name_a = util::get_file_display_name(file_a).unwrap_or_default(); - let name_b = util::get_file_display_name(file_b).unwrap_or_default(); - - util::utf8_collate_key_for_filename(&name_a) - .cmp(&util::utf8_collate_key_for_filename(&name_b)) - }); + vec.sort_by(util::compare_by_name); model.imp().directory.set(directory.clone()).unwrap(); } @@ -127,6 +121,8 @@ impl LpFileModel { pub fn index_of(&self, file: &gio::File) -> Option { let imp = self.imp(); let vec = imp.inner.borrow(); - vec.iter().position(|f| f.equal(file)).map(|p| p as u32) + vec.binary_search_by(|a| util::compare_by_name(a, file)) + .ok() + .map(|i| i as u32) } } diff --git a/src/util.rs b/src/util.rs index e91a626..9d0a988 100644 --- a/src/util.rs +++ b/src/util.rs @@ -3,6 +3,10 @@ use crate::deps::*; use gio::prelude::*; use glib::translate::*; +use anyhow::Context; + +use std::fmt::Write; + pub fn utf8_collate_key_for_filename(filename: &str) -> String { unsafe { from_glib_full(glib::ffi::g_utf8_collate_key_for_filename( @@ -18,14 +22,11 @@ pub fn get_file_display_name(file: &gio::File) -> Option { Some(info.display_name().to_string()) } -pub fn query_attributes( - file: &gio::File, - attributes: Vec<&str>, -) -> Result { +pub fn query_attributes(file: &gio::File, attributes: Vec<&str>) -> anyhow::Result { let mut attributes = attributes; let mut attr_str = String::from(attributes.remove(0)); for attr in attributes { - attr_str.push_str(&format!(",{}", attr)); + write!(attr_str, ",{}", attr)?; } file.query_info( @@ -33,4 +34,12 @@ pub fn query_attributes( gio::FileQueryInfoFlags::empty(), gio::Cancellable::NONE, ) + .context("Failed to query string") +} + +pub fn compare_by_name(file_a: &gio::File, file_b: &gio::File) -> std::cmp::Ordering { + let name_a = get_file_display_name(file_a).unwrap_or_default(); + let name_b = get_file_display_name(file_b).unwrap_or_default(); + + utf8_collate_key_for_filename(&name_a).cmp(&utf8_collate_key_for_filename(&name_b)) }