Implemented opening of pdfs

This commit is contained in:
2024-01-16 23:28:00 +01:00
parent f4bbbc330c
commit e47c9afe33
4 changed files with 153 additions and 13 deletions

View File

@@ -17,6 +17,7 @@ struct AppModel {
#[derive(Debug)]
enum AppInput {
McduInput(char),
SheetPressed(PathBuf),
}
#[relm4::component]
@@ -71,9 +72,14 @@ impl SimpleComponent for AppModel {
mcdu::McduOutput::ButtonPress(c) => AppInput::McduInput(c),
});
let sheet_listing = SheetListingModel::builder()
.launch(path)
.forward(sender.input_sender(), |_response| todo!());
let sheet_listing =
SheetListingModel::builder()
.launch(path)
.forward(sender.input_sender(), |response| match response {
sheet_listing::SheetPressedMessage::SheetPressed(path) => {
AppInput::SheetPressed(path)
}
});
let model = AppModel {
text: String::from("Text: "),
@@ -89,6 +95,7 @@ impl SimpleComponent for AppModel {
fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) {
match message {
AppInput::McduInput(c) => self.text.push(c),
AppInput::SheetPressed(sheet) => opener::open(sheet).unwrap(),
}
}
}

View File

@@ -11,20 +11,31 @@ pub struct SheetModel {
path: PathBuf,
}
#[derive(Debug)]
pub enum SheetModelInput {
OnClicked,
}
#[derive(Debug)]
pub enum SheetPressedMessage {
SheetPressed(PathBuf),
}
#[relm4::component(pub)]
impl SimpleComponent for SheetModel {
type Init = PathBuf;
type Input = ();
type Output = ();
type Input = SheetModelInput;
type Output = SheetPressedMessage;
view! {
#[root]
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
gtk::Label {
append = &gtk::Button {
set_label: &format!("{}", model.path.file_name().unwrap().to_string_lossy()),
set_halign: gtk::Align::Start,
set_margin_all: 10,
connect_clicked[sender] => move |_| sender.input(SheetModelInput::OnClicked),
}
}
}
@@ -32,21 +43,31 @@ impl SimpleComponent for SheetModel {
fn init(
path: Self::Init,
root: &Self::Root,
_sender: ComponentSender<Self>,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = SheetModel { path };
let widgets = view_output!();
ComponentParts { model, widgets }
}
fn update(&mut self, message: Self::Input, sender: ComponentSender<Self>) {
match message {
SheetModelInput::OnClicked => sender
.output(SheetPressedMessage::SheetPressed(self.path.clone()))
.unwrap(),
}
}
}
pub struct SheetListingModel;
pub struct SheetListingModel {
_sheet_models: Vec<Controller<SheetModel>>,
}
#[relm4::component(pub)]
impl SimpleComponent for SheetListingModel {
type Init = PathBuf;
type Input = ();
type Output = ();
type Output = SheetPressedMessage;
view! {
#[root]
@@ -58,8 +79,10 @@ impl SimpleComponent for SheetListingModel {
fn init(
dir: Self::Init,
root: &Self::Root,
_sender: ComponentSender<Self>,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let mut sheet_models = Vec::new();
for entry in WalkDir::new(dir)
.into_iter()
.filter_map(|e| e.ok())
@@ -71,11 +94,16 @@ impl SimpleComponent for SheetListingModel {
.unwrap_or(false)
})
{
let sheet_model = SheetModel::builder().launch(entry);
let sheet_model = SheetModel::builder()
.launch(entry)
.forward(sender.output_sender(), |m| m);
root.append(sheet_model.widget());
sheet_models.push(sheet_model);
}
let model = SheetListingModel;
let model = SheetListingModel {
_sheet_models: sheet_models,
};
let widgets = view_output!();
ComponentParts { model, widgets }
}