summaryrefslogtreecommitdiffstats
path: root/src/views/menu.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/views/menu.rs')
-rw-r--r--src/views/menu.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/views/menu.rs b/src/views/menu.rs
new file mode 100644
index 0000000..04324ec
--- /dev/null
+++ b/src/views/menu.rs
@@ -0,0 +1,70 @@
+use cursive::Cursive;
+use cursive::views::Menubar;
+use cursive::views::Dialog;
+use cursive::views::EditView;
+use cursive::view::Nameable;
+use cursive::view::Resizable;
+use cursive::menu::MenuTree;
+use cursive::menu::MenuItem;
+
+use crate::views::maillist::MaillistView;
+use crate::views::main::MainView;
+use crate::views::main::MAIN_VIEW_NAME;
+
+/// build the menu bar
+pub fn init(siv: &mut Cursive) {
+ let menubar = siv.menubar();
+ add_main(menubar);
+}
+
+fn add_main(bar: &mut Menubar) {
+ bar.add_subtree(
+ "Muar",
+ MenuTree::new()
+ .leaf("Query", menu_command_query)
+ .delimiter()
+ .leaf("Quit", menu_command_quit)
+ );
+}
+
+fn menu_command_quit(siv: &mut Cursive) {
+ siv.quit()
+}
+
+fn menu_command_query(siv: &mut Cursive) {
+ use crate::util::dialog_for;
+ use crate::util::error_dialog_for;
+
+ let edit_view = EditView::new()
+ .on_submit(move |siv: &mut Cursive, query: &str| {
+ let res = siv.call_on_name(MAIN_VIEW_NAME, move |main_view: &mut MainView| {
+ main_view.add_tab_for_query(query)
+ });
+
+ match res {
+ Some(Ok(())) => {
+ siv.pop_layer();
+ info!("Querying went fine: {}", query);
+ },
+
+ Some(Err(e)) => {
+ siv.pop_layer();
+ error!("Error: {:?}", e);
+ siv.add_layer(error_dialog_for(e));
+ },
+
+ None => {
+ siv.pop_layer();
+ error!("Failed to get main view");
+ siv.add_layer(dialog_for("Failed to get database connection set up"));
+ },
+ }
+ })
+ .with_name("query");
+
+ siv.add_layer({
+ Dialog::around(edit_view)
+ .title("Query")
+ .min_width(80)
+ })
+}