gyscos / cursive

A Text User Interface library for the Rust programming language
MIT License
4.27k stars 243 forks source link

Panic on SelectView mouse click #218

Closed yeastplume closed 6 years ago

yeastplume commented 6 years ago

I have a menu defined as follows:

let mut main_menu = SelectView::new().h_align(HAlign::Left);
main_menu.add_item("Basic Status", VIEW_BASIC_STATUS);
main_menu.add_item("Peers and Sync", VIEW_PEER_SYNC);
main_menu.add_item("Mining", VIEW_MINING);

Which is wrapped in a LinearLayout and BoxView as follows:

let main_menu = LinearLayout::new(Orientation::Vertical)
  .child(BoxView::with_full_height(main_menu))
  .child(TextView::new("------------------"))
  .child(TextView::new("Tab/Arrow : Cycle "))
  .child(TextView::new("Enter     : Select"))
  .child(TextView::new("Q         : Quit  "));

When clicking the mouse in the area underneath the defined elements in the menu, I get the following panic (sorry for long stack dump). The original code is here:

https://github.com/mimblewimble/grin/blob/e75eef927b8bdd79b0b56209f09092d6d29d87fd/src/bin/tui/menu.rs#L26

Mar 15 15:40:44.179 ERRO thread 'ui' panicked at 'index out of bounds: the len is 3 but the index is 3': /checkout/src/liballoc/vec.rs:1551stack backtrace:
   0:     0x55d1aefc4d34 - backtrace::backtrace::libunwind::trace::h52b9d0421dc07e00                                        
                        at /home/mcordner/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/libunwind.rs:53
                         - backtrace::backtrace::trace::he556d966c356bd5b                                                  
                        at /home/mcordner/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/mod.rs:42
   1:     0x55d1aefbb89c - backtrace::capture::Backtrace::new_unresolved::h0fe6f394cd1ad6fe                                 
                        at /home/mcordner/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:88  
   2:     0x55d1aefbb7ee - backtrace::capture::Backtrace::new::h9c783221a355c0d3                                            
                        at /home/mcordner/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:63   
   3:     0x55d1aee1f52c - grin_util::logger::send_panic_to_log::{{closure}}::h878fee447f9aa8af                             
                        at util/src/logger.rs:113                                                                          
   4:     0x55d1af014e15 - std::panicking::rust_panic_with_hook::hf9f34d7f0d667943                                         
                        at /checkout/src/libstd/panicking.rs:578                                                            
   5:     0x55d1af014c2e - std::panicking::begin_panic::h215af23ff6354aaf                                                   
                        at /checkout/src/libstd/panicking.rs:538                                                            
   6:     0x55d1af014b9a - std::panicking::begin_panic_fmt::h752224a2c436be23                                                 
                        at /checkout/src/libstd/panicking.rs:522                                                            
   7:     0x55d1af014b32 - rust_begin_unwind                                                                               
                        at /checkout/src/libstd/panicking.rs:498                                                           
   8:     0x55d1af0763f0 - core::panicking::panic_fmt::h68e7715928be641f                                                                  
                        at /checkout/src/libcore/panicking.rs:71                                                                                                                                
   9:     0x55d1af076393 - core::panicking::panic_bounds_check::hc005510ab6cf52c5                                          
                        at /checkout/src/libcore/panicking.rs:58                                                           
  10:     0x55d1ad988575 - <alloc::vec::Vec<T> as core::ops::index::Index<usize>>::index::h3427531086fde2d5                 
                        at /checkout/src/liballoc/vec.rs:1551                                                                             
  11:     0x55d1ad969700 - <cursive::views::select_view::SelectView<T>>::selection::hf7123b575f595ac8                                                
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/select_view.rs:204
  12:     0x55d1ad96911c - <cursive::views::select_view::SelectView<T>>::submit::h7c6abb6bf8fb914d                          
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/select_view.rs:362
  13:     0x55d1ad968872 - <cursive::views::select_view::SelectView<T>>::on_event_regular::h4bcd5e7165d337af                
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/select_view.rs:456                                                                                                                                                                  14:     0x55d1ad96a168 - <cursive::views::select_view::SelectView<T> as cursive::view::View>::on_event::hcbe073a3bcfc3e27 
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/select_view.rs:690
  15:     0x55d1ad9cca18 - <cursive::views::on_event_view::OnEventView<T> as cursive::view::view_wrapper::ViewWrapper>::wrap_on_event::h4e1acda92d68a7fd
 16:     0x55d1ad9cd8d1 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::h53d206f2b5f172fa
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  17:     0x55d1ada9c5c2 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::ha42dd233fb668643
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  18:     0x55d1adaa0850 - <cursive::views::box_view::BoxView<T> as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::ha7d50a314e5bee0b
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:196
  19:     0x55d1adaa3567 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h9169597679f7d66a
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  20:     0x55d1adaa4791 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::h3875f306c21f0e44
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  21:     0x55d1adaea3d0 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::hb8f05542bb7ef1d3
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  22:     0x55d1adaef34d - <T as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::h7e87c64e3eb2db29
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:120
  23:     0x55d1adaeec97 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h3ca880d1b380d0b2
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  24:     0x55d1adaef7f1 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::hb7a443cc78bfa3bb
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  25:     0x55d1adb35be0 - <cursive::views::linear_layout::LinearLayout as cursive::view::View>::on_event::ha8b479bb77c23f37
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/linear_layout.rs:514
  26:     0x55d1ada9c440 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::h74c19f92d0767702
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  27:     0x55d1ad9f85ed - <T as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::hf401a63af56cd726
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:120
  28:     0x55d1ad9f88a7 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h16c0a0d77d7073f7
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  29:     0x55d1ad9f8c81 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::hdd0226736db44b8e
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  30:     0x55d1ada37df9 - <cursive::views::panel::Panel<V> as cursive::view::view_wrapper::ViewWrapper>::wrap_on_event::h09e47d6412280b61
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/panel.rs:25
  31:     0x55d1ada37991 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::ha5be27228b789669
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  32:     0x55d1adaea3d0 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::hb8f05542bb7ef1d3
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  33:     0x55d1adaef34d - <T as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::h7e87c64e3eb2db29
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:120
  34:     0x55d1adaeec97 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h3ca880d1b380d0b2
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  35:     0x55d1adaef7f1 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::hb7a443cc78bfa3bb
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  36:     0x55d1adb35be0 - <cursive::views::linear_layout::LinearLayout as cursive::view::View>::on_event::ha8b479bb77c23f37
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/linear_layout.rs:514
  37:     0x55d1adaea3d0 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::hb8f05542bb7ef1d3
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  38:     0x55d1adaef34d - <T as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::h7e87c64e3eb2db29
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:120
  39:     0x55d1adaeec97 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h3ca880d1b380d0b2
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  40:     0x55d1adaef7f1 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::hb7a443cc78bfa3bb
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  41:     0x55d1adb35be0 - <cursive::views::linear_layout::LinearLayout as cursive::view::View>::on_event::ha8b479bb77c23f37
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/linear_layout.rs:514
  42:     0x55d1adaea3d0 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::hb8f05542bb7ef1d3
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  43:     0x55d1adaef34d - <T as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::h7e87c64e3eb2db29
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:120
  44:     0x55d1adaeec97 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h3ca880d1b380d0b2
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  45:     0x55d1adaef7f1 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::hb7a443cc78bfa3bb
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  46:     0x55d1adaea492 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::{{closure}}::hdd9fb848dc9229b2
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  47:     0x55d1adb2207c - <cursive::views::layer::Layer<T> as cursive::view::view_wrapper::ViewWrapper>::with_view_mut::hf37742742c760a8d
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:196
  48:     0x55d1adb1ca07 - cursive::view::view_wrapper::ViewWrapper::wrap_on_event::h839086936c06f70c
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:64
  49:     0x55d1adb1cc41 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::he8a2bd0acf1f99bf
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  50:     0x55d1adb0645c - <cursive::views::shadow_view::ShadowView<T> as cursive::view::view_wrapper::ViewWrapper>::wrap_on_event::ha594cdf8ea0f24ea
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/shadow_view.rs:69
  51:     0x55d1adb04bc1 - cursive::view::view_wrapper::<impl cursive::view::View for T>::on_event::hf733f069bf312741
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/view/view_wrapper.rs:135
  52:     0x55d1adb36a9a - <cursive::views::stack_view::ChildWrapper<T> as cursive::view::View>::on_event::h360544fe0893465c
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/stack_view.rs:107
53:     0x55d1adb3844f - <cursive::views::stack_view::StackView as cursive::view::View>::on_event::h2b101c1e0e203341
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/views/stack_view.rs:482
  54:     0x55d1adaf214c - cursive::cursive::Cursive::step::hbe0f3864f41df80d
                        at /home/mcordner/.cargo/git/checkouts/cursive-fa9a0f4802024d18/06305c8/src/cursive.rs:629
  55:     0x55d1ad99bfc1 - grin::tui::ui::UI::step::h78c18bcc957ae30b
                        at src/bin/tui/ui.rs:131
  56:     0x55d1ad99c264 - grin::tui::ui::Controller::run::hc8090114e612a4fa
                        at src/bin/tui/ui.rs:163
  57:     0x55d1ad98c2c3 - grin::start_server_tui::{{closure}}::{{closure}}::heee570220840ba77
                        at src/bin/grin.rs:78
  58:     0x55d1ada66474 - std::sys_common::backtrace::__rust_begin_short_backtrace::h2bb7e030297c7fe1
                        at /checkout/src/libstd/sys_common/backtrace.rs:133
  59:     0x55d1ad976e1c - std::thread::Builder::spawn::{{closure}}::{{closure}}::hcb984a6435e1a276
                        at /checkout/src/libstd/thread/mod.rs:406
  60:     0x55d1ada153c4 - <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::h49450ca929ad7e34
                        at /checkout/src/libstd/panic.rs:300
  61:     0x55d1ad9e4411 - std::panicking::try::do_call::h790c5d5e3600e45d
                        at /checkout/src/libstd/panicking.rs:480
  62:     0x55d1af03818e - __rust_maybe_catch_panic
                        at /checkout/src/libpanic_unwind/lib.rs:101
  63:     0x55d1ad9e42bf - std::panicking::try::hfa431e47733bd27f
                        at /checkout/src/libstd/panicking.rs:459
  64:     0x55d1ada1549b - std::panic::catch_unwind::h686ec444a80103da
                        at /checkout/src/libstd/panic.rs:365
  65:     0x55d1ad976c38 - std::thread::Builder::spawn::{{closure}}::hd0a35dccbf555e45
                        at /checkout/src/libstd/thread/mod.rs:405
  66:     0x55d1ad976e57 - <F as alloc::boxed::FnBox<A>>::call_box::h6b527344232e4cfd
                        at /checkout/src/liballoc/boxed.rs:815
  67:     0x55d1af024467 - <alloc::boxed::Box<alloc::boxed::FnBox<A, Output$u3d$R$GT$$u20$$u2b$$u20$$u27$a$GT$$u20$as$u20$core..ops..function..FnOnce$LT$A$GT$$GT$::call_once::h45bad4268ff813ab
                        at /checkout/src/liballoc/boxed.rs:825
                         - std::sys_common::thread::start_thread::h97260957c81cf142
                        at /checkout/src/libstd/sys_common/thread.rs:24
  68:     0x55d1af015388 - std::sys::unix::thread::Thread::new::thread_start::h3838be2df5be642c
                        at /checkout/src/libstd/sys/unix/thread.rs:90
  69:     0x7fb6c7a0308b - start_thread
  70:     0x7fb6c7523e7e - __GI___clone
  71:                0x0 - <unknown>
