From 4a417e484c2f4ca430ba706b49b2838a4b8161af Mon Sep 17 00:00:00 2001 From: glopesdev Date: Sun, 14 Jul 2024 10:04:20 +0100 Subject: [PATCH] Add workflow editable status to explorer view --- Bonsai.Editor/ExplorerTreeView.cs | 59 +++++++++++++------ .../Properties/Resources.Designer.cs | 20 +++++++ Bonsai.Editor/Properties/Resources.resx | 23 +++++++- 3 files changed, 82 insertions(+), 20 deletions(-) diff --git a/Bonsai.Editor/ExplorerTreeView.cs b/Bonsai.Editor/ExplorerTreeView.cs index 9bdf637f..55344c6f 100644 --- a/Bonsai.Editor/ExplorerTreeView.cs +++ b/Bonsai.Editor/ExplorerTreeView.cs @@ -12,24 +12,25 @@ namespace Bonsai.Editor class ExplorerTreeView : ToolboxTreeView { bool activeDoubleClick; - readonly ImageList iconList; + readonly ImageList imageList; + readonly ImageList stateImageList; public ExplorerTreeView() { - iconList = new() - { - ColorDepth = ColorDepth.Depth8Bit, - ImageSize = new Size(16, 16), - TransparentColor = Color.Transparent - }; - StateImageList = iconList; + imageList = new(); + stateImageList = new(); + StateImageList = stateImageList; + ImageList = imageList; } protected override void ScaleControl(SizeF factor, BoundsSpecified specified) { - iconList.Images.Clear(); - iconList.Images.Add(Resources.StatusReadyImage); - iconList.Images.Add(Resources.StatusBlockedImage); + imageList.Images.Clear(); + stateImageList.Images.Clear(); + imageList.Images.Add(Resources.WorkflowEditableImage); + imageList.Images.Add(Resources.WorkflowReadOnlyImage); + stateImageList.Images.Add(Resources.StatusReadyImage); + stateImageList.Images.Add(Resources.StatusBlockedImage); base.ScaleControl(factor, specified); } @@ -61,9 +62,13 @@ public void UpdateWorkflow(string name, WorkflowBuilder workflowBuilder) Nodes.Clear(); var rootNode = Nodes.Add(name); - AddWorkflow(rootNode.Nodes, null, workflowBuilder.Workflow); + AddWorkflow(rootNode.Nodes, null, workflowBuilder.Workflow, ExplorerNodeType.Editable); - static void AddWorkflow(TreeNodeCollection nodes, WorkflowEditorPath basePath, ExpressionBuilderGraph workflow) + static void AddWorkflow( + TreeNodeCollection nodes, + WorkflowEditorPath basePath, + ExpressionBuilderGraph workflow, + ExplorerNodeType parentNodeType) { for (int i = 0; i < workflow.Count; i++) { @@ -71,11 +76,15 @@ static void AddWorkflow(TreeNodeCollection nodes, WorkflowEditorPath basePath, E if (ExpressionBuilder.Unwrap(builder) is IWorkflowExpressionBuilder workflowBuilder && workflowBuilder.Workflow != null) { + var nodeType = parentNodeType == ExplorerNodeType.ReadOnly || workflowBuilder is IncludeWorkflowBuilder + ? ExplorerNodeType.ReadOnly + : ExplorerNodeType.Editable; var displayName = ExpressionBuilder.GetElementDisplayName(builder); var builderPath = new WorkflowEditorPath(i, basePath); var node = nodes.Add(displayName); + node.ImageIndex = node.SelectedImageIndex = GetImageIndex(nodeType); node.Tag = builderPath; - AddWorkflow(node.Nodes, builderPath, workflowBuilder.Workflow); + AddWorkflow(node.Nodes, builderPath, workflowBuilder.Workflow, nodeType); } } } @@ -108,7 +117,17 @@ bool SelectNode(TreeNodeCollection nodes, WorkflowEditorPath path) return false; } - private static int GetImageIndex(ExplorerNodeStatus status) + private static int GetImageIndex(ExplorerNodeType status) + { + return status switch + { + ExplorerNodeType.Editable => 0, + ExplorerNodeType.ReadOnly => 1, + _ => throw new ArgumentException("Invalid node type.", nameof(status)) + }; + } + + private static int GetStateImageIndex(ExplorerNodeStatus status) { return status switch { @@ -120,7 +139,7 @@ private static int GetImageIndex(ExplorerNodeStatus status) public void SetNodeStatus(ExplorerNodeStatus status) { - var imageIndex = GetImageIndex(status); + var imageIndex = GetStateImageIndex(status); SetNodeImageIndex(Nodes, imageIndex); static void SetNodeImageIndex(TreeNodeCollection nodes, int index) @@ -139,7 +158,7 @@ static void SetNodeImageIndex(TreeNodeCollection nodes, int index) public void SetNodeStatus(IEnumerable pathElements, ExplorerNodeStatus status) { var nodes = Nodes; - var imageIndex = GetImageIndex(status); + var imageIndex = GetStateImageIndex(status); foreach (var path in pathElements.Prepend(null)) { var found = false; @@ -161,6 +180,12 @@ public void SetNodeStatus(IEnumerable pathElements, Explorer } } + enum ExplorerNodeType + { + Editable, + ReadOnly + } + enum ExplorerNodeStatus { Ready, diff --git a/Bonsai.Editor/Properties/Resources.Designer.cs b/Bonsai.Editor/Properties/Resources.Designer.cs index f9ef2ac9..998ec755 100644 --- a/Bonsai.Editor/Properties/Resources.Designer.cs +++ b/Bonsai.Editor/Properties/Resources.Designer.cs @@ -611,6 +611,16 @@ internal static string VisualizerLayoutOnNullWorkflow_Error { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap WorkflowEditableImage { + get { + object obj = ResourceManager.GetObject("WorkflowEditableImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized string similar to Externalized properties of this workflow can be configured below.. /// @@ -619,5 +629,15 @@ internal static string WorkflowPropertiesDescription { return ResourceManager.GetString("WorkflowPropertiesDescription", resourceCulture); } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap WorkflowReadOnlyImage { + get { + object obj = ResourceManager.GetObject("WorkflowReadOnlyImage", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/Bonsai.Editor/Properties/Resources.resx b/Bonsai.Editor/Properties/Resources.resx index 86579078..a0a0d351 100644 --- a/Bonsai.Editor/Properties/Resources.resx +++ b/Bonsai.Editor/Properties/Resources.resx @@ -153,7 +153,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vQAADr0BR/uQrQAAANRJREFUOE+1U8ENwjAMzBAMwAiMwAJMAI98kfgzGx86QqbgU5CCeOSHgi/YlZNY + vAAADrwBlbxySQAAANRJREFUOE+1U8ENwjAMzBAMwAiMwAJMAI98kfgzGx86QqbgU5CCeOSHgi/YlZNY SFBx0qmNfXdtWse1SCl54kDMDVHzLOtBzSUxPM6nPG43+bJwFVFDDxpo2fYGm+N1v+uMLW/HA0JiFUKL gAYE43pV2Bp1nUOCmD1eTUTPeyzUIVadt+MRMMieRQiI2KoVLXngRcD0JCvEMgvh7QJAHQJYZvA/AdqM q75vQyRg9kec9xt5FoJMIQTaLNT1apAAWpRRlmn8RHOUAQ757TBpUPOL4+zcCzIffKHxkkn8AAAAAElF @@ -163,7 +163,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAAMFJREFUOE9jQAffvn1LAOL9QPwfDYPEEqDKMAFQUgGIzx+9f/R/wbaC/8YzjVEw + vgAADr4B6kKxwAAAAMFJREFUOE9jQAffvn1LAOL9QPwfDYPEEqDKMAFQUgGIzx+9f/R/wbaC/8YzjVEw SAwkB1IDUgvVBgFQze9r9tRgaETHHYc6QIa8RzEEyDkPksCmARuGGnIepjkB5DR0RTff3PwfuSYSQxyG od5JABmwH5ufYWDmmZkYciAM0gPSCzIAqwJkgMs1IL1EGQAD6K6hnwGEvEBxIFIWjdC0cJ6YVAjDKAkJ BIAccFImJjViTcogADWEvMyEDICSJGRnBgYARwha+z9sKMcAAAAASUVORK5CYII= @@ -219,7 +219,7 @@ Copyright (c) .NET Foundation and Contributors iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wAAADsABataJCQAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC41ZYUyZQAAAKdJREFUOE+lkMEN + vQAADr0BR/uQrQAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC41ZYUyZQAAAKdJREFUOE+lkMEN wyAQBCktooV8U4KLyTuklnxSkJ0P300WaZ3jwDaSLY18HLeDTQDQkHPG7f5CuD4LrNnzc6Rp+PCRpFps hUVP8i9+Dzc1PD3eVVD1kEAn2ZAkjYANi8LECvyeKIKUEmKM5V1tOgHxs0ENiw1Y/Byz1S/0ZB6dLNbL UINDy/wpKGTXmlsv0QguowJlSFewx5Dg9BecFuxxKBhBGQDhC/DB5AQ227rCAAAAAElFTkSuQmCC @@ -344,4 +344,21 @@ NOTE: You will have to restart Bonsai for any changes to take effect. The specified workflow path does not resolve to a workflow expression builder node. + + + iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wAAADsABataJCQAAAH9JREFUOE/VjdEJwCAMRB2ls7ih/+7gHG7hBrY/+mk9iWKNVAqF0oMjJHmXiFcV + Y9xCCCY7dTaYEzIXBb1SKkkpm9FjfnsAH8bgcMAQypWXDdZaJ2ttqXWGPaFcfdg5V2DUfkYoF+CVCeXC + sn6Z+VF498el/0l49DK8MqGfSogTPS0oz8b0R/8AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wQAADsEBuJFr7QAAAJVJREFUOE+9kLENAyEQBCnFJbgEi1qoggKok4yAwAmCEHssTkL4/3UE9kob8Ghm + xZu/pJRyp+O4F8Ba65NuSwQOIXS6JZmWP7C1Vi9Zl3PO3Tmnk8wwgEAioaeCI3iVpJSuYe/9F0wvlwmX + 7/YjAfDpsgR4fusWTBAArD9MBRMRyGqMUQ8TBEv1sASgtfYYvY3Pv4wxL5igM/WVQzVaAAAAAElFTkSu + QmCC + + \ No newline at end of file