diff --git a/MatterControlLib/DesignTools/Operations/Image/Histogram.cs b/MatterControlLib/DesignTools/Operations/Image/Histogram.cs index ee3083aa7..a1695aa20 100644 --- a/MatterControlLib/DesignTools/Operations/Image/Histogram.cs +++ b/MatterControlLib/DesignTools/Operations/Image/Histogram.cs @@ -477,12 +477,16 @@ namespace MatterHackers.MatterControl.DesignTools // grabing the center bool centerDown = false; var centerX = 0.0; + var downStart = 0.0; + var downEnd = 0.0; histogramBackground.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { centerDown = true; centerX = e.Position.X; + downStart = RangeStart; + downEnd = RangeEnd; } }; @@ -490,12 +494,19 @@ namespace MatterHackers.MatterControl.DesignTools { if (centerDown) { + var newStart = RangeStart; + var newEnd = RangeEnd; var offset = e.Position.X - centerX; - var newEnd = RangeEnd + offset / _histogramRawCache.Width; - newEnd = agg_basics.Clamp(newEnd, RangeStart, 1); - - var newStart = RangeStart + offset / _histogramRawCache.Width; - newStart = agg_basics.Clamp(newStart, 0, newEnd); + if (offset < 0) + { + newStart = Math.Max(downStart + offset / _histogramRawCache.Width, 0); + newEnd = newStart + (downEnd - downStart); + } + else + { + newEnd = Math.Min(downEnd + offset / _histogramRawCache.Width, 1); + newStart = newEnd - (downEnd - downStart); + } if (RangeStart != newStart && RangeEnd != newEnd) diff --git a/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs b/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs index 0fd913992..7e0f2ae16 100644 --- a/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs +++ b/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs @@ -52,7 +52,7 @@ using Polygons = System.Collections.Generic.List AnalysisType != AnalysisTypes.Transparency); diff --git a/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs b/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs index f91842d9c..eb887f7e0 100644 --- a/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs +++ b/MatterControlLib/DesignTools/Primitives/ImageObject3D.cs @@ -46,13 +46,18 @@ using Newtonsoft.Json; namespace MatterHackers.MatterControl.DesignTools { + public interface IEditorWidgetModifier + { + void ModifyEditorWidget(GuiWidget widget, ThemeConfig theme, Action requestWidgetUpdate); + } + public interface IImageProvider { ImageBuffer Image { get; } } [HideMeterialAndColor] - public class ImageObject3D : AssetObject3D, IImageProvider, IObject3DControlsProvider + public class ImageObject3D : AssetObject3D, IImageProvider, IObject3DControlsProvider, IEditorWidgetModifier { private const double DefaultSizeMm = 60; @@ -243,19 +248,39 @@ namespace MatterHackers.MatterControl.DesignTools return null; } - public void AddEditorExtra(GuiWidget imageWidget, ThemeConfig theme, Action updateEditorImage) + public void ModifyEditorWidget(GuiWidget widget, ThemeConfig theme, Action requestWidgetUpdate) { - imageWidget.Click += (s, e) => + ModifyImageObjectEditorWidget(this, widget, theme, requestWidgetUpdate); + } + + public static void ModifyImageObjectEditorWidget(ImageObject3D imageObject, GuiWidget widget, ThemeConfig theme, Action requestWidgetUpdate) + { + widget.Click += (s, e) => { if (e.Button == MouseButtons.Left) { - ShowOpenDialog(); + ShowOpenDialog(imageObject); } if (e.Button == MouseButtons.Right) { var popupMenu = new PopupMenu(theme); + var openMenu = popupMenu.CreateMenuItem("Open".Localize()); + openMenu.Click += (s2, e2) => + { + popupMenu.Close(); + ShowOpenDialog(imageObject); + }; + + popupMenu.CreateSeparator(); + + var copyMenu = popupMenu.CreateMenuItem("Copy".Localize()); + copyMenu.Click += (s2, e2) => + { + Clipboard.Instance.SetImage(imageObject.Image); + }; + var pasteMenu = popupMenu.CreateMenuItem("Paste".Localize()); pasteMenu.Click += (s2, e2) => { @@ -267,28 +292,22 @@ namespace MatterHackers.MatterControl.DesignTools filePath, activeImage); - this.AssetPath = filePath; - this.Mesh = null; + imageObject.AssetPath = filePath; + imageObject.Mesh = null; - updateEditorImage(); + requestWidgetUpdate(); - this.Invalidate(InvalidateType.Image); + imageObject.Invalidate(InvalidateType.Image); }; pasteMenu.Enabled = Clipboard.Instance.ContainsImage; - var copyMenu = popupMenu.CreateMenuItem("Copy".Localize()); - copyMenu.Click += (s2, e2) => - { - Clipboard.Instance.SetImage(this.Image); - }; - - popupMenu.ShowMenu(imageWidget, e); + popupMenu.ShowMenu(widget, e); } }; } - private void ShowOpenDialog() + public static void ShowOpenDialog(IAssetObject assetObject) { UiThread.RunOnIdle(() => { @@ -305,7 +324,7 @@ namespace MatterHackers.MatterControl.DesignTools return; } - AssetPath = openParams.FileName; + assetObject.AssetPath = openParams.FileName; }); }); } diff --git a/MatterControlLib/DesignTools/PublicPropertyEditor.cs b/MatterControlLib/DesignTools/PublicPropertyEditor.cs index 3ad938a85..9434f79bb 100644 --- a/MatterControlLib/DesignTools/PublicPropertyEditor.cs +++ b/MatterControlLib/DesignTools/PublicPropertyEditor.cs @@ -681,9 +681,9 @@ namespace MatterHackers.MatterControl.DesignTools object3D.Invalidated += RefreshField; imageWidget.Closed += (s, e) => object3D.Invalidated -= RefreshField; - if (object3D is ImageObject3D imageObject) + if (object3D is IEditorWidgetModifier editorWidgetModifier) { - imageObject.AddEditorExtra(imageWidget, theme, UpdateEditorImage); + editorWidgetModifier.ModifyEditorWidget(imageWidget, theme, UpdateEditorImage); } rowContainer.AddChild(imageWidget); @@ -900,21 +900,7 @@ namespace MatterHackers.MatterControl.DesignTools { UiThread.RunOnIdle(() => { - // we do this using to make sure that the stream is closed before we try and insert the Picture - AggContext.FileDialogs.OpenFileDialog( - new OpenFileDialogParams( - "Select an image file|*.jpg;*.png;*.bmp;*.gif;*.pdf", - multiSelect: false, - title: "Add Image".Localize()), - (openParams) => - { - if (!File.Exists(openParams.FileName)) - { - return; - } - - assetObject.AssetPath = openParams.FileName; - }); + ImageObject3D.ShowOpenDialog(assetObject); }); }; } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 2ec468c98..e084f2a9b 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 2ec468c986a2e2a4b65fc092e120760d3f0e1a2d +Subproject commit e084f2a9b64b5e98827ee9929ff84f111a81a61c