Skip to content

Commit c5157a0

Browse files
committed
Al
1 parent be1d19f commit c5157a0

3 files changed

Lines changed: 198 additions & 50 deletions

File tree

krokiet/src/connect_select.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ mod tests {
267267
#[test]
268268
fn invert_selection_toggles_checked_state_for_non_header_rows() {
269269
let mut model = get_model_vec(5);
270-
model[1].header_row = true;
271270
model[0].checked = true;
271+
model[1].header_row = true;
272272
model[2].checked = false;
273273
let model = create_model_from_model_vec(&model);
274274

krokiet/src/connect_sort.rs

Lines changed: 196 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ pub fn connect_sort(app: &MainWindow) {
1717
SortMode::ParentName => sorts::sort_by_parent_name(&current_model, active_tab),
1818
SortMode::ItemName => sorts::sort_by_name(&current_model, active_tab),
1919
SortMode::FullName => sorts::sort_by_full_name(&current_model, active_tab),
20-
_ => todo!(),
20+
SortMode::ModificationDate => sorts::sort_modification_date(&current_model, active_tab),
21+
SortMode::Selection => sorts::sort_selection(&current_model, active_tab),
22+
SortMode::Reverse => sorts::reverse_sort(&current_model, active_tab),
23+
SortMode::Checked => sorts::sort_checked(&current_model, active_tab),
2124
};
2225

2326
set_tool_model(&app, active_tab, new_model);
@@ -26,7 +29,44 @@ pub fn connect_sort(app: &MainWindow) {
2629

2730
mod sorts {
2831
use super::*;
29-
use crate::common::{get_str_name_idx, get_str_path_idx};
32+
use crate::common::{get_int_modification_date_idx, get_str_name_idx, get_str_path_idx};
33+
34+
pub(super) fn reverse_sort(model: &ModelRc<MainListModel>, active_tab: CurrentTab) -> ModelRc<MainListModel> {
35+
if !get_is_header_mode(active_tab) {
36+
let mut items = model.iter().collect::<Vec<_>>();
37+
items.reverse();
38+
return ModelRc::new(VecModel::from(items));
39+
}
40+
41+
let mut grouped_items = group_by_header(model);
42+
for (_, items) in &mut grouped_items {
43+
items.reverse();
44+
}
45+
46+
convert_group_header_into_rc_model(grouped_items, model.row_count())
47+
}
48+
49+
pub(super) fn sort_checked(model: &ModelRc<MainListModel>, active_tab: CurrentTab) -> ModelRc<MainListModel> {
50+
let sort_function = |e: &MainListModel| !e.checked;
51+
52+
common_sort_function(model, active_tab, sort_function)
53+
}
54+
55+
pub(super) fn sort_selection(model: &ModelRc<MainListModel>, active_tab: CurrentTab) -> ModelRc<MainListModel> {
56+
let sort_function = |e: &MainListModel| !e.selected_row;
57+
58+
common_sort_function(model, active_tab, sort_function)
59+
}
60+
61+
pub(super) fn sort_modification_date(model: &ModelRc<MainListModel>, active_tab: CurrentTab) -> ModelRc<MainListModel> {
62+
let sort_function = |e: &MainListModel| {
63+
let modification_date = get_int_modification_date_idx(active_tab);
64+
let items = e.val_int.iter().collect::<Vec<_>>();
65+
connect_i32_into_u64(items[modification_date], items[modification_date + 1])
66+
};
67+
68+
common_sort_function(model, active_tab, sort_function)
69+
}
3070

3171
pub(super) fn sort_by_full_name(model: &ModelRc<MainListModel>, active_tab: CurrentTab) -> ModelRc<MainListModel> {
3272
let sort_function = |e: &MainListModel| {
@@ -131,8 +171,8 @@ fn group_by_header(model: &ModelRc<MainListModel>) -> Vec<(MainListModel, Vec<Ma
131171
mod tests {
132172
use slint::Model;
133173

134-
use crate::common::{get_int_size_idx, get_is_header_mode, get_str_name_idx, get_str_path_idx};
135-
use crate::connect_sort::sorts::{sort_by_full_name, sort_by_name, sort_by_parent_name, sort_by_size};
174+
use crate::common::{get_int_modification_date_idx, get_int_size_idx, get_is_header_mode, get_str_name_idx, get_str_path_idx};
175+
use crate::connect_sort::sorts::{reverse_sort, sort_by_full_name, sort_by_name, sort_by_parent_name, sort_by_size, sort_checked, sort_modification_date, sort_selection};
136176
use crate::connect_sort::{convert_group_header_into_rc_model, group_by_header};
137177
use crate::test_common::{create_model_from_model_vec, get_model_vec};
138178
use crate::{CurrentTab, MainListModel};
@@ -170,30 +210,29 @@ mod tests {
170210
assert!(grouped.is_empty());
171211
}
172212

173-
// TODO
174-
// #[test]
175-
// #[should_panic]
176-
// fn group_by_header_panics_when_no_header_before_items() {
177-
// let mut model = get_model_vec(3);
178-
// model[0].header_row = false;
179-
// model[1].header_row = false;
180-
// model[2].header_row = false;
181-
// let model = create_model_from_model_vec(&model);
182-
//
183-
// group_by_header(&model);
184-
// }
185-
//
186-
// #[test]
187-
// #[should_panic]
188-
// fn group_by_header_panics_when_group_is_empty() {
189-
// let mut model = get_model_vec(3);
190-
// model[0].header_row = true;
191-
// model[1].header_row = true;
192-
// model[2].header_row = true;
193-
// let model = create_model_from_model_vec(&model);
194-
//
195-
// group_by_header(&model);
196-
// }
213+
#[test]
214+
#[should_panic]
215+
fn group_by_header_panics_when_no_header_before_items() {
216+
let mut model = get_model_vec(3);
217+
model[0].header_row = false;
218+
model[1].header_row = false;
219+
model[2].header_row = false;
220+
let model = create_model_from_model_vec(&model);
221+
222+
group_by_header(&model);
223+
}
224+
225+
#[test]
226+
#[should_panic]
227+
fn group_by_header_panics_when_group_is_empty() {
228+
let mut model = get_model_vec(3);
229+
model[0].header_row = true;
230+
model[1].header_row = true;
231+
model[2].header_row = true;
232+
let model = create_model_from_model_vec(&model);
233+
234+
group_by_header(&model);
235+
}
197236

198237
#[test]
199238
fn convert_group_header_into_rc_model_combines_groups_correctly() {
@@ -257,25 +296,27 @@ mod tests {
257296
assert_eq!(get_int_size_idx(current_tab), 2);
258297
assert!(get_is_header_mode(current_tab));
259298

260-
let mut model = get_model_vec(6);
299+
let mut model = get_model_vec(7);
261300
model[0].header_row = true;
262301
model[1].val_int = create_model_from_model_vec(&[0, 0, 0, 15]);
263302
model[2].val_int = create_model_from_model_vec(&[0, 0, 0, 5]);
264303
model[3].header_row = true;
265-
model[4].val_int = create_model_from_model_vec(&[0, 0, 0, 25]);
304+
model[4].val_int = create_model_from_model_vec(&[0, 0, 1, 15]);
266305
model[5].val_int = create_model_from_model_vec(&[0, 0, 0, 10]);
306+
model[6].val_int = create_model_from_model_vec(&[0, 0, 0, 35]);
267307
let model = create_model_from_model_vec(&model);
268308

269309
let sorted_model = sort_by_size(&model, current_tab);
270310

271311
// Group 1
272312
assert!(sorted_model.row_data(0).unwrap().header_row);
273-
assert_eq!(sorted_model.row_data(1).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 5]); // smallest
274-
assert_eq!(sorted_model.row_data(2).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 15]); // largest
313+
assert_eq!(sorted_model.row_data(1).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 5]);
314+
assert_eq!(sorted_model.row_data(2).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 15]);
275315
// Group 2
276316
assert!(sorted_model.row_data(3).unwrap().header_row);
277-
assert_eq!(sorted_model.row_data(4).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 10]); // smallest
278-
assert_eq!(sorted_model.row_data(5).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 25]); // largest
317+
assert_eq!(sorted_model.row_data(4).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 10]);
318+
assert_eq!(sorted_model.row_data(5).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![0, 35]);
319+
assert_eq!(sorted_model.row_data(6).unwrap().val_int.iter().skip(2).collect::<Vec<_>>(), vec![1, 15]);
279320
}
280321

281322
#[test]
@@ -304,11 +345,11 @@ mod tests {
304345

305346
let sorted_model = sort_by_parent_name(&model, current_tab);
306347

307-
assert_eq!(sorted_model.row_data(0).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "", "A"]);
308-
assert_eq!(sorted_model.row_data(1).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "", "B"]);
309-
assert_eq!(sorted_model.row_data(2).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "", "C"]);
310-
assert_eq!(sorted_model.row_data(3).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "", "D"]);
311-
assert_eq!(sorted_model.row_data(4).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "", "E"]);
348+
assert_eq!(sorted_model.row_data(0).unwrap().val_str.iter().skip(2).collect::<Vec<_>>(), vec!["A"]);
349+
assert_eq!(sorted_model.row_data(1).unwrap().val_str.iter().skip(2).collect::<Vec<_>>(), vec!["B"]);
350+
assert_eq!(sorted_model.row_data(2).unwrap().val_str.iter().skip(2).collect::<Vec<_>>(), vec!["C"]);
351+
assert_eq!(sorted_model.row_data(3).unwrap().val_str.iter().skip(2).collect::<Vec<_>>(), vec!["D"]);
352+
assert_eq!(sorted_model.row_data(4).unwrap().val_str.iter().skip(2).collect::<Vec<_>>(), vec!["E"]);
312353
}
313354

