Implement sorting by last_opened
This commit is contained in:
@ -7,7 +7,7 @@ use sqlx::{prelude::*, sqlite::SqliteRow};
|
|||||||
// use sqlx::{FromRow, sqlite::SqliteRow, sqlx::Row};
|
// use sqlx::{FromRow, sqlite::SqliteRow, sqlx::Row};
|
||||||
use chrono::{DateTime, NaiveDateTime, Utc};
|
use chrono::{DateTime, NaiveDateTime, Utc};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Sheet {
|
pub struct Sheet {
|
||||||
pub id: i64,
|
pub id: i64,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
@ -94,7 +94,7 @@ impl TryFrom<PathBuf> for OrphanFile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct OrphanFile {
|
pub struct OrphanFile {
|
||||||
pub id: i64,
|
pub id: i64,
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::cmp::Reverse;
|
||||||
|
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::{
|
use relm4::{
|
||||||
@ -87,25 +89,27 @@ impl AsyncComponent for AppModel {
|
|||||||
McduOutput::SearchStarted(query) => AppInput::SearchStarted(query),
|
McduOutput::SearchStarted(query) => AppInput::SearchStarted(query),
|
||||||
});
|
});
|
||||||
|
|
||||||
let new_files: Vec<SheetModelType> = init_data
|
let mut new_files: Vec<SheetModelType> = init_data
|
||||||
.orphans
|
.orphans
|
||||||
.iter()
|
.iter()
|
||||||
.map(|orphan| SheetModelType::Orphan {
|
.map(|orphan| SheetModelType::Orphan {
|
||||||
orphan: orphan.clone(),
|
orphan: orphan.clone(),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
new_files.sort_by(|a, b| a.cmp(b).reverse());
|
||||||
|
|
||||||
let new_files_clone_iter = init_data
|
let new_files_clone_iter = init_data
|
||||||
.orphans
|
.orphans
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|orphan| SheetModelType::Orphan { orphan });
|
.map(|orphan| SheetModelType::Orphan { orphan });
|
||||||
|
|
||||||
let sheets_and_files: Vec<SheetModelType> = init_data
|
let mut sheets_and_files: Vec<SheetModelType> = init_data
|
||||||
.sheets
|
.sheets
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|sheet| SheetModelType::Sheet { sheet })
|
.map(|sheet| SheetModelType::Sheet { sheet })
|
||||||
.chain(new_files_clone_iter)
|
.chain(new_files_clone_iter)
|
||||||
.collect();
|
.collect();
|
||||||
|
sheets_and_files.sort_by(|a, b| a.cmp(b).reverse());
|
||||||
|
|
||||||
let sheets_and_files_listing = SheetListingModel::builder()
|
let sheets_and_files_listing = SheetListingModel::builder()
|
||||||
.launch(sheets_and_files)
|
.launch(sheets_and_files)
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
pub mod app;
|
pub mod app;
|
||||||
pub mod database_worker;
|
|
||||||
pub mod mcdu;
|
pub mod mcdu;
|
||||||
pub mod sheet_listing;
|
pub mod sheet_listing;
|
||||||
pub mod sheet_model;
|
pub mod sheet_model;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use std::path::Path;
|
use std::{cmp::Ordering, path::Path};
|
||||||
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::prelude::*;
|
use relm4::prelude::*;
|
||||||
@ -7,7 +7,7 @@ use crate::sheet::{OrphanFile, Sheet};
|
|||||||
|
|
||||||
use super::sheet_listing::SheetListingInput;
|
use super::sheet_listing::SheetListingInput;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum SheetModelType {
|
pub enum SheetModelType {
|
||||||
Sheet { sheet: Sheet },
|
Sheet { sheet: Sheet },
|
||||||
Orphan { orphan: OrphanFile },
|
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<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct SheetModel {
|
pub struct SheetModel {
|
||||||
pub label: String,
|
pub label: String,
|
||||||
|
Reference in New Issue
Block a user