Merge pull request #3375 from jlewin/design_tools

Use generic rather than printer scope
This commit is contained in:
johnlewin 2018-06-01 13:00:18 -07:00 committed by GitHub
commit d7f0ae4efb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 129 additions and 142 deletions

View file

@ -660,6 +660,42 @@ namespace MatterHackers.MatterControl
} }
} }
} }
public double SceneTreeHeight
{
get
{
if (double.TryParse(UserSettings.Instance.get(UserSettingsKey.SceneTreeHeight), out double controlHeight))
{
return Math.Max(controlHeight, 35);
}
return 35;
}
set
{
var minimumValue = Math.Max(value, 35);
UserSettings.Instance.set(UserSettingsKey.SceneTreeHeight, minimumValue.ToString());
}
}
public double SelectedObjectEditorHeight
{
get
{
if (double.TryParse(UserSettings.Instance.get(UserSettingsKey.SelectedObjectEditorHeight), out double controlHeight))
{
return Math.Max(controlHeight, 35);
}
return 120;
}
set
{
var minimumValue = Math.Max(value, 35);
UserSettings.Instance.set(UserSettingsKey.SelectedObjectEditorHeight, minimumValue.ToString());
}
}
} }
public class PrinterViewState public class PrinterViewState
@ -768,42 +804,6 @@ namespace MatterHackers.MatterControl
UserSettings.Instance.set(UserSettingsKey.SelectedObjectPanelWidth, minimumValue.ToString()); UserSettings.Instance.set(UserSettingsKey.SelectedObjectPanelWidth, minimumValue.ToString());
} }
} }
public double SceneTreeHeight
{
get
{
if (double.TryParse(UserSettings.Instance.get(UserSettingsKey.SceneTreeHeight), out double controlHeight))
{
return Math.Max(controlHeight, 35);
}
return 35;
}
set
{
var minimumValue = Math.Max(value, 35);
UserSettings.Instance.set(UserSettingsKey.SceneTreeHeight, minimumValue.ToString());
}
}
public double SelectedObjectEditorHeight
{
get
{
if (double.TryParse(UserSettings.Instance.get(UserSettingsKey.SelectedObjectEditorHeight), out double controlHeight))
{
return Math.Max(controlHeight, 35);
}
return 120;
}
set
{
var minimumValue = Math.Max(value, 35);
UserSettings.Instance.set(UserSettingsKey.SelectedObjectEditorHeight, minimumValue.ToString());
}
}
} }
public class PrinterConfig public class PrinterConfig

View file

