Comments (2)
Thanks for the report!
Indeed, not panicking sounds like a better behavior :)
from cursive.
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)
- [FEATURE] How would I bring form, panel, and menu into this? HOT 1
- [BUG] Calling find_name() in the wrong order makes things unfindable HOT 2
- Documentation issue about textarea set_cursor HOT 2
- [BUG] While using cursive, stacktrace (on panic) are never printed to (non-alternate) screen HOT 2
- [FEATURE] more keys in `event::Keys` HOT 2
- [BUG] Shift+Up/Down do not work w/ Termion backend HOT 2
- [BUG] cursive.clear() does not work. HOT 2
- [FEATURE] `CheckBox` as multichoice with similarity to `RadioGroup` HOT 2
- [BUG] Button gets pressed on mouse hover with crossterm HOT 4
- [FEATURE] Multiline EditView HOT 2
- Inconsistency between documentation and code implementation HOT 3
- [FEATURE] Feature Request or Guidance on Customizing Submit Key for SelectView HOT 1
- [BUG] Limit subview size HOT 2
- [FEATURE] Add the capacity to disable or enabled the Views. Buttons, Edit and others. Even Full Layouts. HOT 1
- [BUG] cursive exits immediately when asked to display a string with a null byte HOT 5
- [FEATURE] Menubar to render StyledStrings HOT 5
- [FEATURE] gradient colors HOT 4
- [BUG] The recent "Move examples to the repo root" commit broke rust-analyzer for the examples HOT 4
- [BUG] tests fail with unicode-width 0.1.12 but not with 0.1.13 (should we support both in tests too?) HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cursive.