diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4fd5e24..d01576c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## /08/2020 - v0.8.1.0
+
+* (Add) Layer preview: Hold-Shift key to select an ROI (Region of interest) on image, that region will be used instead of whole image when running some tools
+* (Add) Layer preview: ESC key to clear ROI
+* (Add) Layer preview: Overlay text with hints for current action
+* (Change) Layer preview: Hold-Shift key to select issues and pick pixel position/brightness changed to Hold-Control key
+* (Change) Layer preview: Shift+click combination to zoom-in changed to Alt+click
+
## 11/08/2020 - v0.8.0.0
* (Add) LGS and LGS30 file format for Longer Orange 10 and 30 (ezrec/uv3dp#105)
diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj
index 2339fa2..cbbb729 100644
--- a/UVtools.Core/UVtools.Core.csproj
+++ b/UVtools.Core/UVtools.Core.csproj
@@ -10,12 +10,12 @@
https://github.com/sn4k3/UVtools
https://github.com/sn4k3/UVtools
MSLA/DLP, file analysis, repair, conversion and manipulation
- 0.8.0.0
+ 0.8.1.0
Copyright © 2020 PTRTECH
UVtools.png
AnyCPU;x64
- 0.8.0.0
- 0.8.0.0
+ 0.8.1.0
+ 0.8.1.0
diff --git a/UVtools.GUI/FrmMain.Designer.cs b/UVtools.GUI/FrmMain.Designer.cs
index aa8a531..8a22929 100644
--- a/UVtools.GUI/FrmMain.Designer.cs
+++ b/UVtools.GUI/FrmMain.Designer.cs
@@ -61,6 +61,7 @@ namespace UVtools.GUI
this.statusBar = new System.Windows.Forms.StatusStrip();
this.mainTable = new System.Windows.Forms.TableLayoutPanel();
this.scCenter = new System.Windows.Forms.SplitContainer();
+ this.lbLayerImageOverlay = new System.Windows.Forms.Label();
this.pbLayer = new Cyotek.Windows.Forms.ImageBox();
this.tsLayer = new System.Windows.Forms.ToolStrip();
this.btnLayerImageExport = new System.Windows.Forms.ToolStripSplitButton();
@@ -246,7 +247,6 @@ namespace UVtools.GUI
this.panelLayerNavigation = new System.Windows.Forms.Panel();
this.pbTrackerIssues = new System.Windows.Forms.PictureBox();
this.lbActualLayer = new System.Windows.Forms.Label();
- this.tbLayer = new UVtools.GUI.Controls.TrackBarEx();
this.lbInitialLayer = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel();
this.btnFindLayer = new System.Windows.Forms.Button();
@@ -257,6 +257,7 @@ namespace UVtools.GUI
this.toolTipInformation = new System.Windows.Forms.ToolTip(this.components);
this.layerScrollTimer = new System.Windows.Forms.Timer(this.components);
this.mouseHoldTimer = new System.Windows.Forms.Timer(this.components);
+ this.tbLayer = new UVtools.GUI.Controls.TrackBarEx();
this.menu.SuspendLayout();
this.mainTable.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.scCenter)).BeginInit();
@@ -315,8 +316,8 @@ namespace UVtools.GUI
this.tlRight.SuspendLayout();
this.panelLayerNavigation.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbTrackerIssues)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.tbLayer)).BeginInit();
this.panel2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tbLayer)).BeginInit();
this.SuspendLayout();
//
// menu
@@ -593,6 +594,7 @@ namespace UVtools.GUI
//
// scCenter.Panel1
//
+ this.scCenter.Panel1.Controls.Add(this.lbLayerImageOverlay);
this.scCenter.Panel1.Controls.Add(this.pbLayer);
this.scCenter.Panel1.Controls.Add(this.tsLayer);
//
@@ -604,6 +606,19 @@ namespace UVtools.GUI
this.scCenter.SplitterDistance = 730;
this.scCenter.TabIndex = 4;
//
+ // lbLayerImageOverlay
+ //
+ this.lbLayerImageOverlay.AutoSize = true;
+ this.lbLayerImageOverlay.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+ this.lbLayerImageOverlay.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.lbLayerImageOverlay.Location = new System.Drawing.Point(13, 37);
+ this.lbLayerImageOverlay.Name = "lbLayerImageOverlay";
+ this.lbLayerImageOverlay.Padding = new System.Windows.Forms.Padding(5);
+ this.lbLayerImageOverlay.Size = new System.Drawing.Size(70, 30);
+ this.lbLayerImageOverlay.TabIndex = 8;
+ this.lbLayerImageOverlay.Text = "Overlay";
+ this.lbLayerImageOverlay.Visible = false;
+ //
// pbLayer
//
this.pbLayer.AllowDoubleClick = true;
@@ -616,6 +631,7 @@ namespace UVtools.GUI
this.pbLayer.Size = new System.Drawing.Size(1176, 705);
this.pbLayer.TabIndex = 7;
this.pbLayer.Zoomed += new System.EventHandler(this.pbLayer_Zoomed);
+ this.pbLayer.KeyUp += new System.Windows.Forms.KeyEventHandler(this.EventKeyUp);
this.pbLayer.MouseClick += new System.Windows.Forms.MouseEventHandler(this.EventMouseClick);
this.pbLayer.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.EventMouseDoubleClick);
this.pbLayer.MouseDown += new System.Windows.Forms.MouseEventHandler(this.EventMouseDown);
@@ -2721,18 +2737,6 @@ namespace UVtools.GUI
this.lbActualLayer.TabIndex = 9;
this.lbActualLayer.Text = "?";
//
- // tbLayer
- //
- this.tbLayer.Dock = System.Windows.Forms.DockStyle.Right;
- this.tbLayer.Location = new System.Drawing.Point(93, 0);
- this.tbLayer.Margin = new System.Windows.Forms.Padding(0);
- this.tbLayer.Name = "tbLayer";
- this.tbLayer.Orientation = System.Windows.Forms.Orientation.Vertical;
- this.tbLayer.Size = new System.Drawing.Size(45, 557);
- this.tbLayer.TabIndex = 8;
- this.tbLayer.TickStyle = System.Windows.Forms.TickStyle.TopLeft;
- this.tbLayer.ValueChanged += new System.EventHandler(this.ValueChanged);
- //
// lbInitialLayer
//
this.lbInitialLayer.Dock = System.Windows.Forms.DockStyle.Fill;
@@ -2823,6 +2827,18 @@ namespace UVtools.GUI
this.mouseHoldTimer.Interval = 1000;
this.mouseHoldTimer.Tick += new System.EventHandler(this.EventTimerTick);
//
+ // tbLayer
+ //
+ this.tbLayer.Dock = System.Windows.Forms.DockStyle.Right;
+ this.tbLayer.Location = new System.Drawing.Point(93, 0);
+ this.tbLayer.Margin = new System.Windows.Forms.Padding(0);
+ this.tbLayer.Name = "tbLayer";
+ this.tbLayer.Orientation = System.Windows.Forms.Orientation.Vertical;
+ this.tbLayer.Size = new System.Drawing.Size(45, 557);
+ this.tbLayer.TabIndex = 8;
+ this.tbLayer.TickStyle = System.Windows.Forms.TickStyle.TopLeft;
+ this.tbLayer.ValueChanged += new System.EventHandler(this.ValueChanged);
+ //
// FrmMain
//
this.AllowDrop = true;
@@ -2929,8 +2945,8 @@ namespace UVtools.GUI
this.panelLayerNavigation.ResumeLayout(false);
this.panelLayerNavigation.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbTrackerIssues)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.tbLayer)).EndInit();
this.panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.tbLayer)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -3163,6 +3179,7 @@ namespace UVtools.GUI
private System.Windows.Forms.ToolStripSplitButton btnLayerImageActions;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator26;
private System.Windows.Forms.ToolStripButton btnLogVerbose;
+ private System.Windows.Forms.Label lbLayerImageOverlay;
}
}
diff --git a/UVtools.GUI/FrmMain.cs b/UVtools.GUI/FrmMain.cs
index 167cd82..fec5cce 100644
--- a/UVtools.GUI/FrmMain.cs
+++ b/UVtools.GUI/FrmMain.cs
@@ -19,6 +19,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BrightIdeasSoftware;
+using Cyotek.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
@@ -146,7 +147,6 @@ namespace UVtools.GUI
}
ControlLeftLastTab = tbpThumbnailsAndInfo;
-
Clear();
btnLayerImageLayerDifference.Checked = Settings.Default.LayerDifferenceDefault;
@@ -159,7 +159,7 @@ namespace UVtools.GUI
btnLayerImageLayerOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas;
// Initialize pbLayer zoom levels to use the discrete factors from ZoomLevels
- pbLayer.ZoomLevels = new Cyotek.Windows.Forms.ZoomLevelCollection(ZoomLevels);
+ pbLayer.ZoomLevels = new ZoomLevelCollection(ZoomLevels);
// Initialize the zoom level used for autozoom based on the stored default settings.
LockedZoomLevel = ZoomLevels[Settings.Default.ZoomLockLevel + ZoomLevelSkipCount];
@@ -1581,16 +1581,20 @@ namespace UVtools.GUI
private void pbLayer_MouseMove(object sender, MouseEventArgs e)
{
- if (!pbLayer.IsPointInImage(e.Location) || (ModifierKeys & Keys.Shift) == 0) return;
+ if (!pbLayer.IsPointInImage(e.Location)) return;
var location = pbLayer.PointToImage(e.Location);
+
+ if ((ModifierKeys & Keys.Control) != 0)
+ {
+ Point realLocation = GetTransposedPoint(location);
+ tsLayerImageMouseLocation.Text =
+ $"{{X={realLocation.X}, Y={realLocation.Y}, B={ActualLayerImage.GetByte(realLocation)}}}";
+ }
+
+ if ((ModifierKeys & Keys.Shift) == 0) return;
if (_lastPixelMouseLocation == e.Location) return;
_lastPixelMouseLocation = e.Location;
- Point realLocation = GetTransposedPoint(location);
-
- tsLayerImageMouseLocation.Text =
- $"{{X={realLocation.X}, Y={realLocation.Y}, B={ActualLayerImage.GetByte(realLocation)}}}";
-
// Bail here if we're not in a draw operation, if the mouse button is not either
// left or right, or if the location of the mouse pointer is not within the image.
if (tabControlPixelEditor.SelectedIndex != (int) PixelOperation.PixelOperationType.Drawing) return;
@@ -2775,20 +2779,45 @@ namespace UVtools.GUI
// the cross cursor is displayed even before the pblayer control has focus.
// This ensures the user is aware that even in this case, a click in the layer
// preview will draw a pixel.
- if (ReferenceEquals(sender, this))
+ if (ReferenceEquals(sender, this) && !ReferenceEquals(SlicerFile, null))
{
// This event repeats for as long as the key is pressed, so if we've
// already set the cursor from a previous key down event, just return.
- if (pbLayer.Cursor == Cursors.Cross || pbLayer.Cursor == Cursors.Hand) return;
+ if (pbLayer.Cursor == Cursors.Cross || pbLayer.Cursor == Cursors.Hand || pbLayer.SelectionMode == ImageBoxSelectionMode.Rectangle) return;
// Pixel Edit is active, Shift is down, and the cursor is over the image region.
- if (e.KeyCode == Keys.ShiftKey &&
- pbLayer.ClientRectangle.Contains(pbLayer.PointToClient(MousePosition)))
+ if (pbLayer.ClientRectangle.Contains(pbLayer.PointToClient(MousePosition)))
{
+ if (e.Modifiers == Keys.Shift)
+ {
+ if (btnLayerImagePixelEdit.Checked)
+ {
+ pbLayer.Cursor = Cursors.Cross;
+ pbLayer.PanMode = ImageBoxPanMode.None;
+ lbLayerImageOverlay.Text = "Pixel editing is on\n" +
+ "Click to draw";
+ }
+ else
+ {
+ pbLayer.SelectionMode = ImageBoxSelectionMode.Rectangle;
+ lbLayerImageOverlay.Text = "ROI selection mode\n" +
+ "Press Esc to clear the ROI";
+ }
- pbLayer.Cursor = btnLayerImagePixelEdit.Checked ? Cursors.Cross : Cursors.Hand;
- pbLayer.PanMode = Cyotek.Windows.Forms.ImageBoxPanMode.None;
- //if (!ReferenceEquals(SlicerFile, null)) ShowLayer(); // Not needed?
+ lbLayerImageOverlay.Visible = true;
+
+ return;
+ }
+ if (e.Modifiers == Keys.Control)
+ {
+ pbLayer.Cursor = Cursors.Hand;
+ pbLayer.PanMode = ImageBoxPanMode.None;
+ lbLayerImageOverlay.Text = "Issue selection mode\n" +
+ "Click on a issue to select it";
+
+ lbLayerImageOverlay.Visible = true;
+ return;
+ }
}
return;
@@ -2798,15 +2827,29 @@ namespace UVtools.GUI
private void EventKeyUp(object sender, KeyEventArgs e)
{
// As with EventKeyDown, we handle this event at the to top level
- // to ensure cursor and pan functionaty are restored regardless
+ // to ensure cursor and pan functionality are restored regardless
// of which form has focus when shift is released.
if (ReferenceEquals(sender, this))
{
- if (e.KeyCode == Keys.ShiftKey)
+ if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.ControlKey)
{
pbLayer.Cursor = Cursors.Default;
- pbLayer.PanMode = Cyotek.Windows.Forms.ImageBoxPanMode.Left;
+ pbLayer.PanMode = ImageBoxPanMode.Left;
+ pbLayer.SelectionMode = ImageBoxSelectionMode.None;
+ lbLayerImageOverlay.Visible = false;
//if (!ReferenceEquals(SlicerFile, null)) ShowLayer(); // Not needed?
+ e.Handled = true;
+ }
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, pbLayer))
+ {
+ if (e.KeyCode == Keys.Escape)
+ {
+ pbLayer.SelectNone();
+ e.Handled = true;
}
return;
@@ -3090,10 +3133,11 @@ namespace UVtools.GUI
{
if (ReferenceEquals(sender, pbLayer))
{
- if ((ModifierKeys & Keys.Control) != 0)
+ if ((ModifierKeys & Keys.Alt) != 0)
{
- // CTRL click within pbLayer performs double click action
+ // ALT click within pbLayer performs double click action
HandleMouseDoubleClick(sender, e);
+
return;
}
@@ -3102,8 +3146,7 @@ namespace UVtools.GUI
// Check to see if the clicked location is an issue,
// and if so, select it in the ListView.
- if (!ReferenceEquals(tabControlLeft.SelectedTab, tabPagePixelEditor) &&
- (ModifierKeys & Keys.Shift) != 0)
+ if ((ModifierKeys & Keys.Control) != 0)
SelectIssueAtPoint(location);
return;
@@ -3112,9 +3155,9 @@ namespace UVtools.GUI
private void EventMouseDoubleClick(object sender, MouseEventArgs e)
{
- // Ignore double click if CTRL is pressed. Prevents CTRL-click
+ // Ignore double click if CTRL is pressed. Prevents ALT-click
// events that emulate double click from firing twice.
- if ((ModifierKeys & Keys.Control) != 0) return;
+ if ((ModifierKeys & Keys.Alt) != 0) return;
HandleMouseDoubleClick(sender, e);
}
@@ -3196,7 +3239,7 @@ namespace UVtools.GUI
//var point = pbLayer.PointToImage(location);
Point realLocation = GetTransposedPoint(location);
-
+
PixelOperation operation = null;
Bitmap bmp = pbLayer.Image as Bitmap;
diff --git a/UVtools.GUI/FrmMain.resx b/UVtools.GUI/FrmMain.resx
index 124d9d2..881eac7 100644
--- a/UVtools.GUI/FrmMain.resx
+++ b/UVtools.GUI/FrmMain.resx
@@ -174,7 +174,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk
- FAAAAk1TRnQBSQFMAgEBBgEAAaABCgGgAQoBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ FAAAAk1TRnQBSQFMAgEBBgEAATABCwEwAQsBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIC4AAxgBIgMwAUsDMAFMAzIBUDMAAQEDJAE2AysBQqwAAyIBMQNWAbkDXQHi
AwAB/wMAAf8BKgEtASgB/gNTAawDTQGVAwABARgAAwkBDAMzAVIDUAGdA1cB6AMAAf4DKwH8Ay8BSqQA
AyEBMANZAewBKwEuASkB+gNRAfcDUgH0A1MB8QNIAfYDQQH5AwAB/wNPAZsDAAEBCAADFQEdAz8BbgNV
diff --git a/UVtools.GUI/Images/object-group-16x16.png b/UVtools.GUI/Images/object-group-16x16.png
new file mode 100644
index 0000000..e5cd1e9
Binary files /dev/null and b/UVtools.GUI/Images/object-group-16x16.png differ
diff --git a/UVtools.GUI/Properties/AssemblyInfo.cs b/UVtools.GUI/Properties/AssemblyInfo.cs
index 78da796..7d72103 100644
--- a/UVtools.GUI/Properties/AssemblyInfo.cs
+++ b/UVtools.GUI/Properties/AssemblyInfo.cs
@@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.8.0.0")]
-[assembly: AssemblyFileVersion("0.8.0.0")]
+[assembly: AssemblyVersion("0.8.1.0")]
+[assembly: AssemblyFileVersion("0.8.1.0")]
diff --git a/UVtools.GUI/Properties/Resources.Designer.cs b/UVtools.GUI/Properties/Resources.Designer.cs
index 659af52..18b07d0 100644
--- a/UVtools.GUI/Properties/Resources.Designer.cs
+++ b/UVtools.GUI/Properties/Resources.Designer.cs
@@ -670,6 +670,16 @@ namespace UVtools.GUI.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap object_group_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("object-group-16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
diff --git a/UVtools.GUI/Properties/Resources.resx b/UVtools.GUI/Properties/Resources.resx
index eae12a1..fed685c 100644
--- a/UVtools.GUI/Properties/Resources.resx
+++ b/UVtools.GUI/Properties/Resources.resx
@@ -139,14 +139,11 @@
..\Images\mask-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\Back-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\Images\move-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\filter-filled-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\cursor-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\Cancel-32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -184,8 +181,8 @@
..\Images\Ok-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\plus-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\blur-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\Save-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -208,14 +205,11 @@
..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\pixel-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\cursor-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\sync-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\settings-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -232,9 +226,6 @@
..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\sync-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\Images\Exit-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -247,15 +238,15 @@
..\Images\pattern-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\Extract-object-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\blur-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\pixel-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\burn-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Images\minus_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -265,12 +256,12 @@
..\Images\trash-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\accept-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
..\Images\file-image-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Images\refresh-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -292,11 +283,23 @@
..\Images\bowling-ball-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\Extract-object-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\file-import-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\undo-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Images\square-solid-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\burn-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\chessboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\filter-filled-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\arrow-down-double-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -310,8 +313,8 @@
..\Images\Global-Network-icon-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\file-import-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\plus-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\photo-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -340,8 +343,8 @@
..\Images\expand-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\accept-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\copy_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
@@ -364,13 +367,13 @@
..\Images\ladder-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\chessboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\Back-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
..\Images\expand-alt-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
- ..\Images\undo-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Images\object-group-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
\ No newline at end of file
diff --git a/UVtools.GUI/UVtools.GUI.csproj b/UVtools.GUI/UVtools.GUI.csproj
index 3589b23..85bfe97 100644
--- a/UVtools.GUI/UVtools.GUI.csproj
+++ b/UVtools.GUI/UVtools.GUI.csproj
@@ -488,6 +488,7 @@
+