gyscos commented 6 years ago

Hi, and thanks for the report!

I think I found the problem; does 1deee269707abaaa3a7683deb8c3fca42c496165 fix the crash?

yeastplume commented 6 years ago

Thanks for the response! I'm trying to test it, but get

the trait `cursive::view::ViewWrapper` is not implemented for `std::boxed::Box<cursive::view::AnyView>` 

after updating to the latest in quite a few places that used to compile without issue

gyscos commented 6 years ago

Yes, that changed recently on master. You probably just need to replace all mentions of AnyView with View, and it should work the same way.

yeastplume commented 6 years ago

Thanks... that fixed it in most places except for here:

!·!·!·!·LinearLayout::new(Orientation::Horizontal)
!·!·!·!·!·.child(Panel::new(main_menu))
!·!·!·!·!·.child(Panel::new(root_stack)),

Where main_menu is a Box < View >

error[E0277]: the trait bound `std::boxed::Box<cursive::traits::View>: cursive::view::ViewWrapper` is not satisfied
  --> src/bin/tui/ui.rs:91:13
   |
91 |                     .child(Panel::new(main_menu))
   |                            ^^^^^^^^^^ the trait `cursive::view::ViewWrapper` is not implemented for `std::boxed::Box<cursive::traits::View>`
   |
   = note: required because of the requirements on the impl of `cursive::traits::View` for `std::boxed::Box<cursive::traits::View>`
   = note: required by `<cursive::views::Panel<V>>::new`
gyscos commented 6 years ago

Ah right. To wrap a Box<View> in a Panel, you can use ViewBox: it will make a View out of the Box.

Panel::new(ViewBox::new(boxed_view))
yeastplume commented 6 years ago

Perfect.. yes, that fixes the original mouse issue.

Thanks again for your help and quick response!