diff --git a/CHANGELOG.md b/CHANGELOG.md index f27ff94..5d4e46c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +## v0.16.8 + +- 去除首次的最小化提示弹框 +- 窗口布局改变后实时保存 +- 增加侧边栏图标和折叠功能 +- 增加皮肤和插槽参数面板的全部启用/禁用菜单项 +- 修改窗口默认大小 +- 支持复制并应用单独的模型皮肤或插槽参数 + ## v0.16.7 - 修复空帧导致的包围盒计算错误 diff --git a/Spine/Spine.csproj b/Spine/Spine.csproj index 1affb8e..8bcc50c 100644 --- a/Spine/Spine.csproj +++ b/Spine/Spine.csproj @@ -7,7 +7,7 @@ net8.0-windows $(SolutionDir)out false - 0.16.7 + 0.16.8 diff --git a/SpineViewer/App.xaml.cs b/SpineViewer/App.xaml.cs index e3064ac..359deba 100644 --- a/SpineViewer/App.xaml.cs +++ b/SpineViewer/App.xaml.cs @@ -331,7 +331,7 @@ namespace SpineViewer get => _language; set { - var uri = $"Resources/Strings/{value.ToString().ToLower()}.xaml"; + var uri = $"Resources/Strings/{value.ToString().ToLowerInvariant()}.xaml"; try { Resources.MergedDictionaries.Add(new() { Source = new(uri, UriKind.Relative) }); @@ -351,7 +351,7 @@ namespace SpineViewer get => _skin; set { - var uri = $"Resources/Skins/{value.ToString().ToLower()}.xaml"; + var uri = $"Resources/Skins/{value.ToString().ToLowerInvariant()}.xaml"; try { Resources.MergedDictionaries.Add(new() { Source = new(uri, UriKind.Relative) }); diff --git a/SpineViewer/Extensions/WpfExtension.cs b/SpineViewer/Extensions/WpfExtension.cs index b1aa789..d5cd487 100644 --- a/SpineViewer/Extensions/WpfExtension.cs +++ b/SpineViewer/Extensions/WpfExtension.cs @@ -40,7 +40,7 @@ namespace SpineViewer.Extensions //public static void SaveToFile(this BitmapSource bitmap, string path) //{ - // var ext = Path.GetExtension(path)?.ToLower(); + // var ext = Path.GetExtension(path)?.ToLowerInvariant(); // BitmapEncoder encoder = ext switch // { // ".jpg" or ".jpeg" => new JpegBitmapEncoder(), diff --git a/SpineViewer/Models/PreferenceModel.cs b/SpineViewer/Models/PreferenceModel.cs index 4ae94d6..1575935 100644 --- a/SpineViewer/Models/PreferenceModel.cs +++ b/SpineViewer/Models/PreferenceModel.cs @@ -102,7 +102,7 @@ namespace SpineViewer.Models private bool _wallpaperView; [ObservableProperty] - private bool? _closeToTray = null; + private bool _closeToTray; [ObservableProperty] private bool _autoRun; diff --git a/SpineViewer/Models/SpineObjectConfigModel.cs b/SpineViewer/Models/SpineObjectConfigModel.cs index 351ac3e..49df019 100644 --- a/SpineViewer/Models/SpineObjectConfigModel.cs +++ b/SpineViewer/Models/SpineObjectConfigModel.cs @@ -1,4 +1,5 @@ using Spine.Interfaces; +using SpineViewer.Utils; using System; using System.Collections.Generic; using System.IO; @@ -13,6 +14,15 @@ namespace SpineViewer.Models { public class SpineObjectConfigModel { + public class TrackConfigModel + { + public string AnimationName { get; set; } = ""; + + public float TimeScale { get; set; } = 1f; + + public float Alpha { get; set; } = 1f; + } + public bool UsePma { get; set; } public string Physics { get; set; } = ISkeleton.Physics.Update.ToString(); @@ -57,14 +67,6 @@ namespace SpineViewer.Models public bool DebugClippings { get; set; } - } - - public class TrackConfigModel - { - public string AnimationName { get; set; } = ""; - - public float TimeScale { get; set; } = 1f; - - public float Alpha { get; set; } = 1f; + public override string ToString() => JsonHelper.Serialize(this); } } diff --git a/SpineViewer/Models/SpineObjectModel.cs b/SpineViewer/Models/SpineObjectModel.cs index e3a17b7..ee0dd97 100644 --- a/SpineViewer/Models/SpineObjectModel.cs +++ b/SpineViewer/Models/SpineObjectModel.cs @@ -91,6 +91,8 @@ namespace SpineViewer.Models public event EventHandler? TrackPropertyChanged; + #region 参数面板实现 + public SpineVersion Version => _spineObject.Version; public string AssetsDir => _spineObject.AssetsDir; @@ -407,6 +409,8 @@ namespace SpineViewer.Models set { lock (_lock) SetProperty(_spineObject.DebugClippings, value, v => _spineObject.DebugClippings = v); } } + #endregion + public void Update(float delta) { lock (_lock) _spineObject.Update(delta); @@ -493,41 +497,57 @@ namespace SpineViewer.Models return config; } } - set + set => ApplyObjectConfig(value); + } + + public void ApplyObjectConfig(SpineObjectConfigModel m, SpineObjectConfigApplyFlag flag = SpineObjectConfigApplyFlag.All) + { + lock (_lock) { - - lock (_lock) + if (flag == SpineObjectConfigApplyFlag.All) { - _spineObject.Skeleton.ScaleX = value.Scale; - _spineObject.Skeleton.ScaleY = value.Scale; + _spineObject.Skeleton.ScaleX = m.Scale; + _spineObject.Skeleton.ScaleY = m.Scale; OnPropertyChanged(nameof(Scale)); - SetProperty(_spineObject.Skeleton.ScaleX < 0, value.FlipX, v => _spineObject.Skeleton.ScaleX *= -1, nameof(FlipX)); - SetProperty(_spineObject.Skeleton.ScaleY < 0, value.FlipY, v => _spineObject.Skeleton.ScaleY *= -1, nameof(FlipY)); - SetProperty(_spineObject.Skeleton.X, value.X, v => _spineObject.Skeleton.X = v, nameof(X)); - SetProperty(_spineObject.Skeleton.Y, value.Y, v => _spineObject.Skeleton.Y = v, nameof(Y)); - SetProperty(_spineObject.UsePma, value.UsePma, v => _spineObject.UsePma = v, nameof(UsePma)); - SetProperty(_spineObject.Physics, Enum.Parse(value.Physics ?? "Update", true), v => _spineObject.Physics = v, nameof(Physics)); - SetProperty(_spineObject.AnimationState.TimeScale, value.TimeScale, v => _spineObject.AnimationState.TimeScale = v, nameof(TimeScale)); + SetProperty(_spineObject.Skeleton.ScaleX < 0, m.FlipX, v => _spineObject.Skeleton.ScaleX *= -1, nameof(FlipX)); + SetProperty(_spineObject.Skeleton.ScaleY < 0, m.FlipY, v => _spineObject.Skeleton.ScaleY *= -1, nameof(FlipY)); + SetProperty(_spineObject.Skeleton.X, m.X, v => _spineObject.Skeleton.X = v, nameof(X)); + SetProperty(_spineObject.Skeleton.Y, m.Y, v => _spineObject.Skeleton.Y = v, nameof(Y)); + SetProperty(_spineObject.UsePma, m.UsePma, v => _spineObject.UsePma = v, nameof(UsePma)); + SetProperty(_spineObject.Physics, Enum.Parse(m.Physics ?? "Update", true), v => _spineObject.Physics = v, nameof(Physics)); + SetProperty(_spineObject.AnimationState.TimeScale, m.TimeScale, v => _spineObject.AnimationState.TimeScale = v, nameof(TimeScale)); + } - foreach (var name in _spineObject.Data.Skins.Select(v => v.Name).Except(value.LoadedSkins)) + if (flag == SpineObjectConfigApplyFlag.All || flag == SpineObjectConfigApplyFlag.Skin) + { + foreach (var name in _spineObject.Data.Skins.Select(v => v.Name).Except(m.LoadedSkins)) if (_spineObject.SetSkinStatus(name, false)) SkinStatusChanged?.Invoke(this, new(name, false)); - foreach (var name in value.LoadedSkins) + foreach (var name in m.LoadedSkins) if (_spineObject.SetSkinStatus(name, true)) SkinStatusChanged?.Invoke(this, new(name, true)); + } - foreach (var (slotName, attachmentName) in value.SlotAttachment) + if (flag == SpineObjectConfigApplyFlag.SlotAttachement) + { + foreach (var (slotName, attachmentName) in m.SlotAttachment) if (_spineObject.SetAttachment(slotName, attachmentName)) SlotAttachmentChanged?.Invoke(this, new(slotName, attachmentName)); + } - foreach (var slotName in value.DisabledSlots) + if (flag == SpineObjectConfigApplyFlag.SlotVisibility) + { + foreach (var slotName in m.DisabledSlots) if (_spineObject.SetSlotVisible(slotName, false)) SlotVisibleChanged?.Invoke(this, new(slotName, false)); + } + if (flag == SpineObjectConfigApplyFlag.All) + { // XXX: 处理空动画 _spineObject.AnimationState.ClearTracks(); int trackIndex = 0; - foreach (var trConfig in value.Animations) + foreach (var trConfig in m.Animations) { if (trConfig is not null && !string.IsNullOrEmpty(trConfig.AnimationName)) { @@ -545,16 +565,16 @@ namespace SpineViewer.Models _spineObject.Skeleton.SetSlotsToSetupPose(); } - SetProperty(_spineObject.DebugTexture, value.DebugTexture, v => _spineObject.DebugTexture = v, nameof(DebugTexture)); - SetProperty(_spineObject.DebugBounds, value.DebugBounds, v => _spineObject.DebugBounds = v, nameof(DebugBounds)); - SetProperty(_spineObject.DebugBones, value.DebugBones, v => _spineObject.DebugBones = v, nameof(DebugBones)); - SetProperty(_spineObject.DebugRegions, value.DebugRegions, v => _spineObject.DebugRegions = v, nameof(DebugRegions)); - SetProperty(_spineObject.DebugMeshHulls, value.DebugMeshHulls, v => _spineObject.DebugMeshHulls = v, nameof(DebugMeshHulls)); - SetProperty(_spineObject.DebugMeshes, value.DebugMeshes, v => _spineObject.DebugMeshes = v, nameof(DebugMeshes)); - SetProperty(_spineObject.DebugBoundingBoxes, value.DebugBoundingBoxes, v => _spineObject.DebugBoundingBoxes = v, nameof(DebugBoundingBoxes)); - SetProperty(_spineObject.DebugPaths, value.DebugPaths, v => _spineObject.DebugPaths = v, nameof(DebugPaths)); - SetProperty(_spineObject.DebugPoints, value.DebugPoints, v => _spineObject.DebugPoints = v, nameof(DebugPoints)); - SetProperty(_spineObject.DebugClippings, value.DebugClippings, v => _spineObject.DebugClippings = v, nameof(DebugClippings)); + SetProperty(_spineObject.DebugTexture, m.DebugTexture, v => _spineObject.DebugTexture = v, nameof(DebugTexture)); + SetProperty(_spineObject.DebugBounds, m.DebugBounds, v => _spineObject.DebugBounds = v, nameof(DebugBounds)); + SetProperty(_spineObject.DebugBones, m.DebugBones, v => _spineObject.DebugBones = v, nameof(DebugBones)); + SetProperty(_spineObject.DebugRegions, m.DebugRegions, v => _spineObject.DebugRegions = v, nameof(DebugRegions)); + SetProperty(_spineObject.DebugMeshHulls, m.DebugMeshHulls, v => _spineObject.DebugMeshHulls = v, nameof(DebugMeshHulls)); + SetProperty(_spineObject.DebugMeshes, m.DebugMeshes, v => _spineObject.DebugMeshes = v, nameof(DebugMeshes)); + SetProperty(_spineObject.DebugBoundingBoxes, m.DebugBoundingBoxes, v => _spineObject.DebugBoundingBoxes = v, nameof(DebugBoundingBoxes)); + SetProperty(_spineObject.DebugPaths, m.DebugPaths, v => _spineObject.DebugPaths = v, nameof(DebugPaths)); + SetProperty(_spineObject.DebugPoints, m.DebugPoints, v => _spineObject.DebugPoints = v, nameof(DebugPoints)); + SetProperty(_spineObject.DebugClippings, m.DebugClippings, v => _spineObject.DebugClippings = v, nameof(DebugClippings)); } } } @@ -613,6 +633,17 @@ namespace SpineViewer.Models #endregion } + /// + /// 可选的应用部分模型参数项 + /// + public enum SpineObjectConfigApplyFlag + { + All, + Skin, + SlotAttachement, + SlotVisibility, + } + public class SkinStatusChangedEventArgs(string name, bool status) : EventArgs { public string Name { get; } = name; diff --git a/SpineViewer/Models/LastStateModel.cs b/SpineViewer/Models/UserStateModel.cs similarity index 94% rename from SpineViewer/Models/LastStateModel.cs rename to SpineViewer/Models/UserStateModel.cs index 17eb9d3..25eedaa 100644 --- a/SpineViewer/Models/LastStateModel.cs +++ b/SpineViewer/Models/UserStateModel.cs @@ -8,7 +8,7 @@ using System.Windows.Media; namespace SpineViewer.Models { - public class LastStateModel + public class UserStateModel { #region 画面布局状态 @@ -18,6 +18,7 @@ namespace SpineViewer.Models public double WindowHeight { get; set; } public WindowState WindowState { get; set; } + public bool RootGridCol0Folded { get; set; } public double RootGridCol0Width { get; set; } public double RootGridCol2Width { get; set; } diff --git a/SpineViewer/Resources/Geometries.xaml b/SpineViewer/Resources/Geometries.xaml index da435a8..2ed3191 100644 --- a/SpineViewer/Resources/Geometries.xaml +++ b/SpineViewer/Resources/Geometries.xaml @@ -13,4 +13,9 @@ M320 96c17.7 0 32 14.3 32 32l0 256c0 17.7-14.3 32-32 32L64 416c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l256 0zM64 64C28.7 64 0 92.7 0 128L0 384c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-256c0-35.3-28.7-64-64-64L64 64z M0 96C0 60.7 28.7 32 64 32l132.1 0c19.1 0 37.4 7.6 50.9 21.1L289.9 96 448 96c35.3 0 64 28.7 64 64l0 256c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-256c0-8.8-7.2-16-16-16l-161.4 0c-10.6 0-20.8-4.2-28.3-11.7L213.1 87c-4.5-4.5-10.6-7-17-7L64 80z M472 224c13.3 0 24-10.7 24-24l0-144c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 80.1-20-23.5C387 63.4 325.1 32 256 32C132.3 32 32 132.3 32 256s100.3 224 224 224c50.4 0 97-16.7 134.4-44.8c10.6-8 12.7-23 4.8-33.6s-23-12.7-33.6-4.8C332.2 418.9 295.7 432 256 432c-97.2 0-176-78.8-176-176s78.8-176 176-176c54.3 0 102.9 24.6 135.2 63.4l.1 .2s0 0 0 0L418.9 176 328 176c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0z + M348 62.7C330.7 52.7 309.3 52.7 292 62.7L207.8 111.3C190.5 121.3 179.8 139.8 179.8 159.8L179.8 261.7L91.5 312.7C74.2 322.7 63.5 341.2 63.5 361.2L63.5 458.5C63.5 478.5 74.2 497 91.5 507L175.8 555.6C193.1 565.6 214.5 565.6 231.8 555.6L320.1 504.6L408.4 555.6C425.7 565.6 447.1 565.6 464.4 555.6L548.5 507C565.8 497 576.5 478.5 576.5 458.5L576.5 361.2C576.5 341.2 565.8 322.7 548.5 312.7L460.2 261.7L460.2 159.8C460.2 139.8 449.5 121.3 432.2 111.3L348 62.7zM135.5 342.7L203.8 303.3L272.1 342.7L203.8 382.1L135.5 342.7zM111.5 384.3L179.8 423.7L179.8 502.5L115.5 465.4C113 464 111.5 461.3 111.5 458.5L111.5 384.3zM227.8 502.5L227.8 423.7L296.1 384.3L296.1 463.1L227.8 502.5zM344 384.3L412.3 423.7L412.3 502.5L344 463.1L344 384.3zM460.3 502.5L460.3 423.7L528.6 384.3L528.6 458.5C528.6 461.4 527.1 464 524.6 465.4L460.3 502.5zM504.6 342.7L436.3 382.1L368 342.7L436.3 303.3L504.6 342.7zM344 301.2L344 222.4L412.3 183L412.3 261.8L344 301.2zM388.3 141.4L320 180.8L251.8 141.4L316 104.3C318.5 102.9 321.5 102.9 324 104.3L388.3 141.4zM227.8 182.9L296.1 222.3L296.1 301.1L227.8 261.7L227.8 182.9z + M160 144C151.2 144 144 151.2 144 160L144 480C144 488.8 151.2 496 160 496L480 496C488.8 496 496 488.8 496 480L496 160C496 151.2 488.8 144 480 144L160 144zM96 160C96 124.7 124.7 96 160 96L480 96C515.3 96 544 124.7 544 160L544 480C544 515.3 515.3 544 480 544L160 544C124.7 544 96 515.3 96 480L96 160zM224 192C241.7 192 256 206.3 256 224C256 241.7 241.7 256 224 256C206.3 256 192 241.7 192 224C192 206.3 206.3 192 224 192zM360 264C368.5 264 376.4 268.5 380.7 275.8L460.7 411.8C465.1 419.2 465.1 428.4 460.8 435.9C456.5 443.4 448.6 448 440 448L200 448C191.1 448 182.8 443 178.7 435.1C174.6 427.2 175.2 417.6 180.3 410.3L236.3 330.3C240.8 323.9 248.1 320.1 256 320.1C263.9 320.1 271.2 323.9 275.7 330.3L292.9 354.9L339.4 275.9C343.7 268.6 351.6 264.1 360.1 264.1z + M304 112L192 112C183.2 112 176 119.2 176 128L176 512C176 520.8 183.2 528 192 528L448 528C456.8 528 464 520.8 464 512L464 272L376 272C336.2 272 304 239.8 304 200L304 112zM444.1 224L352 131.9L352 200C352 213.3 362.7 224 376 224L444.1 224zM128 128C128 92.7 156.7 64 192 64L325.5 64C342.5 64 358.8 70.7 370.8 82.7L493.3 205.3C505.3 217.3 512 233.6 512 250.6L512 512C512 547.3 483.3 576 448 576L192 576C156.7 576 128 547.3 128 512L128 128z + M269.5 156.7L283.2 96L356.8 96L370.5 156.7C372.2 164.1 377.3 170.3 384.3 173.4C395.1 178.2 405.3 184.1 414.7 191C420.8 195.5 428.8 196.9 436.1 194.6L495.6 176.1L532.4 239.9L486.6 282.2C481 287.4 478.2 294.9 479 302.4C480.3 313.9 480.3 326.1 479 337.6C478.2 345.2 481 352.7 486.6 357.8L532.4 400.1L495.6 463.9L436.1 445.4C428.8 443.1 420.9 444.5 414.7 449C405.3 455.9 395.1 461.9 384.3 466.6C377.3 469.7 372.2 475.9 370.5 483.3L356.8 544L283.2 544L269.5 483.3C267.8 475.9 262.7 469.7 255.7 466.6C244.9 461.8 234.7 455.9 225.3 449C219.2 444.5 211.2 443.1 203.9 445.4L144.4 463.9L107.6 400.1L153.4 357.8C159 352.6 161.8 345.1 161 337.6C159.7 326.1 159.7 313.9 161 302.4C161.8 294.8 159 287.3 153.4 282.2L107.6 239.9L144.4 176.1L203.9 194.6C211.2 196.9 219.1 195.5 225.3 191C234.7 184.1 244.9 178.1 255.7 173.4C262.7 170.3 267.8 164.1 269.5 156.7zM276.8 48C258.1 48 241.9 61 237.8 79.2L225.2 134.8C218.9 138 212.9 141.5 207 145.3L152.6 128.4C134.7 122.8 115.4 130.4 106.1 146.6L62.9 221.4C53.6 237.6 56.7 258.1 70.4 270.8L112.3 309.5C112 316.4 112 323.5 112.3 330.5L70.4 369.2C56.7 381.9 53.5 402.4 62.9 418.6L106.1 493.4C115.4 509.6 134.8 517.1 152.6 511.6L207.1 494.7C213 498.5 219 502 225.3 505.2L237.9 560.8C242 579 258.2 592 276.9 592L363.3 592C382 592 398.2 579 402.3 560.8L414.9 505.2C421.2 502 427.2 498.5 433.1 494.7L487.6 511.6C505.5 517.2 524.8 509.6 534.1 493.4L577.3 418.6C586.6 402.4 583.5 381.9 569.8 369.2L527.9 330.5C528.2 323.6 528.2 316.5 527.9 309.5L569.8 270.8C583.5 258.1 586.6 237.6 577.3 221.4L534 146.6C524.6 130.4 505.3 122.9 487.5 128.4L433 145.3C427.1 141.5 421.1 138 414.8 134.8L402.3 79.2C398.1 61 381.9 48 363.2 48L276.8 48zM368 320C368 346.5 346.5 368 320 368C293.5 368 272 346.5 272 320C272 293.5 293.5 272 320 272C346.5 272 368 293.5 368 320zM320 224C267 224 224 267 224 320C224 373 267 416 320 416C373 416 416 373 416 320C416 267 373 224 320 224z + M88 136C74.7 136 64 146.7 64 160C64 173.3 74.7 184 88 184L179.7 184C189.9 216.5 220.2 240 256 240C291.8 240 322.1 216.5 332.3 184L552 184C565.3 184 576 173.3 576 160C576 146.7 565.3 136 552 136L332.3 136C322.1 103.5 291.8 80 256 80C220.2 80 189.9 103.5 179.7 136L88 136zM88 296C74.7 296 64 306.7 64 320C64 333.3 74.7 344 88 344L339.7 344C349.9 376.5 380.2 400 416 400C451.8 400 482.1 376.5 492.3 344L552 344C565.3 344 576 333.3 576 320C576 306.7 565.3 296 552 296L492.3 296C482.1 263.5 451.8 240 416 240C380.2 240 349.9 263.5 339.7 296L88 296zM88 456C74.7 456 64 466.7 64 480C64 493.3 74.7 504 88 504L147.7 504C157.9 536.5 188.2 560 224 560C259.8 560 290.1 536.5 300.3 504L552 504C565.3 504 576 493.3 576 480C576 466.7 565.3 456 552 456L300.3 456C290.1 423.5 259.8 400 224 400C188.2 400 157.9 423.5 147.7 456L88 456zM224 512C206.3 512 192 497.7 192 480C192 462.3 206.3 448 224 448C241.7 448 256 462.3 256 480C256 497.7 241.7 512 224 512zM416 352C398.3 352 384 337.7 384 320C384 302.3 398.3 288 416 288C433.7 288 448 302.3 448 320C448 337.7 433.7 352 416 352zM224 160C224 142.3 238.3 128 256 128C273.7 128 288 142.3 288 160C288 177.7 273.7 192 256 192C238.3 192 224 177.7 224 160z diff --git a/SpineViewer/Resources/Strings/en.xaml b/SpineViewer/Resources/Strings/en.xaml index 386cf0d..418e0c5 100644 --- a/SpineViewer/Resources/Strings/en.xaml +++ b/SpineViewer/Resources/Strings/en.xaml @@ -45,7 +45,11 @@ Reload Move Up Move Down + Model Config Copy Config + Copy Parameters (Skin Only) + Copy Parameters (Slot Attachments Only) + Copy Parameters (Slot Visibility Only) Apply Config Save Config to File... Apply Config from File... @@ -78,13 +82,13 @@ Y Skin - Enable Skins - Disable Skins + Enable + Disable + Enable All + Disable All Slot Clear Slots Attachment - Enable Slots - Disable Slots Animation Add diff --git a/SpineViewer/Resources/Strings/ja.xaml b/SpineViewer/Resources/Strings/ja.xaml index 8dff2b9..766eb13 100644 --- a/SpineViewer/Resources/Strings/ja.xaml +++ b/SpineViewer/Resources/Strings/ja.xaml @@ -45,7 +45,11 @@ 再読み込み 上へ移動 下へ移動 + モデル設定 パラメーターをコピー + パラメーターをコピー(スキンのみ) + パラメーターをコピー(スロットのアタッチメントのみ) + パラメーターをコピー(スロットの表示状態のみ) パラメーターを適用 パラメータファイルを保存... パラメータファイルを適用... @@ -78,13 +82,13 @@ Y座標 スキン - 有効 - 無効 + 有効にする + 無効にする + すべて有効にする + すべて無効にする スロット アタッチメントをクリア - 有効 - 無効 アニメーション 追加 diff --git a/SpineViewer/Resources/Strings/zh.xaml b/SpineViewer/Resources/Strings/zh.xaml index d99a38b..95d462f 100644 --- a/SpineViewer/Resources/Strings/zh.xaml +++ b/SpineViewer/Resources/Strings/zh.xaml @@ -45,7 +45,11 @@ 重新加载 上移 下移 + 模型参数 复制参数 + 复制参数(仅皮肤) + 复制参数(仅插槽附件) + 复制参数(仅插槽可见性) 应用参数 保存参数文件... 应用参数文件... @@ -78,13 +82,13 @@ 纵坐标 皮肤 - 启用 - 禁用 + 启用 + 禁用 + 全部启用 + 全部禁用 插槽 清除附件 - 启用 - 禁用 动画 添加 diff --git a/SpineViewer/Resources/Theme.xaml b/SpineViewer/Resources/Theme.xaml index df5eeee..fb363f5 100644 --- a/SpineViewer/Resources/Theme.xaml +++ b/SpineViewer/Resources/Theme.xaml @@ -34,7 +34,7 @@ @@ -76,6 +76,29 @@ + + + +