diff --git a/src/app/browser/window/tab/item/page/search/form.rs b/src/app/browser/window/tab/item/page/search/form.rs index 7a7e57c1..a7260579 100644 --- a/src/app/browser/window/tab/item/page/search/form.rs +++ b/src/app/browser/window/tab/item/page/search/form.rs @@ -80,9 +80,10 @@ impl Form { let navigation = navigation.clone(); let result = result.clone(); let subject = subject.clone(); - move |_| match subject.borrow().as_ref() { + move |this| match subject.borrow().as_ref() { Some(subject) => { - if let Some((mut start, _)) = navigation.forward(subject) { + if !this.text().is_empty() { + let (mut start, _) = navigation.forward(subject); result.update(navigation.position(), navigation.total()); scroll_to_iter(&subject.text_view, &mut start) } @@ -121,13 +122,11 @@ impl Form { let result = result.clone(); let subject = subject.clone(); move |_| match subject.borrow().as_ref() { - Some(subject) => match navigation.back(subject) { - Some((mut start, _)) => { - result.update(navigation.position(), navigation.total()); - scroll_to_iter(&subject.text_view, &mut start) - } - None => todo!(), - }, + Some(subject) => { + let (mut start, _) = navigation.back(subject); + result.update(navigation.position(), navigation.total()); + scroll_to_iter(&subject.text_view, &mut start) + } None => todo!(), } }); @@ -137,13 +136,11 @@ impl Form { let result = result.clone(); let subject = subject.clone(); move |_| match subject.borrow().as_ref() { - Some(subject) => match navigation.forward(subject) { - Some((mut start, _)) => { - result.update(navigation.position(), navigation.total()); - scroll_to_iter(&subject.text_view, &mut start) - } - None => todo!(), - }, + Some(subject) => { + let (mut start, _) = navigation.forward(subject); + result.update(navigation.position(), navigation.total()); + scroll_to_iter(&subject.text_view, &mut start) + } None => todo!(), } }); diff --git a/src/app/browser/window/tab/item/page/search/form/navigation.rs b/src/app/browser/window/tab/item/page/search/form/navigation.rs index c57a293d..1d485105 100644 --- a/src/app/browser/window/tab/item/page/search/form/navigation.rs +++ b/src/app/browser/window/tab/item/page/search/form/navigation.rs @@ -53,13 +53,18 @@ impl Navigation { // Actions + /// Update widget state, including child components pub fn update(&self, matches: Vec<(TextIter, TextIter)>) { self.back.update(!matches.is_empty()); self.forward.update(!matches.is_empty()); self.model.replace(Model::new(matches)); } - pub fn back(&self, subject: &Subject) -> Option<(TextIter, TextIter)> { + /// Navigate back in matches, apply tags to buffer + /// * return `start`/`end` iters to scroll up the widget + /// * user should not activate this function on empty results + /// expected all actions / buttons deactivated in this case + pub fn back(&self, subject: &Subject) -> (TextIter, TextIter) { let buffer = subject.text_view.buffer(); buffer.remove_tag( @@ -68,16 +73,25 @@ impl Navigation { &buffer.end_iter(), ); - match self.model.borrow_mut().back() { - Some((start, end)) => { - buffer.apply_tag(&subject.tag.current, start, end); - Some((*start, *end)) - } - None => None, + let mut model = self.model.borrow_mut(); + + let (start, end) = match model.back() { + Some((start, end)) => (*start, *end), + None => todo!(), // unexpected + }; + + if model.position().is_some() { + buffer.apply_tag(&subject.tag.current, &start, &end); } + + (start, end) } - pub fn forward(&self, subject: &Subject) -> Option<(TextIter, TextIter)> { + /// Navigate forward in matches, apply tags to buffer + /// * return `start`/`end` iters to scroll down the widget + /// * user should not activate this function on empty results + /// expected all actions / buttons deactivated in this case + pub fn forward(&self, subject: &Subject) -> (TextIter, TextIter) { let buffer = subject.text_view.buffer(); buffer.remove_tag( @@ -86,15 +100,22 @@ impl Navigation { &buffer.end_iter(), ); - match self.model.borrow_mut().next() { - Some((start, end)) => { - buffer.apply_tag(&subject.tag.current, start, end); - Some((*start, *end)) - } - None => None, + let mut model = self.model.borrow_mut(); + + let (start, end) = match model.next() { + Some((start, end)) => (*start, *end), + None => todo!(), // unexpected + }; + + if model.position().is_some() { + buffer.apply_tag(&subject.tag.current, &start, &end); } + + (start, end) } + // Getters + pub fn position(&self) -> Option { self.model.borrow().position() }