diff --git a/src/app.rs b/src/app.rs index be0aee1..e9f91dc 100644 --- a/src/app.rs +++ b/src/app.rs @@ -21,7 +21,7 @@ pub enum AppModelInput { PromptNewTraining, CreateTrainingSetup(TrainingSetup), RemoveTrainingSetup(DynamicIndex), - LoadTraining(TrainingSetup), + LoadTraining(usize), Popped, StartStop, Reset, @@ -93,14 +93,20 @@ impl Component for AppModel { set_content = >k::Stack { #[name = "training_list_scrolled"] gtk::ScrolledWindow { - set_vexpand: true, - #[local_ref] - list_trainings -> gtk::Box { - set_orientation: gtk::Orientation::Vertical, - set_margin_start: 12, - set_margin_end: 12, - set_spacing: 8, - } + adw::Clamp + { + #[local_ref] + list_trainings -> gtk::ListBox { + set_margin_all: 30, + set_size_request: (200, -1), + set_selection_mode: gtk::SelectionMode::None, + set_valign: gtk::Align::Start, + set_css_classes: &["boxed-list"], + connect_row_activated[sender] => move |_, row| { + sender.input(AppModelInput::LoadTraining(row.index() as usize)); + }, + } + }, }, #[name = "training_list_status"] adw::StatusPage { @@ -139,12 +145,9 @@ impl Component for AppModel { sender: ComponentSender, ) -> ComponentParts { let mut list_trainings = relm4::factory::FactoryVecDeque::builder() - .launch(gtk::Box::default()) + .launch(gtk::ListBox::default()) .forward(sender.input_sender(), |output| match output { TrainingSetupOutput::Remove(index) => AppModelInput::RemoveTrainingSetup(index), - TrainingSetupOutput::Load(training_setup) => { - AppModelInput::LoadTraining(training_setup) - } }); { let mut guard = list_trainings.guard(); @@ -251,20 +254,22 @@ impl Component for AppModel { AppModelInput::CreateTrainingSetup(setup) => { self.list_trainings.guard().push_back(setup); } - AppModelInput::LoadTraining(setup) => { - self.training_timer = Some( - TrainingTimer::builder() - .launch(TrainingTimerInit { - setup, - global_setup: self.global_settings.clone(), - output_handle: self.output_stream.clone(), - }) - .detach(), - ); - widgets - .main_view - .set_content(Some(self.training_timer.as_ref().unwrap().widget())); - widgets.navigation_view.push(&widgets.main_navigation_page); + AppModelInput::LoadTraining(idx) => { + if let Some(setup) = self.list_trainings.get(idx) { + self.training_timer = Some( + TrainingTimer::builder() + .launch(TrainingTimerInit { + setup: setup.clone(), + global_setup: self.global_settings.clone(), + output_handle: self.output_stream.clone(), + }) + .detach(), + ); + widgets + .main_view + .set_content(Some(self.training_timer.as_ref().unwrap().widget())); + widgets.navigation_view.push(&widgets.main_navigation_page); + } } AppModelInput::Popped => { self.training_timer = None; diff --git a/src/training_setup.rs b/src/training_setup.rs index b056be0..4a12b5c 100644 --- a/src/training_setup.rs +++ b/src/training_setup.rs @@ -38,13 +38,11 @@ impl Default for TrainingSetup { pub enum TrainingSetupInput { Edit(gtk::Root), Update(TrainingSetup), - Load, } #[derive(Debug)] pub enum TrainingSetupOutput { Remove(DynamicIndex), - Load(TrainingSetup), } fn format_duration(d: &Duration) -> String { @@ -60,13 +58,12 @@ impl FactoryComponent for TrainingSetup { type Input = TrainingSetupInput; type Output = TrainingSetupOutput; type CommandOutput = (); - type ParentWidget = gtk::Box; + type ParentWidget = gtk::ListBox; view! { - gtk::Box { - set_hexpand: true, - set_class_active: ("card", true), - inline_css: "padding: 10px", + gtk::ListBoxRow { + inline_css: "padding: 12px", + set_activatable: true, gtk::Box { set_orientation: gtk::Orientation::Vertical, gtk::CenterBox { @@ -117,16 +114,9 @@ impl FactoryComponent for TrainingSetup { connect_clicked[sender, index] => move |_| { sender.output(TrainingSetupOutput::Remove(index.clone())).unwrap(); }, - set_margin_end: 10, // Translators: tooltip text for exercise card button to delete the training set_tooltip: &gettext("Delete Training"), }, - gtk::Button { - set_icon_name: icon_names::PLAY, - connect_clicked => TrainingSetupInput::Load, - // Translators: tooltip text for exercise card button to start the training timer - set_tooltip: &gettext("Start Training"), - }, }, }, }, @@ -161,11 +151,6 @@ impl FactoryComponent for TrainingSetup { TrainingSetupInput::Update(setup) => { *self = setup; } - TrainingSetupInput::Load => { - sender - .output(TrainingSetupOutput::Load(self.clone())) - .unwrap(); - } } } }