Added dragging to the histogram center

Added open to the image to path object when backed by an ImageObject
This commit is contained in:
Lars Brubaker 2021-08-17 11:31:40 -07:00
parent e016241a0b
commit ac5f4ed2f9
5 changed files with 66 additions and 41 deletions

View file

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

View file

@ -52,7 +52,7 @@ using Polygons = System.Collections.Generic.List<System.Collections.Generic.List
namespace MatterHackers.MatterControl.DesignTools
{
[HideMeterialAndColor]
public class ImageToPathObject3D_2 : Object3D, IImageProvider, IPathObject, ISelectedEditorDraw, IObject3DControlsProvider, IPropertyGridModifier
public class ImageToPathObject3D_2 : Object3D, IImageProvider, IPathObject, ISelectedEditorDraw, IObject3DControlsProvider, IPropertyGridModifier, IEditorWidgetModifier
{
public ImageToPathObject3D_2()
{
@ -316,6 +316,15 @@ namespace MatterHackers.MatterControl.DesignTools
});
}
public void ModifyEditorWidget(GuiWidget widget, ThemeConfig theme, Action requestWidgetUpdate)
{
var child = this.Children.First();
if (child is ImageObject3D imageObject)
{
ImageObject3D.ModifyImageObjectEditorWidget(imageObject, widget, theme, requestWidgetUpdate);
}
}
public void UpdateControls(PublicPropertyChange change)
{
change.SetRowVisible(nameof(Histogram), () => AnalysisType != AnalysisTypes.Transparency);

View file

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

View file

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

@ -1 +1 @@
Subproject commit 2ec468c986a2e2a4b65fc092e120760d3f0e1a2d
Subproject commit e084f2a9b64b5e98827ee9929ff84f111a81a61c