Improve scene/treeview/SelectedObjectPanel selection behaviors

- Issue MatterHackers/MCCentral#4434
Scene selection change not firing treeview/editor selection change
This commit is contained in:
John Lewin 2018-10-31 22:13:59 -07:00
parent 052e3c1fb1
commit 32836d0793
3 changed files with 51 additions and 45 deletions

View file

@ -54,7 +54,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
// Suppress MeshWrapper and OperationSource nodes in tree
bool shouldCollapseToParent = item.Source is ModifiedMeshObject3D || item.Source is OperationSourceObject3D;
var contextNode = (shouldCollapseToParent && parent != null) ? parent : AddItem(item, parent, theme);
var contextNode = (shouldCollapseToParent && parent != null) ? parent : AddItem(item, parent, keyValues, theme);
using (contextNode.LayoutLock())
{
@ -67,9 +67,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
if (child != null)
{
var newNode = AddTree(BuildItemView(child), contextNode, keyValues, theme);
keyValues?.Add(child, newNode);
AddTree(BuildItemView(child), contextNode, keyValues, theme);
}
}
}
@ -78,7 +76,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
return contextNode;
}
private static TreeNode AddItem(ObjectView item, TreeNode parentNode, ThemeConfig theme)
private static TreeNode AddItem(ObjectView item, TreeNode parentNode, Dictionary<IObject3D, TreeNode> keyValues, ThemeConfig theme)
{
if(item.Source is InsertionGroupObject3D insertionGroup)
{
@ -99,6 +97,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
PointSize = theme.DefaultFontSize,
};
keyValues.Add(item.Source, node);
// Check for operation resulting in the given type
if (ApplicationController.Instance.Thumbnails.OperationIcons.TryGetValue(item.Source.GetType(), out Func<ImageBuffer> iconSource))
{

View file

@ -27,14 +27,10 @@ of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using JsonPath;
using MatterHackers.Agg;
using MatterHackers.Agg.Image;
using MatterHackers.Agg.Platform;
using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D;
@ -43,8 +39,6 @@ using MatterHackers.MatterControl.CustomWidgets;
using MatterHackers.MatterControl.DesignTools;
using MatterHackers.MatterControl.Library;
using MatterHackers.MatterControl.SlicerConfiguration;
using MatterHackers.MeshVisualizer;
using MatterHackers.VectorMath;
using static JsonPath.JsonPathContext.ReflectionValueSystem;
namespace MatterHackers.MatterControl.PartPreviewWindow
@ -176,6 +170,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public void SetActiveItem(IObject3D selectedItem)
{
if (this.item == selectedItem)
{
return;
}
this.item = selectedItem;
editorPanel.CloseAllChildren();

View file

@ -178,39 +178,42 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
Margin = new BorderDouble(left: theme.DefaultContainerPadding + 12),
};
treeView.AfterSelect += (s, e) =>
{
// Ignore AfterSelect events if they're being driven by a SelectionChanged event
if (!assigningTreeNode)
{
Scene.SelectedItem = (IObject3D)treeView.SelectedNode.Tag;
}
selectedObjectPanel.SetActiveItem((IObject3D)treeView.SelectedNode.Tag);
};
treeView.NodeMouseClick += (s, e) =>
{
if (e is MouseEventArgs sourceEvent
&& s is GuiWidget clickedWidget
&& sourceEvent.Button == MouseButtons.Right)
&& s is GuiWidget clickedWidget)
{
UiThread.RunOnIdle(() =>
if (sourceEvent.Button == MouseButtons.Right)
{
var menu = ApplicationController.Instance.GetActionMenuForSceneItem((IObject3D)treeView.SelectedNode.Tag, Scene, true);
UiThread.RunOnIdle(() =>
{
var menu = ApplicationController.Instance.GetActionMenuForSceneItem((IObject3D)treeView.SelectedNode.Tag, Scene, true);
var systemWindow = this.Parents<SystemWindow>().FirstOrDefault();
systemWindow.ShowPopup(
new MatePoint(clickedWidget)
{
Mate = new MateOptions(MateEdge.Left, MateEdge.Top),
AltMate = new MateOptions(MateEdge.Left, MateEdge.Top)
},
new MatePoint(menu)
{
Mate = new MateOptions(MateEdge.Left, MateEdge.Top),
AltMate = new MateOptions(MateEdge.Right, MateEdge.Top)
},
altBounds: new RectangleDouble(sourceEvent.X + 1, sourceEvent.Y + 1, sourceEvent.X + 1, sourceEvent.Y + 1));
});
var systemWindow = this.Parents<SystemWindow>().FirstOrDefault();
systemWindow.ShowPopup(
new MatePoint(clickedWidget)
{
Mate = new MateOptions(MateEdge.Left, MateEdge.Top),
AltMate = new MateOptions(MateEdge.Left, MateEdge.Top)
},
new MatePoint(menu)
{
Mate = new MateOptions(MateEdge.Left, MateEdge.Top),
AltMate = new MateOptions(MateEdge.Right, MateEdge.Top)
},
altBounds: new RectangleDouble(sourceEvent.X + 1, sourceEvent.Y + 1, sourceEvent.X + 1, sourceEvent.Y + 1));
});
}
else
{
// Ignore AfterSelect events if they're being driven by a SelectionChanged event
if (!assigningTreeNode)
{
Scene.SelectedItem = (IObject3D)treeView.SelectedNode.Tag;
}
// selectedObjectPanel.SetActiveItem((IObject3D)treeView.SelectedNode.Tag);
}
}
};
treeView.ScrollArea.ChildAdded += (s, e) =>
@ -393,13 +396,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
var rootNode = Object3DTreeBuilder.BuildTree(child, keyValues, theme);
treeNodeContainer.AddChild(rootNode);
rootNode.TreeView = treeView;
}
if (this.Parent != null)
{
assigningTreeNode = true;
treeView.SelectedNode = rootNode;
assigningTreeNode = false;
}
// Ensure selectedItem is selected
var selectedItem = sceneContext.Scene.SelectedItem;
if (selectedItem != null
&& keyValues.TryGetValue(selectedItem, out TreeNode treeNode))
{
treeView.SelectedNode = treeNode;
}
}
@ -1817,10 +1821,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
if (selectedItem == null)
{
this.Scene.ClearSelection();
// Clear the TreeView and release node references when no item is selected
selectedObjectPanel.SetActiveItem(null);
treeView.SelectedNode = null;
return;
}
else
@ -1830,6 +1835,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
treeView.SelectedNode = treeNode;
}
selectedObjectPanel.SetActiveItem(selectedItem);
}
if (deferEditorTillMouseUp)