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

Allow starting editor session on a specified folder #1464

Merged
merged 5 commits into from
Jul 12, 2023
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Bonsai.Design/FolderBrowserDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Windows.Forms;

namespace Bonsai.Design
Expand Down Expand Up @@ -48,6 +49,14 @@ protected override bool RunDialog(IntPtr hwndOwner)
dialog.GetOptions(out uint options);
options |= FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM;
dialog.SetOptions(options);
if (!string.IsNullOrEmpty(SelectedPath) &&
SHCreateItemFromParsingName(
SelectedPath, pbc: null,
typeof(IShellItem).GUID,
out IShellItem selectedShellItem) == S_OK)
{
dialog.SetFolder(selectedShellItem);
}

if (dialog.Show(hwndOwner) == S_OK &&
dialog.GetResult(out IShellItem shellItem) == S_OK &&
Expand Down Expand Up @@ -175,6 +184,13 @@ interface IShellItem
uint Compare([In, MarshalAs(UnmanagedType.Interface)] IShellItem psi, [In] uint hint, out int piOrder);
}

[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
static extern uint SHCreateItemFromParsingName(
[MarshalAs(UnmanagedType.LPWStr)] string pszPath,
IBindCtx pbc,
[MarshalAs(UnmanagedType.LPStruct)] Guid riid,
[MarshalAs(UnmanagedType.Interface)] out IShellItem ppv);

#endregion
}
}
23 changes: 17 additions & 6 deletions Bonsai.Design/FolderNameEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ namespace Bonsai.Design
/// </summary>
public class FolderNameEditor : UITypeEditor
{
static readonly bool IsRunningOnMono = Type.GetType("Mono.Runtime") != null;

/// <inheritdoc/>
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
Expand All @@ -25,15 +27,24 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide
var editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (context != null && editorService != null)
{
using (var dialog = new FolderBrowserDialog())
var folderName = value as string;
if (!string.IsNullOrEmpty(folderName))
{
var folderName = value as string;
if (!string.IsNullOrEmpty(folderName))
folderName = Path.GetFullPath(folderName);
}
else folderName = Environment.CurrentDirectory;

if (IsRunningOnMono)
{
using var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = folderName };
if (dialog.ShowDialog() == DialogResult.OK)
{
dialog.SelectedPath = Path.GetFullPath(folderName);
return PathConvert.GetProjectPath(dialog.SelectedPath);
}
else dialog.SelectedPath = Environment.CurrentDirectory;

}
else
{
using var dialog = new FolderBrowserDialog { SelectedPath = folderName };
if (dialog.ShowDialog() == DialogResult.OK)
{
return PathConvert.GetProjectPath(dialog.SelectedPath);
Expand Down
4 changes: 3 additions & 1 deletion Bonsai.Editor/StartScreen.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 32 additions & 18 deletions Bonsai.Editor/StartScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ public partial class StartScreen : Form
bool tabSelect;
readonly List<Image> customImages = new List<Image>();
readonly ComponentResourceManager resources = new ComponentResourceManager(typeof(StartScreen));
readonly TreeNode newProjectNode = new TreeNode("New Project", 0, 0);
readonly TreeNode openProjectNode = new TreeNode("Open Project", 1, 1);
readonly TreeNode galleryNode = new TreeNode("Bonsai Gallery", 2, 2);
readonly TreeNode packageManagerNode = new TreeNode("Manage Packages", 3, 3);
readonly TreeNode newFileNode = new TreeNode("New File", 0, 0);
readonly TreeNode openFileNode = new TreeNode("Open File", 1, 1);
readonly TreeNode openFolderNode = new TreeNode("Open Folder", 2, 2);
readonly TreeNode galleryNode = new TreeNode("Bonsai Gallery", 3, 3);
readonly TreeNode packageManagerNode = new TreeNode("Manage Packages", 4, 4);
readonly TreeNode documentationNode = new TreeNode("Documentation");
readonly TreeNode forumNode = new TreeNode("Forums");

Expand All @@ -26,28 +27,32 @@ public StartScreen()
InitializeComponent();
getStartedTreeView.Nodes.Add(documentationNode);
getStartedTreeView.Nodes.Add(forumNode);
openTreeView.Nodes.Add(newProjectNode);
openTreeView.Nodes.Add(openProjectNode);
openTreeView.Nodes.Add(newFileNode);
openTreeView.Nodes.Add(openFileNode);
if (!EditorSettings.IsRunningOnMono)
{
openTreeView.Nodes.Add(openFolderNode);
}
openTreeView.Nodes.Add(galleryNode);
openTreeView.Nodes.Add(packageManagerNode);
FileName = string.Empty;
}

public EditorResult EditorResult { get; private set; }

public string FileName
{
get { return openWorkflowDialog.FileName; }
}
public string FileName { get; private set; }

private void ActivateNode(TreeNode node)
{
if (node == documentationNode) EditorDialog.ShowDocs();
if (node == forumNode) EditorDialog.ShowForum();
if (node == newProjectNode) EditorResult = EditorResult.ReloadEditor;
if (node == newFileNode) EditorResult = EditorResult.ReloadEditor;
if (node == galleryNode) EditorResult = EditorResult.OpenGallery;
if (node == packageManagerNode) EditorResult = EditorResult.ManagePackages;
if (node == openProjectNode && openWorkflowDialog.ShowDialog() == DialogResult.OK)
if (node == openFileNode && openWorkflowDialog.ShowDialog() == DialogResult.OK ||
node == openFolderNode && openFolderDialog.ShowDialog() == DialogResult.OK)
{
FileName = node == openFileNode ? openWorkflowDialog.FileName : openFolderDialog.SelectedPath;
EditorResult = EditorResult.ReloadEditor;
}

Expand Down Expand Up @@ -87,6 +92,12 @@ protected override void OnLoad(EventArgs e)
foreach (var file in recentlyUsedFiles)
{
recentFileView.Nodes.Add(Path.GetFileName(file.FileName), file.FileName);
if (string.IsNullOrEmpty(openWorkflowDialog.InitialDirectory))
{
var initialDirectory = Path.GetDirectoryName(file.FileName);
openWorkflowDialog.InitialDirectory = initialDirectory;
openFolderDialog.SelectedPath = initialDirectory;
}
}

openTreeView.Select();
Expand All @@ -110,8 +121,9 @@ protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
Math.Min(MaxImageSize, (int)(16 * factor.Height)),
Math.Min(MaxImageSize, (int)(16 * factor.Height)));

var newItemImage = (Image)(resources.GetObject("newToolStripMenuItem.Image"));
var openItemImage = (Image)(resources.GetObject("openToolStripMenuItem.Image"));
var newFileImage = (Image)resources.GetObject("newToolStripMenuItem.Image");
var openFileImage = (Image)resources.GetObject("openFileToolStripMenuItem.Image");
var openFolderImage = (Image)resources.GetObject("openToolStripMenuItem.Image");
var galleryItemImage = (Image)(resources.GetObject("galleryToolStripMenuItem.Image"));
var packageManagerItemImage = (Image)(resources.GetObject("packageManagerToolStripMenuItem.Image"));
var editorTheme = EditorSettings.Instance.EditorTheme;
Expand All @@ -129,14 +141,16 @@ protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
recentFileView.BackColor = ThemeHelper.Invert(systemMenuColor);
recentFileView.ForeColor = ThemeHelper.Invert(recentFileView.ForeColor);
recentFileView.LineColor = ThemeHelper.Invert(recentFileView.LineColor);
customImages.Add(newItemImage = ThemeHelper.InvertScale(newItemImage, iconList.ImageSize));
customImages.Add(openItemImage = ThemeHelper.InvertScale(openItemImage, iconList.ImageSize));
customImages.Add(newFileImage = ThemeHelper.InvertScale(newFileImage, iconList.ImageSize));
customImages.Add(openFileImage = ThemeHelper.InvertScale(openFileImage, iconList.ImageSize));
customImages.Add(openFolderImage = ThemeHelper.InvertScale(openFolderImage, iconList.ImageSize));
customImages.Add(galleryItemImage = ThemeHelper.InvertScale(galleryItemImage, iconList.ImageSize));
customImages.Add(packageManagerItemImage = ThemeHelper.InvertScale(packageManagerItemImage, iconList.ImageSize));
}

iconList.Images.Add(newItemImage);
iconList.Images.Add(openItemImage);
iconList.Images.Add(newFileImage);
iconList.Images.Add(openFileImage);
iconList.Images.Add(openFolderImage);
iconList.Images.Add(galleryItemImage);
iconList.Images.Add(packageManagerItemImage);
base.ScaleControl(factor, specified);
Expand Down
32 changes: 22 additions & 10 deletions Bonsai.Editor/StartScreen.resx
Original file line number Diff line number Diff line change
Expand Up @@ -124,31 +124,43 @@
<data name="openWorkflowDialog.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>17, 17</value>
</data>
<data name="openFolderDialog.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>277, 17</value>
</data>
<data name="galleryToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAACYAAAAmAfhOc6sAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwa
AAABNklEQVQ4T52Sy0rDQBSGs/JBRBDduFUQFyq1SgVBFAq68C3EC4IgCCKulOrGy9LLQlofJa0P0XRS
nMxMiJlfz3SCRk3T+MFPmDPn/OfMIc4P8A+lQBEov1f2hb0aDMo3RUWVYM/prlpIqOc6RO3KfHUg7E2P
vgZRswU2W0JwfILu5hbaw6PoTM0gcl2b0ceAOlOxuLiEVgqIY/hrVfiVFbC5BWgpTV6mAY3rjU9APTxB
h6GJGbRGt7oBVW+YY6YBdQ5OzxB7HsLGC9T9I8R5DXxn3zyF7olMA5qAlZbQHhmDv7oOeXNnChPlTkDb
poV1JqfBD4+gOYe8vjUxNl/O3wERuU2wxWXwvQNT/La9C1au4L31ajNyDAjqROPSf0C7SDon2KLv+hUY
RCk+A0MF9KdBYVkc5wMNv1IGxf8/cAAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA
JAAAACQBh7CwIgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE2SURBVDhPnZLL
SsNAFIaz8kFEEN24VRAXKrVKBUEUCrrwLcQLgiAIIq6U6sbL0stCWh8lrQ/RdFKczEyImV/PdIJGTdP4
wU+YM+f858whzg/wD6VAESi/V/aFvRoMyjdFRZVgz+muWkio5zpE7cp8dSDsTY++BlGzBTZbQnB8gu7m
FtrDo+hMzSByXZvRx4A6U7G4uIRWCohj+GtV+JUVsLkFaClNXqYBjeuNT0A9PEGHoYkZtEa3ugFVb5hj
pgF1Dk7PEHsewsYL1P0jxHkNfGffPIXuiUwDmoCVltAeGYO/ug55c2cKE+VOQNumhXUmp8EPj6A5h7y+
NTE2X87fARG5TbDFZfC9A1P8tr0LVq7gvfVqM3IMCOpE49J/QLtIOifYou/6FRhEKT4DQwX0p0FhWRzn
Aw2/UgbF/z9wAAAAAElFTkSuQmCC
</value>
</data>
<data name="newToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAMRJREFUOE/NkjsOAiEYhDmCtSew9AycyAtYyjVsPImJhRWHsLESjUCLDv4T2V1Y
wQAADsEBuJFr7QAAAMRJREFUOE/NkjsOAiEYhDmCtSew9AycyAtYyjVsPImJhRWHsLESjUCLDv4T2V1Y
X42TTDbAzLf/PlSpEMLCOTeJMSYaa+xLpK17aC0li+t2OSUkr3Eu0aFwB4R2q1k67De5SADW2BdIfRIZ
2zJ8PR1zAdcCapGTSlcI0yw37Lz3c6k9hUOMXDx30loPbIypQ1iCOQEKZ3fpuAnpv4MxQAmRev0r1AA0
zpCR+kP9/+BjAIRJ+Cd+BaD+BzDml4B3LPFfpNQN8wIwvWiZlr0AAAAASUVORK5CYII=
</value>
</data>
<data name="openFileToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wAAADsABataJCQAAAMRJREFUOE9jgIHv37////btGwr+8ePHf6g0ceDLly//9YrW/mcInvM/ZsI+sCE/
f/4kbAhIEczW528+YBiCjlEMBXFWHr71nz92EVgTOu5afx6sycnJCYzb2trA/F+/fkEMAXFAmkG2XX/0
GiwJYoM0g1wCctGH9x/BGN0QuAEgxTvPPsDQfPvhU7hmZANQDAER6C6AYWTN6AaAMNgAUBiAbIeFAUgQ
JImuGR3DDQAB5FggywBkMGoAFQ0gBuM0gHj87T8Ac76PyhFBSacAAAAASUVORK5CYII=
</value>
</data>
<data name="openToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAARxJREFUOE+VkrGqwjAUhvsG9z6J3Ee49BVcWlBw6F7wCZw6qrMIF1TodB9Ah+6d
wQAADsEBuJFr7QAAARxJREFUOE+VkrGqwjAUhvsG9z6J3Ee49BVcWlBw6F7wCZw6qrMIF1TodB9Ah+6d
XAqiLsVBB4X0atqO5+aENiRNoxj4SM/J//9Nm1j1oJR+FUVBGCBBsF9JXg8Uny8Z6Qx/werOoTeNeEiF
HCyorJbFikndvNwykEPiOAbbtjVEAJpn6wQ++gtuaoJr9/sDMvInaAZwM75td7pqO6APKkyIElCW5Td/
YOJn5iZPd4A1YjIjIqAWy/8A6zaTjBKAhed5EEURpGnKF7DXRlvA1vd9TWhis96oAXmej8Iw1IQmxuOJ
Expand Down
12 changes: 10 additions & 2 deletions Bonsai/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,16 @@ internal static int Main(string[] args)
else editorArgs.Add(SuppressBootstrapCommand);
if (!string.IsNullOrEmpty(initialFileName))
{
editorArgs.Add(initialFileName);
workingDirectory = Path.GetDirectoryName(initialFileName);
if (Directory.Exists(initialFileName))
{
workingDirectory = initialFileName;
initialFileName = string.Empty;
}
else
{
editorArgs.Add(initialFileName);
workingDirectory = Path.GetDirectoryName(initialFileName);
}
}
}

Expand Down
Loading