314355
#[test]
@@ -328,11 +369,11 @@ mod tests {
328369

329370
let sorted_model = sort_by_name(&model, current_tab);
330371

331-
assert_eq!(sorted_model.row_data(0).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "A"]);
332-
assert_eq!(sorted_model.row_data(1).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "B"]);
333-
assert_eq!(sorted_model.row_data(2).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "C"]);
334-
assert_eq!(sorted_model.row_data(3).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "D"]);
335-
assert_eq!(sorted_model.row_data(4).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "E"]);
372+
assert_eq!(sorted_model.row_data(0).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["A"]);
373+
assert_eq!(sorted_model.row_data(1).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["B"]);
374+
assert_eq!(sorted_model.row_data(2).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["C"]);
375+
assert_eq!(sorted_model.row_data(3).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["D"]);
376+
assert_eq!(sorted_model.row_data(4).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["E"]);
336377
}
337378

338379
#[test]
@@ -353,10 +394,116 @@ mod tests {
353394

354395
let sorted_model = sort_by_full_name(&model, current_tab);
355396

356-
assert_eq!(sorted_model.row_data(0).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "E", "A"]);
357-
assert_eq!(sorted_model.row_data(1).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "D", "B"]);
358-
assert_eq!(sorted_model.row_data(2).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "F", "B"]);
359-
assert_eq!(sorted_model.row_data(3).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "A", "C"]);
360-
assert_eq!(sorted_model.row_data(4).unwrap().val_str.iter().collect::<Vec<_>>(), vec!["", "A", "D"]);
397+
assert_eq!(sorted_model.row_data(0).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["E", "A"]);
398+
assert_eq!(sorted_model.row_data(1).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["D", "B"]);
399+
assert_eq!(sorted_model.row_data(2).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["F", "B"]);
400+
assert_eq!(sorted_model.row_data(3).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["A", "C"]);
401+
assert_eq!(sorted_model.row_data(4).unwrap().val_str.iter().skip(1).collect::<Vec<_>>(), vec!["A", "D"]);
402+
}
403+
404+
#[test]
405+
fn sort_by_modification_date_sorts_flat_model_correctly() {
406+
let current_tab = CurrentTab::BigFiles;
407+
// To be sure that we set correct values in val_int, which must be equal to index
408+
assert_eq!(get_int_modification_date_idx(current_tab), 0);
409+
assert!(!get_is_header_mode(current_tab));
410+
411+
let mut model = get_model_vec(5);
412+
model[0].val_int = create_model_from_model_vec(&[15, 17]);
413+
model[1].val_int = create_model_from_model_vec(&[14, 50]);
414+
model[2].val_int = create_model_from_model_vec(&[9, 10]);
415+
model[3].val_int = create_model_from_model_vec(&[9, 9]);
416+
model[4].val_int = create_model_from_model_vec(&[29, 0]);
417+
let model = create_model_from_model_vec(&model);
418+
419+
let sorted_model = sort_modification_date(&model, current_tab);
420+
421+
assert_eq!(sorted_model.row_data(0).unwrap().val_int.iter().collect::<Vec<_>>(), vec![9, 9]);
422+
assert_eq!(sorted_model.row_data(1).unwrap().val_int.iter().collect::<Vec<_>>(), vec![9, 10]);
423+
assert_eq!(sorted_model.row_data(2).unwrap().val_int.iter().collect::<Vec<_>>(), vec![14, 50]);
424+
assert_eq!(sorted_model.row_data(3).unwrap().val_int.iter().collect::<Vec<_>>(), vec![15, 17]);
425+
assert_eq!(sorted_model.row_data(4).unwrap().val_int.iter().collect::<Vec<_>>(), vec![29, 0]);
426+
}
427+
428+
#[test]
429+
fn sort_by_checked_sorts_flat_model_correctly() {
430+
let current_tab = CurrentTab::BigFiles;
431+
// To be sure that we set correct values in val_int, which must be equal to index
432+
assert!(!get_is_header_mode(current_tab));
433+
434+
let mut model = get_model_vec(4);
435+
model[0].checked = true;
436+
model[0].val_int = create_model_from_model_vec(&[15]);
437+
model[1].checked = false;
438+
model[1].val_int = create_model_from_model_vec(&[14]);
439+
model[2].checked = true;
440+
model[2].val_int = create_model_from_model_vec(&[9]);
441+
model[3].checked = false;
442+
model[3].val_int = create_model_from_model_vec(&[29]);
443+
let model = create_model_from_model_vec(&model);
444+
445+
let sorted_model = sort_checked(&model, current_tab);
446+
447+
assert!(sorted_model.row_data(0).unwrap().checked);
448+
assert_eq!(sorted_model.row_data(0).unwrap().val_int.iter().collect::<Vec<_>>(), vec![15]);
449+
assert!(sorted_model.row_data(1).unwrap().checked);
450+
assert_eq!(sorted_model.row_data(1).unwrap().val_int.iter().collect::<Vec<_>>(), vec![9]);
451+
assert!(!sorted_model.row_data(2).unwrap().checked);
452+
assert_eq!(sorted_model.row_data(2).unwrap().val_int.iter().collect::<Vec<_>>(), vec![14]);
453+
assert!(!sorted_model.row_data(3).unwrap().checked);
454+
assert_eq!(sorted_model.row_data(3).unwrap().val_int.iter().collect::<Vec<_>>(), vec![29]);
455+
}
456+
457+
#[test]
458+
fn sort_by_selection_sorts_flat_model_correctly() {
459+
let current_tab = CurrentTab::BigFiles;
460+
// To be sure that we set correct values in val_int, which must be equal to index
461+
assert!(!get_is_header_mode(current_tab));
462+
463+
let mut model = get_model_vec(4);
464+
model[0].selected_row = true;
465+
model[0].val_int = create_model_from_model_vec(&[15]);
466+
model[1].selected_row = false;
467+
model[1].val_int = create_model_from_model_vec(&[14]);
468+
model[2].selected_row = true;
469+
model[2].val_int = create_model_from_model_vec(&[9]);
470+
model[3].selected_row = false;
471+
model[3].val_int = create_model_from_model_vec(&[29]);
472+
let model = create_model_from_model_vec(&model);
473+
474+
let sorted_model = sort_selection(&model, current_tab);
475+
476+
assert!(sorted_model.row_data(0).unwrap().selected_row);
477+
assert_eq!(sorted_model.row_data(0).unwrap().val_int.iter().collect::<Vec<_>>(), vec![15]);
478+
assert!(sorted_model.row_data(1).unwrap().selected_row);
479+
assert_eq!(sorted_model.row_data(1).unwrap().val_int.iter().collect::<Vec<_>>(), vec![9]);
480+
assert!(!sorted_model.row_data(2).unwrap().selected_row);
481+
assert_eq!(sorted_model.row_data(2).unwrap().val_int.iter().collect::<Vec<_>>(), vec![14]);
482+
assert!(!sorted_model.row_data(3).unwrap().selected_row);
483+
assert_eq!(sorted_model.row_data(3).unwrap().val_int.iter().collect::<Vec<_>>(), vec![29]);
484+
}
485+
486+
#[test]
487+
fn sort_reverse_sorts_flat_model_correctly() {
488+
let current_tab = CurrentTab::BigFiles;
489+
// To be sure that we set correct values in val_int, which must be equal to index
490+
assert_eq!(get_int_modification_date_idx(current_tab), 0);
491+
assert!(!get_is_header_mode(current_tab));
492+
493+
let mut model = get_model_vec(5);
494+
model[0].val_int = create_model_from_model_vec(&[9, 9]);
495+
model[1].val_int = create_model_from_model_vec(&[9, 10]);
496+
model[2].val_int = create_model_from_model_vec(&[14, 50]);
497+
model[3].val_int = create_model_from_model_vec(&[15, 17]);
498+
model[4].val_int = create_model_from_model_vec(&[29, 0]);
499+
let model = create_model_from_model_vec(&model);
500+
501+
let sorted_model = reverse_sort(&model, current_tab);
502+
503+
assert_eq!(sorted_model.row_data(0).unwrap().val_int.iter().collect::<Vec<_>>(), vec![29, 0]);
504+
assert_eq!(sorted_model.row_data(1).unwrap().val_int.iter().collect::<Vec<_>>(), vec![15, 17]);
505+
assert_eq!(sorted_model.row_data(2).unwrap().val_int.iter().collect::<Vec<_>>(), vec![14, 50]);
506+
assert_eq!(sorted_model.row_data(3).unwrap().val_int.iter().collect::<Vec<_>>(), vec![9, 10]);
507+
assert_eq!(sorted_model.row_data(4).unwrap().val_int.iter().collect::<Vec<_>>(), vec![9, 9]);
361508
}
362509
}

krokiet/ui/common.slint

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export enum SortMode {
7777
ModificationDate,
7878
Selection,
7979
Reverse,
80+
Checked,
8081
}
8182

8283
export struct SortModel {

0 commit comments

Comments
 (0)