Skip to content

Commit

Permalink
feat(UI): Native style training list
Browse files Browse the repository at this point in the history
mfep committed Dec 3, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 7aaba8b commit 60c4bd1
Showing 2 changed files with 36 additions and 46 deletions.
59 changes: 32 additions & 27 deletions src/app.rs
Original file line number Diff line number Diff line change
@@ -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 = &gtk::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<Self>,
) -> ComponentParts<Self> {
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;
23 changes: 4 additions & 19 deletions src/training_setup.rs
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
}

0 comments on commit 60c4bd1

Please sign in to comment.