@ -90,10 +90,18 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
this.TitleBar.AddChild(expandCheckBox); this.TitleBar.AddChild(expandCheckBox);
this.SelectionBar = new FlowLayoutWidget()
{
VAnchor = VAnchor.Fit,
HAnchor = HAnchor.Fit,
Selectable = false
};
this.TitleBar.AddChild(this.SelectionBar);
// add a check box // add a check box
if (Image != null) if (Image != null)
{ {
this.TitleBar.AddChild(imageWidget = new ImageWidget(this.Image) this.SelectionBar.AddChild(imageWidget = new ImageWidget(this.Image)
{ {
VAnchor = VAnchor.Center, VAnchor = VAnchor.Center,
BackgroundColor = new Color(theme.Colors.PrimaryTextColor, 12), BackgroundColor = new Color(theme.Colors.PrimaryTextColor, 12),
@ -101,7 +109,9 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
Selectable = false Selectable = false
}); });
}; };
this.TitleBar.AddChild(textWidget = new TextWidget(this.Text, pointSize: theme.DefaultFontSize, textColor: theme.Colors.PrimaryTextColor)
this.SelectionBar.AddChild(textWidget = new TextWidget(this.Text, pointSize: theme.DefaultFontSize, textColor: theme.Colors.PrimaryTextColor)
{ {
Selectable = false, Selectable = false,
AutoExpandBoundsToText = true, AutoExpandBoundsToText = true,
@ -113,7 +123,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
HAnchor = HAnchor.Fit | HAnchor.Left, HAnchor = HAnchor.Fit | HAnchor.Left,
Visible = false, // content starts out not visible Visible = false, // content starts out not visible
Name = "content", Name = "content",
Margin = new BorderDouble(25, 3), Margin = new BorderDouble(12, 3),
}; };
AddChild(content); AddChild(content);
@ -122,6 +132,8 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
public FlowLayoutWidget TitleBar { get; } public FlowLayoutWidget TitleBar { get; }
public FlowLayoutWidget SelectionBar { get; }
public void BeginEdit() public void BeginEdit()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -378,7 +390,14 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
// A TreeView that represents the parent tree view that the // A TreeView that represents the parent tree view that the
// tree node is assigned to, or null if the node has not been assigned to a tree // tree node is assigned to, or null if the node has not been assigned to a tree
// view. // view.
public virtual TreeView TreeView => NodeParent.TreeView;
private TreeView _treeView;
public virtual TreeView TreeView
{
get => _treeView ?? NodeParent.TreeView;
set => _treeView = value;
}
private void OnImageChanged(EventArgs args) private void OnImageChanged(EventArgs args)
{ {

View file

@ -29,40 +29,32 @@ either expressed or implied, of the FreeBSD Project.
using System; using System;
using System.Collections; using System.Collections;
using System.Linq;
using MatterHackers.Agg; using MatterHackers.Agg;
using MatterHackers.Agg.UI; using MatterHackers.Agg.UI;
using MatterHackers.VectorMath; using MatterHackers.VectorMath;
namespace MatterHackers.MatterControl.CustomWidgets.TreeView namespace MatterHackers.MatterControl.CustomWidgets.TreeView
{ {
public class TopNode : TreeNode public interface IVisualLeafNode
{ {
internal TreeView treeView;
public override TreeView TreeView => treeView;
} }
public class TreeView : ScrollableWidget public class TreeView : ScrollableWidget
{ {
private ThemeConfig theme; private ThemeConfig theme;
public TreeView(TopNode topNode, ThemeConfig theme) public TreeView(ThemeConfig theme)
: this(topNode, 0, 0, theme) : this(0, 0, theme)
{ {
} }
public TreeView(TopNode topNode, int width, int height, ThemeConfig theme) public TreeView(int width, int height, ThemeConfig theme)
: base(width, height) : base(width, height)
{ {
this.theme = theme; this.theme = theme;
this.AutoScroll = true; this.AutoScroll = true;
this.HAnchor = HAnchor.Stretch; this.HAnchor = HAnchor.Stretch;
this.VAnchor = VAnchor.Stretch; this.VAnchor = VAnchor.Stretch;
this.TopNode = topNode;
topNode.treeView = this;
this.AddChild(TopNode);
} }
#region Events #region Events
@ -207,19 +199,20 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
public TreeNode SelectedNode public TreeNode SelectedNode
{ {
get => _selectedNode; set get => _selectedNode;
set
{ {
if (value != _selectedNode) if (value != _selectedNode)
{ {
OnBeforeSelect(null); OnBeforeSelect(null);
foreach (var node in this.Descendants<TreeNode>().Where((c) => c != value)) if (_selectedNode != null)
{ {
node.TitleBar.BackgroundColor = Color.Transparent; _selectedNode.SelectionBar.BackgroundColor = Color.Transparent;
} }
_selectedNode = value; _selectedNode = value;
_selectedNode.TitleBar.BackgroundColor = theme.AccentMimimalOverlay; _selectedNode.SelectionBar.BackgroundColor = theme.AccentMimimalOverlay;
OnAfterSelect(null); OnAfterSelect(null);
} }
} }
@ -230,7 +223,6 @@ namespace MatterHackers.MatterControl.CustomWidgets.TreeView
public bool ShowPlusMinus { get; set; } public bool ShowPlusMinus { get; set; }
public bool ShowRootLines { get; set; } public bool ShowRootLines { get; set; }
public bool Sorted { get; set; } public bool Sorted { get; set; }
public TreeNode TopNode { get; }
public IComparer TreeViewNodeSorter { get; set; } public IComparer TreeViewNodeSorter { get; set; }

View file

@ -250,7 +250,7 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
return currentTransform; return currentTransform;
} }
public static Vector3 GetCenter(this IObject3D item) public static Vector3 GetCenter(this IObject3D item)
{ {
return item.GetAxisAlignedBoundingBox(Matrix4X4.Identity).Center; return item.GetAxisAlignedBoundingBox(Matrix4X4.Identity).Center;

View file

@ -37,6 +37,7 @@ using MatterHackers.Agg.VertexSource;
using MatterHackers.DataConverters3D; using MatterHackers.DataConverters3D;
using MatterHackers.DataConverters3D.UndoCommands; using MatterHackers.DataConverters3D.UndoCommands;
using MatterHackers.Localizations; using MatterHackers.Localizations;
using MatterHackers.MatterControl.CustomWidgets.TreeView;
using MatterHackers.MatterControl.DesignTools.Operations; using MatterHackers.MatterControl.DesignTools.Operations;
using MatterHackers.VectorMath; using MatterHackers.VectorMath;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -44,7 +45,7 @@ using Newtonsoft.Json.Converters;
namespace MatterHackers.MatterControl.DesignTools namespace MatterHackers.MatterControl.DesignTools
{ {
public class TextObject3D : Object3D, IPublicPropertyObject public class TextObject3D : Object3D, IPublicPropertyObject, IVisualLeafNode
{ {
public TextObject3D() public TextObject3D()
{ {

View file

@ -31,52 +31,33 @@ using MatterHackers.Agg.UI;
using MatterHackers.DataConverters3D; using MatterHackers.DataConverters3D;
using MatterHackers.MatterControl.CustomWidgets; using MatterHackers.MatterControl.CustomWidgets;
using MatterHackers.MatterControl.CustomWidgets.TreeView; using MatterHackers.MatterControl.CustomWidgets.TreeView;
using MatterHackers.MatterControl.DesignTools;
using MatterHackers.MatterControl.Library; using MatterHackers.MatterControl.Library;
using MatterHackers.MatterControl.PartPreviewWindow.View3D;
namespace MatterHackers.MatterControl.PartPreviewWindow namespace MatterHackers.MatterControl.PartPreviewWindow
{ {
public static class Object3DTreeBuilder public static class Object3DTreeBuilder
{ {
public static TreeView GetPartTreeView(IObject3D rootItem, ThemeConfig theme) public static TreeNode BuildTree(IObject3D rootItem, ThemeConfig theme)
{ {
var topNode = new TopNode() return AddTree(rootItem, null, theme);
{
Text = BuildDefaultName(rootItem),
Tag = rootItem,
TextColor = theme.Colors.PrimaryTextColor,
PointSize = theme.DefaultFontSize
};
var treeView = new TreeView(topNode, theme)
{
TextColor = theme.Colors.PrimaryTextColor,
PointSize = theme.DefaultFontSize
};
treeView.SuspendLayout();
//selectionTreeNodes.Clear();
//selectionTreeNodes.Add(rootItem, topNode);
// add the children to the root node
foreach (var child in rootItem.Children)
{
AddTree(child, topNode, theme);
}
treeView.ResumeLayout();
return treeView;
} }
private static void AddTree(IObject3D item, TreeNode parent, ThemeConfig theme) private static TreeNode AddTree(IObject3D item, TreeNode parent, ThemeConfig theme)
{ {
var node = AddItem(item, parent, theme); // Suppress MeshWrapper nodes in treeview - retain parent node as context reference
var contextNode = (item is MeshWrapper) ? parent : AddItem(item, parent, theme);
foreach (var child in item.Children) if (!(item is IVisualLeafNode))
{ {
AddTree(child, node, theme); foreach (var child in item.Children)
{
AddTree(child, contextNode, theme);
}
} }
return contextNode;
} }
private static TreeNode AddItem(IObject3D item, TreeNode parentNode, ThemeConfig theme) private static TreeNode AddItem(IObject3D item, TreeNode parentNode, ThemeConfig theme)
@ -108,12 +89,16 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
iconView.ImageSet += (s1, e1) => iconView.ImageSet += (s1, e1) =>
{ {
node.Image = iconView.imageWidget.Image; node.Image = iconView.imageWidget.Image;
node.Invalidate();
}; };
}; };
} }
parentNode.Nodes.Add(node); if (parentNode != null)
parentNode.Expanded = true; {
parentNode.Nodes.Add(node);
parentNode.Expanded = true;
}
return node; return node;
} }

View file

@ -48,9 +48,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private IObject3D item = new Object3D(); private IObject3D item = new Object3D();
private ThemeConfig theme; private ThemeConfig theme;
private BedConfig sceneContext;
private View3DWidget view3DWidget; private View3DWidget view3DWidget;
private InteractiveScene scene;
private PrinterConfig printer;
private SectionWidget editorSection; private SectionWidget editorSection;
private TextButton editButton; private TextButton editButton;
@ -58,7 +57,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private InlineTitleEdit inlineTitleEdit; private InlineTitleEdit inlineTitleEdit;
private BottomResizeContainer editorColumn; private BottomResizeContainer editorColumn;
public SelectedObjectPanel(View3DWidget view3DWidget, InteractiveScene scene, ThemeConfig theme, PrinterConfig printer) public SelectedObjectPanel(View3DWidget view3DWidget, BedConfig sceneContext, ThemeConfig theme)
: base(FlowDirection.TopToBottom) : base(FlowDirection.TopToBottom)
{ {
this.HAnchor = HAnchor.Stretch; this.HAnchor = HAnchor.Stretch;
@ -66,8 +65,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
this.Padding = 0; this.Padding = 0;
this.view3DWidget = view3DWidget; this.view3DWidget = view3DWidget;
this.theme = theme; this.theme = theme;
this.scene = scene; this.sceneContext = sceneContext;
this.printer = printer;
this.ContentPanel = new FlowLayoutWidget(FlowDirection.TopToBottom) this.ContentPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
{ {
@ -91,7 +89,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Absolute, VAnchor = VAnchor.Absolute,
Height = printer.ViewState.SelectedObjectEditorHeight Height = sceneContext.ViewState.SelectedObjectEditorHeight
}; };
var toolbar = new Toolbar(theme) var toolbar = new Toolbar(theme)
@ -102,6 +100,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}; };
editorColumn.AddChild(toolbar); editorColumn.AddChild(toolbar);
var scene = sceneContext.Scene;
editButton = new TextButton("Edit".Localize(), theme) editButton = new TextButton("Edit".Localize(), theme)
{ {
BackgroundColor = theme.MinimalShade, BackgroundColor = theme.MinimalShade,
@ -252,11 +252,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public void SetActiveItem(IObject3D selectedItem) public void SetActiveItem(IObject3D selectedItem)
{ {
if (!scene.HasSelection)
{
this.Parent.Visible = false;
return;
}
var selectedItemType = selectedItem.GetType(); var selectedItemType = selectedItem.GetType();
@ -266,8 +261,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
this.item = selectedItem; this.item = selectedItem;
var viewMode = printer?.ViewState.ViewMode;
HashSet<IObject3DEditor> mappedEditors = ApplicationController.Instance.GetEditorsForType(selectedItemType); HashSet<IObject3DEditor> mappedEditors = ApplicationController.Instance.GetEditorsForType(selectedItemType);
var activeEditors = new List<(IObject3DEditor, IObject3D, string)>(); var activeEditors = new List<(IObject3DEditor, IObject3D, string)>();
@ -358,7 +351,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
button.EnsureAvailablity(); button.EnsureAvailablity();
button.Click += (s, e) => button.Click += (s, e) =>
{ {
nodeOperation.Operation(selectedItem, scene).ConfigureAwait(false); nodeOperation.Operation(selectedItem, sceneContext.Scene).ConfigureAwait(false);
}; };
buttons.Add(button); buttons.Add(button);
@ -410,7 +403,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public override void OnClosed(ClosedEventArgs e) public override void OnClosed(ClosedEventArgs e)
{ {
printer.ViewState.SelectedObjectEditorHeight = editorColumn.Height; sceneContext.ViewState.SelectedObjectEditorHeight = editorColumn.Height;
base.OnClosed(e); base.OnClosed(e);
} }
} }

View file

@ -149,7 +149,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
TrackballTumbleWidget.TransformState = TrackBallTransformType.Rotation; TrackballTumbleWidget.TransformState = TrackBallTransformType.Rotation;
selectedObjectPanel = new SelectedObjectPanel(this, Scene, theme, printer) selectedObjectPanel = new SelectedObjectPanel(this, sceneContext, theme)
{ {
VAnchor = VAnchor.Stretch, VAnchor = VAnchor.Stretch,
}; };
@ -187,12 +187,23 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{ {
HAnchor = HAnchor.Stretch, HAnchor = HAnchor.Stretch,
VAnchor = VAnchor.Absolute, VAnchor = VAnchor.Absolute,
Height = Printer.ViewState.SceneTreeHeight Height = sceneContext.ViewState.SceneTreeHeight
}; };
modelViewSidePanel.AddChild(treeSection); modelViewSidePanel.AddChild(treeSection);
// add the tree view // add the tree view
this.RebuildTreeSection(new Object3D(), theme); treeView = new TreeView(theme)
{
TextColor = theme.Colors.PrimaryTextColor,
PointSize = theme.DefaultFontSize,
HAnchor =HAnchor.Stretch,
VAnchor = VAnchor.Stretch
};
treeView.AfterSelect += (s, e) =>
{
selectedObjectPanel.SetActiveItem((IObject3D)treeView.SelectedNode.Tag);
};
treeSection.AddChild(treeView);
modelViewSidePanel.AddChild(selectedObjectPanel); modelViewSidePanel.AddChild(selectedObjectPanel);
splitContainer.AddChild(modelViewSidePanel); splitContainer.AddChild(modelViewSidePanel);
@ -236,24 +247,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
} }
} }
private void RebuildTreeSection(IObject3D selection, ThemeConfig theme)
{
treeSection.CloseAllChildren();
treeView = Object3DTreeBuilder.GetPartTreeView(selection, theme);
treeSection.AddChild(treeView);
treeView.AfterSelect += (s, e) =>
{
selectedObjectPanel.SetActiveItem((IObject3D)treeView.SelectedNode.Tag);
};
if (this.Parent != null)
{
treeView.TopNode.Padding = treeView.TopNode.Padding.Clone(left: 8, top: 8);
treeView.SelectedNode = treeView.TopNode;
}
}
private void UpdateRenderView(object sender, EventArgs e) private void UpdateRenderView(object sender, EventArgs e)
{ {
TrackballTumbleWidget.CenterOffsetX = -modelViewSidePanel.Width; TrackballTumbleWidget.CenterOffsetX = -modelViewSidePanel.Width;
@ -365,10 +358,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public override void OnClosed(ClosedEventArgs e) public override void OnClosed(ClosedEventArgs e)
{ {
if (Printer != null) sceneContext.ViewState.SceneTreeHeight = treeSection.Height;
{
Printer.ViewState.SceneTreeHeight = treeSection.Height;
}
viewControls3D.TransformStateChanged -= ViewControls3D_TransformStateChanged; viewControls3D.TransformStateChanged -= ViewControls3D_TransformStateChanged;
Scene.SelectionChanged -= Scene_SelectionChanged; Scene.SelectionChanged -= Scene_SelectionChanged;
@ -689,11 +679,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
if (e == null) if (e == null)
{ {
Scene.ClearSelection(); Scene.ClearSelection();
Scene.SetSelection(matchingSceneChildren.ToList());
foreach (var sceneItem in matchingSceneChildren.ToList())
{
Scene.AddToSelection(sceneItem);
}
} }
else else
{ {
@ -1225,9 +1211,20 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
} }
// Top level selection only - rebuild tree // Top level selection only - rebuild tree
if (Scene.Children.Contains(Scene.SelectedItem)) var selection = Scene.SelectedItem;
if (Scene.Children.Contains(selection))
{ {
this.RebuildTreeSection(Scene.SelectedItem, theme); treeView.ScrollArea.CloseAllChildren();
var rootNode = Object3DTreeBuilder.BuildTree(selection, theme);
treeView.AddChild(rootNode);
rootNode.TreeView = treeView;
if (this.Parent != null)
{
rootNode.Padding = rootNode.Padding.Clone(left: 8, top: 8);
treeView.SelectedNode = rootNode;
}
} }
} }

@ -1 +1 @@
Subproject commit a38d5e68bcaace904d1dc18e416ea9ace6756ac2 Subproject commit 44c6128a05217f6ca0a928e7061e087c05173d08