Improve scene/treeview/SelectedObjectPanel selection behaviors
- Issue MatterHackers/MCCentral#4434 Scene selection change not firing treeview/editor selection change
This commit is contained in:
parent
052e3c1fb1
commit
32836d0793
3 changed files with 51 additions and 45 deletions
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue