diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c71c6a69..dba980cd9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,6 +46,7 @@ jobs: dotnet-version: | 6.0.x 8.0.x + 10.0.x - uses: actions/setup-node@v4 with: node-version: 20 diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index e8a5074f8..c1b5d77c6 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -27,6 +27,7 @@ jobs: dotnet-version: | 6.0.x 8.0.x + 10.0.x - name: restore run: dotnet restore OpenUtau -r ${{ matrix.os.arch }} diff --git a/OpenUtau.Core/OpenUtau.Core.csproj b/OpenUtau.Core/OpenUtau.Core.csproj index 7b5ab3cae..eae7bc20d 100644 --- a/OpenUtau.Core/OpenUtau.Core.csproj +++ b/OpenUtau.Core/OpenUtau.Core.csproj @@ -1,11 +1,12 @@  - net8.0 + net10.0 none true embedded enable + 12 @@ -26,9 +27,12 @@ + + - + + diff --git a/OpenUtau.Plugin.Builtin/OpenUtau.Plugin.Builtin.csproj b/OpenUtau.Plugin.Builtin/OpenUtau.Plugin.Builtin.csproj index bf555d107..c36116dc3 100644 --- a/OpenUtau.Plugin.Builtin/OpenUtau.Plugin.Builtin.csproj +++ b/OpenUtau.Plugin.Builtin/OpenUtau.Plugin.Builtin.csproj @@ -1,14 +1,14 @@  - net8.0 + net10.0 none embedded enable - + diff --git a/OpenUtau.Test/Classic/UstTest.cs b/OpenUtau.Test/Classic/UstTest.cs index c51fa1f45..65e3012e8 100644 --- a/OpenUtau.Test/Classic/UstTest.cs +++ b/OpenUtau.Test/Classic/UstTest.cs @@ -8,7 +8,6 @@ using SharpCompress.Common; using SharpCompress.Readers; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Classic { public class UstTest { diff --git a/OpenUtau.Test/Classic/VoicebankConfigTest.cs b/OpenUtau.Test/Classic/VoicebankConfigTest.cs index d975d2e7f..52674d47b 100644 --- a/OpenUtau.Test/Classic/VoicebankConfigTest.cs +++ b/OpenUtau.Test/Classic/VoicebankConfigTest.cs @@ -1,6 +1,5 @@ using OpenUtau.Core; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Classic { public class VoicebankConfigTest { diff --git a/OpenUtau.Test/Classic/VoicebankLoaderTest.cs b/OpenUtau.Test/Classic/VoicebankLoaderTest.cs index f5d8580d3..c71ed4be7 100644 --- a/OpenUtau.Test/Classic/VoicebankLoaderTest.cs +++ b/OpenUtau.Test/Classic/VoicebankLoaderTest.cs @@ -1,7 +1,6 @@ using System.IO; using System.Text; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Classic { public class VoicebankLoaderTest { diff --git a/OpenUtau.Test/Core/Format/MusicXMLTest.cs b/OpenUtau.Test/Core/Format/MusicXMLTest.cs index 9a7fddbdd..ee20e4de1 100644 --- a/OpenUtau.Test/Core/Format/MusicXMLTest.cs +++ b/OpenUtau.Test/Core/Format/MusicXMLTest.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Reflection; using Xunit; -using Xunit.Abstractions; using OpenUtau.Core.Ustx; diff --git a/OpenUtau.Test/Core/G2p/G2pTest.cs b/OpenUtau.Test/Core/G2p/G2pTest.cs index 238e1611d..050a92c8a 100644 --- a/OpenUtau.Test/Core/G2p/G2pTest.cs +++ b/OpenUtau.Test/Core/G2p/G2pTest.cs @@ -1,5 +1,4 @@ using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Core.G2p { public class G2pTest { diff --git a/OpenUtau.Test/Core/SignalChain/WaveSourceTest.cs b/OpenUtau.Test/Core/SignalChain/WaveSourceTest.cs index 1f544f077..e79caec5a 100644 --- a/OpenUtau.Test/Core/SignalChain/WaveSourceTest.cs +++ b/OpenUtau.Test/Core/SignalChain/WaveSourceTest.cs @@ -1,5 +1,4 @@ using Xunit; -using Xunit.Abstractions; using System.IO; using System.Reflection; using NAudio.Wave; diff --git a/OpenUtau.Test/Core/USTx/UstxYamlTest.cs b/OpenUtau.Test/Core/USTx/UstxYamlTest.cs index c7d500dce..cf5da5d70 100644 --- a/OpenUtau.Test/Core/USTx/UstxYamlTest.cs +++ b/OpenUtau.Test/Core/USTx/UstxYamlTest.cs @@ -1,5 +1,4 @@ using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Core.Ustx { public class UstxYamlTest { diff --git a/OpenUtau.Test/Core/Util/Base64Test.cs b/OpenUtau.Test/Core/Util/Base64Test.cs index 13b09e529..61fd45eef 100644 --- a/OpenUtau.Test/Core/Util/Base64Test.cs +++ b/OpenUtau.Test/Core/Util/Base64Test.cs @@ -1,5 +1,4 @@ using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Core.Util { public class Base64Test { diff --git a/OpenUtau.Test/Core/Util/MusicMathTest.cs b/OpenUtau.Test/Core/Util/MusicMathTest.cs index d02b77e05..ce23f1ba8 100644 --- a/OpenUtau.Test/Core/Util/MusicMathTest.cs +++ b/OpenUtau.Test/Core/Util/MusicMathTest.cs @@ -1,5 +1,4 @@ using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Core.Util { public class MusicMathTest { diff --git a/OpenUtau.Test/Core/Util/SplitLyricsTest.cs b/OpenUtau.Test/Core/Util/SplitLyricsTest.cs index 1eadc9521..cc08f6862 100644 --- a/OpenUtau.Test/Core/Util/SplitLyricsTest.cs +++ b/OpenUtau.Test/Core/Util/SplitLyricsTest.cs @@ -1,5 +1,4 @@ using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Core.Util { public class SplitLyricsTest { diff --git a/OpenUtau.Test/Core/Util/TimeAxisTest.cs b/OpenUtau.Test/Core/Util/TimeAxisTest.cs index 213c0bf56..1ec3f7d29 100644 --- a/OpenUtau.Test/Core/Util/TimeAxisTest.cs +++ b/OpenUtau.Test/Core/Util/TimeAxisTest.cs @@ -1,6 +1,5 @@ using OpenUtau.Core.Ustx; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Core { diff --git a/OpenUtau.Test/OpenUtau.Test.csproj b/OpenUtau.Test/OpenUtau.Test.csproj index d57c9d991..784519000 100644 --- a/OpenUtau.Test/OpenUtau.Test.csproj +++ b/OpenUtau.Test/OpenUtau.Test.csproj @@ -1,9 +1,9 @@ - net8.0-windows + net10.0-windows - net8.0 + net10.0 none @@ -11,12 +11,12 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -25,6 +25,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + + + diff --git a/OpenUtau.Test/Plugins/DeDiphoneTest.cs b/OpenUtau.Test/Plugins/DeDiphoneTest.cs index 951c73823..84e3a1fe9 100644 --- a/OpenUtau.Test/Plugins/DeDiphoneTest.cs +++ b/OpenUtau.Test/Plugins/DeDiphoneTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class DeDiphoneTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/DeVccvTest.cs b/OpenUtau.Test/Plugins/DeVccvTest.cs index 44789c6cb..5b3f5d35d 100644 --- a/OpenUtau.Test/Plugins/DeVccvTest.cs +++ b/OpenUtau.Test/Plugins/DeVccvTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class DeVccvTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/EnArpaPlusTest.cs b/OpenUtau.Test/Plugins/EnArpaPlusTest.cs index d69694d11..fdffd9bc7 100644 --- a/OpenUtau.Test/Plugins/EnArpaPlusTest.cs +++ b/OpenUtau.Test/Plugins/EnArpaPlusTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class EnArpaPlusTest : PhonemizerTestBase { @@ -88,4 +87,4 @@ public void HintTest(string lyric, string hint, string[] aliases) { RunPhonemizeTest("en_arpa-plus", new NoteParams[] { new NoteParams { lyric = lyric, hint = hint, tone = "C3", phonemes = SamePhonemeParams(4, 0, 0, "")} }, aliases); } } -} \ No newline at end of file +} diff --git a/OpenUtau.Test/Plugins/EnArpaTest.cs b/OpenUtau.Test/Plugins/EnArpaTest.cs index 2ee08792c..f11652cad 100644 --- a/OpenUtau.Test/Plugins/EnArpaTest.cs +++ b/OpenUtau.Test/Plugins/EnArpaTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class EnArpaTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/EnToJaTest.cs b/OpenUtau.Test/Plugins/EnToJaTest.cs index 54b9ed9d5..c2573cf6e 100644 --- a/OpenUtau.Test/Plugins/EnToJaTest.cs +++ b/OpenUtau.Test/Plugins/EnToJaTest.cs @@ -3,7 +3,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; using System.Linq; namespace OpenUtau.Plugins { diff --git a/OpenUtau.Test/Plugins/EnVCCVTest.cs b/OpenUtau.Test/Plugins/EnVCCVTest.cs index 8ec9ee4fe..30847000e 100644 --- a/OpenUtau.Test/Plugins/EnVCCVTest.cs +++ b/OpenUtau.Test/Plugins/EnVCCVTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class EnVCCVTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/EnXSampaTest.cs b/OpenUtau.Test/Plugins/EnXSampaTest.cs index 536bb5ec0..9872b8c69 100644 --- a/OpenUtau.Test/Plugins/EnXSampaTest.cs +++ b/OpenUtau.Test/Plugins/EnXSampaTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class EnXSampaTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/JaCvvcTest.cs b/OpenUtau.Test/Plugins/JaCvvcTest.cs index e8282439a..5266c1753 100644 --- a/OpenUtau.Test/Plugins/JaCvvcTest.cs +++ b/OpenUtau.Test/Plugins/JaCvvcTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class JaCvvcTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/JaPresampTest.cs b/OpenUtau.Test/Plugins/JaPresampTest.cs index 55127bd37..91d0e1f17 100644 --- a/OpenUtau.Test/Plugins/JaPresampTest.cs +++ b/OpenUtau.Test/Plugins/JaPresampTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class JaPresampTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/JaVcvTest.cs b/OpenUtau.Test/Plugins/JaVcvTest.cs index 0aed10b86..efc5a3048 100644 --- a/OpenUtau.Test/Plugins/JaVcvTest.cs +++ b/OpenUtau.Test/Plugins/JaVcvTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public class JaVcvTest : PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/PhonemizerTestBase.cs b/OpenUtau.Test/Plugins/PhonemizerTestBase.cs index 41dedc2be..89b118104 100644 --- a/OpenUtau.Test/Plugins/PhonemizerTestBase.cs +++ b/OpenUtau.Test/Plugins/PhonemizerTestBase.cs @@ -8,7 +8,6 @@ using OpenUtau.Classic; using OpenUtau.Core.Format; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { public abstract class PhonemizerTestBase { diff --git a/OpenUtau.Test/Plugins/ZhCvvcTest.cs b/OpenUtau.Test/Plugins/ZhCvvcTest.cs index 9423226e1..d6af013b5 100644 --- a/OpenUtau.Test/Plugins/ZhCvvcTest.cs +++ b/OpenUtau.Test/Plugins/ZhCvvcTest.cs @@ -1,7 +1,6 @@ using OpenUtau.Api; using OpenUtau.Plugin.Builtin; using Xunit; -using Xunit.Abstractions; namespace OpenUtau.Plugins { diff --git a/OpenUtau/Controls/LyricBox.axaml b/OpenUtau/Controls/LyricBox.axaml index c22c199fa..2acc6dd3c 100644 --- a/OpenUtau/Controls/LyricBox.axaml +++ b/OpenUtau/Controls/LyricBox.axaml @@ -18,7 +18,7 @@ VerticalAlignment="Stretch" HorizontalAlignment="Stretch" BorderThickness="0" Background="Transparent" Margin="{DynamicResource AutoCompleteListPadding}" - ItemsSource="{Binding Suggestions}" SelectedItem="{Binding SelectedSuggestion}" + ItemsSource="{Binding Suggestions}" SelectedItem="{Binding SelectedSuggestion}" SelectionMode="Single" Focusable="True" KeyDown="ListBox_KeyDown"> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + TrackOffset="{Binding TrackOffset}"/> + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - + + diff --git a/OpenUtau/Views/MainWindow.axaml.cs b/OpenUtau/Views/MainWindow.axaml.cs index 5ea4cdb0c..46c42ab8a 100644 --- a/OpenUtau/Views/MainWindow.axaml.cs +++ b/OpenUtau/Views/MainWindow.axaml.cs @@ -10,8 +10,11 @@ using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.Primitives; +using Avalonia.Controls.Shapes; using Avalonia.Input; using Avalonia.Interactivity; +using Avalonia.Platform.Storage; +using Avalonia.VisualTree; using Avalonia.Threading; using OpenUtau.App.Controls; using OpenUtau.App.ViewModels; @@ -25,6 +28,7 @@ using ReactiveUI; using Serilog; using SharpCompress; +using Path = System.IO.Path; using Point = Avalonia.Point; namespace OpenUtau.App.Views { @@ -878,7 +882,11 @@ async void OnDrop(object? sender, DragEventArgs args) { .Append(Core.Vogen.VogenSingerInstaller.FileExt) .Append(PackageManager.OudepExt) .ToArray(); - var files = args.Data?.GetFiles()?.Where(i => i != null).Select(i => i.Path.LocalPath).ToArray() ?? new string[] { }; + var files = args.DataTransfer.TryGetFiles()? + .Where(i => i != null) + .Select(i => i.Path.LocalPath) + .ToArray() ?? new string[] { }; + if (files.Length == 0) { return; } @@ -1040,7 +1048,9 @@ public void TimelinePointerReleased(object sender, PointerReleasedEventArgs args public void PartsCanvasPointerPressed(object sender, PointerPressedEventArgs args) { var control = (Control)sender; var point = args.GetCurrentPoint(control); - var hitControl = control.InputHitTest(point.Position); + var sourceControl = args.Source as Control; + var hitPartControl = sourceControl?.FindAncestorOfType(includeSelf: true); + if (partEditState != null) { return; } @@ -1048,51 +1058,52 @@ public void PartsCanvasPointerPressed(object sender, PointerPressedEventArgs arg if (args.KeyModifiers == cmdKey) { partEditState = new PartSelectionEditState(control, viewModel, SelectionBox); Cursor = ViewConstants.cursorCross; - } else if (hitControl == control) { + } else if (hitPartControl == null) { + // Clicked empty canvas — equivalent to old `hitControl == control` viewModel.TracksViewModel.DeselectParts(); var part = viewModel.TracksViewModel.MaybeAddPart(point.Position); if (part != null) { - // Start moving right away partEditState = new PartMoveEditState(control, viewModel, part); Cursor = ViewConstants.cursorSizeAll; } - } else if (hitControl is PartControl partControl) { + } else { + // Clicked on a part bool fadein = false; bool fadeout = false; - if (partControl.part is UWavePart wavePart && point.Position.Y < partControl.Bounds.Top + 6) { - var fadePos = partControl.Bounds.Left + partControl.FadeIn; + if (hitPartControl.part is UWavePart && point.Position.Y < hitPartControl.Bounds.Top + 6) { + var fadePos = hitPartControl.Bounds.Left + hitPartControl.FadeIn; fadein = fadePos < point.Position.X && point.Position.X < fadePos + 6; - fadePos = partControl.Bounds.Left + partControl.FadeOut; + fadePos = hitPartControl.Bounds.Left + hitPartControl.FadeOut; fadeout = fadePos - 6 < point.Position.X && point.Position.X < fadePos; } - bool skip = point.Position.X < partControl.Bounds.Left + ViewConstants.ResizeMargin; - bool trim = point.Position.X > partControl.Bounds.Right - ViewConstants.ResizeMargin; + bool skip = point.Position.X < hitPartControl.Bounds.Left + ViewConstants.ResizeMargin; + bool trim = point.Position.X > hitPartControl.Bounds.Right - ViewConstants.ResizeMargin; if (fadein) { - partEditState = new PartFadeInState(control, viewModel, (UWavePart)partControl.part); + partEditState = new PartFadeInState(control, viewModel, (UWavePart)hitPartControl.part); Cursor = ViewConstants.cursorSizeWE; } else if (fadeout) { - partEditState = new PartFadeOutState(control, viewModel, (UWavePart)partControl.part); + partEditState = new PartFadeOutState(control, viewModel, (UWavePart)hitPartControl.part); Cursor = ViewConstants.cursorSizeWE; } else if (skip) { - partEditState = new PartResizeEditState(control, viewModel, partControl.part, true); + partEditState = new PartResizeEditState(control, viewModel, hitPartControl.part, true); Cursor = ViewConstants.cursorSizeWE; } else if (trim) { - partEditState = new PartResizeEditState(control, viewModel, partControl.part); + partEditState = new PartResizeEditState(control, viewModel, hitPartControl.part); Cursor = ViewConstants.cursorSizeWE; } else { - partEditState = new PartMoveEditState(control, viewModel, partControl.part); + partEditState = new PartMoveEditState(control, viewModel, hitPartControl.part); Cursor = ViewConstants.cursorSizeAll; } } } else if (point.Properties.IsRightButtonPressed) { - if (hitControl is PartControl partControl) { - if (!viewModel.TracksViewModel.SelectedParts.Contains(partControl.part)) { + if (hitPartControl != null) { + if (!viewModel.TracksViewModel.SelectedParts.Contains(hitPartControl.part)) { viewModel.TracksViewModel.DeselectParts(); - viewModel.TracksViewModel.SelectPart(partControl.part); + viewModel.TracksViewModel.SelectPart(hitPartControl.part); } if (PartsContextMenu != null && viewModel.TracksViewModel.SelectedParts.Count > 0) { var menuArgs = new PartsContextMenuArgs { - Part = partControl.part, + Part = hitPartControl.part, PartDeleteCommand = viewModel.PartDeleteCommand, PartGotoFileCommand = PartGotoFileCommand, PartReplaceAudioCommand = PartReplaceAudioCommand, @@ -1101,7 +1112,7 @@ public void PartsCanvasPointerPressed(object sender, PointerPressedEventArgs arg PartMergeCommand = PartMergeCommand, PartSplitCommand = PartSplitCommand }; - if (partControl.part is UVoicePart voicePart) { + if (hitPartControl.part is UVoicePart voicePart) { menuArgs.PartApplyPitchMenuItems = DocManager.Inst.Project.parts .OfType() .OrderBy(p => p.trackNo) @@ -1139,18 +1150,19 @@ public void PartsCanvasPointerMoved(object sender, PointerEventArgs args) { partEditState.Update(point.Pointer, point.Position); return; } - var hitControl = control.InputHitTest(point.Position); - if (hitControl is PartControl partControl) { + var sourceControl = args.Source as Control; + var hitPartControl = sourceControl?.FindAncestorOfType(includeSelf: true); + if (hitPartControl != null) { bool fadein = false; bool fadeout = false; - if (partControl.part is UWavePart wavePart && point.Position.Y < partControl.Bounds.Top + 6) { - var fadePos = partControl.Bounds.Left + partControl.FadeIn; + if (hitPartControl.part is UWavePart && point.Position.Y < hitPartControl.Bounds.Top + 6) { + var fadePos = hitPartControl.Bounds.Left + hitPartControl.FadeIn; fadein = fadePos < point.Position.X && point.Position.X < fadePos + 6; - fadePos = partControl.Bounds.Left + partControl.FadeOut; + fadePos = hitPartControl.Bounds.Left + hitPartControl.FadeOut; fadeout = fadePos - 6 < point.Position.X && point.Position.X < fadePos; } - bool skip = point.Position.X < partControl.Bounds.Left + ViewConstants.ResizeMargin; - bool trim = point.Position.X > partControl.Bounds.Right - ViewConstants.ResizeMargin; + bool skip = point.Position.X < hitPartControl.Bounds.Left + ViewConstants.ResizeMargin; + bool trim = point.Position.X > hitPartControl.Bounds.Right - ViewConstants.ResizeMargin; if (fadein || fadeout) { Cursor = ViewConstants.cursorHand; } else if (skip || trim) { @@ -1179,8 +1191,13 @@ public async void PartsCanvasDoubleTapped(object sender, TappedEventArgs args) { if (sender is not Canvas canvas) { return; } - var control = canvas.InputHitTest(args.GetPosition(canvas)); - if (control is PartControl partControl && partControl.part is UVoicePart) { + + var point = args.GetPosition(canvas); + var visuals = canvas.GetVisualsAt(point); + var hitPartControl = visuals + .Select(v => v.FindAncestorOfType(includeSelf: true)) + .FirstOrDefault(pc => pc != null); + if (hitPartControl?.part is UVoicePart) { if (pianoRoll == null) { LoadingWindow.BeginLoading(this); @@ -1213,7 +1230,7 @@ await Task.Run(() => pianoRoll.Focus(); } int tick = viewModel.TracksViewModel.PointToTick(args.GetPosition(canvas)); - DocManager.Inst.ExecuteCmd(new LoadPartNotification(partControl.part, DocManager.Inst.Project, tick)); + DocManager.Inst.ExecuteCmd(new LoadPartNotification(hitPartControl.part, DocManager.Inst.Project, tick)); pianoRoll.AttachExpressions(); } } diff --git a/OpenUtau/Views/MessageBox.axaml.cs b/OpenUtau/Views/MessageBox.axaml.cs index bb7355b0c..1274d1411 100644 --- a/OpenUtau/Views/MessageBox.axaml.cs +++ b/OpenUtau/Views/MessageBox.axaml.cs @@ -8,6 +8,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Input.Platform; using Avalonia.Interactivity; using Avalonia.Threading; using OpenUtau.Core; diff --git a/OpenUtau/Views/PhoneticAssistant.axaml.cs b/OpenUtau/Views/PhoneticAssistant.axaml.cs index a031e2ee6..ddb61e3a2 100644 --- a/OpenUtau/Views/PhoneticAssistant.axaml.cs +++ b/OpenUtau/Views/PhoneticAssistant.axaml.cs @@ -1,4 +1,5 @@ using Avalonia.Controls; +using Avalonia.Input.Platform; using Avalonia.Interactivity; using OpenUtau.App.ViewModels; diff --git a/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs b/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs index 2e1103ccd..bb9a89f06 100644 --- a/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs +++ b/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs @@ -23,7 +23,7 @@ public PianoRollDetachedWindow(PianoRoll pianoRoll) { WindowState = (WindowState)Preferences.Default.PianorollWindowSize.State; } - public void WindowGotFocus(object sender, GotFocusEventArgs e) { + public void WindowGotFocus(object sender, FocusChangedEventArgs e) { if (e.Source is PianoRollDetachedWindow) { pianoRoll.Focus(); } diff --git a/OpenUtau/Views/SingersDialog.axaml b/OpenUtau/Views/SingersDialog.axaml index c0dec4a46..af69702ed 100644 --- a/OpenUtau/Views/SingersDialog.axaml +++ b/OpenUtau/Views/SingersDialog.axaml @@ -92,7 +92,7 @@ - beatPerBars = Enumerable.Range(1, 32).ToList(); static readonly List beatUnits = new List { 1, 2, 4, 8, 16, 32 }; public List BeatPerBars => beatPerBars; public List BeatUnits => beatUnits; - [Reactive] public int BeatPerBar { get; set; } - [Reactive] public int BeatUnit { get; set; } + + [Reactive] public partial int BeatPerBar { get; set; } + [Reactive] public partial int BeatUnit { get; set; } + + public new event PropertyChangedEventHandler? PropertyChanged; + public event PropertyChangingEventHandler? PropertyChanging; + + public void RaisePropertyChanging(PropertyChangingEventArgs args) => PropertyChanging?.Invoke(this, args); + public void RaisePropertyChanged(PropertyChangedEventArgs args) => PropertyChanged?.Invoke(this, args); + public Action? OnOk { get; set; } public TimeSignatureDialog() : this(4, 4) { } diff --git a/OpenUtau/Views/UpdaterDialog.axaml b/OpenUtau/Views/UpdaterDialog.axaml index a23d203e8..0664d744a 100644 --- a/OpenUtau/Views/UpdaterDialog.axaml +++ b/OpenUtau/Views/UpdaterDialog.axaml @@ -7,28 +7,26 @@ Width="400" Height="300" CanResize="False" WindowStartupLocation="CenterScreen" Icon="/Assets/open-utau.ico" Title="{DynamicResource updater.caption}" Closing="OnClosing"> - - - - - - - - -