diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index fb744aeba..28a1ec0b1 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -30,13 +30,11 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.ComponentModel; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; -using System.Net.Http; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -46,7 +44,6 @@ using System.Threading; using System.Threading.Tasks; using global::MatterControl.Printing; using Markdig.Agg; -using Markdig.Syntax.Inlines; using MatterControlLib.Library.OpenInto; using MatterHackers.Agg; using MatterHackers.Agg.Font; @@ -71,7 +68,6 @@ using MatterHackers.MatterControl.PrintHistory; using MatterHackers.MatterControl.PrintQueue; using MatterHackers.MatterControl.SettingsManagement; using MatterHackers.MatterControl.SlicerConfiguration; -using MatterHackers.MatterControl.Tour; using MatterHackers.PolygonMesh; using MatterHackers.PolygonMesh.Processors; using MatterHackers.VectorMath; @@ -1648,17 +1644,17 @@ namespace MatterHackers.MatterControl /// /// Set or get the current ui hint for the thing the mouse is over /// - public string UiHint + public string GetUiHint() { - get => _uiHint; - - set + return _uiHint; + } + + public void SetUiHint(string value) + { + if (_uiHint != value) { - if (_uiHint != value) - { - _uiHint = value; - UiHintChanged?.Invoke(this, null); - } + _uiHint = value; + UiHintChanged?.Invoke(this, null); } } @@ -2673,4 +2669,24 @@ namespace MatterHackers.MatterControl public Action Action { get; set; } } } + + public static class SetUiHintExtensions + { + // GuiWidget extension + public static void SetActiveUiHint(this GuiWidget widget, string value) + { + if (ApplicationController.Instance.GetUiHint() != value) + { + void MouseHasLeftBounds(object s, EventArgs e) + { + ApplicationController.Instance.SetUiHint(""); + widget.MouseLeaveBounds -= MouseHasLeftBounds; + } + + widget.MouseLeaveBounds += MouseHasLeftBounds; + + ApplicationController.Instance.SetUiHint(value); + } + } + } } \ No newline at end of file diff --git a/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs b/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs index 98c9d3d18..c64fa03d6 100644 --- a/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs +++ b/MatterControlLib/DesignTools/Primitives/TracedPositionObject3DControl.cs @@ -96,12 +96,12 @@ namespace MatterHackers.MatterControl.DesignTools { if (DownOnControl) { - ApplicationController.Instance.UiHint = ""; + ApplicationController.Instance.SetUiHint(""); DownOnControl = false; setPosition(mouseDownPosition); - ApplicationController.Instance.UiHint = ""; - } - } + ApplicationController.Instance.SetUiHint(""); + } + } public void Draw(DrawGlContentEventArgs e) { @@ -144,7 +144,7 @@ namespace MatterHackers.MatterControl.DesignTools public void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { DownOnControl = true; - ApplicationController.Instance.UiHint = UiHint; + ApplicationController.Instance.SetUiHint(UiHint); mouseDownPosition = getPosition(); // Make sure we always get a new hit plane ResetHitPlane(); @@ -219,7 +219,7 @@ namespace MatterHackers.MatterControl.DesignTools { DownOnControl = false; editComplete(mouseDownPosition); - ApplicationController.Instance.UiHint = ""; + ApplicationController.Instance.SetUiHint(""); } } diff --git a/MatterControlLib/PartPreviewWindow/MainViewWidget.cs b/MatterControlLib/PartPreviewWindow/MainViewWidget.cs index ed98c400d..cc432c93e 100644 --- a/MatterControlLib/PartPreviewWindow/MainViewWidget.cs +++ b/MatterControlLib/PartPreviewWindow/MainViewWidget.cs @@ -1149,9 +1149,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow tasksContainer.AddChild(runningTaskPanel); } - if (!string.IsNullOrEmpty(ApplicationController.Instance.UiHint)) + if (!string.IsNullOrEmpty(ApplicationController.Instance.GetUiHint())) { - statusMessage.Text = ApplicationController.Instance.UiHint; + statusMessage.Text = ApplicationController.Instance.GetUiHint(); statusMessage.Visible = true; var parent = statusMessage.Parent; if (parent.Children.IndexOf(statusMessage) != parent.Children.Count - 1) diff --git a/MatterControlLib/PartPreviewWindow/Tabs.cs b/MatterControlLib/PartPreviewWindow/Tabs.cs index 9aca0eafe..670fac9d2 100644 --- a/MatterControlLib/PartPreviewWindow/Tabs.cs +++ b/MatterControlLib/PartPreviewWindow/Tabs.cs @@ -283,12 +283,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow TabBar.MouseEnterBounds += (s, e) => { - ApplicationController.Instance.UiHint = "You can drag and drop .mcx files here to open them"; - }; - - TabBar.MouseLeaveBounds += (s, e) => - { - ApplicationController.Instance.UiHint = ""; + TabBar.SetActiveUiHint("You can drag and drop .mcx files here to open them"); }; this.TabBar.MouseUp += (s, e) => diff --git a/MatterControlLib/PartPreviewWindow/View3D/Interaction/Object3DControl.cs b/MatterControlLib/PartPreviewWindow/View3D/Interaction/Object3DControl.cs index 6a7115259..f83ab6718 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/Interaction/Object3DControl.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/Interaction/Object3DControl.cs @@ -120,9 +120,9 @@ namespace MatterHackers.MeshVisualizer { if (!string.IsNullOrEmpty(UiHint)) { - ApplicationController.Instance.UiHint = ""; - } - } + ApplicationController.Instance.SetUiHint(""); + } + } public virtual void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { @@ -132,7 +132,7 @@ namespace MatterHackers.MeshVisualizer this.Object3DControlContext.GuiSurface.Invalidate(); if (!string.IsNullOrEmpty(UiHint)) { - ApplicationController.Instance.UiHint = UiHint; + ApplicationController.Instance.SetUiHint(UiHint); } } } @@ -148,7 +148,7 @@ namespace MatterHackers.MeshVisualizer if (!string.IsNullOrEmpty(UiHint)) { - ApplicationController.Instance.UiHint = ""; + ApplicationController.Instance.SetUiHint(""); } } diff --git a/MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs b/MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs index 2dbb7184b..1226b6acb 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs @@ -480,11 +480,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow lastControlMessage = "Click to edit values".Localize(); } - ApplicationController.Instance.UiHint = lastControlMessage; + ApplicationController.Instance.SetUiHint(lastControlMessage); } - else if (ApplicationController.Instance.UiHint == lastControlMessage) + else if (ApplicationController.Instance.GetUiHint() == lastControlMessage) { - ApplicationController.Instance.UiHint = ""; + ApplicationController.Instance.SetUiHint(""); } } } diff --git a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs index 1f02019db..3438eca64 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/PrinterBar/PrintPopupMenu.cs @@ -171,8 +171,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var errors = printer.Validate(); var startPrintButton = CreateStartPrintButton("Start Print".Localize(), printer, menuTheme, out bool printEnabled); - startPrintButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Ctrl + P".Localize(); - startPrintButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + startPrintButton.MouseEnterBounds += (s, e) => startPrintButton.SetActiveUiHint("Ctrl + P".Localize()); startPrintButton.Click += (s, e) => this.CloseMenu(); var hasErrors = errors.Any(e => e.ErrorLevel == ValidationErrorLevel.Error); diff --git a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs index d504dd997..7afbc88b0 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs @@ -363,8 +363,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Margin = theme.ButtonSpacing, }; - partSelectButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Ctrl + A = Select Alll, 'Space' = Clear Selection, 'ESC' = Cancel Drag".Localize(); - partSelectButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + partSelectButton.MouseEnterBounds += (s, e) => partSelectButton.SetActiveUiHint("Ctrl + A = Select Alll, 'Space' = Clear Selection, 'ESC' = Cancel Drag".Localize()); AddRoundButton(partSelectButton, RotatedMargin(partSelectButton, MathHelper.Tau * .15)); partSelectButton.Click += (s, e) => viewControls3D.ActiveButton = ViewControls3DButtons.PartSelect; buttonGroupA.Add(partSelectButton); @@ -375,8 +374,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ToolTipText = "Rotate View".Localize(), Margin = theme.ButtonSpacing }; - rotateButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Rotate: Right Mouse Button, Ctrl + Left Mouse Button, Arrow Keys".Localize(); - rotateButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + rotateButton.MouseEnterBounds += (s, e) => rotateButton.SetActiveUiHint("Rotate: Right Mouse Button, Ctrl + Left Mouse Button, Arrow Keys".Localize()); AddRoundButton(rotateButton, RotatedMargin(rotateButton, MathHelper.Tau * .05)); rotateButton.Click += (s, e) => viewControls3D.ActiveButton = ViewControls3DButtons.Rotate; buttonGroupA.Add(rotateButton); @@ -387,8 +385,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ToolTipText = "Move View".Localize(), Margin = theme.ButtonSpacing }; - translateButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Move: Middle Mouse Button, Ctrl + Shift + Left Mouse Button, Shift Arrow Keys".Localize(); - translateButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + translateButton.MouseEnterBounds += (s, e) => translateButton.SetActiveUiHint("Move: Middle Mouse Button, Ctrl + Shift + Left Mouse Button, Shift Arrow Keys".Localize()); AddRoundButton(translateButton, RotatedMargin(translateButton , - MathHelper.Tau * .05)); translateButton.Click += (s, e) => viewControls3D.ActiveButton = ViewControls3DButtons.Translate; buttonGroupA.Add(translateButton); @@ -399,8 +396,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ToolTipText = "Zoom View".Localize(), Margin = theme.ButtonSpacing }; - zoomButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Zoom: Mouse Wheel, Ctrl + Alt + Left Mouse Button, Ctrl + '+' & Ctrl + '-'".Localize(); - zoomButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + zoomButton.MouseEnterBounds += (s, e) => zoomButton.SetActiveUiHint("Zoom: Mouse Wheel, Ctrl + Alt + Left Mouse Button, Ctrl + '+' & Ctrl + '-'".Localize()); AddRoundButton(zoomButton, RotatedMargin(zoomButton, - MathHelper.Tau * .15)); zoomButton.Click += (s, e) => viewControls3D.ActiveButton = ViewControls3DButtons.Scale; buttonGroupA.Add(zoomButton); @@ -471,8 +467,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ToolTipText = "Reset View".Localize(), Margin = theme.ButtonSpacing }; - homeButton.MouseEnterBounds += (s1, e1) => ApplicationController.Instance.UiHint = "W Key"; - homeButton.MouseLeaveBounds += (s1, e1) => ApplicationController.Instance.UiHint = ""; + homeButton.MouseEnterBounds += (s1, e1) => homeButton.SetActiveUiHint("W Key"); AddRoundButton(homeButton, RotatedMargin(homeButton, MathHelper.Tau * .3)).Click += (s, e) => viewControls3D.NotifyResetView(); var zoomToSelectionButton = new ThemedIconButton(StaticData.Instance.LoadIcon("select.png", 16, 16).SetToColor(theme.TextColor), theme) @@ -481,8 +476,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ToolTipText = "Zoom to Selection".Localize(), Margin = theme.ButtonSpacing }; - zoomToSelectionButton.MouseEnterBounds += (s1, e1) => ApplicationController.Instance.UiHint = "Z Key"; - zoomToSelectionButton.MouseLeaveBounds += (s1, e1) => ApplicationController.Instance.UiHint = ""; + zoomToSelectionButton.MouseEnterBounds += (s1, e1) => zoomToSelectionButton.SetActiveUiHint("Z Key"); void SetZoomEnabled(object s, EventArgs e) { zoomToSelectionButton.Enabled = this.Scene.SelectedItem != null @@ -507,8 +501,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Checked = turntableEnabled, //DoubleBuffer = true, }; - turnTableButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Switch between turn table and trackball modes".Localize(); - turnTableButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + turnTableButton.MouseEnterBounds += (s, e) => turnTableButton.SetActiveUiHint("Switch between turn table and trackball modes".Localize()); AddRoundButton(turnTableButton, RotatedMargin(turnTableButton, -MathHelper.Tau * .4)); // 2 button position turnTableButton.CheckedStateChanged += (s, e) => @@ -534,8 +527,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow SiblingRadioButtonList = new List(), Checked = TrackballTumbleWidget.PerspectiveMode, }; - projectionButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Turn on and off perspective rendering".Localize(); - projectionButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + projectionButton.MouseEnterBounds += (s, e) => projectionButton.SetActiveUiHint("Turn on and off perspective rendering".Localize()); AddRoundButton(projectionButton, RotatedMargin(projectionButton, -MathHelper.Tau * .3)); projectionButton.CheckedStateChanged += (s, e) => { @@ -564,8 +556,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ToggleButton = true, SiblingRadioButtonList = new List(), }; - bedButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Hide and show the bed".Localize(); - bedButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + bedButton.MouseEnterBounds += (s, e) => bedButton.SetActiveUiHint("Hide and show the bed".Localize()); AddRoundButton(bedButton, new Vector2((cubeCenterFromRightTop.X + 18 * scale - bedButton.Width / 2) / scale, startHeight)); var printAreaButton = new ThemedRadioIconButton(StaticData.Instance.LoadIcon("print_area.png", 16, 16).SetToColor(theme.TextColor), theme) @@ -623,8 +614,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Mate = new MateOptions(MateEdge.Right, MateEdge.Top) } }; - modelViewStyleButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Change the current rendering mode".Localize(); - modelViewStyleButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + modelViewStyleButton.MouseEnterBounds += (s, e) => modelViewStyleButton.SetActiveUiHint("Change the current rendering mode".Localize()); modelViewStyleButton.AnchorMate.Mate.VerticalEdge = MateEdge.Bottom; modelViewStyleButton.AnchorMate.Mate.HorizontalEdge = MateEdge.Right; @@ -660,8 +650,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Mate = new MateOptions(MateEdge.Right, MateEdge.Top) } }; - gridSnapButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Adjust the grid that objects will snap to when moved".Localize(); - gridSnapButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + gridSnapButton.MouseEnterBounds += (s, e) => gridSnapButton.SetActiveUiHint("Adjust the grid that objects will snap to when moved".Localize()); gridSnapButton.AnchorMate.Mate.VerticalEdge = MateEdge.Bottom; gridSnapButton.AnchorMate.Mate.HorizontalEdge = MateEdge.Right; diff --git a/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs b/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs index 8cd3ebe09..5d4923d25 100644 --- a/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs +++ b/MatterControlLib/PartPreviewWindow/ViewToolBarControls.cs @@ -131,8 +131,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Margin = theme.ButtonSpacing, VAnchor = VAnchor.Center }; - undoButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Ctrl + z".Localize(); - undoButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + undoButton.MouseEnterBounds += (s, e) => undoButton.SetActiveUiHint("Ctrl + z".Localize()); undoButton.Click += (sender, e) => { sceneContext.Scene.Undo(); @@ -148,8 +147,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Enabled = false, VAnchor = VAnchor.Center }; - redoButton.MouseEnterBounds += (s, e) => ApplicationController.Instance.UiHint = "Ctrl + Y, Ctrl + Shift + Z".Localize(); - redoButton.MouseLeaveBounds += (s, e) => ApplicationController.Instance.UiHint = ""; + redoButton.MouseEnterBounds += (s, e) => redoButton.SetActiveUiHint("Ctrl + Y, Ctrl + Shift + Z".Localize()); redoButton.Click += (sender, e) => { sceneContext.Scene.Redo(); @@ -265,8 +263,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (!string.IsNullOrEmpty(namedAction.UiHint)) { - button.MouseEnterBounds += (s1, e1) => ApplicationController.Instance.UiHint = namedAction.UiHint; - button.MouseLeaveBounds += (s1, e1) => ApplicationController.Instance.UiHint = ""; + button.MouseEnterBounds += (s1, e1) => button.SetActiveUiHint(namedAction.UiHint); } } else @@ -476,8 +473,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var operationButton = new OperationIconButton(operation, sceneContext, theme); if (!string.IsNullOrEmpty(operation.UiHint)) { - operationButton.MouseEnterBounds += (s1, e1) => ApplicationController.Instance.UiHint = operation.UiHint; - operationButton.MouseLeaveBounds += (s1, e1) => ApplicationController.Instance.UiHint = ""; + operationButton.MouseEnterBounds += (s1, e1) => operationButton.SetActiveUiHint(operation.UiHint); } operationButtons.Add(operationButton, operation); @@ -542,8 +538,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (!string.IsNullOrEmpty(operation.UiHint)) { - iconButton.MouseEnterBounds += (s1, e1) => ApplicationController.Instance.UiHint = operation.UiHint; - iconButton.MouseLeaveBounds += (s1, e1) => ApplicationController.Instance.UiHint = ""; + iconButton.MouseEnterBounds += (s1, e1) => iconButton.SetActiveUiHint(operation.UiHint); } UserSettings.Instance.set(operationGroup.GroupRecordId, operationGroup.Operations.IndexOf(operation).ToString()); @@ -770,6 +765,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow foreach (var (button, operation) in operationButtons.Select(kvp => (kvp.Key, kvp.Value))) { button.Enabled = operation.IsEnabled?.Invoke(sceneContext) ?? false; + button.MouseEnterBounds += (s, e) => button.SetActiveUiHint(operation.Title); button.ToolTipText = operation.Title; if (!button.Enabled && !string.IsNullOrEmpty(operation.HelpText)) diff --git a/MatterControlLib/SlicerConfiguration/UIFields/NumberField.cs b/MatterControlLib/SlicerConfiguration/UIFields/NumberField.cs index 65d880fc7..7d26af987 100644 --- a/MatterControlLib/SlicerConfiguration/UIFields/NumberField.cs +++ b/MatterControlLib/SlicerConfiguration/UIFields/NumberField.cs @@ -59,13 +59,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration if (internalTextEditWidget != null && double.TryParse(internalTextEditWidget.Text, out double value)) { - ApplicationController.Instance.UiHint = "Up Arrow = +1, Down Arrow = -1, (Shift * 10, Control / 10)".Localize(); + guiWidget.SetActiveUiHint("Up Arrow = +1, Down Arrow = -1, (Shift * 10, Control / 10)".Localize()); } }; - guiWidget.MouseLeaveBounds += (s, e) => - { - ApplicationController.Instance.UiHint = ""; - }; } private static void InternalTextEditWidget_KeyDown(object sender, KeyEventArgs e)