diff --git a/MatterControlLib/DesignTools/Operations/PathEditorFactory.cs b/MatterControlLib/DesignTools/Operations/PathEditorFactory.cs index 81de53dce..334694231 100644 --- a/MatterControlLib/DesignTools/Operations/PathEditorFactory.cs +++ b/MatterControlLib/DesignTools/Operations/PathEditorFactory.cs @@ -53,14 +53,14 @@ namespace MatterHackers.MatterControl.DesignTools propertyEditor.UndoBuffer, propertyEditor.Theme, VertexBufferChanged, + ref tabIndex, vertexStorage.UnscaledOffset, vertexStorage.Scale, (unscaledOffset, scale) => { vertexStorage.UnscaledOffset = unscaledOffset; vertexStorage.Scale = scale; - } - ); + }); if (property.Source is Object3D object3D) { diff --git a/MatterControlLib/DesignTools/Operations/PathEditorWidget.cs b/MatterControlLib/DesignTools/Operations/PathEditorWidget.cs index c2c659462..307fd71f2 100644 --- a/MatterControlLib/DesignTools/Operations/PathEditorWidget.cs +++ b/MatterControlLib/DesignTools/Operations/PathEditorWidget.cs @@ -74,10 +74,16 @@ namespace MatterHackers.MatterControl.DesignTools UndoBuffer undoBuffer, ThemeConfig theme, Action vertexChanged, + ref int tabIndex, Vector2 unscaledRenderOffset = default, double layerScale = 1, Action scaleChanged = null) { + // remember the initial tab index + initialTabIndex = tabIndex; + // and add to the tab index the number of controls we plan to add + tabIndex += 2; + HAnchor = HAnchor.Stretch; BackgroundOutlineWidth = 1; BackgroundColor = theme.BackgroundColor; @@ -127,49 +133,42 @@ namespace MatterHackers.MatterControl.DesignTools private void AddPositionControls(ThemeConfig theme, FlowLayoutWidget toolBar) { - var tabIndex = 0; - xEditWidget = new ThemedNumberEdit(0, theme, singleCharLabel: 'X', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth, tabIndex: tabIndex) + var tabIndex = initialTabIndex; + xEditWidget = new ThemedNumberEdit(0, theme, singleCharLabel: 'X', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth) { TabIndex = tabIndex++, SelectAllOnFocus = true, Margin = theme.ButtonSpacing, VAnchor = VAnchor.Center, + Enabled = false, }; xEditWidget.ActuallNumberEdit.InternalNumberEdit.MaxDecimalsPlaces = 3; xEditWidget.ActuallNumberEdit.EditComplete += (sender, e) => { - if (controlPointBeingDragged > -1) - { - var vertexData = vertexStorage[controlPointBeingDragged]; - if (vertexData.Hint == CommandHint.C4Point) - { - // the prev point - if (controlPointBeingDragged > 0) - { - controlPointBeingDragged--; - vertexData = new VertexData(vertexData.Command, new Vector2(vertexData.Position.X, xEditWidget.ActuallNumberEdit.Value), vertexData.Hint); - controlPointBeingDragged++; - } - } - else - { - } - } + var oldPosition = vertexStorage[controlPointBeingDragged].Position; + var newPosition = new Vector2(xEditWidget.ActuallNumberEdit.Value, yEditWidget.ActuallNumberEdit.Value); + var delta = newPosition - oldPosition; + OffsetSelectedPoint(delta); }; xEditWidget.ActuallNumberEdit.KeyDown += NumberField.InternalTextEditWidget_KeyDown; toolBar.AddChild(xEditWidget); - yEditWidget = new ThemedNumberEdit(0, theme, 'Y', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth, tabIndex: tabIndex) + yEditWidget = new ThemedNumberEdit(0, theme, 'Y', allowNegatives: true, allowDecimals: true, pixelWidth: VectorXYEditWidth) { TabIndex = tabIndex++, SelectAllOnFocus = true, VAnchor = VAnchor.Center, Margin = theme.ButtonSpacing, + Enabled = false, }; yEditWidget.ActuallNumberEdit.InternalNumberEdit.MaxDecimalsPlaces = 3; yEditWidget.ActuallNumberEdit.EditComplete += (sender, e) => { + var oldPosition = vertexStorage[controlPointBeingDragged].Position; + var newPosition = new Vector2(xEditWidget.ActuallNumberEdit.Value, yEditWidget.ActuallNumberEdit.Value); + var delta = newPosition - oldPosition; + OffsetSelectedPoint(delta); }; yEditWidget.ActuallNumberEdit.KeyDown += NumberField.InternalTextEditWidget_KeyDown; @@ -193,7 +192,7 @@ namespace MatterHackers.MatterControl.DesignTools }; // the sharp corner button - var sharpButton = new ThemedRadioTextButton("S", theme) + sharpButton = new ThemedRadioTextButton("S", theme) { BackgroundColor = theme.SlightShade, HoverColor = theme.SlightShade.WithAlpha(75), @@ -206,7 +205,7 @@ namespace MatterHackers.MatterControl.DesignTools sharpButton.Click += (s, e) => { controlPointConstraint = ControlPointConstraint.Sharp; }; // the aligned corner button - var alignedButton = new ThemedRadioTextButton("A", theme) + alignedButton = new ThemedRadioTextButton("A", theme) { BackgroundColor = theme.SlightShade, HoverColor = theme.SlightShade.WithAlpha(75), @@ -219,7 +218,7 @@ namespace MatterHackers.MatterControl.DesignTools alignedButton.Click += (s, e) => { controlPointConstraint = ControlPointConstraint.Aligned; }; // the free button - var freeButton = new ThemedRadioTextButton("F", theme) + freeButton = new ThemedRadioTextButton("F", theme) { BackgroundColor = theme.SlightShade, HoverColor = theme.SlightShade.WithAlpha(75), @@ -243,6 +242,10 @@ namespace MatterHackers.MatterControl.DesignTools private int controlPointBeingHovered = -1; private ThemedNumberEdit yEditWidget; private ThemedNumberEdit xEditWidget; + private int initialTabIndex; + private ThemedRadioTextButton sharpButton; + private ThemedRadioTextButton alignedButton; + private ThemedRadioTextButton freeButton; public void CenterPartInView() { @@ -260,7 +263,7 @@ namespace MatterHackers.MatterControl.DesignTools public override void OnDraw(Graphics2D graphics2D) { - new VertexSourceApplyTransform(vertexStorage, TotalTransform).RenderCurve(graphics2D, theme.TextColor, 2, true, theme.PrimaryAccentColor.Blend(theme.TextColor, .5), theme.PrimaryAccentColor); + new VertexSourceApplyTransform(vertexStorage, TotalTransform).RenderPath(graphics2D, theme.TextColor, 2, true, theme.PrimaryAccentColor.Blend(theme.TextColor, .5), theme.PrimaryAccentColor); //if (vertexStorage.GetType().GetCustomAttributes(typeof(PathEditorFactory.ShowAxisAttribute), true).FirstOrDefault() is PathEditorFactory.ShowAxisAttribute showAxisAttribute) { @@ -316,31 +319,62 @@ namespace MatterHackers.MatterControl.DesignTools xEditWidget.Enabled= false; yEditWidget.Text = "---"; yEditWidget.Enabled= false; + + sharpButton.Enabled = false; + alignedButton.Enabled = false; + freeButton.Enabled = false; } else { - xEditWidget.Enabled = true; - yEditWidget.Enabled = true; - UpdatePositionControls(); + UpdateControlsForSelection(); } } break; case MouseButtons.Middle: - mouseDownTransformOverride = ETransformState.Move; - break; - case MouseButtons.Right: - mouseDownTransformOverride = ETransformState.Scale; + if (Keyboard.IsKeyDown(Keys.ControlKey)) + { + mouseDownTransformOverride = ETransformState.Scale; + } + else + { + mouseDownTransformOverride = ETransformState.Move; + } break; } } } - private void UpdatePositionControls() + private void UpdateControlsForSelection() { - xEditWidget.Value = vertexStorage[controlPointBeingDragged].Position.X; - yEditWidget.Value = vertexStorage[controlPointBeingDragged].Position.Y; + xEditWidget.Enabled = true; + yEditWidget.Enabled = true; + sharpButton.Enabled = true; + alignedButton.Enabled = true; + freeButton.Enabled = true; + + var selected = vertexStorage[controlPointBeingDragged]; + xEditWidget.Value = selected.Position.X; + yEditWidget.Value = selected.Position.Y; + + switch(selected.Hint) + { + case CommandHint.C4Point: + case CommandHint.C4ControlToPoint: + case CommandHint.C4ControlFromPrev: + freeButton.Checked = true; + break; + + default: + if (selected.IsMoveTo + || selected.IsLineTo) + { + sharpButton.Checked = true; + } + break; + } + } private int GetControlPointIndex(Vector2 mousePosition) @@ -379,8 +413,7 @@ namespace MatterHackers.MatterControl.DesignTools { ScalingTransform.inverse_transform(ref mouseDelta); OffsetSelectedPoint(mouseDelta); - vertexChanged?.Invoke(); - UpdatePositionControls(); + UpdateControlsForSelection(); } } } @@ -395,7 +428,8 @@ namespace MatterHackers.MatterControl.DesignTools private void OffsetSelectedPoint(Vector2 delta) { if (controlPointBeingDragged < 0 - || controlPointBeingDragged >= vertexStorage.Count) + || controlPointBeingDragged >= vertexStorage.Count + || delta.LengthSquared == 0) { return; } @@ -421,6 +455,8 @@ namespace MatterHackers.MatterControl.DesignTools // only drag the point vertexStorage[controlPointBeingDragged] = new VertexData(vertexData.Command, vertexData.Position + delta, vertexData.Hint); } + + vertexChanged?.Invoke(); } private void DoTranslateAndZoom(MouseEventArgs mouseEvent) diff --git a/MatterControlLib/Library/ContentProviders/MeshContentProvider.cs b/MatterControlLib/Library/ContentProviders/MeshContentProvider.cs index f364100c6..0647e8334 100644 --- a/MatterControlLib/Library/ContentProviders/MeshContentProvider.cs +++ b/MatterControlLib/Library/ContentProviders/MeshContentProvider.cs @@ -90,7 +90,7 @@ namespace MatterHackers.MatterControl { if (item is ILibraryAssetStream streamInterface) { - // If we are loding a binary MCX file, coy its assets + // If we are loding a binary MCX file, copy its assets await CopyAssetsFromBinaryMcx(streamInterface); using (var contentStream = await streamInterface.GetStream(progressReporter)) diff --git a/MatterControlLib/Library/Providers/FileSystem/FileSystemItem.cs b/MatterControlLib/Library/Providers/FileSystem/FileSystemItem.cs index f038ab366..9d711e9bd 100644 --- a/MatterControlLib/Library/Providers/FileSystem/FileSystemItem.cs +++ b/MatterControlLib/Library/Providers/FileSystem/FileSystemItem.cs @@ -75,7 +75,7 @@ namespace MatterHackers.MatterControl.Library public DateTime DateModified { get; } - public virtual string ID => Util.GetLongHashCode(this.FilePath).ToString(); + public virtual string ID => Util.GetLongHashCode(this.FilePath + DateModified.ToString()).ToString(); public virtual bool IsProtected => false; diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index b2125420f..9545c19b1 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit b2125420fc190b876dabccb44c0107832bd156fd +Subproject commit 9545c19b13d294e47d87ab3b9ae67366827072b3