Improving new view ui

This commit is contained in:
LarsBrubaker 2021-05-22 14:20:28 -07:00
parent 01b93ccb62
commit d4696dff2d
7 changed files with 113 additions and 54 deletions

View file

@ -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<GuiWidget>();

View file

@ -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;

View file

@ -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<TimeAndPosition> motionQueue = new List<TimeAndPosition>();

View file

@ -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);
}
}

View file

@ -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;

View file

@ -42,10 +42,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
public class ViewStyleButton : DropButton
{
private TextIconButton iconButton;
private IconButton iconButton;
private ISceneContext sceneContext;
private Dictionary<RenderTypes, ImageBuffer> viewIcons;
private Dictionary<RenderTypes, (ImageBuffer image, string toolTip)> viewData;
private PopupMenu popupMenu;
public ViewStyleButton(ISceneContext sceneContext, ThemeConfig theme)
: base(theme)
@ -55,21 +56,24 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
this.HAnchor = HAnchor.Fit;
this.VAnchor = VAnchor.Fit;
viewIcons = new Dictionary<RenderTypes, ImageBuffer>()
viewData = new Dictionary<RenderTypes, (ImageBuffer image, string toolTip)>
{
[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<GuiWidget>();
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) =>
{

@ -1 +1 @@
Subproject commit ecf30ee57ee6d272291c7f7a3321179cf1f196fe
Subproject commit 1313a4c9560a31fd8f507b97f68864c43708e9f1