Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add functionalities to enable, disable and remove plugins #880

Merged
merged 1 commit into from Jul 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 14 additions & 3 deletions lapce-data/src/command.rs
Expand Up @@ -398,6 +398,13 @@ pub enum LapceWorkbenchCommand {
PreviousEditorTab,
}

#[derive(Debug, Clone)]
pub enum PluginLoadingStatus {
Loading,
Failed,
Ok(Vec<PluginDescription>),
}

#[derive(Debug)]
pub enum EnsureVisiblePosition {
// Move the view so the cursor line will be at the center of the window. If
Expand Down Expand Up @@ -495,9 +502,13 @@ pub enum LapceUICommand {
UpdateExplorerItems(PathBuf, HashMap<PathBuf, FileNodeItem>, bool),
UpdateInstalledPlugins(HashMap<String, PluginDescription>),
UpdatePluginDescriptions(Vec<PluginDescription>),
UpdateInstalledPluginDescriptions(Option<Vec<PluginDescription>>),
UpdateUninstalledPluginDescriptions(Option<Vec<PluginDescription>>),
DeleteUninstalledPluginDescriptions(Vec<PluginDescription>),
UpdateInstalledPluginDescriptions(PluginLoadingStatus),
UpdateUninstalledPluginDescriptions(PluginLoadingStatus),
UpdatePluginInstallationChange(HashMap<String, PluginDescription>),
UpdateDisabledPlugins(HashMap<String, PluginDescription>),
DisablePlugin(PluginDescription),
EnablePlugin(PluginDescription),
RemovePlugin(PluginDescription),
RequestLayout,
RequestPaint,
ResetFade,
Expand Down
62 changes: 37 additions & 25 deletions lapce-data/src/data.rs
Expand Up @@ -47,8 +47,8 @@ use crate::{
alert::{AlertContentData, AlertData},
command::{
CommandKind, EnsureVisiblePosition, LapceCommand, LapceUICommand,
LapceWorkbenchCommand, LAPCE_COMMAND, LAPCE_OPEN_FILE, LAPCE_OPEN_FOLDER,
LAPCE_UI_COMMAND,
LapceWorkbenchCommand, PluginLoadingStatus, LAPCE_COMMAND, LAPCE_OPEN_FILE,
LAPCE_OPEN_FOLDER, LAPCE_UI_COMMAND,
},
completion::CompletionData,
config::{Config, ConfigWatcher, GetConfig, LapceTheme},
Expand Down Expand Up @@ -188,38 +188,47 @@ impl LapceData {
.collect::<Vec<PluginDescription>>();
let _ = event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::UpdateInstalledPluginDescriptions(Some(
plugins.clone(),
)),
LapceUICommand::UpdateInstalledPluginDescriptions(
PluginLoadingStatus::Ok(plugins.clone()),
),
Target::Auto,
);
let _ = event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::UpdateDisabledPlugins(catalog.disabled.clone()),
Target::Auto,
);
if let Ok(fetched_plugins) = LapceData::load_plugin_descriptions() {
let (installed, uninstalled) =
fetched_plugins.into_iter().partition(|p| {
plugins
.iter()
.find(|ip| ip.name == p.name)
.ok_or(())
.is_ok()
});
let (installed, uninstalled): (
Vec<PluginDescription>,
Vec<PluginDescription>,
) = fetched_plugins.into_iter().partition(|p| {
plugins
.iter()
.find(|ip| ip.name == p.name)
.ok_or(())
.is_ok()
});
let _ = event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::UpdateInstalledPluginDescriptions(Some(
installed,
)),
LapceUICommand::UpdateInstalledPluginDescriptions(
PluginLoadingStatus::Ok(installed),
),
Target::Auto,
);
let _ = event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::UpdateUninstalledPluginDescriptions(Some(
uninstalled,
)),
LapceUICommand::UpdateUninstalledPluginDescriptions(
PluginLoadingStatus::Ok(uninstalled),
),
Target::Auto,
);
} else {
let _ = event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::UpdateUninstalledPluginDescriptions(None),
LapceUICommand::UpdateUninstalledPluginDescriptions(
PluginLoadingStatus::Failed,
),
Target::Auto,
);
}
Expand Down Expand Up @@ -262,7 +271,7 @@ impl LapceData {
env.set(LapceTheme::INPUT_FONT_SIZE, 13u64);
}

