Preserve order when removing items from file model

The files are stored in an index map.
When removing from that map, `remove` does not guarantee to preserve order.
However `shift_remove` does.

Fixes #270
This commit is contained in:
Julian Hofer 2023-11-15 15:25:07 +01:00
parent 8ab903fbb9
commit 831cf953c6

View file

@ -231,7 +231,7 @@ impl LpFileModel {
} }
pub fn remove(&self, file: &gio::File) -> Option<gio::File> { pub fn remove(&self, file: &gio::File) -> Option<gio::File> {
self.imp().files.borrow_mut().remove(&file.uri()) self.imp().files.borrow_mut().shift_remove(&file.uri())
} }
/// Currently sorts by name /// Currently sorts by name
@ -289,14 +289,14 @@ impl LpFileModel {
} }
gio::FileMonitorEvent::Deleted | gio::FileMonitorEvent::MovedOut | gio::FileMonitorEvent::Unmounted => { gio::FileMonitorEvent::Deleted | gio::FileMonitorEvent::MovedOut | gio::FileMonitorEvent::Unmounted => {
let mut files = self.imp().files.borrow_mut(); let mut files = self.imp().files.borrow_mut();
files.remove(&file_a.uri()).is_some() files.shift_remove(&file_a.uri()).is_some()
} }
gio::FileMonitorEvent::Renamed => { gio::FileMonitorEvent::Renamed => {
if let Some(file_b) = file_b { if let Some(file_b) = file_b {
let mut changed = false; let mut changed = false;
{ {
let mut files = self.imp().files.borrow_mut(); let mut files = self.imp().files.borrow_mut();
changed |= files.remove(&file_a.uri()).is_some(); changed |= files.shift_remove(&file_a.uri()).is_some();
if Self::is_image_file(file_b) { if Self::is_image_file(file_b) {
changed |= files.insert(file_b.uri(), file_b.clone()).is_none(); changed |= files.insert(file_b.uri(), file_b.clone()).is_none();
if changed { if changed {