diff --git a/MatterControlLib/PartPreviewWindow/View3D/GridOptionsPanel.cs b/MatterControlLib/PartPreviewWindow/View3D/GridOptionsPanel.cs index e36c450b5..02fff1393 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/GridOptionsPanel.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/GridOptionsPanel.cs @@ -26,6 +26,7 @@ The views and conclusions contained in the software and documentation are those 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 MatterHackers.Agg; using MatterHackers.Agg.Platform; @@ -39,6 +40,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public class GridOptionsPanel : DropButton { Object3DControlsLayer object3DControlLayer; + private GuiWidget textButton; + private PopupMenu popupMenu; public GridOptionsPanel(Object3DControlsLayer object3DControlLayer, ThemeConfig theme) : base(theme) @@ -46,17 +49,58 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.object3DControlLayer = object3DControlLayer; this.PopupContent = () => ShowGridOptions(theme); - this.AddChild(new TextIconButton("Snap", StaticData.Instance.LoadIcon("snap_grid.png", 16, 16).SetToColor(theme.TextColor), theme) + var gridDistance = object3DControlLayer.SnapGridDistance; + + textButton = this.AddChild(new TextButton(gridDistance.ToString(), theme) { - Selectable = false + Selectable = false, + HAnchor = HAnchor.Center }); - this.HAnchor = HAnchor.Fit; this.VAnchor = VAnchor.Fit; + this.Width = this.Height; + + UserSettings.Instance.SettingChanged += UserSettings_SettingChanged; + + SetToolTip(); + } + + public override void OnClosed(EventArgs e) + { + // Unregister listener + UserSettings.Instance.SettingChanged -= UserSettings_SettingChanged; + + base.OnClosed(e); + } + + private void UserSettings_SettingChanged(object sender, StringEventArgs e) + { + if (e.Data == UserSettingsKey.SnapGridDistance) + { + SetToolTip(); + } + } + + private void SetToolTip() + { + var distance = object3DControlLayer.SnapGridDistance; + if (distance == 0) + { + textButton.Text = "-"; + ToolTipText = "Snapping Turned Off".Localize(); + } + else + { + textButton.Text = distance.ToString().TrimStart('0'); + ToolTipText = "Snap Grid".Localize() + " = " + textButton.Text; + } + + popupMenu?.Close(); + popupMenu = null; } private GuiWidget ShowGridOptions(ThemeConfig theme) { - var popupMenu = new PopupMenu(ApplicationController.Instance.MenuTheme); + popupMenu = new PopupMenu(ApplicationController.Instance.MenuTheme); var siblingList = new List(); diff --git a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/WidgetAnimationExtensions.cs b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/WidgetAnimationExtensions.cs index 15e86d1ee..7083bae7e 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/WidgetAnimationExtensions.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/WidgetAnimationExtensions.cs @@ -39,7 +39,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public static void FlashBackground(this GuiWidget widget, Color hightlightColor) { - double displayTime = 2; + double displayTime = 1.5; double pulseTime = .5; double totalSeconds = 0; Color backgroundColor = widget.BackgroundColor; diff --git a/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs b/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs index 55448f72b..a81d4c89d 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs @@ -7,6 +7,9 @@ using MatterHackers.VectorMath; using MatterHackers.VectorMath.TrackBall; using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; namespace MatterHackers.MatterControl.PartPreviewWindow { @@ -288,10 +291,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - public void Reset(Vector3 bedCenter) + public void SetRotationCenter(Vector3 worldPosition) { ZeroVelocity(); - mouseDownWorldPosition = bedCenter; + mouseDownWorldPosition = worldPosition; } public void SetRotationWithDisplacement(Quaternion rotationQ) @@ -422,6 +425,34 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } + public void AnimateTo(Matrix4X4 newRotation) + { + var rotationStart = new Quaternion(world.RotationMatrix); + var rotationEnd = new Quaternion(newRotation); + + Task.Run(() => + { + // TODO: stop any spinning happening in the view + double duration = .25; + var timer = Stopwatch.StartNew(); + var time = timer.Elapsed.TotalSeconds; + + while (time < duration) + { + var current = Quaternion.Slerp(rotationStart, rotationEnd, time / duration); + UiThread.RunOnIdle(() => + { + this.SetRotationWithDisplacement(current); + }); + time = timer.Elapsed.TotalSeconds; + Thread.Sleep(10); + } + + this.world.RotationMatrix = newRotation; + Invalidate(); + }); + } + internal class MotionQueue { private readonly List motionQueue = new List(); diff --git a/MatterControlLib/PartPreviewWindow/View3D/TumbleCubeControl.cs b/MatterControlLib/PartPreviewWindow/View3D/TumbleCubeControl.cs index 6fff8cb77..a0be050c9 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/TumbleCubeControl.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/TumbleCubeControl.cs @@ -387,30 +387,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var look = Matrix4X4.LookAt(Vector3.Zero, normalAndUp.normal, normalAndUp.up); - var start = new Quaternion(object3DControlLayer.World.RotationMatrix); - var end = new Quaternion(look); - - Task.Run(() => - { - // TODO: stop any spinning happening in the view - double duration = .25; - var timer = Stopwatch.StartNew(); - var time = timer.Elapsed.TotalSeconds; - - while (time < duration) - { - var current = Quaternion.Slerp(start, end, time / duration); - UiThread.RunOnIdle(() => - { - trackballTumbleWidgetExtended.SetRotationWithDisplacement(current); - }); - time = timer.Elapsed.TotalSeconds; - Thread.Sleep(10); - } - - trackballTumbleWidgetExtended.SetRotationWithDisplacement(end); - Invalidate(); - }); + trackballTumbleWidgetExtended.AnimateTo(look); } } diff --git a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs index 0d585dc98..20def5886 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs @@ -570,7 +570,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // put in the view list buttons var modelViewStyleButton = new ViewStyleButton(sceneContext, theme) { - ToolTipText = "Model View Style".Localize(), PopupMate = new MatePoint() { Mate = new MateOptions(MateEdge.Left, MateEdge.Top) @@ -605,7 +604,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // Add the grid snap button gridSnapButton = new GridOptionsPanel(Object3DControlLayer, theme) { - ToolTipText = "Snap Grid".Localize(), PopupMate = new MatePoint() { Mate = new MateOptions(MateEdge.Right, MateEdge.Top) @@ -1704,7 +1702,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public void ResetView() { - TrackballTumbleWidget.Reset(new Vector3(sceneContext.BedCenter)); + TrackballTumbleWidget.SetRotationCenter(new Vector3(sceneContext.BedCenter)); var world = sceneContext.World; diff --git a/MatterControlLib/PartPreviewWindow/ViewStyleButton.cs b/MatterControlLib/PartPreviewWindow/ViewStyleButton.cs index eea6472d6..5d65f032d 100644 --- a/MatterControlLib/PartPreviewWindow/ViewStyleButton.cs +++ b/MatterControlLib/PartPreviewWindow/ViewStyleButton.cs @@ -42,10 +42,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public class ViewStyleButton : DropButton { - private TextIconButton iconButton; + private IconButton iconButton; private ISceneContext sceneContext; - private Dictionary viewIcons; + private Dictionary viewData; + private PopupMenu popupMenu; public ViewStyleButton(ISceneContext sceneContext, ThemeConfig theme) : base(theme) @@ -55,20 +56,23 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.HAnchor = HAnchor.Fit; this.VAnchor = VAnchor.Fit; - viewIcons = new Dictionary() + viewData = new Dictionary { - [RenderTypes.Shaded] = StaticData.Instance.LoadIcon("view_shaded.png", 16, 16), - [RenderTypes.Outlines] = StaticData.Instance.LoadIcon("view_outlines.png", 16, 16), - [RenderTypes.Polygons] = StaticData.Instance.LoadIcon("view_polygons.png", 16, 16), - [RenderTypes.NonManifold] = StaticData.Instance.LoadIcon("view_polygons.png", 16, 16), - [RenderTypes.Materials] = StaticData.Instance.LoadIcon("view_materials.png", 16, 16), - [RenderTypes.Overhang] = StaticData.Instance.LoadIcon("view_overhang.png", 16, 16), + [RenderTypes.Shaded] = (StaticData.Instance.LoadIcon("view_shaded.png", 16, 16), "View Mode = Shaded".Localize()), + [RenderTypes.Outlines] = (StaticData.Instance.LoadIcon("view_outlines.png", 16, 16), "View Mode = Outlines".Localize()), + [RenderTypes.Polygons] = (StaticData.Instance.LoadIcon("view_polygons.png", 16, 16), "View Mode = Polygons".Localize()), + [RenderTypes.NonManifold] = (StaticData.Instance.LoadIcon("view_polygons.png", 16, 16), "View Mode = Non-Manifold".Localize()), + [RenderTypes.Materials] = (StaticData.Instance.LoadIcon("view_materials.png", 16, 16), "View Mode = Materials".Localize()), + [RenderTypes.Overhang] = (StaticData.Instance.LoadIcon("view_overhang.png", 16, 16), "View Mode = Overhangs".Localize()), }; - this.AddChild(iconButton = new TextIconButton("View".Localize(), viewIcons[sceneContext.ViewState.RenderType], theme) + var renderType = sceneContext.ViewState.RenderType; + this.AddChild(iconButton = new IconButton(viewData[renderType].image, theme) { Selectable = false }); + + ToolTipText = viewData[renderType].toolTip; UserSettings.Instance.SettingChanged += UserSettings_SettingChanged; } @@ -85,23 +89,28 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { if (e.Data == UserSettingsKey.defaultRenderSetting) { - iconButton.SetIcon(viewIcons[sceneContext.ViewState.RenderType]); + var renderType = sceneContext.ViewState.RenderType; + iconButton.SetIcon(viewData[renderType].image); if (!this.MenuVisible) { - iconButton.FlashBackground(theme.PrimaryAccentColor.WithContrast(theme.TextColor, 6).ToColor()); + this.FlashBackground(theme.PrimaryAccentColor.WithContrast(theme.TextColor, 6).ToColor()); } + ToolTipText = viewData[renderType].toolTip; + + popupMenu?.Close(); + popupMenu = null; } } private GuiWidget ShowViewOptions() { - var popupMenu = new PopupMenu(ApplicationController.Instance.MenuTheme); + popupMenu = new PopupMenu(ApplicationController.Instance.MenuTheme); var siblingList = new List(); popupMenu.CreateBoolMenuItem( "Shaded".Localize(), - viewIcons[RenderTypes.Shaded], + viewData[RenderTypes.Shaded].image, () => sceneContext.ViewState.RenderType == RenderTypes.Shaded, (isChecked) => { @@ -112,7 +121,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow popupMenu.CreateBoolMenuItem( "Outlines (default)".Localize(), - viewIcons[RenderTypes.Outlines], + viewData[RenderTypes.Outlines].image, () => sceneContext.ViewState.RenderType == RenderTypes.Outlines, (isChecked) => { @@ -124,7 +133,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow #if DEBUG popupMenu.CreateBoolMenuItem( "Non-Manifold".Localize(), - viewIcons[RenderTypes.Polygons], + viewData[RenderTypes.Polygons].image, () => sceneContext.ViewState.RenderType == RenderTypes.NonManifold, (isChecked) => { @@ -136,7 +145,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow popupMenu.CreateBoolMenuItem( "Polygons".Localize(), - viewIcons[RenderTypes.Polygons], + viewData[RenderTypes.Polygons].image, () => sceneContext.ViewState.RenderType == RenderTypes.Polygons, (isChecked) => { @@ -147,7 +156,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow popupMenu.CreateBoolMenuItem( "Materials".Localize(), - viewIcons[RenderTypes.Materials], + viewData[RenderTypes.Materials].image, () => sceneContext.ViewState.RenderType == RenderTypes.Materials, (isChecked) => { @@ -158,7 +167,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow popupMenu.CreateBoolMenuItem( "Overhang".Localize(), - viewIcons[RenderTypes.Overhang], + viewData[RenderTypes.Overhang].image, () => sceneContext.ViewState.RenderType == RenderTypes.Overhang, (isChecked) => { diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index ecf30ee57..1313a4c95 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit ecf30ee57ee6d272291c7f7a3321179cf1f196fe +Subproject commit 1313a4c9560a31fd8f507b97f68864c43708e9f1