1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//! Sorting functionality for CSV Viewer widget
use crate::utils::natural_cmp;
use super::types::SortOrder;
/// Sorting methods for CsvViewer
impl super::CsvViewer {
/// Sort by column
pub fn sort_by(&mut self, column: usize) {
if self.sort_column == Some(column) {
// Toggle sort order
self.sort_order = match self.sort_order {
SortOrder::None => SortOrder::Ascending,
SortOrder::Ascending => SortOrder::Descending,
SortOrder::Descending => SortOrder::None,
};
} else {
self.sort_column = Some(column);
self.sort_order = SortOrder::Ascending;
}
self.apply_sort();
}
/// Reset sorting
pub fn reset_sort(&mut self) {
self.sort_column = None;
self.sort_order = SortOrder::None;
let start = if self.has_header { 1 } else { 0 };
self.sorted_indices = (start..self.data.len()).collect();
}
/// Apply current sort
fn apply_sort(&mut self) {
let start = if self.has_header { 1 } else { 0 };
self.sorted_indices = (start..self.data.len()).collect();
if let Some(col) = self.sort_column {
match self.sort_order {
SortOrder::None => {}
SortOrder::Ascending => {
self.sorted_indices.sort_by(|&a, &b| {
let val_a = self
.data
.get(a)
.and_then(|r| r.get(col))
.map(|s| s.as_str())
.unwrap_or("");
let val_b = self
.data
.get(b)
.and_then(|r| r.get(col))
.map(|s| s.as_str())
.unwrap_or("");
natural_cmp(val_a, val_b)
});
}
SortOrder::Descending => {
self.sorted_indices.sort_by(|&a, &b| {
let val_a = self
.data
.get(a)
.and_then(|r| r.get(col))
.map(|s| s.as_str())
.unwrap_or("");
let val_b = self
.data
.get(b)
.and_then(|r| r.get(col))
.map(|s| s.as_str())
.unwrap_or("");
natural_cmp(val_b, val_a)
});
}
}
}
}
}