diff --git a/SpineViewer/src/SpinePreviewer.cs b/SpineViewer/src/SpinePreviewer.cs
index 512feb4..46b606c 100644
--- a/SpineViewer/src/SpinePreviewer.cs
+++ b/SpineViewer/src/SpinePreviewer.cs
@@ -13,152 +13,49 @@ namespace SpineViewer
{
public partial class SpinePreviewer : UserControl
{
+ ///
+ /// 包装类, 用于 PropertyGrid 显示
+ ///
private class PreviewerProperty
{
- public const float ZOOM_MAX = 1000f;
- public const float ZOOM_MIN = 0.001f;
+ private readonly SpinePreviewer previewer;
- private readonly SFML.Graphics.RenderWindow RenderWindow;
- private readonly Control ContainerControl;
-
- public PreviewerProperty(SpinePreviewer previewer)
- {
- RenderWindow = previewer.RenderWindow;
- ContainerControl = previewer;
- }
+ public PreviewerProperty(SpinePreviewer previewer) { this.previewer = previewer; }
///
/// 导出画面分辨率
///
[TypeConverter(typeof(SizeTypeConverter))]
[Category("属性"), DisplayName("分辨率")]
- public Size Resolution
- {
- get => resolution;
- set
- {
- if (value.Width <= 0) value.Width = 100;
- if (value.Height <= 0) value.Height = 100;
-
- float parentX = ContainerControl.Width;
- float parentY = ContainerControl.Height;
- float sizeX = value.Width;
- float sizeY = value.Height;
-
- if ((sizeY / sizeX) < (parentY / parentX))
- {
- // 相同的 X, 子窗口 Y 更小
- sizeY = parentX * sizeY / sizeX;
- sizeX = parentX;
- }
- else
- {
- // 相同的 Y, 子窗口 X 更小
- sizeX = parentY * sizeX / sizeY;
- sizeY = parentY;
- }
-
- // 必须通过 SFML 的方法调整窗口
- RenderWindow.Position = new((int)(parentX - sizeX) / 2, (int)(parentY - sizeY) / 2);
- RenderWindow.Size = new((uint)sizeX, (uint)sizeY);
-
- // 将 view 的大小设置成于 resolution 相同的大小, 其余属性都不变
- var view = RenderWindow.GetView();
- var signX = Math.Sign(view.Size.X);
- var signY = Math.Sign(view.Size.Y);
- view.Size = new(value.Width * signX, value.Height * signY);
- RenderWindow.SetView(view);
-
- resolution = value;
- }
- }
- private Size resolution = new(0, 0);
+ public Size Resolution { get => previewer.Resolution; set => previewer.Resolution = value; }
[TypeConverter(typeof(PointFTypeConverter))]
[Category("属性"), DisplayName("画面中心点")]
- public PointF Center
- {
- get
- {
- var center = RenderWindow.GetView().Center;
- return new(center.X, center.Y);
- }
- set
- {
- var view = RenderWindow.GetView();
- view.Center = new(value.X, value.Y);
- RenderWindow.SetView(view);
- }
- }
+ public PointF Center { get => previewer.Center; set => previewer.Center = value; }
///
/// 画面缩放
///
[Category("属性"), DisplayName("缩放")]
- public float Zoom
- {
- get => resolution.Width / Math.Abs(RenderWindow.GetView().Size.X);
- set
- {
- value = Math.Clamp(value, ZOOM_MIN, ZOOM_MAX);
- var view = RenderWindow.GetView();
- var signX = Math.Sign(view.Size.X);
- var signY = Math.Sign(view.Size.Y);
- view.Size = new(resolution.Width / value * signX, resolution.Height / value * signY);
- RenderWindow.SetView(view);
- }
- }
+ public float Zoom { get => previewer.Zoom; set => previewer.Zoom = value; }
///
/// 画面旋转
///
[Category("属性"), DisplayName("旋转")]
- public float Rotation
- {
- get => RenderWindow.GetView().Rotation;
- set
- {
- var view = RenderWindow.GetView();
- view.Rotation = value;
- RenderWindow.SetView(view);
- }
- }
+ public float Rotation { get => previewer.Rotation; set => previewer.Rotation = value; }
///
/// 画面旋转
///
[Category("属性"), DisplayName("水平翻转")]
- public bool FlipX
- {
- get => RenderWindow.GetView().Size.X < 0;
- set
- {
- var view = RenderWindow.GetView();
- var size = view.Size;
- if (size.X > 0 && value || size.X < 0 && !value)
- size.X *= -1;
- view.Size = size;
- RenderWindow.SetView(view);
- }
- }
+ public bool FlipX { get => previewer.FlipX; set => previewer.FlipX = value; }
///
/// 画面旋转
///
[Category("属性"), DisplayName("垂直翻转")]
- public bool FlipY
- {
- get => RenderWindow.GetView().Size.Y < 0;
- set
- {
- var view = RenderWindow.GetView();
- var size = view.Size;
- if (size.Y > 0 && value || size.Y < 0 && !value)
- size.Y *= -1;
- view.Size = size;
- RenderWindow.SetView(view);
- }
- }
+ public bool FlipY { get => previewer.FlipY; set => previewer.FlipY = value; }
}
[Category("自定义"), Description("用于显示画面属性的属性页")]
@@ -169,7 +66,7 @@ namespace SpineViewer
{
propertyGrid = value;
if (propertyGrid is not null)
- propertyGrid.SelectedObject = Property;
+ propertyGrid.SelectedObject = new PreviewerProperty(this);
}
}
private PropertyGrid? propertyGrid;
@@ -181,7 +78,6 @@ namespace SpineViewer
private readonly SFML.Graphics.RenderWindow RenderWindow;
private readonly SFML.System.Clock Clock = new();
private readonly SFML.Graphics.Color BackgroundColor = SFML.Graphics.Color.Green;
- private readonly PreviewerProperty Property;
public SpinePreviewer()
{
@@ -189,12 +85,152 @@ namespace SpineViewer
RenderWindow = new(panel.Handle);
RenderWindow.SetFramerateLimit(30);
RenderWindow.SetActive(false);
- Property = new(this)
+ Resolution = new(1280, 720);
+ Center = new(0, 0);
+ FlipY = true;
+ }
+
+ public const float ZOOM_MAX = 1000f;
+ public const float ZOOM_MIN = 0.001f;
+
+ ///
+ /// 分辨率
+ ///
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [Browsable(false)]
+ public Size Resolution
+ {
+ get => resolution;
+ set
{
- Resolution = new(1280, 720),
- Center = new(0, 0),
- FlipY = true
- };
+ if (value.Width <= 0) value.Width = 100;
+ if (value.Height <= 0) value.Height = 100;
+
+ float parentX = Width;
+ float parentY = Height;
+ float sizeX = value.Width;
+ float sizeY = value.Height;
+
+ if ((sizeY / sizeX) < (parentY / parentX))
+ {
+ // 相同的 X, 子窗口 Y 更小
+ sizeY = parentX * sizeY / sizeX;
+ sizeX = parentX;
+ }
+ else
+ {
+ // 相同的 Y, 子窗口 X 更小
+ sizeX = parentY * sizeX / sizeY;
+ sizeY = parentY;
+ }
+
+ // 必须通过 SFML 的方法调整窗口
+ RenderWindow.Position = new((int)(parentX - sizeX) / 2, (int)(parentY - sizeY) / 2);
+ RenderWindow.Size = new((uint)sizeX, (uint)sizeY);
+
+ // 将 view 的大小设置成于 resolution 相同的大小, 其余属性都不变
+ var view = RenderWindow.GetView();
+ var signX = Math.Sign(view.Size.X);
+ var signY = Math.Sign(view.Size.Y);
+ view.Size = new(value.Width * signX, value.Height * signY);
+ RenderWindow.SetView(view);
+
+ resolution = value;
+ }
+ }
+ private Size resolution = new(0, 0);
+
+ ///
+ /// 画面中心点
+ ///
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [Browsable(false)]
+ public PointF Center
+ {
+ get
+ {
+ var center = RenderWindow.GetView().Center;
+ return new(center.X, center.Y);
+ }
+ set
+ {
+ var view = RenderWindow.GetView();
+ view.Center = new(value.X, value.Y);
+ RenderWindow.SetView(view);
+ }
+ }
+
+ ///
+ /// 画面缩放
+ ///
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [Browsable(false)]
+ public float Zoom
+ {
+ get => resolution.Width / Math.Abs(RenderWindow.GetView().Size.X);
+ set
+ {
+ value = Math.Clamp(value, ZOOM_MIN, ZOOM_MAX);
+ var view = RenderWindow.GetView();
+ var signX = Math.Sign(view.Size.X);
+ var signY = Math.Sign(view.Size.Y);
+ view.Size = new(resolution.Width / value * signX, resolution.Height / value * signY);
+ RenderWindow.SetView(view);
+ }
+ }
+
+ ///
+ /// 画面旋转
+ ///
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public float Rotation
+ {
+ get => RenderWindow.GetView().Rotation;
+ set
+ {
+ var view = RenderWindow.GetView();
+ view.Rotation = value;
+ RenderWindow.SetView(view);
+ }
+ }
+
+ ///
+ /// 水平翻转
+ ///
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [Browsable(false)]
+ public bool FlipX
+ {
+ get => RenderWindow.GetView().Size.X < 0;
+ set
+ {
+ var view = RenderWindow.GetView();
+ var size = view.Size;
+ if (size.X > 0 && value || size.X < 0 && !value)
+ size.X *= -1;
+ view.Size = size;
+ RenderWindow.SetView(view);
+ }
+ }
+
+ ///
+ /// 垂直翻转
+ ///
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [Browsable(false)]
+ public bool FlipY
+ {
+ get => RenderWindow.GetView().Size.Y < 0;
+ set
+ {
+ var view = RenderWindow.GetView();
+ var size = view.Size;
+ if (size.Y > 0 && value || size.Y < 0 && !value)
+ size.Y *= -1;
+ view.Size = size;
+ RenderWindow.SetView(view);
+ }
}
public void StartPreview()
@@ -254,7 +290,7 @@ namespace SpineViewer
private void panel_MouseWheel(object sender, MouseEventArgs e)
{
- Property.Zoom *= (e.Delta > 0 ? 1.1f : 0.9f);
+ Zoom *= (e.Delta > 0 ? 1.1f : 0.9f);
PropertyGrid?.Refresh();
}