|
@@ -1,17 +1,26 @@
|
|
|
using Avalonia.Controls;
|
|
|
using PicView.Avalonia.MacOS.WindowImpl;
|
|
|
+using PicView.Avalonia.UI;
|
|
|
using PicView.Avalonia.ViewModels;
|
|
|
using PicView.Avalonia.WindowBehavior;
|
|
|
+using R3;
|
|
|
+using R3.Avalonia;
|
|
|
using ReactiveUI;
|
|
|
|
|
|
namespace PicView.Avalonia.MacOS.Views;
|
|
|
|
|
|
public partial class MacMainWindow : Window
|
|
|
{
|
|
|
+ private readonly AvaloniaRenderingFrameProvider _frameProvider;
|
|
|
+ private IDisposable? _windowStateSubscription;
|
|
|
+
|
|
|
public MacMainWindow()
|
|
|
{
|
|
|
InitializeComponent();
|
|
|
|
|
|
+ _frameProvider = new AvaloniaRenderingFrameProvider(GetTopLevel(this));
|
|
|
+ UIHelper.SetFrameProvider(_frameProvider);
|
|
|
+
|
|
|
Loaded += delegate
|
|
|
{
|
|
|
// Keep window position when resizing
|
|
@@ -23,21 +32,23 @@ public partial class MacMainWindow : Window
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
- this.WhenAnyValue(x => x.WindowState).Subscribe(async state =>
|
|
|
+ Observable.EveryValueChanged(this, x => x.WindowState, _frameProvider).SelectAwait(async (state, _) =>
|
|
|
{
|
|
|
switch (state)
|
|
|
{
|
|
|
case WindowState.FullScreen:
|
|
|
if (!Settings.WindowProperties.Fullscreen)
|
|
|
{
|
|
|
- await MacOSWindow.Fullscreen(this, vm);
|
|
|
+ await MacOSWindow.Fullscreen(this, vm);
|
|
|
}
|
|
|
+
|
|
|
break;
|
|
|
case WindowState.Maximized:
|
|
|
if (!Settings.WindowProperties.Maximized)
|
|
|
{
|
|
|
- await MacOSWindow.Maximize(this, vm);
|
|
|
+ await MacOSWindow.Maximize(this, vm);
|
|
|
}
|
|
|
+
|
|
|
break;
|
|
|
case WindowState.Normal:
|
|
|
if (Settings.WindowProperties.Maximized || Settings.WindowProperties.Fullscreen)
|
|
@@ -46,9 +57,11 @@ public partial class MacMainWindow : Window
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
- });
|
|
|
+ return Unit.Default;
|
|
|
+ }).Subscribe();
|
|
|
+
|
|
|
// Hide macOS buttons when interface is hidden
|
|
|
- vm.WhenAnyValue(x => x.IsTopToolbarShown).Subscribe(shown =>
|
|
|
+ Observable.EveryValueChanged(vm, x => x.IsTopToolbarShown, _frameProvider).Subscribe(shown =>
|
|
|
{
|
|
|
SystemDecorations = shown ? SystemDecorations.Full : SystemDecorations.None;
|
|
|
});
|
|
@@ -76,4 +89,9 @@ public partial class MacMainWindow : Window
|
|
|
await WindowFunctions.WindowClosingBehavior(this);
|
|
|
base.OnClosing(e);
|
|
|
}
|
|
|
+
|
|
|
+ protected override void OnClosed(EventArgs e)
|
|
|
+ {
|
|
|
+ _frameProvider?.Dispose();
|
|
|
+ }
|
|
|
}
|