From 2cefb06063ac044524f630dd4f81b386de8319f8 Mon Sep 17 00:00:00 2001 From: daa84 Date: Tue, 24 Oct 2017 18:03:34 +0300 Subject: [PATCH] Change state management --- src/dirs.rs | 12 +++-- src/plug_manager/manager.rs | 33 +++++++++---- src/plug_manager/store.rs | 4 ++ src/plug_manager/ui.rs | 94 ++++++++++++++++++++++++------------ src/plug_manager/vim_plug.rs | 14 ++---- src/settings.rs | 11 ++++- src/ui.rs | 11 +++-- 7 files changed, 120 insertions(+), 59 deletions(-) diff --git a/src/dirs.rs b/src/dirs.rs index 10ef164..dceccc2 100644 --- a/src/dirs.rs +++ b/src/dirs.rs @@ -4,13 +4,14 @@ use std::path::PathBuf; pub fn get_app_config_dir_create() -> Result { let config_dir = get_app_config_dir()?; - std::fs::create_dir_all(&config_dir) - .map_err(|e| format!("{}", e))?; + std::fs::create_dir_all(&config_dir).map_err( + |e| format!("{}", e), + )?; Ok(config_dir) } -fn get_app_config_dir() -> Result { +pub fn get_app_config_dir() -> Result { let mut config_dir = get_xdg_config_dir()?; config_dir.push("nvim-gtk"); @@ -23,8 +24,9 @@ fn get_xdg_config_dir() -> Result { return Ok(PathBuf::from(config_path)); } - let mut home_dir = std::env::home_dir() - .ok_or("Impossible to get your home dir!")?; + let mut home_dir = std::env::home_dir().ok_or( + "Impossible to get your home dir!", + )?; home_dir.push(".config"); Ok(home_dir) } diff --git a/src/plug_manager/manager.rs b/src/plug_manager/manager.rs index 05533f9..dda4fc2 100644 --- a/src/plug_manager/manager.rs +++ b/src/plug_manager/manager.rs @@ -6,29 +6,42 @@ use super::store::Store; use nvim::NeovimClient; pub struct Manager { - pub vim_plug: vim_plug::Manager, + vim_plug: vim_plug::Manager, + pub plug_manage_state: PlugManageState, } impl Manager { pub fn new() -> Self { Manager { vim_plug: vim_plug::Manager::new(), + plug_manage_state: PlugManageState::Unknown, } } - pub fn initialize(&mut self, nvim: Rc>) { + pub fn generate_plug_config(&mut self) -> Option { + if Store::is_config_exists() { + self.plug_manage_state = PlugManageState::NvimGtk(Store::load()); + Some("TODO".to_owned()) + } else { + None + } + } + + pub fn init_nvim_client(&mut self, nvim: Rc>) { self.vim_plug.initialize(nvim); } - pub fn load_store(&self, vim_plug_state: &vim_plug::State) -> Store { - match *vim_plug_state { - vim_plug::State::AlreadyLoaded => { - let store = Store::load_from_plug(&self.vim_plug); - store - } - vim_plug::State::Unknown => { - Store::load() + pub fn update_state(&mut self) { + if self.vim_plug.is_loaded() { + if let PlugManageState::Unknown = self.plug_manage_state { + self.plug_manage_state = PlugManageState::Configuration(Store::load_from_plug(&self.vim_plug)); } } } } + +pub enum PlugManageState { + NvimGtk(Store), + Configuration(Store), + Unknown, +} diff --git a/src/plug_manager/store.rs b/src/plug_manager/store.rs index df8de13..ab1705c 100644 --- a/src/plug_manager/store.rs +++ b/src/plug_manager/store.rs @@ -8,6 +8,10 @@ pub struct Store { } impl Store { + pub fn is_config_exists() -> bool { + Settings::is_file_exists() + } + pub fn load() -> Self { Store { settings: Settings::load() } } diff --git a/src/plug_manager/ui.rs b/src/plug_manager/ui.rs index b31c026..e28ad60 100644 --- a/src/plug_manager/ui.rs +++ b/src/plug_manager/ui.rs @@ -1,23 +1,25 @@ -use std::rc::Rc; -use std::cell::RefCell; +use std::sync::Arc; + +use ui::UiMutex; use gtk; use gtk::prelude::*; use super::manager; -use super::vim_plug; use super::store::Store; pub struct Ui<'a> { - manager: &'a manager::Manager, + manager: &'a Arc>, } impl<'a> Ui<'a> { - pub fn new(manager: &'a manager::Manager) -> Ui<'a> { + pub fn new(manager: &'a Arc>) -> Ui<'a> { + manager.borrow_mut().update_state(); + Ui { manager } } - pub fn show>(&self, parent: &T) { + pub fn show>(&mut self, parent: &T) { const OK_ID: i32 = 0; let dlg = gtk::Dialog::new_with_buttons( @@ -31,41 +33,52 @@ impl<'a> Ui<'a> { let content = dlg.get_content_area(); let tabs = gtk::Notebook::new(); - let vim_plug_state = self.get_state(); - match vim_plug_state { - vim_plug::State::AlreadyLoaded => { + match self.manager.borrow_mut().plug_manage_state { + manager::PlugManageState::Unknown => { let help = gtk::Box::new(gtk::Orientation::Vertical, 3); let warn_lbl = gtk::Label::new(None); - warn_lbl.set_markup("Note: vim-plug manager already loaded!\n\ - NeovimGtk plugins manager will be disabled.\n\ - To enable it please disable vim-plug in your configuration.\n\ - NeovimGtk manages plugins use vim-plug as backend.\n\ - You can convert vim-plug configuration to NeovimGtk configuration using button below.\n\ + warn_lbl.set_markup("Note: NeovimGtk plugin manager disabled!"); + help.pack_start(&warn_lbl, true, false, 0); + + let enable_btn = gtk::Button::new_with_label("Enable NeovimGtk plugin manager"); + help.pack_start(&enable_btn, false, false, 0); + + let get_plugins_lbl = gtk::Label::new("Help"); + tabs.append_page(&help, Some(&get_plugins_lbl)); + } + manager::PlugManageState::Configuration(ref store) => { + let help = gtk::Box::new(gtk::Orientation::Vertical, 3); + let warn_lbl = gtk::Label::new(None); + warn_lbl.set_markup("Note: NeovimGtk plugin manager disabled!\n\ + NeovimGtk manages plugins use vim-plug as backend, so enable it disables vim-plug configuration.\n\ + You can convert current vim-plug configuration to NeovimGtk configuration using button below.\n\ List of current vim-plug plugins can be found in 'Plugins' tab."); help.pack_start(&warn_lbl, true, false, 0); + let enable_btn = gtk::Button::new_with_label( + "Enable NeovimGtk plugin manager, empty configuration", + ); + help.pack_start(&enable_btn, false, false, 0); + let copy_btn = gtk::Button::new_with_label("Copy plugins from current vim-plug configuration"); help.pack_start(©_btn, false, false, 0); let get_plugins_lbl = gtk::Label::new("Help"); tabs.append_page(&help, Some(&get_plugins_lbl)); + + + self.add_plugin_list_tab(&tabs, store); } - vim_plug::State::Unknown => { + manager::PlugManageState::NvimGtk(ref store) => { let get_plugins = gtk::Box::new(gtk::Orientation::Vertical, 0); let get_plugins_lbl = gtk::Label::new("Get Plugins"); tabs.append_page(&get_plugins, Some(&get_plugins_lbl)); + + self.add_plugin_list_tab(&tabs, store); } } - let plugins = gtk::Box::new(gtk::Orientation::Vertical, 3); - let store = self.manager.load_store(&vim_plug_state); - - let store = Rc::new(RefCell::new(store)); - Ui::fill_plugin_list(&plugins, &store); - - let plugins_lbl = gtk::Label::new("Plugins"); - tabs.append_page(&plugins, Some(&plugins_lbl)); tabs.set_tab_pos(gtk::PositionType::Left); content.pack_start(&tabs, true, true, 0); @@ -82,12 +95,21 @@ impl<'a> Ui<'a> { dlg.destroy(); } - fn fill_plugin_list(panel: >k::Box, store: &Rc>) { + fn add_plugin_list_tab(&self, tabs: >k::Notebook, store: &Store) { + // Plugins + let plugins = gtk::Box::new(gtk::Orientation::Vertical, 3); + self.fill_plugin_list(&plugins, store); + + let plugins_lbl = gtk::Label::new("Plugins"); + tabs.append_page(&plugins, Some(&plugins_lbl)); + } + + fn fill_plugin_list(&self, panel: >k::Box, store: &Store) { let scroll = gtk::ScrolledWindow::new(None, None); let plugs_panel = gtk::ListBox::new(); plugs_panel.set_selection_mode(gtk::SelectionMode::None); - for (idx, plug_info) in store.borrow().get_plugs().iter().enumerate() { + for (idx, plug_info) in store.get_plugs().iter().enumerate() { let row = gtk::ListBoxRow::new(); let row_container = gtk::Box::new(gtk::Orientation::Vertical, 5); let hbox = gtk::Box::new(gtk::Orientation::Horizontal, 5); @@ -106,11 +128,21 @@ impl<'a> Ui<'a> { let row_ref = row.clone(); remove_btn.connect_clicked(move |_| { // store_ref.borrow_mut().remove(idx); - panel_ref.remove(&row_ref); + row_ref.remove(row_ref.get_child().as_ref().unwrap()); + let undo_btn = gtk::Button::new_with_label("Undo"); + let row_container = gtk::Box::new(gtk::Orientation::Horizontal, 5); + row_container.pack_end(&undo_btn, false, true, 0); + row_ref.add(&row_container); + row_container.show_all(); }); row_container.pack_start(&hbox, true, true, 0); - row_container.pack_start(>k::Separator::new(gtk::Orientation::Horizontal), true, true, 0); + row_container.pack_start( + >k::Separator::new(gtk::Orientation::Horizontal), + true, + true, + 0, + ); vbox.pack_start(&name_lbl, true, true, 0); vbox.pack_start(&url_lbl, true, true, 0); hbox.pack_start(&vbox, true, true, 0); @@ -123,12 +155,12 @@ impl<'a> Ui<'a> { scroll.add(&plugs_panel); panel.pack_start(&scroll, true, true, 0); + let enable_btn = + gtk::Button::new_with_label("Enable NeovimGtk plugin manager, empty configuration"); + panel.add(&enable_btn); + let copy_btn = gtk::Button::new_with_label("Copy plugins from current vim-plug configuration"); panel.add(©_btn); } - - fn get_state(&self) -> vim_plug::State { - self.manager.vim_plug.get_state() - } } diff --git a/src/plug_manager/vim_plug.rs b/src/plug_manager/vim_plug.rs index 9b74718..d878d65 100644 --- a/src/plug_manager/vim_plug.rs +++ b/src/plug_manager/vim_plug.rs @@ -72,19 +72,19 @@ impl Manager { } } - pub fn get_state(&self) -> State { + pub fn is_loaded(&self) -> bool { if let Some(mut nvim) = self.nvim() { let loaded_plug = nvim.eval("exists('g:loaded_plug')"); loaded_plug .ok_and_report(&mut *nvim) .and_then(|loaded_plug| loaded_plug.as_i64()) - .map_or(State::Unknown, |loaded_plug| if loaded_plug > 0 { - State::AlreadyLoaded + .map_or(false, |loaded_plug| if loaded_plug > 0 { + true } else { - State::Unknown + false }) } else { - State::Unknown + false } } } @@ -101,7 +101,3 @@ impl VimPlugInfo { } } -pub enum State { - Unknown, - AlreadyLoaded, -} diff --git a/src/settings.rs b/src/settings.rs index edc0319..6799e5a 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -128,10 +128,19 @@ pub trait SettingsLoader: Sized + serde::Serialize { } } + fn is_file_exists() -> bool { + if let Ok(mut toml_path) = dirs::get_app_config_dir() { + toml_path.push(Self::SETTINGS_FILE); + toml_path.is_file() + } else { + false + } + } + fn save(&self) { match save_err(self) { Ok(()) => (), - Err(e) => println!("{}", e), + Err(e) => error!("{}", e), } } } diff --git a/src/ui.rs b/src/ui.rs index 6c18f8c..d2b8ae8 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -132,8 +132,13 @@ impl Ui { let comps_ref = self.comps.clone(); let plug_manager_ref = self.plug_manager.clone(); plug_btn.connect_clicked(move |_| { - plug_manager::Ui::new(&mut *plug_manager_ref.borrow_mut()) - .show(comps_ref.borrow().window.as_ref().unwrap()) + plug_manager::Ui::new(&plug_manager_ref).show( + comps_ref + .borrow() + .window + .as_ref() + .unwrap(), + ) }); header_bar.pack_start(&plug_btn); @@ -168,7 +173,7 @@ impl Ui { let state_ref = self.shell.borrow().state.clone(); let plug_manager_ref = self.plug_manager.clone(); shell.set_nvim_started_cb(Some(move || { - plug_manager_ref.borrow_mut().initialize( + plug_manager_ref.borrow_mut().init_nvim_client( state_ref.borrow().nvim_clone(), ); }));