add tests to_record selection and improve it
[?]
Oct 31, 2025, 6:46 PM
5O4FWCFP4ZPAS7WKSYPHN76ML3O2S4JUOYWOV2ETD4TF2H6KZ6AQCDependencies
- [2]
KM5PSZ4Awatch repo once loaded - [3]
23SFYK4Qbig view refactor into a new crate - [4]
PKJCFSBMtheme improvements - [5]
XIASAP3Gclippy - [6]
SASAN2XCuse nav-scrollable - [7]
KWTBNTO3diffs selection and scrolling - [8]
UR4J677Rnav for log changes and refactors - [9]
FJSVMFB4add `iced_expl_widgets` with forked scrollable - [10]
3XRG4BB6rewritten nav-scrollable! - [11]
WAOGSCOJvery nice refactor, wip adding channels logs - [12]
EJPSD5XOshared allowed actions conditions between update and view - [13]
YK3MOJJLchonky refactor, wip other channels logs & diffs - [14]
7WCB5YQJrefactor msgs and modules - [15]
AZ5D2LQUallow to set record description - [16]
CULHFNIVadd error report view - [17]
LFEMJYYDstart of to_record selection - [18]
KEPKF3WOunify diffs handling, simplify view - [19]
C5P3JIFCrefactor out the nav-scrollable children len arg - [20]
PKLUHYE4allow to copy change hash - [21]
U3EAZKHRallow to copy error report - [22]
XSZZB47Urefactor stuff into lib - [23]
OJPGHVC3entire log! - [24]
MYGIBRRHwip custom theme - [25]
UBRT5BAUfix new nav-scrollable to jump to first non-skip section - [*]
6YZAVBWUInitial commit
Change contents
- replacement in inflorescence_view/src/view.rs at line 270
diff::view(state, nav, file, *diff_selected)diff::view(state, nav, file, *diff_selected, false) - replacement in inflorescence_view/src/view.rs at line 293
diff::view(state, nav, file, *diff_selected)diff::view(state, nav, file, *diff_selected, true) - replacement in inflorescence_view/src/view.rs at line 518
diff::view(state, nav, file, *diff_selected)diff::view(state, nav, file, *diff_selected, false) - replacement in inflorescence_view/src/view.rs at line 757
diff::view(state, nav, file, *diff_selected)diff::view(state, nav, file, *diff_selected, false) - replacement in inflorescence_view/src/view.rs at line 919
diff::view(state, nav, file, *diff_selected)diff::view(state, nav, file, *diff_selected, false) - edit in inflorescence_view/src/theme.rs at line 49
const NAV_SECTION_BORDER_WIDTH: f32 = 2.0; - edit in inflorescence_view/src/theme.rs at line 102
NavNonSelectedSection,NavSelectedSection, - edit in inflorescence_view/src/theme.rs at line 255
Container::NavNonSelectedSection => container::Style {border: Border {color: Color::TRANSPARENT,width: NAV_SECTION_BORDER_WIDTH,..default()},..default()},Container::NavSelectedSection => container::Style {border: Border {color: MAGENTA_LIGHT,width: NAV_SECTION_BORDER_WIDTH,..default()},..default()}, - replacement in inflorescence_view/src/diff.rs at line 9
use iced_expl_widget::nav_scrollable;use iced_expl_widget::{nav_scrollable, nav_selectable}; - edit in inflorescence_view/src/diff.rs at line 21
select_sections: bool, - replacement in inflorescence_view/src/diff.rs at line 27[3.3566]→[7.5334:5375](∅→∅),[7.5375]→[8.131:197](∅→∅),[8.197]→[7.5436:5446](∅→∅),[7.5436]→[7.5436:5446](∅→∅)
File::Decoded(decoded_file) => {view_decoded(state, nav, decoded_file, diff_selected)}File::Decoded(decoded_file) => view_decoded(state,nav,decoded_file,diff_selected,select_sections,), - edit in inflorescence_view/src/diff.rs at line 45
select_sections: bool, - replacement in inflorescence_view/src/diff.rs at line 99
let sections =el(nav_scrollable(nav, sections_view).class(if diff_selected {theme::Scrollable::Selected} else {theme::Scrollable::Normal}));let nav = if diff_selected && select_sections {nav_selectable(nav,sections_view,|| theme::Container::NavNonSelectedSection,|| theme::Container::NavSelectedSection,)} else {nav_scrollable(nav, sections_view)}.class(if diff_selected {theme::Scrollable::Selected} else {theme::Scrollable::Normal});let sections = el(nav); - edit in inflorescence_model/src/to_record.rs at line 2
#[cfg(test)]mod test; - replacement in inflorescence_model/src/to_record.rs at line 23
#[derive(Clone, Copy, Debug)]#[derive(Clone, Copy, Debug, PartialEq, Eq)] - replacement in inflorescence_model/src/to_record.rs at line 29
#[derive(Clone, Copy, Debug, Default)]#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] - replacement in inflorescence_model/src/to_record.rs at line 84
if matches!(state.overall, PickSet::Include | PickSet::Exclude) {// Clear out the last partial states// Set a pick for files that don't have it{let unset_file_pick = match state.overall {PickSet::Include | PickSet::Exclude => state.overall,PickSet::Partial => PickSet::Exclude,}; - replacement in inflorescence_model/src/to_record.rs at line 91
state.files.insert(changed_file.clone(), state.overall);if !state.files.contains_key(changed_file) {state.files.insert(changed_file.clone(), unset_file_pick);} - edit in inflorescence_model/src/to_record.rs at line 97
state.changes.clear(); - replacement in inflorescence_model/src/to_record.rs at line 105
if matches!(state.overall, PickSet::Include | PickSet::Exclude) {// Clear out the last partial statesdbg!(&state);// Set a pick for files that don't have it{let unset_file_pick = match state.overall {PickSet::Include | PickSet::Exclude => state.overall,PickSet::Partial => PickSet::Exclude,}; - replacement in inflorescence_model/src/to_record.rs at line 113
state.files.insert(changed_file.clone(), state.overall);if !state.files.contains_key(changed_file) {state.files.insert(changed_file.clone(), unset_file_pick);}}}// Set a pick for this file's changes that don't have it{let unset_pick = match state.files.get(&file).copied().unwrap_or(state.overall){PickSet::Include => Pick::Include,PickSet::Exclude | PickSet::Partial => Pick::Exclude,};let PartialFile { changes } =state.changes.entry(file.clone()).or_default();for change in changed_files.get(&file).unwrap() {if !changes.contains_key(change) {changes.insert(change.clone(), unset_pick);} - edit in inflorescence_model/src/to_record.rs at line 138
state.changes.clear(); - edit in inflorescence_model/src/to_record.rs at line 144
.or_else(|| {state.files.get(&file).and_then(|pick| {if matches!(pick, PickSet::Partial) {Some(Pick::Include)} else {None}})}) - replacement in inflorescence_model/src/to_record.rs at line 161
.unwrap_or(match pick {Pick::Include => PickSet::Include,Pick::Exclude => PickSet::Exclude,.unwrap_or_else(|| {if changed_files.get(&file).unwrap().len() > 1 {PickSet::Partial} else {match pick {Pick::Include => PickSet::Include,Pick::Exclude => PickSet::Exclude,}} - edit in inflorescence_model/src/to_record.rs at line 174
dbg!(&state); - edit in inflorescence_model/src/to_record.rs at line 177
dbg!(&state); - edit in inflorescence_model/src/to_record.rs at line 211
}pub fn next_file_change_pick(file: &str,diff: &repo::ChangedFileDiff,state: &State,) -> Pick {let current = state.changes.get(file).and_then(|PartialFile { changes }| changes.get(diff)).copied().unwrap_or_else(|| default_pick(state));next_pick(current) - replacement in inflorescence_model/src/to_record.rs at line 255
changes,changes: _, - edit in inflorescence_model/src/to_record.rs at line 262
|| changes.values().any(|file| {file.changes.values().any(|pick| matches!(pick, Pick::Exclude))}) - replacement in inflorescence_model/src/to_record.rs at line 369
pick = Some(default_pick_set(state));// dbg!(default_pick_set(state));// pick = Some(default_pick_set(state));return Some(PickSet::Partial); - edit in inflorescence_model/src/to_record.rs at line 375
dbg!((*pick, change_pick)); - replacement in inflorescence_model/src/to_record.rs at line 390
Pick::Exclude => PickSet::Include,Pick::Exclude => PickSet::Exclude, - edit in inflorescence_model/src/to_record.rs at line 395
dbg!(&pick); - file addition: to_record[11.29627]
- file addition: test.rs[0.5185]
use super::*;#[test]fn toggle_overall() {let mut state = State::default();assert_eq!(state.overall, PickSet::Include);let changed_files = repo::ChangedFiles::default();update(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Exclude);update(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Include);}// TODO add test in which files (and/or changes) are added and rm'd#[test]fn toggle_file() {let mut state = State::default();assert_eq!(state.overall, PickSet::Include);let file_a = "A";let file_b = "B";let file_c = "C";let changed_files = repo::ChangedFiles::from_iter([(file_a.to_owned(), repo::ChangedFile::default()),(file_b.to_owned(), repo::ChangedFile::default()),(file_c.to_owned(), repo::ChangedFile::default()),]);let toggle_file = |state: &mut State, file: &str| {update(state,Msg::ToggleFile {file: file.to_owned(),},&changed_files,)};let file = |state: &State, file: &str| *state.files.get(file).unwrap();// Exclude Atoggle_file(&mut state, file_a);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Partial);// Exclude allupdate(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Exclude);// Include allupdate(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Include);// Include Atoggle_file(&mut state, file_a);assert_eq!(file(&state, file_a), PickSet::Include);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Include);// Exclude Atoggle_file(&mut state, file_a);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Partial);// Exclude Btoggle_file(&mut state, file_b);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(file(&state, file_b), PickSet::Exclude);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Partial);// Exclude Ctoggle_file(&mut state, file_c);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(file(&state, file_b), PickSet::Exclude);assert_eq!(file(&state, file_c), PickSet::Exclude);assert_eq!(state.overall, PickSet::Exclude);// Include Atoggle_file(&mut state, file_a);assert_eq!(file(&state, file_a), PickSet::Include);assert_eq!(file(&state, file_b), PickSet::Exclude);assert_eq!(file(&state, file_c), PickSet::Exclude);assert_eq!(state.overall, PickSet::Partial);// Include Btoggle_file(&mut state, file_b);assert_eq!(file(&state, file_a), PickSet::Include);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(file(&state, file_c), PickSet::Exclude);assert_eq!(state.overall, PickSet::Partial);// Exclude allupdate(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Exclude);// Include allupdate(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Include);// Include Ctoggle_file(&mut state, file_c);assert_eq!(file(&state, file_a), PickSet::Include);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Include);// Exclude Atoggle_file(&mut state, file_a);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Partial);// Exclude allupdate(&mut state, Msg::ToggleOverall, &changed_files);assert_eq!(state.overall, PickSet::Exclude);// Exclude Btoggle_file(&mut state, file_b);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(file(&state, file_b), PickSet::Exclude);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Partial);}#[test]fn toggle_change() {let mut state = State::default();assert_eq!(state.overall, PickSet::Include);let file_a = "A";let file_b = "B";let file_c = "C";let change_a_1 = repo::ChangedFileDiff::Move;let change_b_1 = repo::ChangedFileDiff::Del;let change_b_2 = repo::ChangedFileDiff::Undel;let change_c_1 = repo::ChangedFileDiff::Add;let change_c_2 = repo::ChangedFileDiff::DelRoot;let change_c_3 = repo::ChangedFileDiff::AddRoot;let changed_files = repo::ChangedFiles::from_iter([(file_a.to_owned(),repo::ChangedFile::from_iter([change_a_1.clone()]),),(file_b.to_owned(),repo::ChangedFile::from_iter([change_b_1.clone(),change_b_2.clone(),]),),(file_c.to_owned(),repo::ChangedFile::from_iter([change_c_1.clone(),change_c_2.clone(),change_c_3.clone(),]),),]);let toggle_change =|state: &mut State, file: &str, change: &repo::ChangedFileDiff| {update(state,Msg::ToggleChange {file: file.to_owned(),change: change.clone(),},&changed_files,)};let file = |state: &State, file: &str| *state.files.get(file).unwrap();let change = |state: &State, file: &str, change: &repo::ChangedFileDiff| {*state.changes.get(file).unwrap().changes.get(change).unwrap()};// Exclude A.1toggle_change(&mut state, file_a, &change_a_1);assert_eq!(change(&state, file_a, &change_a_1), Pick::Exclude);assert_eq!(file(&state, file_a), PickSet::Exclude);assert_eq!(state.overall, PickSet::Partial);// Include A.1toggle_change(&mut state, file_a, &change_a_1);assert_eq!(change(&state, file_a, &change_a_1), Pick::Include);assert_eq!(file(&state, file_a), PickSet::Include);assert_eq!(state.overall, PickSet::Include);// Exclude B.1toggle_change(&mut state, file_b, &change_b_1);assert_eq!(change(&state, file_b, &change_b_1), Pick::Exclude);assert_eq!(file(&state, file_b), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Exclude B.2toggle_change(&mut state, file_b, &change_b_2);assert_eq!(change(&state, file_b, &change_b_2), Pick::Exclude);assert_eq!(file(&state, file_b), PickSet::Exclude);assert_eq!(state.overall, PickSet::Partial);// Include B.1toggle_change(&mut state, file_b, &change_b_1);assert_eq!(change(&state, file_b, &change_b_1), Pick::Include);assert_eq!(file(&state, file_b), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Include B.2toggle_change(&mut state, file_b, &change_b_2);assert_eq!(change(&state, file_b, &change_b_2), Pick::Include);assert_eq!(file(&state, file_b), PickSet::Include);assert_eq!(state.overall, PickSet::Include);// Exclude C.1toggle_change(&mut state, file_c, &change_c_1);assert_eq!(change(&state, file_c, &change_c_1), Pick::Exclude);assert_eq!(file(&state, file_c), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Exclude C.2toggle_change(&mut state, file_c, &change_c_2);assert_eq!(change(&state, file_c, &change_c_2), Pick::Exclude);assert_eq!(file(&state, file_c), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Exclude C.3toggle_change(&mut state, file_c, &change_c_3);assert_eq!(change(&state, file_c, &change_c_3), Pick::Exclude);assert_eq!(file(&state, file_c), PickSet::Exclude);assert_eq!(state.overall, PickSet::Partial);// Include C.1toggle_change(&mut state, file_c, &change_c_1);assert_eq!(change(&state, file_c, &change_c_1), Pick::Include);assert_eq!(file(&state, file_c), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Include C.2toggle_change(&mut state, file_c, &change_c_2);assert_eq!(change(&state, file_c, &change_c_2), Pick::Include);assert_eq!(file(&state, file_c), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Include C.3toggle_change(&mut state, file_c, &change_c_3);assert_eq!(change(&state, file_c, &change_c_3), Pick::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Include);// Exclude C.1toggle_change(&mut state, file_c, &change_c_1);assert_eq!(change(&state, file_c, &change_c_1), Pick::Exclude);assert_eq!(file(&state, file_c), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Exclude B.1toggle_change(&mut state, file_b, &change_b_1);assert_eq!(change(&state, file_b, &change_b_1), Pick::Exclude);assert_eq!(file(&state, file_b), PickSet::Partial);assert_eq!(state.overall, PickSet::Partial);// Include C.1toggle_change(&mut state, file_c, &change_c_1);assert_eq!(change(&state, file_c, &change_c_1), Pick::Include);assert_eq!(file(&state, file_c), PickSet::Include);assert_eq!(state.overall, PickSet::Partial);} - replacement in inflorescence_model/src/action.rs at line 37
/// Same purpose as `to_record::ToggleFile`, but without file name for/// action filteringToRecordToggleSelectedFile,/// Same purpose as `to_record::ToggleFile` or `to_record::ToggleChange`,/// but without file name for action filteringToRecordToggleSelectedFileOrChange, - edit in inflorescence_model/src/action.rs at line 81
(ToRecordToggleSelectedFile, ToRecordToggleSelectedFile) => true, - replacement in inflorescence_model/src/action.rs at line 82
ToRecord(to_record::Msg::ToggleFile { file: _ }),ToRecordToggleSelectedFile,ToRecordToggleSelectedFileOrChange,ToRecordToggleSelectedFileOrChange, - replacement in inflorescence_model/src/action.rs at line 86
ToRecordToggleSelectedFile,ToRecord(to_record::Msg::ToggleFile { file: _ }),ToRecord(to_record::Msg::ToggleFile { file: _ })| ToRecord(to_record::Msg::ToggleChange { file: _, change: _ }),ToRecordToggleSelectedFileOrChange,) => true,(ToRecordToggleSelectedFileOrChange,ToRecord(to_record::Msg::ToggleFile { file: _ })| ToRecord(to_record::Msg::ToggleChange { file: _, change: _ }), - replacement in inflorescence_model/src/action.rs at line 114
(ToRecordToggleSelectedFile, _) => false,(ToRecordToggleSelectedFileOrChange, _) => false, - replacement in inflorescence_model/src/action.rs at line 316
msg: Some(FilteredMsg::ToRecordToggleSelectedFile),msg: Some(FilteredMsg::ToRecordToggleSelectedFileOrChange),}};let to_record_toggle_file_change = |next: to_record::Pick| {let label = match next {to_record::Pick::Include => "include selected change",to_record::Pick::Exclude => "exclude selected change",};Binding {key: "t",label,msg: Some(FilteredMsg::ToRecordToggleSelectedFileOrChange), - edit in inflorescence_model/src/action.rs at line 389
next_to_record_file_change_pick, - replacement in inflorescence_model/src/action.rs at line 402
push_if_some(next_to_record_file_pick, to_record_toggle_file, ma);// TODO maybe in here S+t should control file pick and lowercase// used for selected changelet _ = next_to_record_file_pick;// push_if_some(next_to_record_file_pick, to_record_toggle_file,// ma);push_if_some(next_to_record_file_change_pick,to_record_toggle_file_change,ma,); - edit in inflorescence_model/src/action.rs at line 575
next_to_record_file_change_pick: Option<to_record::Pick>, - edit in inflorescence_model/src/action.rs at line 694
next_to_record_file_change_pick: None, - edit in inflorescence_model/src/action.rs at line 736
let diff_ix = navigation.files_diffs.diffs_nav.get_selected_section_ix();let selected_diff = diff_ix.and_then(|diff_ix| {changed_files.get(path).and_then(|diffs| diffs.iter().nth(diff_ix))});let next_to_record_file_change_pick = selected_diff.map(|selected_diff| {to_record::next_file_change_pick(path,selected_diff,to_record,)}); - edit in inflorescence_model/src/action.rs at line 756
next_to_record_file_change_pick, - edit in inflorescence_model/src/action.rs at line 787
next_to_record_file_change_pick: None, - replacement in inflorescence/src/main.rs at line 515
action::FilteredMsg::ToRecordToggleSelectedFile => {action::FilteredMsg::ToRecordToggleSelectedFileOrChange => { - edit in inflorescence/src/main.rs at line 520
navigation, - replacement in inflorescence/src/main.rs at line 526
diff_selected: _,diff_selected, - replacement in inflorescence/src/main.rs at line 529
let msg = to_record::Msg::ToggleFile { file: path.clone() };to_record::update(to_record, msg, &repo.changed_files);if *diff_selected {let diff_ix = navigation.files_diffs.diffs_nav.get_selected_section_ix().unwrap();let selected_diff = repo.changed_files.get(path).and_then(|diffs| diffs.iter().nth(diff_ix)).cloned();if let Some(change) = selected_diff {let msg = to_record::Msg::ToggleChange {file: path.clone(),change,};to_record::update(to_record, msg, &repo.changed_files);}} else {let msg = to_record::Msg::ToggleFile { file: path.clone() };to_record::update(to_record, msg, &repo.changed_files);} - edit in inflorescence/src/main.rs at line 1102
// TODO update to_record state - replacement in inflorescence/src/main.rs at line 1468
"t" => {action(action::FilteredMsg::ToRecordToggleSelectedFile)}"t" => action(action::FilteredMsg::ToRecordToggleSelectedFileOrChange,), - edit in iced_expl_widget/src/nav_scrollable.rs at line 132
/// Only used when `NavScrollable::select_sections` is set. It cannot/// contain any index from `skip_sections`selected_section: Option<usize>, - replacement in iced_expl_widget/src/nav_scrollable.rs at line 175
if let Some((y, delay)) = stateif let Some((ix, y, delay)) = state - edit in iced_expl_widget/src/nav_scrollable.rs at line 183
// Frame of the nav's visible region is reduced by the// `context_height` on top and bottom - replacement in iced_expl_widget/src/nav_scrollable.rs at line 190
// The top edge of the section is visible, but the bottom// edge of is below the bottom edge of nav, scroll down// The top edge of the section is above the bottom frame,// but the bottom edge of is below the// bottom frame, scroll down to see the rest of it - replacement in iced_expl_widget/src/nav_scrollable.rs at line 198
Some((state.offset_y + offset_delta, Delay::Start))} else if *offset > bottom_frame {// Scroll to the next sectionSome((ix, state.offset_y + offset_delta, Delay::Start))} else if *offset > bottom_frame|| state.selected_section.map(|section| section < ix).unwrap_or_default(){// Section is below the bottom frame, or the previous// section is selected, scroll down to see this one - edit in iced_expl_widget/src/nav_scrollable.rs at line 208
ix, - edit in iced_expl_widget/src/nav_scrollable.rs at line 247
// Set the new selectionif state.selected_section.is_some() {state.selected_section = Some(ix);} - replacement in iced_expl_widget/src/nav_scrollable.rs at line 260
if let Some((y, delay)) = stateif let Some((ix, y, delay)) = state - edit in iced_expl_widget/src/nav_scrollable.rs at line 269
// Frame of the nav's visible region is reduced by the// `context_height` on top and bottom - replacement in iced_expl_widget/src/nav_scrollable.rs at line 273
// The bottom edge of the section is visible, but the top// edge of is above the top edge of nav, scroll up// The bottom edge of the section is below the top frame,// but the top edge of is above the top// farme, scroll up to see the rest of it - edit in iced_expl_widget/src/nav_scrollable.rs at line 282
ix, - replacement in iced_expl_widget/src/nav_scrollable.rs at line 286
} else if offset + height < top_frame {} else if offset + height < top_frame|| state.selected_section.map(|section| section > ix).unwrap_or_default(){// Section is above the top frame, or the following section// is selected, scroll up to see this one - edit in iced_expl_widget/src/nav_scrollable.rs at line 295
ix, - edit in iced_expl_widget/src/nav_scrollable.rs at line 347
// Set the new selectionif state.selected_section.is_some() {state.selected_section = Some(ix);} - edit in iced_expl_widget/src/nav_scrollable.rs at line 372
// TODO update selected_section, if some - edit in iced_expl_widget/src/nav_scrollable.rs at line 386
// TODO update selected_section, if some - replacement in iced_expl_widget/src/nav_scrollable.rs at line 476
let iterator = children.into_iter();let mut children = Vec::with_capacity(iterator.size_hint().0);children.extend(iterator);let children: Vec<_> = children.into_iter().collect(); - edit in iced_expl_widget/src/nav_scrollable.rs at line 628
}}impl<'a, Message, Theme, Renderer> NavScrollable<'a, Message, Theme, Renderer>whereMessage: 'a,Theme: 'a + Catalog + container::Catalog,Renderer: 'a + iced::advanced::Renderer,{/// Creates a new [`NavScrollable`] with section selection.pub fn with_selection(state: &'a State,children: impl IntoIterator<Item = Element<'a, Message, Theme, Renderer>>,non_selected_section: impl Fn() -> <Theme as container::Catalog>::Class<'a>,selected_section: impl Fn() -> <Theme as container::Catalog>::Class<'a>,) -> Self {let selected_section_ix = state.select_fst_section();// Add border for selected sectionlet children: Vec<_> = children.into_iter().enumerate().map(|(ix, child)| {Element::from(if ix == selected_section_ix {container(child).class(selected_section())} else {container(child).class(non_selected_section())})}).collect();let content = iced::widget::column(children).into();NavScrollable {state,width: Length::Shrink,height: Length::Shrink,direction: Direction::default(),content,on_scroll: None,class: <Theme as Catalog>::default(),last_status: None,}.validate() - edit in iced_expl_widget/src/nav_scrollable.rs at line 695
selected_section: None, - replacement in iced_expl_widget/src/nav_scrollable.rs at line 702
pub fn set_skip_sections(&mut self, skip_sections: HashSet<usize>) {pub fn set_skip_sections(&self, skip_sections: HashSet<usize>) { - replacement in iced_expl_widget/src/nav_scrollable.rs at line 708
pub fn with_skip_sections(self, skip_sections: HashSet<usize>) -> Self {/// Select first non-skip section if nothing is yet selected./// Returns the selected index.pub fn select_fst_section(&self) -> usize { - replacement in iced_expl_widget/src/nav_scrollable.rs at line 712
let inner = RefCell::into_inner(inner);let inner = StateInner {skip_sections,..inner};Self {inner: RefCell::new(inner),let mut inner = inner.borrow_mut();if let Some(ix) = inner.selected_section {ix} else {debug_assert!(inner.skip_sections.len() < inner.section_heights.len(),"There has to be at least one non-skip section");let mut selected_section: usize = 0;while inner.skip_sections.contains(&selected_section) {selected_section += 1;}inner.selected_section = Some(selected_section);selected_section - edit in iced_expl_widget/src/nav_scrollable.rs at line 728
}/// Get the index of selected section within the selectable sections only/// (the index range excludes `skip_sections`)pub fn get_selected_section_ix(&self) -> Option<usize> {let Self { inner } = self;let inner = inner.borrow();inner.selected_section.map(|ix| {ix - inner.skip_sections.iter().filter(|section| **section < ix).count()}) - edit in iced_expl_widget/src/nav_scrollable.rs at line 1883
// TODO how do I add borders for sections? - edit in iced_expl_widget/src/lib.rs at line 10
use iced::widget::container; - edit in iced_expl_widget/src/lib.rs at line 86
}pub fn nav_selectable<'a, Message, Theme, Renderer>(state: &'a nav_scrollable::State,children: impl IntoIterator<Item = Element<'a, Message, Theme, Renderer>>,non_selected_section: impl Fn() -> <Theme as container::Catalog>::Class<'a>,selected_section: impl Fn() -> <Theme as container::Catalog>::Class<'a>,) -> NavScrollable<'a, Message, Theme, Renderer>whereMessage: 'a,Theme: 'a + nav_scrollable::Catalog + container::Catalog,Renderer: 'a + iced_core::Renderer,{NavScrollable::with_selection(state,children,non_selected_section,selected_section,)