diff --git a/src/sheet.rs b/src/sheet.rs index 08349d2..30b79f2 100644 --- a/src/sheet.rs +++ b/src/sheet.rs @@ -1,6 +1,6 @@ use std::{fs, path::Path}; -#[derive(sqlx::FromRow, Debug)] +#[derive(sqlx::FromRow, Debug, Clone)] pub struct Sheet { pub id: i32, pub name: String, diff --git a/src/ui/app.rs b/src/ui/app.rs index d2eb4b6..b3f6145 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -15,14 +15,15 @@ use super::{ pub struct AppModel { mcdu: Controller, - sheets_and_files_listing: Connector, - new_files_listing: Connector, + sheets_and_files_listing: Controller, + new_files_listing: Controller, } #[derive(Debug)] pub enum AppInput { SearchStarted(String), - SheetPressed(PathBuf), + NewFilesSheetPressed(SheetModelType), + SheetsAndFilesSheetPressed(SheetModelType), } #[relm4::component(pub)] @@ -100,12 +101,16 @@ impl SimpleComponent for AppModel { .chain(new_files_clone_iter) .collect(); - let sheets_and_files_listing = SheetListingModel::builder().launch(sheets_and_files); - let new_files_listing = SheetListingModel::builder().launch(new_files); - // .forward(sender.input_sender(), |_| {}); - // .forward(sender.input_sender(), |response| match response { - // SheetPressedMessage::SheetPressed(path) => AppInput::SheetPressed(path), - // }); + let sheets_and_files_listing = SheetListingModel::builder() + .launch(sheets_and_files) + .forward(sender.input_sender(), |response| { + AppInput::SheetsAndFilesSheetPressed(response.sheet_model_type) + }); + let new_files_listing = SheetListingModel::builder() + .launch(new_files) + .forward(sender.input_sender(), |response| { + AppInput::NewFilesSheetPressed(response.sheet_model_type) + }); let model = AppModel { mcdu, @@ -119,13 +124,19 @@ impl SimpleComponent for AppModel { } fn update(&mut self, message: Self::Input, _sender: ComponentSender) { + // AppInput::SheetPressed(sheet) => opener::open(sheet).unwrap(), match message { - AppInput::SheetPressed(sheet) => opener::open(sheet).unwrap(), AppInput::SearchStarted(query) => { self.sheets_and_files_listing .emit(SheetListingInput::Query(query.clone())); self.new_files_listing.emit(SheetListingInput::Query(query)); } + AppInput::NewFilesSheetPressed(_) => { + // TODO + } + AppInput::SheetsAndFilesSheetPressed(sheet_model_type) => { + opener::open(sheet_model_type.get_path()).unwrap() + } } } } diff --git a/src/ui/sheet_listing.rs b/src/ui/sheet_listing.rs index 6f3eec2..25632b1 100644 --- a/src/ui/sheet_listing.rs +++ b/src/ui/sheet_listing.rs @@ -21,15 +21,16 @@ pub enum SheetListingInput { ListBoxRowClicked(i32), } +#[derive(Debug)] pub struct SheetModelSelected { - sheet_model_type: SheetModelType, + pub sheet_model_type: SheetModelType, } #[relm4::component(pub)] impl SimpleComponent for SheetListingModel { type Init = Vec; type Input = SheetListingInput; - type Output = (); + type Output = SheetModelSelected; view! { #[root] @@ -63,7 +64,7 @@ impl SimpleComponent for SheetListingModel { ComponentParts { model, widgets } } - fn update(&mut self, message: Self::Input, _sender: ComponentSender) { + fn update(&mut self, message: Self::Input, sender: ComponentSender) { match message { SheetListingInput::Query(query) => { self.sheets.broadcast(OnQueryUpdate { query }); @@ -71,6 +72,11 @@ impl SimpleComponent for SheetListingModel { SheetListingInput::ListBoxRowClicked(index) => { let x = self.sheets.get(index as usize).unwrap(); debug!("clicked: {}!!!!!", x.label); + sender + .output(SheetModelSelected { + sheet_model_type: x.sheet_model_type.clone(), + }) + .unwrap(); } } } diff --git a/src/ui/sheet_model.rs b/src/ui/sheet_model.rs index 5728045..81d6481 100644 --- a/src/ui/sheet_model.rs +++ b/src/ui/sheet_model.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use gtk::prelude::*; use relm4::prelude::*; @@ -7,13 +7,24 @@ use crate::sheet::Sheet; use super::sheet_listing::SheetListingInput; +#[derive(Debug, Clone)] pub enum SheetModelType { Sheet { sheet: Sheet }, Pdf { path: PathBuf }, } +impl SheetModelType { + pub fn get_path(&self) -> &str { + match self { + SheetModelType::Sheet { sheet } => &sheet.path, + SheetModelType::Pdf { path } => path.to_str().unwrap(), + } + } +} + pub struct SheetModel { pub label: String, + pub sheet_model_type: SheetModelType, visible: bool, } @@ -51,7 +62,7 @@ impl FactoryComponent for SheetModel { } fn init_model(value: Self::Init, _index: &DynamicIndex, _sender: FactorySender) -> Self { - let label = match value { + let label = match &value { SheetModelType::Sheet { sheet } => format!("{}", sheet.name), SheetModelType::Pdf { path } => { format!("{}", path.file_name().unwrap().to_str().unwrap()) @@ -60,6 +71,7 @@ impl FactoryComponent for SheetModel { SheetModel { label, + sheet_model_type: value, visible: true, } }