diff --git a/src/sheet.rs b/src/sheet.rs index b533213..ca05959 100644 --- a/src/sheet.rs +++ b/src/sheet.rs @@ -7,7 +7,7 @@ use sqlx::{prelude::*, sqlite::SqliteRow}; // use sqlx::{FromRow, sqlite::SqliteRow, sqlx::Row}; use chrono::{DateTime, NaiveDateTime, Utc}; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Sheet { pub id: i64, pub name: String, @@ -94,7 +94,7 @@ impl TryFrom for OrphanFile { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct OrphanFile { pub id: i64, pub path: PathBuf, diff --git a/src/ui/app.rs b/src/ui/app.rs index efa2048..2ebb8bc 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -1,3 +1,5 @@ +use std::cmp::Reverse; + use chrono::Utc; use gtk::prelude::*; use relm4::{ @@ -87,25 +89,27 @@ impl AsyncComponent for AppModel { McduOutput::SearchStarted(query) => AppInput::SearchStarted(query), }); - let new_files: Vec = init_data + let mut new_files: Vec = init_data .orphans .iter() .map(|orphan| SheetModelType::Orphan { orphan: orphan.clone(), }) .collect(); + new_files.sort_by(|a, b| a.cmp(b).reverse()); let new_files_clone_iter = init_data .orphans .into_iter() .map(|orphan| SheetModelType::Orphan { orphan }); - let sheets_and_files: Vec = init_data + let mut sheets_and_files: Vec = init_data .sheets .into_iter() .map(|sheet| SheetModelType::Sheet { sheet }) .chain(new_files_clone_iter) .collect(); + sheets_and_files.sort_by(|a, b| a.cmp(b).reverse()); let sheets_and_files_listing = SheetListingModel::builder() .launch(sheets_and_files) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 78d10f9..5f3a11e 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,5 +1,4 @@ pub mod app; -pub mod database_worker; pub mod mcdu; pub mod sheet_listing; pub mod sheet_model; diff --git a/src/ui/sheet_model.rs b/src/ui/sheet_model.rs index 37c9c5e..3f81794 100644 --- a/src/ui/sheet_model.rs +++ b/src/ui/sheet_model.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::{cmp::Ordering, path::Path}; use gtk::prelude::*; use relm4::prelude::*; @@ -7,7 +7,7 @@ use crate::sheet::{OrphanFile, Sheet}; use super::sheet_listing::SheetListingInput; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub enum SheetModelType { Sheet { sheet: Sheet }, Orphan { orphan: OrphanFile }, @@ -21,6 +21,25 @@ impl SheetModelType { } } } +impl Ord for SheetModelType { + fn cmp(&self, other: &Self) -> Ordering { + let self_last_opened = match self { + SheetModelType::Sheet { sheet } => sheet.last_opened, + SheetModelType::Orphan { orphan } => orphan.last_opened, + }; + let other_last_opened = match other { + SheetModelType::Sheet { sheet } => sheet.last_opened, + SheetModelType::Orphan { orphan } => orphan.last_opened, + }; + self_last_opened.cmp(&other_last_opened) + } +} + +impl PartialOrd for SheetModelType { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} pub struct SheetModel { pub label: String,