2017-10-24 15:03:34 +00:00
|
|
|
use std::sync::Arc;
|
2017-10-28 20:18:42 +00:00
|
|
|
use std::rc::Rc;
|
|
|
|
use std::cell::RefCell;
|
|
|
|
use std::ops::Deref;
|
2017-10-24 15:03:34 +00:00
|
|
|
|
|
|
|
use ui::UiMutex;
|
2017-10-23 15:07:04 +00:00
|
|
|
|
2017-10-13 15:27:10 +00:00
|
|
|
use gtk;
|
|
|
|
use gtk::prelude::*;
|
|
|
|
|
2017-10-16 15:34:26 +00:00
|
|
|
use super::manager;
|
2017-10-20 15:06:05 +00:00
|
|
|
use super::store::Store;
|
2017-10-13 15:27:10 +00:00
|
|
|
|
2017-10-17 18:34:49 +00:00
|
|
|
pub struct Ui<'a> {
|
2017-10-24 15:03:34 +00:00
|
|
|
manager: &'a Arc<UiMutex<manager::Manager>>,
|
2017-10-16 15:34:26 +00:00
|
|
|
}
|
|
|
|
|
2017-10-17 18:34:49 +00:00
|
|
|
impl<'a> Ui<'a> {
|
2017-10-24 15:03:34 +00:00
|
|
|
pub fn new(manager: &'a Arc<UiMutex<manager::Manager>>) -> Ui<'a> {
|
|
|
|
manager.borrow_mut().update_state();
|
|
|
|
|
2017-10-17 18:34:49 +00:00
|
|
|
Ui { manager }
|
2017-10-13 15:27:10 +00:00
|
|
|
}
|
|
|
|
|
2017-10-24 15:03:34 +00:00
|
|
|
pub fn show<T: IsA<gtk::Window>>(&mut self, parent: &T) {
|
2017-10-13 15:27:10 +00:00
|
|
|
const OK_ID: i32 = 0;
|
|
|
|
|
|
|
|
let dlg = gtk::Dialog::new_with_buttons(
|
|
|
|
Some("Plug"),
|
|
|
|
Some(parent),
|
|
|
|
gtk::DialogFlags::empty(),
|
|
|
|
&[("Ok", OK_ID)],
|
|
|
|
);
|
|
|
|
|
2017-10-21 17:20:55 +00:00
|
|
|
dlg.set_default_size(800, 600);
|
2017-10-13 15:27:10 +00:00
|
|
|
let content = dlg.get_content_area();
|
2017-10-27 15:06:18 +00:00
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
let header_bar = gtk::HeaderBar::new();
|
2017-10-27 15:06:18 +00:00
|
|
|
|
|
|
|
let enable_swc = gtk::Switch::new();
|
2017-10-28 20:18:42 +00:00
|
|
|
enable_swc.set_valign(gtk::Align::Center);
|
|
|
|
header_bar.pack_end(&enable_swc);
|
|
|
|
|
|
|
|
header_bar.set_title("Plug");
|
|
|
|
header_bar.set_show_close_button(true);
|
|
|
|
header_bar.show_all();
|
|
|
|
|
|
|
|
dlg.set_titlebar(&header_bar);
|
|
|
|
|
|
|
|
let pages = SettingsPages::new();
|
2017-10-13 15:27:10 +00:00
|
|
|
|
2017-10-24 15:03:34 +00:00
|
|
|
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("<span foreground=\"red\">Note:</span> NeovimGtk plugin manager <b>disabled</b>!");
|
|
|
|
help.pack_start(&warn_lbl, true, false, 0);
|
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
let help_lbl = gtk::Label::new("Help");
|
|
|
|
pages.add_page(&help_lbl, &help, "help");
|
2017-10-24 15:03:34 +00:00
|
|
|
}
|
|
|
|
manager::PlugManageState::Configuration(ref store) => {
|
2017-10-23 15:07:04 +00:00
|
|
|
let help = gtk::Box::new(gtk::Orientation::Vertical, 3);
|
2017-10-21 17:20:55 +00:00
|
|
|
let warn_lbl = gtk::Label::new(None);
|
2017-10-24 15:03:34 +00:00
|
|
|
warn_lbl.set_markup("<span foreground=\"red\">Note:</span> NeovimGtk plugin manager <b>disabled</b>!\n\
|
2017-10-27 15:06:18 +00:00
|
|
|
NeovimGtk manages plugins use vim-plug as backend, so enable it disables vim-plug configuration.");
|
2017-10-23 15:07:04 +00:00
|
|
|
help.pack_start(&warn_lbl, true, false, 0);
|
2017-10-20 15:06:05 +00:00
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
let help_lbl = gtk::Label::new("Help");
|
|
|
|
pages.add_page(&help_lbl, &help, "help");
|
2017-10-24 15:03:34 +00:00
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
self.add_plugin_list_tab(&pages, store);
|
2017-10-17 18:34:49 +00:00
|
|
|
}
|
2017-10-24 15:03:34 +00:00
|
|
|
manager::PlugManageState::NvimGtk(ref store) => {
|
2017-10-17 18:34:49 +00:00
|
|
|
let get_plugins = gtk::Box::new(gtk::Orientation::Vertical, 0);
|
2017-10-28 20:18:42 +00:00
|
|
|
// TODO:
|
2017-10-17 18:34:49 +00:00
|
|
|
let get_plugins_lbl = gtk::Label::new("Get Plugins");
|
2017-10-28 20:18:42 +00:00
|
|
|
pages.add_page(&get_plugins_lbl, &get_plugins, "get_plugins");
|
2017-10-24 15:03:34 +00:00
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
self.add_plugin_list_tab(&pages, store);
|
2017-10-17 18:34:49 +00:00
|
|
|
}
|
|
|
|
}
|
2017-10-13 15:27:10 +00:00
|
|
|
|
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
content.pack_start(&*pages, true, true, 0);
|
2017-10-13 15:27:10 +00:00
|
|
|
content.show_all();
|
|
|
|
|
|
|
|
|
|
|
|
match dlg.run() {
|
|
|
|
OK_ID => {
|
|
|
|
println!("TODO:");
|
|
|
|
}
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
|
|
|
dlg.destroy();
|
|
|
|
}
|
2017-10-17 18:34:49 +00:00
|
|
|
|
2017-10-28 20:18:42 +00:00
|
|
|
fn add_plugin_list_tab(&self, pages: &SettingsPages, store: &Store) {
|
2017-10-24 15:03:34 +00:00
|
|
|
// Plugins
|
|
|
|
let plugins = gtk::Box::new(gtk::Orientation::Vertical, 3);
|
|
|
|
self.fill_plugin_list(&plugins, store);
|
|
|
|
|
|
|
|
let plugins_lbl = gtk::Label::new("Plugins");
|
2017-10-28 20:18:42 +00:00
|
|
|
pages.add_page(&plugins_lbl, &plugins, "plugins");
|
2017-10-24 15:03:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn fill_plugin_list(&self, panel: >k::Box, store: &Store) {
|
2017-10-20 15:06:05 +00:00
|
|
|
let scroll = gtk::ScrolledWindow::new(None, None);
|
2017-10-21 17:20:55 +00:00
|
|
|
let plugs_panel = gtk::ListBox::new();
|
2017-10-23 15:07:04 +00:00
|
|
|
plugs_panel.set_selection_mode(gtk::SelectionMode::None);
|
2017-10-21 17:20:55 +00:00
|
|
|
|
2017-10-24 15:03:34 +00:00
|
|
|
for (idx, plug_info) in store.get_plugs().iter().enumerate() {
|
2017-10-23 15:07:04 +00:00
|
|
|
let row = gtk::ListBoxRow::new();
|
|
|
|
let row_container = gtk::Box::new(gtk::Orientation::Vertical, 5);
|
|
|
|
let hbox = gtk::Box::new(gtk::Orientation::Horizontal, 5);
|
|
|
|
let vbox = gtk::Box::new(gtk::Orientation::Vertical, 5);
|
2017-10-21 17:20:55 +00:00
|
|
|
|
|
|
|
let name_lbl = gtk::Label::new(None);
|
|
|
|
name_lbl.set_markup(&format!("<b>{}</b>", plug_info.name.as_str()));
|
|
|
|
name_lbl.set_halign(gtk::Align::Start);
|
|
|
|
let url_lbl = gtk::Label::new(Some(plug_info.url.as_str()));
|
2017-10-23 15:07:04 +00:00
|
|
|
url_lbl.set_halign(gtk::Align::Start);
|
|
|
|
let remove_btn = gtk::Button::new_with_label("Remove");
|
|
|
|
remove_btn.set_halign(gtk::Align::End);
|
|
|
|
|
|
|
|
let store_ref = store.clone();
|
|
|
|
let panel_ref = panel.clone();
|
|
|
|
let row_ref = row.clone();
|
|
|
|
remove_btn.connect_clicked(move |_| {
|
|
|
|
// store_ref.borrow_mut().remove(idx);
|
2017-10-24 15:03:34 +00:00
|
|
|
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();
|
2017-10-23 15:07:04 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
row_container.pack_start(&hbox, true, true, 0);
|
2017-10-24 15:03:34 +00:00
|
|
|
row_container.pack_start(
|
|
|
|
>k::Separator::new(gtk::Orientation::Horizontal),
|
|
|
|
true,
|
|
|
|
true,
|
|
|
|
0,
|
|
|
|
);
|
2017-10-23 15:07:04 +00:00
|
|
|
vbox.pack_start(&name_lbl, true, true, 0);
|
|
|
|
vbox.pack_start(&url_lbl, true, true, 0);
|
|
|
|
hbox.pack_start(&vbox, true, true, 0);
|
|
|
|
hbox.pack_start(&remove_btn, false, true, 0);
|
|
|
|
|
|
|
|
row.add(&row_container);
|
|
|
|
plugs_panel.add(&row);
|
2017-10-21 17:20:55 +00:00
|
|
|
}
|
2017-10-20 15:06:05 +00:00
|
|
|
|
2017-10-21 17:20:55 +00:00
|
|
|
scroll.add(&plugs_panel);
|
|
|
|
panel.pack_start(&scroll, true, true, 0);
|
2017-10-18 14:49:56 +00:00
|
|
|
}
|
2017-10-13 15:27:10 +00:00
|
|
|
}
|
2017-10-28 20:18:42 +00:00
|
|
|
|
|
|
|
struct SettingsPages {
|
|
|
|
categories: gtk::ListBox,
|
|
|
|
stack: gtk::Stack,
|
|
|
|
content: gtk::Box,
|
|
|
|
rows: Rc<RefCell<Vec<(gtk::ListBoxRow, &'static str)>>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SettingsPages {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
let content = gtk::Box::new(gtk::Orientation::Horizontal, 3);
|
|
|
|
let categories = gtk::ListBox::new();
|
|
|
|
let stack = gtk::Stack::new();
|
|
|
|
stack.set_transition_type(gtk::StackTransitionType::Crossfade);
|
|
|
|
let rows: Rc<RefCell<Vec<(gtk::ListBoxRow, &'static str)>>> =
|
|
|
|
Rc::new(RefCell::new(Vec::new()));
|
|
|
|
|
|
|
|
content.pack_start(&categories, false, true, 0);
|
|
|
|
content.pack_start(&stack, true, true, 0);
|
|
|
|
|
|
|
|
let rows_ref = rows.clone();
|
|
|
|
let stack_ref = stack.clone();
|
|
|
|
categories.connect_row_selected(move |_, row| if let &Some(ref row) = row {
|
|
|
|
if let Some(ref r) = rows_ref.borrow().iter().find(|r| r.0 == *row) {
|
|
|
|
if let Some(child) = stack_ref.get_child_by_name(&r.1) {
|
|
|
|
stack_ref.set_visible_child(&child);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
SettingsPages {
|
|
|
|
categories,
|
|
|
|
stack,
|
|
|
|
content,
|
|
|
|
rows,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn add_page<W: gtk::IsA<gtk::Widget>>(
|
|
|
|
&self,
|
|
|
|
label: >k::Label,
|
|
|
|
widget: &W,
|
|
|
|
name: &'static str,
|
|
|
|
) {
|
|
|
|
let row = gtk::ListBoxRow::new();
|
|
|
|
|
|
|
|
let hbox = gtk::Box::new(gtk::Orientation::Horizontal, 0);
|
|
|
|
hbox.set_border_width(12);
|
|
|
|
hbox.pack_start(label, false, true, 0);
|
|
|
|
row.add(&hbox);
|
|
|
|
|
|
|
|
self.categories.add(&row);
|
|
|
|
self.stack.add_named(widget, name);
|
|
|
|
self.rows.borrow_mut().push((row, name));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Deref for SettingsPages {
|
|
|
|
type Target = gtk::Box;
|
|
|
|
|
|
|
|
fn deref(&self) -> >k::Box {
|
|
|
|
&self.content
|
|
|
|
}
|
|
|
|
}
|