use std::cell::RefCell;
use std::rc::Rc;
use cursive::event::Key;
use cursive::view::Nameable;
use cursive::view::View;
use cursive::views::Dialog;
use cursive::views::EditView;
use cursive::views::OnEventView;
use cursive::Cursive;
use crate::stats_view::StateCommon;
use crate::MainViewState;
fn set_cp_filter(c: &mut Cursive, field_info: Option<(String, String)>) {
let state = c
.user_data::<crate::ViewState>()
.expect("No user data")
.main_view_state
.clone();
match state {
MainViewState::Cgroup => crate::cgroup_view::ViewType::cp_filter(c, field_info),
MainViewState::Process(_) => crate::process_view::ViewType::cp_filter(c, field_info),
MainViewState::System => crate::system_view::ViewType::cp_filter(c, field_info),
#[cfg(fbcode_build)]
MainViewState::Gpu => crate::gpu_view::ViewType::cp_filter(c, field_info),
}
}
pub fn new<F>(
state: Rc<RefCell<impl StateCommon + 'static>>,
refresh: F,
tab: String,
idx: usize,
title_name: String,
) -> impl View
where
F: 'static + Copy + Fn(&mut Cursive),
{
fn set_filter_state_and_cp(
c: &mut Cursive,
state: Rc<RefCell<impl StateCommon + 'static>>,
text: &str,
tab: &str,
idx: usize,
title_name: &String,
) {
if text.is_empty() {
state.borrow_mut().set_filter_from_tab_idx("", 0, None);
set_cp_filter(c, None);
} else {
state
.borrow_mut()
.set_filter_from_tab_idx(tab, idx, Some(text.to_string()));
set_cp_filter(c, Some((title_name.to_string(), text.to_string())));
}
}
let submit_state = state.clone();
let submit_tab = tab.clone();
let submit_title_name = title_name.clone();
let mut editview = EditView::new()
.on_submit(move |c, text| {
set_filter_state_and_cp(
c,
submit_state.clone(),
text,
&submit_tab,
idx,
&submit_title_name,
);
refresh(c);
c.pop_layer();
});
editview.set_content(match state.borrow_mut().get_filter_info().as_ref() {
None => String::new(),
Some((_, filter)) => filter.to_string(),
});
OnEventView::new(
Dialog::new()
.title(format!("Filter by {}", title_name))
.padding_lrtb(1, 1, 1, 0)
.content(editview.with_name("filter_popup"))
.dismiss_button("Close")
.button("Filter", move |c| {
let text = c
.call_on_name("filter_popup", |view: &mut EditView| view.get_content())
.expect("Unable to find filter_popup");
set_filter_state_and_cp(c, state.clone(), &text, &tab, idx, &title_name);
refresh(c);
c.pop_layer();
}),
)
.on_event(Key::Esc, |s| {
s.pop_layer();
})
}