diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index c60ec77e..64a5bee6 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -6514,6 +6514,20 @@ namespace IDE procInfo.UseShellExecute = true; procInfo.SetFileName(directory); + let process = scope SpawnedProcess(); + process.Start(procInfo).IgnoreError(); + }); + item = menu.AddItem("Open in Terminal"); + item.mOnMenuItemSelected.Add(new (menu) => + { + let directory = scope String(); + Path.GetDirectoryPath(sourceViewPanel.mFilePath, directory); + + ProcessStartInfo procInfo = scope ProcessStartInfo(); + procInfo.UseShellExecute = true; + procInfo.SetFileName(gApp.mSettings.mEditorSettings.mDefaultConsole); + procInfo.SetWorkingDirectory(directory); + let process = scope SpawnedProcess(); process.Start(procInfo).IgnoreError(); }); diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index f0080e4c..76e60c3b 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -657,6 +657,7 @@ namespace IDE public List mFonts = new .() ~ DeleteContainerAndItems!(_); public float mFontSize = 12; + public String mDefaultConsole = new .("powershell") ~ delete _; public AutoCompleteShowKind mAutoCompleteShowKind = .PanelIfVisible; public bool mAutoCompleteRequireControl = true; public bool mAutoCompleteRequireTab = false; @@ -691,6 +692,7 @@ namespace IDE sd.Add(str); } sd.Add("FontSize", mFontSize); + sd.Add("DefaultConsole", mDefaultConsole); sd.Add("AutoCompleteShowKind", mAutoCompleteShowKind); sd.Add("AutoCompleteRequireControl", mAutoCompleteRequireControl); sd.Add("AutoCompleteRequireTab", mAutoCompleteRequireTab); @@ -728,6 +730,7 @@ namespace IDE } sd.Get("UIScale", ref gApp.mSettings.mUISettings.mScale); // Legacy sd.Get("FontSize", ref mFontSize); + sd.Get("DefaultConsole", mDefaultConsole); sd.Get("AutoCompleteShowKind", ref mAutoCompleteShowKind); sd.Get("AutoCompleteRequireControl", ref mAutoCompleteRequireControl); sd.Get("AutoCompleteRequireTab", ref mAutoCompleteRequireTab); diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index bf742ba0..8eaf4ccd 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -2989,6 +2989,39 @@ namespace IDE.ui process.Start(psi).IgnoreError(); } }); + + item = menu.AddItem("Open in Terminal"); + item.mOnMenuItemSelected.Add(new (menu) => + { + let projectItem = GetSelectedProjectItem(); + String path = scope String(); + if (projectItem == null) + { + path.Set(gApp.mWorkspace.mDir); + } + else if (let projectFolder = projectItem as ProjectFolder) + { + if (projectFolder.mParentFolder == null) + { + path.Set(projectFolder.mProject.mProjectDir); + } + else + projectFolder.GetFullImportPath(path); + } + else + projectItem.mParentFolder.GetFullImportPath(path); + + if (!path.IsWhiteSpace) + { + ProcessStartInfo psi = scope ProcessStartInfo(); + psi.SetFileName(gApp.mSettings.mEditorSettings.mDefaultConsole); + psi.SetWorkingDirectory(path); + psi.UseShellExecute = true; + + var process = scope SpawnedProcess(); + process.Start(psi).IgnoreError(); + } + }); } if (projectItem == null) diff --git a/IDE/src/ui/SettingsDialog.bf b/IDE/src/ui/SettingsDialog.bf index 52b58a4c..d62aaa1e 100644 --- a/IDE/src/ui/SettingsDialog.bf +++ b/IDE/src/ui/SettingsDialog.bf @@ -96,6 +96,7 @@ namespace IDE.ui category.mTextColor = Color.Mult(DarkTheme.COLOR_TEXT, cHeaderColor); AddPropertiesItem(category, "Font", "mFonts"); AddPropertiesItem(category, "Font Size", "mFontSize"); + AddPropertiesItem(category, "Default Console", "mDefaultConsole"); AddPropertiesItem(category, "Autocomplete", "mAutoCompleteShowKind"); AddPropertiesItem(category, "Autocomplete Require Control", "mAutoCompleteRequireControl"); AddPropertiesItem(category, "Autocomplete Require Tab", "mAutoCompleteRequireTab"); diff --git a/IDE/src/ui/StartupPanel.bf b/IDE/src/ui/StartupPanel.bf index 035c0b97..982f2a47 100644 --- a/IDE/src/ui/StartupPanel.bf +++ b/IDE/src/ui/StartupPanel.bf @@ -132,6 +132,7 @@ namespace IDE.ui menu.AddItem("Open").mOnMenuItemSelected.Add(new (menu) => { TryOpenWorkspace(); }); menu.AddItem(); menu.AddItem("Open Containing Folder").mOnMenuItemSelected.Add(new (menu) => { OpenContainingFolder(); }); + menu.AddItem("Open in Terminal").mOnMenuItemSelected.Add(new (menu) => { OpenInTerminal(); }); menu.AddItem("Copy Path").mOnMenuItemSelected.Add(new (menu) => { gApp.SetClipboardData("text", mPath.CStr(), (int32)mPath.Length + 1, true); }); @@ -174,6 +175,23 @@ namespace IDE.ui process.Start(psi).IgnoreError(); } + void OpenInTerminal() + { + if (!Directory.Exists(mPath)) + { + ShowNotFoundDialog(); + return; + } + + ProcessStartInfo psi = scope ProcessStartInfo(); + psi.SetFileName(gApp.mSettings.mEditorSettings.mDefaultConsole); + psi.UseShellExecute = true; + psi.SetWorkingDirectory(mPath); + + var process = scope SpawnedProcess(); + process.Start(psi).IgnoreError(); + } + void TryOpenWorkspace() { const String WORKSPACE_FILENAME = "BeefSpace.toml";