GithubHelp home page GithubHelp logo

Comments (2)

gyscos avatar gyscos commented on July 24, 2024 1

Thanks for the report!

Indeed, not panicking sounds like a better behavior :)

from cursive.

correabuscar avatar correabuscar commented on July 24, 2024

Tentative fix would be:

diff --git a/cursive-core/src/views/menu_popup.rs b/cursive-core/src/views/menu_popup.rs
index d3050ba..9fe5698 100644
--- a/cursive-core/src/views/menu_popup.rs
+++ b/cursive-core/src/views/menu_popup.rs
@@ -130,7 +130,11 @@ impl MenuPopup {
             } else if cycle {
                 // Only cycle once to prevent endless loop
                 cycle = false;
-                self.focus = self.menu.children.len() - 1;
+                let len = self.menu.children.len();
+                if len == 0 {
+                    break;
+                }
+                self.focus = len - 1;
             } else {
                 break;
             }
@@ -143,12 +147,16 @@ impl MenuPopup {
 
     fn scroll_down(&mut self, mut n: usize, mut cycle: bool) {
         while n > 0 {
-            if self.focus + 1 < self.menu.children.len() {
+            let len = self.menu.children.len();
+            if self.focus + 1 < len {
                 self.focus += 1;
             } else if cycle {
                 // Only cycle once to prevent endless loop
                 cycle = false;
                 self.focus = 0;
+                if len == 0 {
+                    break;
+                }
             } else {
                 // Stop if we're at the bottom.
                 break;
@@ -236,13 +244,19 @@ impl MenuPopup {
             Event::Key(Key::Home) => self.focus = 0,
             Event::Key(Key::End) => self.focus = self.menu.children.len().saturating_sub(1),
 
-            Event::Key(Key::Right) if self.menu.children[self.focus].is_subtree() => {
+            Event::Key(Key::Right)
+                if (self.focus < self.menu.children.len()
+                    && self.menu.children[self.focus].is_subtree()) =>
+            {
                 return match self.menu.children[self.focus] {
                     menu::Item::Subtree { ref tree, .. } => self.make_subtree_cb(tree),
                     _ => unreachable!("Child is a subtree"),
                 };
             }
-            Event::Key(Key::Enter) if self.menu.children[self.focus].is_enabled() => {
+            Event::Key(Key::Enter)
+                if (self.focus < self.menu.children.len()
+                    && self.menu.children[self.focus].is_enabled()) =>
+            {
                 return self.submit();
             }
             Event::Mouse {
@@ -263,7 +277,8 @@ impl MenuPopup {
                 event: MouseEvent::Release(MouseButton::Left),
                 position,
                 offset,
-            } if self.menu.children[self.focus].is_enabled()
+            } if (self.focus < self.menu.children.len()
+                && self.menu.children[self.focus].is_enabled())
                 && position
                     .checked_sub(offset)
                     .map(|position| position.y == self.focus)
@@ -320,7 +335,13 @@ impl View for MenuPopup {
         scroll::draw_box_frame(
             self,
             printer,
-            |s, y| s.menu.children[y].is_delimiter(),
+            |s, y| {
+                if s.menu.children.len() > y {
+                    s.menu.children[y].is_delimiter()
+                } else {
+                    false
+                }
+            },
             |_s, _x| false,
         );
 

But maybe this isn't the proper way to do it. Like, some indirection(via some new function) might be wanted instead.

from cursive.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.