diff --git a/src/plug_manager/mod.rs b/src/plug_manager/mod.rs index 7ed9f71..9419ddd 100644 --- a/src/plug_manager/mod.rs +++ b/src/plug_manager/mod.rs @@ -2,6 +2,7 @@ mod ui; mod vim_plug; mod store; mod manager; +mod plugin_settings_dlg; pub use self::ui::Ui; pub use self::manager::{Manager, PlugManagerConfigSource}; diff --git a/src/plug_manager/plugin_settings_dlg.rs b/src/plug_manager/plugin_settings_dlg.rs new file mode 100644 index 0000000..fe85332 --- /dev/null +++ b/src/plug_manager/plugin_settings_dlg.rs @@ -0,0 +1,44 @@ +use gtk; +use gtk::prelude::*; + +use super::store; + +pub struct Builder<'a> { + title: &'a str +} + +impl <'a> Builder <'a> { + pub fn new(title: &'a str) -> Self { + Builder { title } + } + + pub fn show>(&self, parent: &F) -> Option { + let dlg = gtk::Dialog::new_with_buttons( + Some(self.title), + Some(parent), + gtk::DIALOG_USE_HEADER_BAR | gtk::DIALOG_DESTROY_WITH_PARENT, + &[("Cancel", gtk::ResponseType::Cancel.into()), + ("Ok", gtk::ResponseType::Accept.into())], + ); + + let content = dlg.get_content_area(); + let grid = gtk::Grid::new(); + + let label = gtk::Label::new("Path:"); + let entry = gtk::Entry::new(); + + grid.attach(&label, 0, 0, 1, 1); + grid.attach(&entry, 1, 0, 1, 1); + + content.add(&grid); + content.show_all(); + + if dlg.run() == gtk::ResponseType::Ok.into() { + } + + dlg.destroy(); + + None + } +} + diff --git a/src/plug_manager/ui.rs b/src/plug_manager/ui.rs index deba02e..c60045e 100644 --- a/src/plug_manager/ui.rs +++ b/src/plug_manager/ui.rs @@ -10,6 +10,7 @@ use gtk::prelude::*; use super::manager; use super::store::{Store, PlugInfo}; +use super::plugin_settings_dlg; pub struct Ui<'a> { manager: &'a Arc>, @@ -23,13 +24,11 @@ impl<'a> Ui<'a> { } pub fn show>(&mut self, parent: &T) { - const OK_ID: i32 = 0; - let dlg = gtk::Dialog::new_with_buttons( Some("Plug"), Some(parent), - gtk::DialogFlags::empty(), - &[("Ok", OK_ID)], + gtk::DIALOG_DESTROY_WITH_PARENT, + &[("Ok", gtk::ResponseType::Ok.into())], ); dlg.set_default_size(800, 600); @@ -37,6 +36,14 @@ impl<'a> Ui<'a> { let header_bar = gtk::HeaderBar::new(); + let add_plug_btn = gtk::Button::new_with_label("Add.."); + header_bar.pack_end(&add_plug_btn); + + let manager_ref = self.manager.clone(); + add_plug_btn.connect_clicked(clone!(dlg => move |_| { + add_plugin(&dlg, &manager_ref); + })); + let enable_swc = gtk::Switch::new(); enable_swc.set_valign(gtk::Align::Center); @@ -49,7 +56,11 @@ impl<'a> Ui<'a> { dlg.set_titlebar(&header_bar); - let pages = SettingsPages::new(); + let pages = SettingsPages::new(move |row_name| if row_name == "plugins" { + add_plug_btn.show(); + } else { + add_plug_btn.hide(); + }); match self.manager.borrow_mut().plug_manage_state { manager::PlugManageState::Unknown => { @@ -91,13 +102,10 @@ impl<'a> Ui<'a> { content.show_all(); - match dlg.run() { - OK_ID => { - let mut manager = self.manager.borrow_mut(); - manager.clear_removed(); - manager.save(); - } - _ => (), + if dlg.run() == gtk::ResponseType::Ok.into() { + let mut manager = self.manager.borrow_mut(); + manager.clear_removed(); + manager.save(); } dlg.destroy(); @@ -172,6 +180,10 @@ impl<'a> Ui<'a> { } } +fn add_plugin>(parent: &F, manager: &Arc>) { + plugin_settings_dlg::Builder::new("Add plugin").show(parent); +} + fn create_plug_label(plug_info: &PlugInfo) -> gtk::Box { let label_box = gtk::Box::new(gtk::Orientation::Vertical, 5); @@ -202,10 +214,11 @@ struct SettingsPages { stack: gtk::Stack, content: gtk::Box, rows: Rc>>, + row_selected: Box, } impl SettingsPages { - pub fn new() -> Self { + pub fn new(row_selected: F) -> Self { let content = gtk::Box::new(gtk::Orientation::Horizontal, 5); let categories = gtk::ListBox::new(); categories.get_style_context().map(|c| c.add_class("view")); @@ -233,6 +246,7 @@ impl SettingsPages { stack, content, rows, + row_selected: Box::new(row_selected), } }