From 2fa2a3fb4c39c2aa3b3ae86938cdd168c9faab51 Mon Sep 17 00:00:00 2001 From: lastbattle <4586194+lastbattle@users.noreply.github.com> Date: Sun, 30 Jun 2024 12:49:51 +0800 Subject: [PATCH 1/5] [HaRepacker] fixed an edge case exception with selecting nodes for upscaling --- HaRepacker/GUI/Panels/MainPanel.xaml.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/HaRepacker/GUI/Panels/MainPanel.xaml.cs b/HaRepacker/GUI/Panels/MainPanel.xaml.cs index 6a9df415..ac867a9b 100644 --- a/HaRepacker/GUI/Panels/MainPanel.xaml.cs +++ b/HaRepacker/GUI/Panels/MainPanel.xaml.cs @@ -1289,9 +1289,12 @@ private void UpscaleImageNodesRecursively(WzNode node, Dictionary(bitmap, property, node)); + toUpscaleImageDictionary.Add(property.FullPath.GetHashCode().ToString(), new Tuple(bitmap, property, node)); + } } } else { From 67e11db27ca8d31f17fdf51b894cd12043360cd8 Mon Sep 17 00:00:00 2001 From: lastbattle <4586194+lastbattle@users.noreply.github.com> Date: Sun, 30 Jun 2024 13:13:03 +0800 Subject: [PATCH 2/5] [HaRepacker] during changing a WzCanvasProperty image, close the file handle right away after loading to memory --- HaRepacker/GUI/Panels/MainPanel.xaml.cs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/HaRepacker/GUI/Panels/MainPanel.xaml.cs b/HaRepacker/GUI/Panels/MainPanel.xaml.cs index ac867a9b..2e5611be 100644 --- a/HaRepacker/GUI/Panels/MainPanel.xaml.cs +++ b/HaRepacker/GUI/Panels/MainPanel.xaml.cs @@ -923,19 +923,28 @@ private void MenuItem_changeImage_Click(object sender, RoutedEventArgs e) }; if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; - System.Drawing.Bitmap bmp; - try - { - bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(dialog.FileName); + + byte[] bitmapBytes = null; + try { + using (System.Drawing.Bitmap originalBitmap = new System.Drawing.Bitmap(dialog.FileName)) { + using (MemoryStream ms = new MemoryStream()) { + originalBitmap.Save(ms, originalBitmap.RawFormat); + bitmapBytes = ms.ToArray(); + } + } } - catch - { + catch { Warning.Error(Properties.Resources.MainImageLoadError); return; } //List actions = new List(); // Undo action - ChangeCanvasPropBoxImage(bmp); + if (bitmapBytes != null) { + using (MemoryStream ms = new MemoryStream(bitmapBytes)) { + System.Drawing.Bitmap newBitmap = new System.Drawing.Bitmap(ms); + ChangeCanvasPropBoxImage(newBitmap); + } + } } } From 20df42eeae2c2d4ad413fd64ad71ba87e3703ac2 Mon Sep 17 00:00:00 2001 From: lastbattle <4586194+lastbattle@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:00:00 +0800 Subject: [PATCH 3/5] [HaRepacker] fixed an issue with prior commit -- image stream gets closed https://github.com/lastbattle/Harepacker-resurrected/commit/67e11db27ca8d31f17fdf51b894cd12043360cd8 --- HaRepacker/GUI/Panels/MainPanel.xaml.cs | 8 ++++---- HaSharedLibrary/Util/BitmapHelper.cs | 25 +++++++++++++++++++++++++ MapleLib | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/HaRepacker/GUI/Panels/MainPanel.xaml.cs b/HaRepacker/GUI/Panels/MainPanel.xaml.cs index 2e5611be..32d6636e 100644 --- a/HaRepacker/GUI/Panels/MainPanel.xaml.cs +++ b/HaRepacker/GUI/Panels/MainPanel.xaml.cs @@ -940,10 +940,10 @@ private void MenuItem_changeImage_Click(object sender, RoutedEventArgs e) //List actions = new List(); // Undo action if (bitmapBytes != null) { - using (MemoryStream ms = new MemoryStream(bitmapBytes)) { - System.Drawing.Bitmap newBitmap = new System.Drawing.Bitmap(ms); - ChangeCanvasPropBoxImage(newBitmap); - } + MemoryStream ms = new MemoryStream(bitmapBytes); // dont close this + System.Drawing.Bitmap newBitmap = new System.Drawing.Bitmap(ms); + + ChangeCanvasPropBoxImage(newBitmap); } } } diff --git a/HaSharedLibrary/Util/BitmapHelper.cs b/HaSharedLibrary/Util/BitmapHelper.cs index a618584c..f13b8b73 100644 --- a/HaSharedLibrary/Util/BitmapHelper.cs +++ b/HaSharedLibrary/Util/BitmapHelper.cs @@ -1,6 +1,10 @@ using Microsoft.Xna.Framework.Graphics; +using System; +using System.Diagnostics; using System.Drawing; +using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Windows.Media.Imaging; namespace HaSharedLibrary.Util @@ -41,5 +45,26 @@ public static Texture2D ToTexture2D(this System.Drawing.Bitmap bitmap, GraphicsD return Texture2D.FromStream(device, s); } } + + /// + /// Gets the image format extention from ImageFormat object i.e Png returns "png" + /// + /// + /// + public static string GetImageFormatExtension(ImageFormat imageFormat) { + // Get all image encoders + ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); + + // Find the codec with the matching format + foreach (ImageCodecInfo codec in codecs) { + //Debug.WriteLine(codec.FormatID.ToString() + ", " + imageFormat.Guid.ToString()); + if (codec.FormatID.ToString() == imageFormat.Guid.ToString()) { + // Extract the file extension from the codec's FilenameExtension property + string extension = codec.FilenameExtension.Split(';').First().TrimStart('*'); + return extension; + } + } + return "unknown"; + } } } diff --git a/MapleLib b/MapleLib index bbadd00c..d4740fb7 160000 --- a/MapleLib +++ b/MapleLib @@ -1 +1 @@ -Subproject commit bbadd00ced05c015e6ab3475d9ac19095ec95ce2 +Subproject commit d4740fb7928214a9f93b54a6ebcf3b93a58e2457 From b277693194d8a47bb3701cf509569be8ece8451d Mon Sep 17 00:00:00 2001 From: lastbattle <4586194+lastbattle@users.noreply.github.com> Date: Thu, 4 Jul 2024 00:07:16 +0800 Subject: [PATCH 4/5] [HaRepacker] moved image properties to PropertyGrid, added color filter feature --- .../ImageSizeDoubleToIntegerConverter.cs | 8 +- .../ImageWidthOrHeightToScreenDPIConverter.cs | 8 +- HaRepacker/Converter/PointFConverter.cs | 34 ++ .../PointFOriginToStringConverter.cs | 5 +- .../Converter/PointFToVisiblityConverter.cs | 5 +- HaRepacker/Converter/PointFValueConverter.cs | 19 + .../VectorOriginPointFToMarginConverter.cs | 5 +- HaRepacker/GUI/Controls/NotifyPointF.cs | 55 +++ HaRepacker/GUI/Controls/PointFEditor.cs | 27 + .../GUI/Controls/PointFEditorControl.cs | 44 ++ HaRepacker/GUI/Panels/MainPanel.xaml | 6 +- HaRepacker/GUI/Panels/MainPanel.xaml.cs | 74 ++- .../Panels/SubPanels/ImageRenderViewer.xaml | 251 +++------- .../SubPanels/ImageRenderViewer.xaml.cs | 464 ++++++------------ .../Panels/SubPanels/ImageRenderViewerItem.cs | 262 ++++++++++ HaRepacker/Harepacker-resurrected.csproj | 25 +- HaRepacker/packages.config | 3 +- HaSharedLibrary/Util/BitmapHelper.cs | 58 +++ 18 files changed, 804 insertions(+), 549 deletions(-) create mode 100644 HaRepacker/Converter/PointFConverter.cs create mode 100644 HaRepacker/Converter/PointFValueConverter.cs create mode 100644 HaRepacker/GUI/Controls/NotifyPointF.cs create mode 100644 HaRepacker/GUI/Controls/PointFEditor.cs create mode 100644 HaRepacker/GUI/Controls/PointFEditorControl.cs create mode 100644 HaRepacker/GUI/Panels/SubPanels/ImageRenderViewerItem.cs diff --git a/HaRepacker/Converter/ImageSizeDoubleToIntegerConverter.cs b/HaRepacker/Converter/ImageSizeDoubleToIntegerConverter.cs index a49d96a0..13b17a5b 100644 --- a/HaRepacker/Converter/ImageSizeDoubleToIntegerConverter.cs +++ b/HaRepacker/Converter/ImageSizeDoubleToIntegerConverter.cs @@ -21,16 +21,16 @@ public class ImageSizeDoubleToIntegerConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - double value_ = (double)value; + int value_ = (int)value; - return (int)value_; + return value_; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - double value_ = (double)value; + int value_ = (int)value; - return (int)value_; + return value_; } } } diff --git a/HaRepacker/Converter/ImageWidthOrHeightToScreenDPIConverter.cs b/HaRepacker/Converter/ImageWidthOrHeightToScreenDPIConverter.cs index d91ff290..daa93ca1 100644 --- a/HaRepacker/Converter/ImageWidthOrHeightToScreenDPIConverter.cs +++ b/HaRepacker/Converter/ImageWidthOrHeightToScreenDPIConverter.cs @@ -23,16 +23,16 @@ public class ImageWidthOrHeightToScreenDPIConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - double widthOrHeight = (double)value; - double realWidthOrHeightToDisplay = widthOrHeight * ScreenDPIUtil.GetScreenScaleFactor(); + int widthOrHeight = (int)value; + int realWidthOrHeightToDisplay = (int) ((double) widthOrHeight * ScreenDPIUtil.GetScreenScaleFactor()); return realWidthOrHeightToDisplay; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - double value_ = (double)value; - double imageWidthOrHeight = value_ / ScreenDPIUtil.GetScreenScaleFactor(); + int value_ = (int)value; + int imageWidthOrHeight = (int) ((double)value_ / ScreenDPIUtil.GetScreenScaleFactor()); return imageWidthOrHeight; } diff --git a/HaRepacker/Converter/PointFConverter.cs b/HaRepacker/Converter/PointFConverter.cs new file mode 100644 index 00000000..d302a1b7 --- /dev/null +++ b/HaRepacker/Converter/PointFConverter.cs @@ -0,0 +1,34 @@ +using HaRepacker.GUI.Controls; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HaRepacker.Converter { + public class PointFConverter : TypeConverter { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { + return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { + if (value is string stringValue) { + string[] parts = stringValue.Split(','); + if (parts.Length == 2 && float.TryParse(parts[0], out float x) && float.TryParse(parts[1], out float y)) { + return new NotifyPointF(x, y); + } + } + return base.ConvertFrom(context, culture, value); + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { + if (destinationType == typeof(string) && value is NotifyPointF point) { + return $"{point.X},{point.Y}"; + } + return base.ConvertTo(context, culture, value, destinationType); + } + } +} diff --git a/HaRepacker/Converter/PointFOriginToStringConverter.cs b/HaRepacker/Converter/PointFOriginToStringConverter.cs index 27457d84..46a128af 100644 --- a/HaRepacker/Converter/PointFOriginToStringConverter.cs +++ b/HaRepacker/Converter/PointFOriginToStringConverter.cs @@ -6,6 +6,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +using HaRepacker.GUI.Controls; using System; using System.Collections.Generic; using System.Drawing; @@ -23,14 +24,14 @@ public class PointFOriginToStringConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - PointF point = (PointF)value; + NotifyPointF point = (PointF)value; return string.Format("X {0}, Y {1}", point.X, point.Y); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - return new PointF(0,0); // anyway wtf + return new NotifyPointF(0,0); // anyway wtf } } } diff --git a/HaRepacker/Converter/PointFToVisiblityConverter.cs b/HaRepacker/Converter/PointFToVisiblityConverter.cs index 7d3c9abe..71edb72c 100644 --- a/HaRepacker/Converter/PointFToVisiblityConverter.cs +++ b/HaRepacker/Converter/PointFToVisiblityConverter.cs @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +using HaRepacker.GUI.Controls; using System; using System.Collections.Generic; using System.Drawing; @@ -25,7 +26,7 @@ public class PointFToVisiblityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - PointF point = (PointF)value; + NotifyPointF point = (NotifyPointF)value; if (point.X == 0 && point.Y == 0) return Visibility.Collapsed; @@ -35,7 +36,7 @@ public object Convert(object value, Type targetType, object parameter, System.Gl public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - return new PointF(0, 0); // anyway wtf + return new NotifyPointF(0, 0); // anyway wtf } } } diff --git a/HaRepacker/Converter/PointFValueConverter.cs b/HaRepacker/Converter/PointFValueConverter.cs new file mode 100644 index 00000000..56621413 --- /dev/null +++ b/HaRepacker/Converter/PointFValueConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace HaRepacker.Converter { + public class PointFValueConverter : IValueConverter { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + return value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { + return value; + } + } +} diff --git a/HaRepacker/Converter/VectorOriginPointFToMarginConverter.cs b/HaRepacker/Converter/VectorOriginPointFToMarginConverter.cs index db235d8e..c5bd9269 100644 --- a/HaRepacker/Converter/VectorOriginPointFToMarginConverter.cs +++ b/HaRepacker/Converter/VectorOriginPointFToMarginConverter.cs @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +using HaRepacker.GUI.Controls; using HaRepacker.Utils; using System; using System.Collections.Generic; @@ -26,7 +27,7 @@ public class VectorOriginPointFToMarginConverter : IValueConverter public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { - PointF originValue = (PointF)value; + NotifyPointF originValue = (NotifyPointF)value; // converted // its always -50, as it is 50px wide, as specified in the xaml @@ -41,7 +42,7 @@ public object ConvertBack(object value, Type targetType, object parameter, Syste Thickness value_ = (Thickness)value; // converted - PointF originValue = new PointF((float) ((value_.Left) * ScreenDPIUtil.GetScreenScaleFactor()), (float) ((value_.Top + fCrossHairWidthHeight) * ScreenDPIUtil.GetScreenScaleFactor())); + PointF originValue = new NotifyPointF((float) ((value_.Left) * ScreenDPIUtil.GetScreenScaleFactor()), (float) ((value_.Top + fCrossHairWidthHeight) * ScreenDPIUtil.GetScreenScaleFactor())); return originValue; } } diff --git a/HaRepacker/GUI/Controls/NotifyPointF.cs b/HaRepacker/GUI/Controls/NotifyPointF.cs new file mode 100644 index 00000000..35d90ff9 --- /dev/null +++ b/HaRepacker/GUI/Controls/NotifyPointF.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HaRepacker.GUI.Controls { + /// + /// Custom PointF struct that implements INotifyPropertyChanged for PropertyView + /// + public class NotifyPointF : INotifyPropertyChanged { + private float _x; + private float _y; + + public float X { + get => _x; + set { + if (_x != value) { + _x = value; + OnPropertyChanged(nameof(X)); + } + } + } + + public float Y { + get => _y; + set { + if (_y != value) { + _y = value; + OnPropertyChanged(nameof(Y)); + } + } + } + + public NotifyPointF(float x, float y) { + _x = x; + _y = y; + } + public NotifyPointF(PointF f) { + _x = f.X; + _y = f.Y; + } + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnPropertyChanged(string propertyName) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + public static implicit operator PointF(NotifyPointF point) => new PointF(point.X, point.Y); + public static implicit operator NotifyPointF(PointF point) => new NotifyPointF(point.X, point.Y); + } +} diff --git a/HaRepacker/GUI/Controls/PointFEditor.cs b/HaRepacker/GUI/Controls/PointFEditor.cs new file mode 100644 index 00000000..bf2e486d --- /dev/null +++ b/HaRepacker/GUI/Controls/PointFEditor.cs @@ -0,0 +1,27 @@ +using HaRepacker.Converter; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using Xceed.Wpf.Toolkit.PropertyGrid; +using Xceed.Wpf.Toolkit.PropertyGrid.Editors; + +namespace HaRepacker.GUI.Controls { + + public class PointFEditor : TypeEditor { + protected override void SetValueDependencyProperty() { + ValueProperty = PointFEditorControl.PointFProperty; + } + + protected override void SetControlProperties(PropertyItem propertyItem) { + base.SetControlProperties(propertyItem); + Editor.IsReadOnly = propertyItem.IsReadOnly; + } + + protected override IValueConverter CreateValueConverter() { + return new PointFValueConverter(); + } + } +} \ No newline at end of file diff --git a/HaRepacker/GUI/Controls/PointFEditorControl.cs b/HaRepacker/GUI/Controls/PointFEditorControl.cs new file mode 100644 index 00000000..cc0d632c --- /dev/null +++ b/HaRepacker/GUI/Controls/PointFEditorControl.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; + +namespace HaRepacker.GUI.Controls { + /// + /// A custom control to make PointF editable. + /// + public class PointFEditorControl : Control { + public static readonly DependencyProperty PointFProperty = + DependencyProperty.Register(nameof(PointF), typeof(NotifyPointF), typeof(PointFEditorControl), + new FrameworkPropertyMetadata(new NotifyPointF(0, 0), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); + + public static readonly DependencyProperty IsReadOnlyProperty = + DependencyProperty.Register(nameof(IsReadOnly), typeof(bool), typeof(PointFEditorControl), new PropertyMetadata(false)); + + public NotifyPointF PointF { + get { + return (NotifyPointF)GetValue(PointFProperty); + } + set { + SetValue(PointFProperty, value); + } + } + + public bool IsReadOnly { + get { + return (bool)GetValue(IsReadOnlyProperty); + } + set { + SetValue(IsReadOnlyProperty, value); + } + } + + static PointFEditorControl() { + DefaultStyleKeyProperty.OverrideMetadata(typeof(PointFEditorControl), new FrameworkPropertyMetadata(typeof(PointFEditorControl))); + } + } +} \ No newline at end of file diff --git a/HaRepacker/GUI/Panels/MainPanel.xaml b/HaRepacker/GUI/Panels/MainPanel.xaml index cb56b88a..ac2c012a 100644 --- a/HaRepacker/GUI/Panels/MainPanel.xaml +++ b/HaRepacker/GUI/Panels/MainPanel.xaml @@ -272,9 +272,9 @@ - + - + @@ -371,7 +371,7 @@ - + /// /// - private void ChangeCanvasPropBoxImage(Bitmap bmp) + public void ChangeCanvasPropBoxImage(Bitmap bmp) { if (DataTree.SelectedNode.Tag is WzCanvasProperty property) { + WzNode parentCanvasNode = (WzNode)DataTree.SelectedNode; + WzCanvasProperty selectedWzCanvas = property; if (selectedWzCanvas.ContainsInlinkProperty()) // if its an inlink property, remove that before updating base image. { selectedWzCanvas.RemoveProperty(selectedWzCanvas[WzCanvasProperty.InlinkPropertyName]); - WzNode parentCanvasNode = (WzNode)DataTree.SelectedNode; WzNode childInlinkNode = WzNode.GetChildNode(parentCanvasNode, WzCanvasProperty.InlinkPropertyName); // Add undo actions @@ -977,7 +979,6 @@ private void ChangeCanvasPropBoxImage(Bitmap bmp) { selectedWzCanvas.RemoveProperty(selectedWzCanvas[WzCanvasProperty.OutlinkPropertyName]); - WzNode parentCanvasNode = (WzNode)DataTree.SelectedNode; WzNode childInlinkNode = WzNode.GetChildNode(parentCanvasNode, WzCanvasProperty.OutlinkPropertyName); // Add undo actions @@ -987,10 +988,18 @@ private void ChangeCanvasPropBoxImage(Bitmap bmp) selectedWzCanvas.PngProperty.SetImage(bmp); - // Updates - selectedWzCanvas.ParentImage.Changed = true; + canvasPropBox.SetIsLoading(true); + try { + canvasPropBox.BindingPropertyItem.Bitmap = bmp; + canvasPropBox.BindingPropertyItem.BitmapBackup = bmp; + } + finally { + canvasPropBox.SetIsLoading(false); + } - canvasPropBox.Image = bmp.ToWpfBitmap(); + // flag changed for saving updates + // and also node foreground color + parentCanvasNode.ChangedNodeProperty(); // Add undo actions //UndoRedoMan.AddUndoBatch(actions); @@ -1008,8 +1017,10 @@ private void RefreshSelectedImageToImageRenderviewer(object selectedTreeNode, Im if (selectedTreeNode is WzCanvasProperty) // only allow button click if its an image property { System.Drawing.Image img = ((WzCanvasProperty)(selectedTreeNode))?.GetLinkedWzCanvasBitmap(); - if (img != null) - canvasPropBox.Image = ((System.Drawing.Bitmap)img).ToWpfBitmap(); + if (img != null) { + canvasPropBox.BindingPropertyItem.Bitmap = (Bitmap)img; + canvasPropBox.BindingPropertyItem.BitmapBackup = (Bitmap)img; + } } } @@ -1778,15 +1789,18 @@ private void ShowObjectValue(WzObject obj) menuItem_saveImage.Visibility = Visibility.Visible; // Image - if (canvasProp.ContainsInlinkProperty() || canvasProp.ContainsOutlinkProperty()) - { + if (canvasProp.ContainsInlinkProperty() || canvasProp.ContainsOutlinkProperty()) { System.Drawing.Image img = canvasProp.GetLinkedWzCanvasBitmap(); - if (img != null) - canvasPropBox.Image = ((System.Drawing.Bitmap)img).ToWpfBitmap(); + if (img != null) { + canvasPropBox.BindingPropertyItem.Bitmap = (System.Drawing.Bitmap)img; + canvasPropBox.BindingPropertyItem.BitmapBackup = (System.Drawing.Bitmap)img; + } + } + else { + Bitmap bmp = canvasProp.GetLinkedWzCanvasBitmap(); + canvasPropBox.BindingPropertyItem.Bitmap = bmp; + canvasPropBox.BindingPropertyItem.BitmapBackup = bmp; } - else - canvasPropBox.Image = canvasProp.GetLinkedWzCanvasBitmap().ToWpfBitmap(); - SetImageRenderView(canvasProp); } else if (obj is WzUOLProperty uolProperty) @@ -1798,7 +1812,11 @@ private void ShowObjectValue(WzObject obj) if (linkValue is WzCanvasProperty canvasUOL) { canvasPropBox.Visibility = Visibility.Visible; - canvasPropBox.Image = canvasUOL.GetLinkedWzCanvasBitmap().ToWpfBitmap(); // in any event that the WzCanvasProperty is an '_inlink' or '_outlink' + + Bitmap bmp = canvasUOL.GetLinkedWzCanvasBitmap(); + canvasPropBox.BindingPropertyItem.Bitmap = bmp; // in any event that the WzCanvasProperty is an '_inlink' or '_outlink' + canvasPropBox.BindingPropertyItem.BitmapBackup = bmp; // in any event that the WzCanvasProperty is an '_inlink' or '_outlink' + menuItem_saveImage.Visibility = Visibility.Visible; // dont show change image, as its a UOL SetImageRenderView(canvasUOL); @@ -2019,15 +2037,23 @@ private void SetImageRenderView(WzCanvasProperty canvas) PointF headVector = canvas.GetCanvasHeadPosition(); PointF ltVector = canvas.GetCanvasLtPosition(); - // Set XY point to canvas xaml - canvasPropBox.ParentWzCanvasProperty = canvas; - canvasPropBox.Delay = delay ?? 0; - canvasPropBox.CanvasVectorOrigin = originVector; - canvasPropBox.CanvasVectorHead = headVector; - canvasPropBox.CanvasVectorLt = ltVector; + canvasPropBox.SetIsLoading(true); + try { + canvasPropBox.SetParentMainPanel(this); - if (canvasPropBox.Visibility != Visibility.Visible) - canvasPropBox.Visibility = Visibility.Visible; + // Set XY point to canvas xaml + canvasPropBox.BindingPropertyItem.ParentWzCanvasProperty = canvas; + canvasPropBox.BindingPropertyItem.Delay = delay ?? 0; + canvasPropBox.BindingPropertyItem.CanvasVectorOrigin = new NotifyPointF(originVector); + canvasPropBox.BindingPropertyItem.CanvasVectorHead = new NotifyPointF(headVector); + canvasPropBox.BindingPropertyItem.CanvasVectorLt = new NotifyPointF(ltVector); + + if (canvasPropBox.Visibility != Visibility.Visible) + canvasPropBox.Visibility = Visibility.Visible; + } + finally { + canvasPropBox.SetIsLoading(false); + } } #endregion diff --git a/HaRepacker/GUI/Panels/SubPanels/ImageRenderViewer.xaml b/HaRepacker/GUI/Panels/SubPanels/ImageRenderViewer.xaml index c5bf55f6..284c1fe6 100644 --- a/HaRepacker/GUI/Panels/SubPanels/ImageRenderViewer.xaml +++ b/HaRepacker/GUI/Panels/SubPanels/ImageRenderViewer.xaml @@ -4,10 +4,12 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:HaRepacker.GUI.Panels.SubPanels" + xmlns:guiControls="clr-namespace:HaRepacker.GUI.Controls" + xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" xmlns:converter="clr-namespace:HaRepacker.Converter" mc:Ignorable="d" - d:DesignHeight="250" d:DesignWidth="400"> + d:DesignHeight="400" d:DesignWidth="600"> @@ -466,6 +468,24 @@ + + + @@ -495,12 +515,6 @@ - - - - - - @@ -510,8 +524,12 @@ + + + + - @@ -521,7 +539,7 @@ Height="{Binding ImageHeight, Converter={StaticResource imageWidthOrHeightToScreenDPIConverter}}" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="80,50,0,0"> - + Visibility="{Binding ShowImageBorder, Converter={StaticResource checkboxToVisibilityConverter}}"> - + - + - - + @@ -590,7 +606,7 @@ @@ -605,7 +621,7 @@ @@ -620,174 +636,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -