Skip to content

Commit 3c31c64

Browse files
committed
Refactoring to use a collection
1 parent be252e2 commit 3c31c64

File tree

5 files changed

+214
-109
lines changed

5 files changed

+214
-109
lines changed

src/app.rs

Lines changed: 16 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::{
2-
cmp::Ordering,
32
fmt::Display,
43
io,
54
time::{Duration, SystemTime},
@@ -19,7 +18,7 @@ use crate::{
1918
component::activity_list::{ActivityListMode, ActivityListState, ActivityViewState},
2019
event::{input::EventSender, util::{table_state_prev, table_state_next}},
2120
input::InputEvent,
22-
store::{activity::ActivityStore, polyline_compare::compare},
21+
store::{activity::{ActivityStore, Activities}},
2322
};
2423
use crate::{
2524
component::{activity_list, activity_view, unit_formatter::UnitFormatter},
@@ -78,8 +77,8 @@ pub struct App<'a> {
7877
pub activity_type: Option<String>,
7978
pub activity: Option<Activity>,
8079
pub activity_anchored: Option<Activity>,
81-
pub activities: Vec<Activity>,
82-
pub activities_filtered: Vec<Activity>,
80+
pub activities: Activities,
81+
pub activities_filtered: Activities,
8382

8483
pub info_message: Option<Notification>,
8584
pub error_message: Option<Notification>,
@@ -161,8 +160,8 @@ impl App<'_> {
161160
},
162161
activity: None,
163162
activity_anchored: None,
164-
activities: vec![],
165-
activities_filtered: vec![],
163+
activities: Activities::new(),
164+
activities_filtered: Activities::new(),
166165
store,
167166

168167
activity_type: None,
@@ -228,63 +227,22 @@ impl App<'_> {
228227

229228
pub async fn reload(&mut self) {
230229
self.activities = self.store.activities().await;
231-
let activities = self.activities.clone();
232-
self.activities_filtered = activities
233-
.into_iter()
234-
.filter(|a| {
235-
if !a.title.contains(self.filters.filter.as_str()) {
236-
return false;
237-
}
238-
if let Some(activity_type) = self.activity_type.clone() {
239-
if a.activity_type != activity_type {
240-
return false;
241-
}
242-
}
243-
244-
true
245-
})
246-
.filter(|a| {
247-
if self.activity_anchored.is_none() {
248-
return true;
249-
}
250-
let anchored = self.activity_anchored.as_ref().unwrap();
251-
if anchored.polyline().is_err() || a.polyline().is_err() {
252-
return false;
253-
}
254-
compare(&anchored.polyline().unwrap(), &a.polyline().unwrap(), 100)
255-
< self.filters.anchor_tolerance
256-
})
257-
.collect()
230+
self.activities_filtered = self.activities.where_title_contains(self.filters.filter.as_str());
231+
if let Some(activity_type) = self.activity_type.clone() {
232+
self.activities_filtered = self.activities_filtered.having_activity_type(activity_type);
233+
}
234+
if let Some(anchored) = &self.activity_anchored {
235+
self.activities_filtered = self.activities_filtered.withing_distance_of(anchored, self.filters.anchor_tolerance);
236+
}
258237
}
259238

260-
// TODO: Add a collection object
261-
pub fn unsorted_filtered_activities(&self) -> Vec<Activity> {
239+
pub fn unsorted_filtered_activities(&self) -> Activities {
262240
self.activities_filtered.clone()
263241
}
264242

265-
pub fn filtered_activities(&self) -> Vec<Activity> {
266-
let mut activities = self.unsorted_filtered_activities();
267-
activities.sort_by(|a, b| {
268-
let ordering = match self.filters.sort_by {
269-
SortBy::Date => a.id.cmp(&b.id),
270-
SortBy::Distance => a
271-
.distance
272-
.partial_cmp(&b.distance)
273-
.unwrap_or(Ordering::Less),
274-
SortBy::Pace => a.kmph().partial_cmp(&b.kmph()).unwrap_or(Ordering::Less),
275-
SortBy::HeartRate => a
276-
.average_heartrate
277-
.or(Some(0.0))
278-
.partial_cmp(&b.average_heartrate.or(Some(0.0)))
279-
.unwrap(),
280-
SortBy::Time => a.moving_time.partial_cmp(&b.moving_time).unwrap(),
281-
};
282-
match self.filters.sort_order {
283-
SortOrder::Asc => ordering,
284-
SortOrder::Desc => ordering.reverse(),
285-
}
286-
});
287-
activities
243+
pub fn filtered_activities(&self) -> Activities {
244+
let activities = self.unsorted_filtered_activities();
245+
activities.sort(&self.filters.sort_by, &self.filters.sort_order)
288246
}
289247

290248
fn draw<B: Backend>(&mut self, f: &mut Frame<B>) -> Result<(), anyhow::Error> {

src/component/activity_list/chart.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,8 @@ pub fn draw<B: Backend>(
2525
area: tui::layout::Rect,
2626
) -> Result<(), anyhow::Error> {
2727
let activities = &app.unsorted_filtered_activities();
28-
let times: Vec<i64> = activities
29-
.iter()
30-
.map(|a| {
31-
a.start_date.unwrap().timestamp()
32-
})
33-
.collect();
34-
let paces: Vec<i64> = activities
35-
.iter()
36-
.map(|a| {
37-
a.meters_per_hour() as i64
38-
})
39-
.collect();
28+
let times: Vec<i64> = activities.timestamps();
29+
let paces: Vec<i64> = activities.meter_per_hours();
4030
let tmax = times.iter().max();
4131
let tmin = times.iter().min();
4232
let pmax = paces.iter().max();
@@ -51,7 +41,7 @@ pub fn draw<B: Backend>(
5141
}
5242
let pmin = pmin.unwrap();
5343
let pmax = pmax.unwrap();
54-
let data: Vec<(f64, f64)> = activities
44+
let data: Vec<(f64, f64)> = activities.to_vec()
5545
.iter()
5646
.map(|a| {
5747
let ts = a.start_date.unwrap().timestamp();
@@ -62,7 +52,7 @@ pub fn draw<B: Backend>(
6252
if let Some(selected) = app.activity_list.table_state().selected() {
6353
let activities = app.filtered_activities();
6454
if let Some(a) = activities.get(selected) {
65-
if let Some(a) = app.activities.iter().find(|unsorted|unsorted.id == a.id) {
55+
if let Some(a) = app.activities.find(a.id) {
6656
current.push((a.start_date.unwrap().timestamp() as f64, *pmin as f64));
6757
current.push((a.start_date.unwrap().timestamp() as f64, *pmax as f64));
6858
}

src/component/activity_list/list.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
event::{
1515
keymap::{MappedKey, StravaEvent}, input::InputEvent,
1616
},
17-
store::activity::Activity,
17+
store::activity::{Activities},
1818
ui::{centered_rect_absolute, color::ColorTheme}, component::{table_status_select_current},
1919
};
2020

@@ -133,7 +133,7 @@ pub fn draw<B: Backend>(
133133
Ok(())
134134
}
135135

136-
pub fn activity_list_table<'a>(app: &App, activities: &'a Vec<Activity>) -> Table<'a> {
136+
pub fn activity_list_table<'a>(app: &App, activities: &'a Activities) -> Table<'a> {
137137
let mut rows = vec![];
138138
let header_names = [
139139
"Date",
@@ -149,7 +149,7 @@ pub fn activity_list_table<'a>(app: &App, activities: &'a Vec<Activity>) -> Tabl
149149
.iter()
150150
.map(|header| Cell::from(Span::styled(*header, Style::default().fg(Color::DarkGray))));
151151

152-
for activity in activities {
152+
for activity in activities.to_vec() {
153153
rows.push(Row::new([
154154
Cell::from(match activity.start_date {
155155
Some(x) => x.format("%Y-%m-%d").to_string(),

src/component/activity_view.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
event::{
1111
keymap::{MappedKey, StravaEvent},
1212
util::{table_state_next, table_state_prev}, input::InputEvent,
13-
},
13+
}, store::activity::Activities,
1414
};
1515

1616
use super::{
@@ -66,7 +66,10 @@ pub fn draw<B: Backend>(
6666
.split(area);
6767

6868
if let Some(activity) = &app.activity {
69-
f.render_widget(activity_list_table(app, &vec![activity.clone()]), rows[0]);
69+
{
70+
let a = Activities::from(activity.clone());
71+
f.render_widget(activity_list_table(app, &a), rows[0]);
72+
}
7073
}
7174

7275
let cols = Layout::default()

0 commit comments

Comments
 (0)