summaryrefslogtreecommitdiffstats
path: root/src/interactive/widgets/mark.rs
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-15 14:25:21 +0800
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-15 14:25:21 +0800
commit0fb99e00453da6d63cc01af64fdab8419314763b (patch)
treee87257dccc1d782027716e9e7d1293bc51cb7895 /src/interactive/widgets/mark.rs
parentf8485c8d48fb231b113a6511ee4048712ccc27fc (diff)
better separation of concerns when iterating marked items
also: fix consumption of mark-pane - it's now not always consuming it.
Diffstat (limited to 'src/interactive/widgets/mark.rs')
-rw-r--r--src/interactive/widgets/mark.rs25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/interactive/widgets/mark.rs b/src/interactive/widgets/mark.rs
index 611dec0..e10930d 100644
--- a/src/interactive/widgets/mark.rs
+++ b/src/interactive/widgets/mark.rs
@@ -103,7 +103,25 @@ impl MarkPane {
Some((self, action))
}
- pub fn next_entry_for_deletion(&mut self) -> Option<TreeIndex> {
+ pub fn iterate_deletable_items(
+ mut self,
+ mut delete_fn: impl FnMut(TreeIndex) -> Result<(), usize>,
+ ) -> Option<Self> {
+ loop {
+ match self.next_entry_for_deletion() {
+ Some(entry_to_delete) => match delete_fn(entry_to_delete) {
+ Ok(_) => match self.delete_entry() {
+ Some(p) => self = p,
+ None => return None,
+ },
+ Err(num_errors) => self.set_error_on_marked_item(num_errors),
+ },
+ None => return Some(self),
+ }
+ }
+ }
+
+ fn next_entry_for_deletion(&mut self) -> Option<TreeIndex> {
match self.selected.and_then(|selected| {
self.tree_index_by_list_position(selected)
.and_then(|idx| self.marked.get(&idx).map(|d| (selected, idx, d)))
@@ -115,17 +133,16 @@ impl MarkPane {
p if p < self.marked.len() => Some(p),
_ => None,
};
- // we assume that each entry is either followed by `delete_entry()` or `set_error_on_marked_item`.
self.tree_index_by_list_position(position + 1)
}
},
None => None,
}
}
- pub fn delete_entry(self) -> Option<Self> {
+ fn delete_entry(self) -> Option<Self> {
self.remove_selected()
}
- pub fn set_error_on_marked_item(&mut self, num_errors: usize) {
+ fn set_error_on_marked_item(&mut self, num_errors: usize) {
if let Some(d) = self
.selected
.and_then(|s| self.tree_index_by_list_position(s))