diff --git a/src/main.rs b/src/main.rs index 9d8f430..328e440 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ mod database; -mod mcdu; mod sheet; -mod sheet_listing; +mod ui; use std::{ path::{Path, PathBuf}, @@ -11,94 +10,12 @@ use std::{ use clap::Parser; use database::Database; use env_logger::Env; -use gtk::prelude::*; use log::{debug, error}; -use mcdu::McduModel; -use relm4::prelude::*; +use relm4::RelmApp; use sheet::Sheet; -use sheet_listing::{SheetListingInput, SheetListingModel}; use walkdir::WalkDir; -struct AppModel { - mcdu: Controller, - sheet_listing: Controller, -} - -#[derive(Debug)] -enum AppInput { - SearchStarted(String), - SheetPressed(PathBuf), -} - -#[relm4::component] -impl SimpleComponent for AppModel { - type Input = AppInput; - type Output = (); - type Init = PathBuf; - - view! { - #[root] - gtk::Window{ - set_default_width: 300, - set_default_height: 300, - set_title: Some("Play music!!!"), - set_maximized: true, - gtk::Box { - set_orientation: gtk::Orientation::Horizontal, - gtk::Box { - set_orientation: gtk::Orientation::Vertical, - set_hexpand: true, - gtk::ScrolledWindow { - model.sheet_listing.widget(), - set_vexpand: true, - set_hexpand: true, - // set_hscrollbar_policy: PolicyType::Never, - }, - }, - model.mcdu.widget(), - } - } - } - - fn init( - path: Self::Init, - window: &Self::Root, - sender: ComponentSender, - ) -> relm4::ComponentParts { - relm4_icons::initialize_icons(); - - let mcdu = McduModel::builder() - .launch(()) - .forward(sender.input_sender(), |response| match response { - mcdu::McduOutput::SearchStarted(query) => AppInput::SearchStarted(query), - }); - - 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 { - mcdu, - sheet_listing, - }; - - let widgets = view_output!(); - - ComponentParts { model, widgets } - } - - fn update(&mut self, message: Self::Input, _sender: ComponentSender) { - match message { - AppInput::SheetPressed(sheet) => opener::open(sheet).unwrap(), - AppInput::SearchStarted(query) => self.sheet_listing.emit(SheetListingInput { query }), - } - } -} +use crate::ui::app::AppModel; #[derive(Parser)] #[command(author, version, about)] diff --git a/src/ui/app.rs b/src/ui/app.rs new file mode 100644 index 0000000..7ac072d --- /dev/null +++ b/src/ui/app.rs @@ -0,0 +1,90 @@ +use std::path::PathBuf; + +use gtk::prelude::*; +use relm4::prelude::*; + +use crate::ui::{mcdu::McduOutput, sheet_listing::SheetPressedMessage}; + +use super::{ + mcdu::McduModel, + sheet_listing::{SheetListingInput, SheetListingModel}, +}; + +pub struct AppModel { + mcdu: Controller, + sheet_listing: Controller, +} + +#[derive(Debug)] +pub enum AppInput { + SearchStarted(String), + SheetPressed(PathBuf), +} + +#[relm4::component(pub)] +impl SimpleComponent for AppModel { + type Input = AppInput; + type Output = (); + type Init = PathBuf; + + view! { + #[root] + gtk::Window{ + set_default_width: 300, + set_default_height: 300, + set_title: Some("Play music!!!"), + set_maximized: true, + gtk::Box { + set_orientation: gtk::Orientation::Horizontal, + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_hexpand: true, + gtk::ScrolledWindow { + model.sheet_listing.widget(), + set_vexpand: true, + set_hexpand: true, + // set_hscrollbar_policy: PolicyType::Never, + }, + }, + model.mcdu.widget(), + } + } + } + + fn init( + path: Self::Init, + window: &Self::Root, + sender: ComponentSender, + ) -> relm4::ComponentParts { + relm4_icons::initialize_icons(); + + let mcdu = McduModel::builder() + .launch(()) + .forward(sender.input_sender(), |response| match response { + McduOutput::SearchStarted(query) => AppInput::SearchStarted(query), + }); + + let sheet_listing = + SheetListingModel::builder() + .launch(path) + .forward(sender.input_sender(), |response| match response { + SheetPressedMessage::SheetPressed(path) => AppInput::SheetPressed(path), + }); + + let model = AppModel { + mcdu, + sheet_listing, + }; + + let widgets = view_output!(); + + ComponentParts { model, widgets } + } + + fn update(&mut self, message: Self::Input, _sender: ComponentSender) { + match message { + AppInput::SheetPressed(sheet) => opener::open(sheet).unwrap(), + AppInput::SearchStarted(query) => self.sheet_listing.emit(SheetListingInput { query }), + } + } +} diff --git a/src/mcdu.rs b/src/ui/mcdu.rs similarity index 100% rename from src/mcdu.rs rename to src/ui/mcdu.rs diff --git a/src/ui/mod.rs b/src/ui/mod.rs new file mode 100644 index 0000000..3bb5055 --- /dev/null +++ b/src/ui/mod.rs @@ -0,0 +1,3 @@ +pub mod app; +pub mod mcdu; +pub mod sheet_listing; diff --git a/src/sheet_listing.rs b/src/ui/sheet_listing.rs similarity index 100% rename from src/sheet_listing.rs rename to src/ui/sheet_listing.rs