make back/forward result optional

This commit is contained in:
yggverse 2024-12-18 15:21:27 +02:00
parent b9bdaaa495
commit d8a4e42f3c
2 changed files with 39 additions and 31 deletions

View File

@ -83,9 +83,13 @@ impl Form {
move |this| match subject.borrow().as_ref() { move |this| match subject.borrow().as_ref() {
Some(subject) => { Some(subject) => {
if !this.text().is_empty() { if !this.text().is_empty() {
let (mut start, _) = navigation.forward(subject); match navigation.forward(subject) {
result.update(navigation.position(), navigation.total()); Some((mut start, _)) => {
scroll_to_iter(&subject.text_view, &mut start) result.update(navigation.position(), navigation.total());
scroll_to_iter(&subject.text_view, &mut start)
}
None => todo!(), // unexpected
}
} }
} }
None => todo!(), None => todo!(),
@ -123,9 +127,13 @@ impl Form {
let subject = subject.clone(); let subject = subject.clone();
move |_| match subject.borrow().as_ref() { move |_| match subject.borrow().as_ref() {
Some(subject) => { Some(subject) => {
let (mut start, _) = navigation.back(subject); match navigation.back(subject) {
result.update(navigation.position(), navigation.total()); Some((mut start, _)) => {
scroll_to_iter(&subject.text_view, &mut start) result.update(navigation.position(), navigation.total());
scroll_to_iter(&subject.text_view, &mut start)
}
None => todo!(), // unexpected
}
} }
None => todo!(), None => todo!(),
} }
@ -136,11 +144,13 @@ impl Form {
let result = result.clone(); let result = result.clone();
let subject = subject.clone(); let subject = subject.clone();
move |_| match subject.borrow().as_ref() { move |_| match subject.borrow().as_ref() {
Some(subject) => { Some(subject) => match navigation.forward(subject) {
let (mut start, _) = navigation.forward(subject); Some((mut start, _)) => {
result.update(navigation.position(), navigation.total()); result.update(navigation.position(), navigation.total());
scroll_to_iter(&subject.text_view, &mut start) scroll_to_iter(&subject.text_view, &mut start)
} }
None => todo!(), // unexpected
},
None => todo!(), None => todo!(),
} }
}); });

View File

@ -64,7 +64,7 @@ impl Navigation {
/// * return `start`/`end` iters to scroll up the widget /// * return `start`/`end` iters to scroll up the widget
/// * user should not activate this function on empty results /// * user should not activate this function on empty results
/// expected all actions / buttons deactivated in this case /// expected all actions / buttons deactivated in this case
pub fn back(&self, subject: &Subject) -> (TextIter, TextIter) { pub fn back(&self, subject: &Subject) -> Option<(TextIter, TextIter)> {
let buffer = subject.text_view.buffer(); let buffer = subject.text_view.buffer();
buffer.remove_tag( buffer.remove_tag(
@ -75,23 +75,22 @@ impl Navigation {
let mut model = self.model.borrow_mut(); let mut model = self.model.borrow_mut();
let (start, end) = match model.back() { match model.back().map(|(start, end)| (*start, *end)) {
Some((start, end)) => (*start, *end), Some((start, end)) => {
None => todo!(), // unexpected if model.position().is_some() {
}; buffer.apply_tag(&subject.tag.current, &start, &end);
}
if model.position().is_some() { Some((start, end))
buffer.apply_tag(&subject.tag.current, &start, &end); }
None => None,
} }
(start, end)
} }
/// Navigate forward in matches, apply tags to buffer /// Navigate forward in matches, apply tags to buffer
/// * return `start`/`end` iters to scroll down the widget /// * return `start`/`end` iters to scroll down the widget
/// * user should not activate this function on empty results /// * user should not activate this function on empty results
/// expected all actions / buttons deactivated in this case /// expected all actions / buttons deactivated in this case
pub fn forward(&self, subject: &Subject) -> (TextIter, TextIter) { pub fn forward(&self, subject: &Subject) -> Option<(TextIter, TextIter)> {
let buffer = subject.text_view.buffer(); let buffer = subject.text_view.buffer();
buffer.remove_tag( buffer.remove_tag(
@ -102,16 +101,15 @@ impl Navigation {
let mut model = self.model.borrow_mut(); let mut model = self.model.borrow_mut();
let (start, end) = match model.next() { match model.next().map(|(start, end)| (*start, *end)) {
Some((start, end)) => (*start, *end), Some((start, end)) => {
None => todo!(), // unexpected if model.position().is_some() {
}; buffer.apply_tag(&subject.tag.current, &start, &end);
}
if model.position().is_some() { Some((start, end))
buffer.apply_tag(&subject.tag.current, &start, &end); }
None => None,
} }
(start, end)
} }
// Getters // Getters