fn load_plugin_descriptions() -> Result<Vec<PluginDescription>> {
pub fn load_plugin_descriptions() -> Result<Vec<PluginDescription>> {
let plugins: Vec<String> =
reqwest::blocking::get("https://lapce.github.io/plugins.json")?
.json()?;
Expand Down Expand Up @@ -509,9 +518,10 @@ pub struct LapceTabData {
pub plugin: Arc<PluginData>,
pub picker: Arc<FilePickerData>,
pub plugins: Arc<Vec<PluginDescription>>,
pub installed_plugins_desc: Arc<Option<Vec<PluginDescription>>>,
pub uninstalled_plugins_desc: Arc<Option<Vec<PluginDescription>>>,
pub installed_plugins_desc: Arc<PluginLoadingStatus>,
pub uninstalled_plugins_desc: Arc<PluginLoadingStatus>,
pub installed_plugins: Arc<HashMap<String, PluginDescription>>,
pub disabled_plugins: Arc<HashMap<String, PluginDescription>>,
pub file_explorer: Arc<FileExplorerData>,
pub proxy: Arc<LapceProxy>,
pub proxy_status: Arc<ProxyStatus>,
Expand Down Expand Up @@ -557,6 +567,7 @@ impl Data for LapceTabData {
&& self
.uninstalled_plugins_desc
.same(&other.uninstalled_plugins_desc)
&& self.disabled_plugins.same(&other.disabled_plugins)
&& self.installed_plugins.same(&other.installed_plugins)
&& self.picker.same(&other.picker)
&& self.drag.same(&other.drag)
Expand Down Expand Up @@ -690,8 +701,9 @@ impl LapceTabData {
problem,
search,
plugins: Arc::new(Vec::new()),
installed_plugins_desc: Arc::new(Some(Vec::new())),
uninstalled_plugins_desc: Arc::new(Some(Vec::new())),
disabled_plugins: Arc::new(HashMap::new()),
installed_plugins_desc: Arc::new(PluginLoadingStatus::Ok(Vec::new())),
uninstalled_plugins_desc: Arc::new(PluginLoadingStatus::Ok(Vec::new())),
installed_plugins: Arc::new(HashMap::new()),
find: Arc::new(Find::new(0)),
picker: file_picker,
Expand Down
1 change: 1 addition & 0 deletions lapce-data/src/plugin.rs
Expand Up @@ -28,4 +28,5 @@ pub enum PluginStatus {
Installed,
Install,
Upgrade,
Disabled,
}
31 changes: 20 additions & 11 deletions lapce-data/src/proxy.rs
Expand Up @@ -125,23 +125,17 @@ impl Handler for LapceProxy {
LapceUICommand::UpdateInstalledPlugins(plugins.clone()),
Target::Widget(self.tab_id),
);
let plugins_desc = plugins
.iter()
.map(|(_, desc)| desc.to_owned())
.collect::<Vec<PluginDescription>>();
let _ = self.event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::UpdateInstalledPluginDescriptions(Some(
plugins_desc.clone(),
)),
LapceUICommand::UpdatePluginInstallationChange(plugins),
Target::Widget(self.tab_id),
);
}
DisabledPlugins { plugins } => {
let _ = self.event_sink.submit_command(
LAPCE_UI_COMMAND,
LapceUICommand::DeleteUninstalledPluginDescriptions(
plugins_desc,
),
Target::Widget(self.tab_id),
LapceUICommand::UpdateDisabledPlugins(plugins),
Target::Auto,
);
}
DiffInfo { diff } => {
Expand Down Expand Up @@ -437,6 +431,21 @@ impl LapceProxy {
.send_rpc_notification("install_plugin", &json!({ "plugin": plugin }));
}

pub fn disable_plugin(&self, plugin: &PluginDescription) {
self.rpc
.send_rpc_notification("disable_plugin", &json!({ "plugin": plugin }))
}

pub fn enable_plugin(&self, plugin: &PluginDescription) {
self.rpc
.send_rpc_notification("enable_plugin", &json!({ "plugin": plugin }))
}

pub fn remove_plugin(&self, plugin: &PluginDescription) {
self.rpc
.send_rpc_notification("remove_plugin", &json!({ "plugin": plugin }));
}

pub fn get_buffer_head(
&self,
buffer_id: BufferId,
Expand Down
65 changes: 65 additions & 0 deletions lapce-proxy/src/dispatch.rs
Expand Up @@ -372,6 +372,71 @@ impl Dispatcher {
);
});
}
DisablePlugin { plugin } => {
let catalog = self.plugins.clone();
let dispatcher = self.clone();
std::thread::spawn(move || {
if let Err(e) = catalog
.lock()
.disable_plugin(dispatcher.clone(), plugin.clone())
{
eprintln!("disable plugin error {e}");
}
let plugins = { dispatcher.plugins.lock().disabled.clone() };
dispatcher.send_notification(
"disabled_plugins",
json!({
"plugins": plugins,
}),
)
});
}
EnablePlugin { plugin } => {
let catalog = self.plugins.clone();
let dispatcher = self.clone();
std::thread::spawn(move || {
if let Err(e) = catalog
.lock()
.enable_plugin(dispatcher.clone(), plugin.clone())
{
eprintln!("enable plugin error {e}");
}
let plugins = { dispatcher.plugins.lock().disabled.clone() };
dispatcher.send_notification(
"disabled_plugins",
json!({
"plugins": plugins,
}),
)
});
}
RemovePlugin { plugin } => {
let catalog = self.plugins.clone();
let dispatcher = self.clone();
std::thread::spawn(move || {
if let Err(e) = catalog
.lock()
.remove_plugin(dispatcher.clone(), plugin.clone())
{
eprintln!("remove plugin error {e}");
}
let plugins = { dispatcher.plugins.lock().items.clone() };
dispatcher.send_notification(
"installed_plugins",
json!({
"plugins": plugins,
}),
);
let disabled_plugins =
{ dispatcher.plugins.lock().disabled.clone() };
dispatcher.send_notification(
"disabled_plugins",
json!({
"plugins": disabled_plugins,
}),
);
});
}
NewTerminal {
term_id,
cwd,
Expand Down
6 changes: 6 additions & 0 deletions lapce-proxy/src/lsp.rs
Expand Up @@ -114,6 +114,12 @@ impl LspCatalog {
self.dispatcher.take();
}

pub fn stop_language_lsp(&mut self, lang: &String) {
if let Some(lsp) = self.clients.get(lang) {
lsp.stop();
}
}

pub fn start_server(
&mut self,
exec_path: &str,
Expand Down