diff --git a/Cargo.lock b/Cargo.lock index 8dfc4ccc..c488758d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1025,7 +1025,7 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "druid" version = "0.7.0" -source = "git+https://github.com/lapce/druid#e121a48816c6b9b742d6fb941a8da0abf10123e3" +source = "git+https://github.com/lapce/druid#fa80c9289a64857d492d619a40158cb116cfb9f3" dependencies = [ "console_error_panic_hook", "druid-derive", @@ -1049,7 +1049,7 @@ dependencies = [ [[package]] name = "druid-derive" version = "0.4.0" -source = "git+https://github.com/lapce/druid#e121a48816c6b9b742d6fb941a8da0abf10123e3" +source = "git+https://github.com/lapce/druid#fa80c9289a64857d492d619a40158cb116cfb9f3" dependencies = [ "proc-macro2 1.0.29", "quote 1.0.9", @@ -1059,7 +1059,7 @@ dependencies = [ [[package]] name = "druid-shell" version = "0.7.0" -source = "git+https://github.com/lapce/druid#e121a48816c6b9b742d6fb941a8da0abf10123e3" +source = "git+https://github.com/lapce/druid#fa80c9289a64857d492d619a40158cb116cfb9f3" dependencies = [ "anyhow", "bitflags", @@ -2149,6 +2149,7 @@ dependencies = [ "serde_json", "strum 0.19.5", "strum_macros 0.19.4", + "tinyfiledialogs", "toml 0.5.8 (git+https://github.com/lapce/toml-rs)", "tree-sitter", "tree-sitter-highlight", @@ -4233,6 +4234,16 @@ dependencies = [ "syn 1.0.75", ] +[[package]] +name = "tinyfiledialogs" +version = "3.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9545b2375cbcb7a7d70cca5e92fbaa096fd89bebd2fbc54a3da7f37d15a54e6b" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "tinystr" version = "0.3.4" diff --git a/core/Cargo.toml b/core/Cargo.toml index 217cbcc0..456b2a9d 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Dongdong Zhou "] edition = "2018" [dependencies] +tinyfiledialogs = "3.8.3" itertools = "0.10.1" unicode-width = "0.1.8" unicode-segmentation = "1.7.1" diff --git a/core/src/code_action.rs b/core/src/code_action.rs index 369a6a17..43ceec46 100644 --- a/core/src/code_action.rs +++ b/core/src/code_action.rs @@ -259,9 +259,13 @@ fn paint(&mut self, ctx: &mut PaintCtx, data: &LapceTabData, env: &Env) { } let rect = ctx.size().to_rect(); - let blur_color = Color::grey8(180); let shadow_width = 5.0; - ctx.blurred_rect(rect, shadow_width, &blur_color); + ctx.blurred_rect( + rect, + shadow_width, + data.config + .get_color_unchecked(LapceTheme::LAPCE_DROPDOWN_SHADOW), + ); ctx.fill( rect, data.config diff --git a/core/src/completion.rs b/core/src/completion.rs index 58d194ba..e1f91e6b 100644 --- a/core/src/completion.rs +++ b/core/src/completion.rs @@ -700,8 +700,7 @@ fn paint(&mut self, ctx: &mut PaintCtx, data: &LapceTabData, env: &Env) { let y = line_height * line as f64 + 5.0; - if let Some((svg, color)) = - completion_svg(item.item.kind, data.theme.clone()) + if let Some((svg, color)) = completion_svg(item.item.kind, &data.config) { let color = color.unwrap_or( data.config diff --git a/core/src/palette.rs b/core/src/palette.rs index 6e2286e6..f8dae695 100644 --- a/core/src/palette.rs +++ b/core/src/palette.rs @@ -79,7 +79,9 @@ fn string(&self) -> String { fn has_preview(&self) -> bool { match &self { - PaletteType::File | PaletteType::Workspace => false, + PaletteType::File | PaletteType::Workspace | PaletteType::Command => { + false + } _ => true, } } @@ -111,6 +113,7 @@ pub enum PaletteItemContent { }, ReferenceLocation(PathBuf, EditorLocationNew), Workspace(LapceWorkspace), + Command(LapceCommand), } impl PaletteItemContent { @@ -175,6 +178,35 @@ fn select(&self, ctx: &mut EventCtx, preview: bool) { )); } } + PaletteItemContent::Command(command) => { + if !preview { + match command { + LapceCommand::OpenFolder => { + let event_sink = ctx.get_external_handle(); + thread::spawn(move || { + if let Some(folder) = + tinyfiledialogs::select_folder_dialog( + "Open folder", + "./", + ) + { + event_sink.submit_command( + LAPCE_UI_COMMAND, + LapceUICommand::SetWorkspace( + LapceWorkspace { + kind: LapceWorkspaceType::Local, + path: PathBuf::from(folder), + }, + ), + Target::Auto, + ); + } + }); + } + _ => (), + } + } + } } } @@ -236,6 +268,13 @@ fn paint( }; (None, text, indices.to_vec(), "".to_string(), vec![]) } + PaletteItemContent::Command(command) => ( + None, + command.to_string(), + indices.to_vec(), + "".to_string(), + vec![], + ), }; if let Some(svg) = svg.as_ref() { @@ -564,6 +603,9 @@ pub fn run(&mut self, ctx: &mut EventCtx, palette_type: Option) { self.get_workspaces(ctx); } &PaletteType::Reference => {} + &PaletteType::Command => { + self.get_commands(ctx); + } _ => self.get_files(ctx), } } @@ -774,6 +816,16 @@ fn get_workspaces(&mut self, ctx: &mut EventCtx) { .collect(); } + fn get_commands(&mut self, ctx: &mut EventCtx) { + let palette = Arc::make_mut(&mut self.palette); + palette.items = vec![NewPaletteItem { + content: PaletteItemContent::Command(LapceCommand::OpenFolder), + filter_text: "Open Folder".to_string(), + score: 0, + indices: vec![], + }]; + } + fn get_lines(&mut self, ctx: &mut EventCtx) { let editor = self.main_split.active_editor(); let buffer = self.main_split.open_files.get(&editor.buffer).unwrap(); diff --git a/core/src/svg.rs b/core/src/svg.rs index 35f44630..493b1bc4 100644 --- a/core/src/svg.rs +++ b/core/src/svg.rs @@ -13,6 +13,8 @@ use parking_lot::Mutex; use usvg; +use crate::config::Config; + pub const ICONS_DIR: Dir = include_dir!("../icons"); lazy_static! { static ref SVG_STORE: SvgStore = SvgStore::new(); @@ -85,7 +87,7 @@ pub fn symbol_svg_new(kind: &SymbolKind) -> Option { pub fn completion_svg( kind: Option, - theme: Arc>, + config: &Config, ) -> Option<(Svg, Option)> { let kind = kind?; let kind_str = match kind { @@ -113,6 +115,8 @@ pub fn completion_svg( Some(( get_svg(&format!("symbol-{}.svg", kind_str))?, - theme.get(theme_str).map(|c| c.clone()), + config + .get_color(&("style.".to_string() + theme_str)) + .map(|c| c.clone()), )) } diff --git a/core/src/tab.rs b/core/src/tab.rs index 54755cfe..30392464 100644 --- a/core/src/tab.rs +++ b/core/src/tab.rs @@ -3,7 +3,7 @@ use druid::{ theme, BoxConstraints, Color, Command, Cursor, Data, Env, Event, EventCtx, Insets, LayoutCtx, LifeCycle, LifeCycleCtx, PaintCtx, Point, RenderContext, - Size, Target, Widget, WidgetExt, WidgetId, WidgetPod, + Size, Target, Widget, WidgetExt, WidgetId, WidgetPod, WindowConfig, }; use lsp_types::{CallHierarchyOptions, DiagnosticSeverity}; @@ -389,6 +389,24 @@ fn event( | LapceUICommand::CancelCodeActions => { self.code_action.event(ctx, event, data, env); } + LapceUICommand::FocusTab => { + let dir = data + .workspace + .as_ref() + .map(|w| { + let dir = + w.path.file_name().unwrap().to_str().unwrap(); + let dir = match &w.kind { + LapceWorkspaceType::Local => dir.to_string(), + LapceWorkspaceType::RemoteSSH(user, host) => { + format!("{} [{}@{}]", dir, user, host) + } + }; + dir + }) + .unwrap_or("Lapce".to_string()); + ctx.configure_window(WindowConfig::default().set_title(dir)); + } LapceUICommand::UpdateStyle { id, path,