|
|
@@ -14,17 +14,21 @@ namespace Avalonia.Controls.Chrome
|
|
|
public class CaptionButtons : TemplatedControl
|
|
|
{
|
|
|
private CompositeDisposable? _disposables;
|
|
|
- private Window? _hostWindow;
|
|
|
|
|
|
- public void Attach(Window hostWindow)
|
|
|
+ /// <summary>
|
|
|
+ /// Currently attached window.
|
|
|
+ /// </summary>
|
|
|
+ protected Window? HostWindow { get; private set; }
|
|
|
+
|
|
|
+ public virtual void Attach(Window hostWindow)
|
|
|
{
|
|
|
if (_disposables == null)
|
|
|
{
|
|
|
- _hostWindow = hostWindow;
|
|
|
+ HostWindow = hostWindow;
|
|
|
|
|
|
_disposables = new CompositeDisposable
|
|
|
{
|
|
|
- _hostWindow.GetObservable(Window.WindowStateProperty)
|
|
|
+ HostWindow.GetObservable(Window.WindowStateProperty)
|
|
|
.Subscribe(x =>
|
|
|
{
|
|
|
PseudoClasses.Set(":minimized", x == WindowState.Minimized);
|
|
|
@@ -36,14 +40,45 @@ namespace Avalonia.Controls.Chrome
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void Detach()
|
|
|
+ public virtual void Detach()
|
|
|
{
|
|
|
if (_disposables != null)
|
|
|
{
|
|
|
_disposables.Dispose();
|
|
|
_disposables = null;
|
|
|
|
|
|
- _hostWindow = null;
|
|
|
+ HostWindow = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void OnClose()
|
|
|
+ {
|
|
|
+ HostWindow?.Close();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void OnRestore()
|
|
|
+ {
|
|
|
+ if (HostWindow != null)
|
|
|
+ {
|
|
|
+ HostWindow.WindowState = HostWindow.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void OnMinimize()
|
|
|
+ {
|
|
|
+ if (HostWindow != null)
|
|
|
+ {
|
|
|
+ HostWindow.WindowState = WindowState.Minimized;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual void OnToggleFullScreen()
|
|
|
+ {
|
|
|
+ if (HostWindow != null)
|
|
|
+ {
|
|
|
+ HostWindow.WindowState = HostWindow.WindowState == WindowState.FullScreen
|
|
|
+ ? WindowState.Normal
|
|
|
+ : WindowState.FullScreen;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -56,31 +91,13 @@ namespace Avalonia.Controls.Chrome
|
|
|
var minimiseButton = e.NameScope.Get<Panel>("PART_MinimiseButton");
|
|
|
var fullScreenButton = e.NameScope.Get<Panel>("PART_FullScreenButton");
|
|
|
|
|
|
- closeButton.PointerReleased += (sender, e) => _hostWindow?.Close();
|
|
|
+ closeButton.PointerReleased += (sender, e) => OnClose();
|
|
|
|
|
|
- restoreButton.PointerReleased += (sender, e) =>
|
|
|
- {
|
|
|
- if (_hostWindow != null)
|
|
|
- {
|
|
|
- _hostWindow.WindowState = _hostWindow.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
|
|
|
- }
|
|
|
- };
|
|
|
+ restoreButton.PointerReleased += (sender, e) => OnRestore();
|
|
|
|
|
|
- minimiseButton.PointerReleased += (sender, e) =>
|
|
|
- {
|
|
|
- if (_hostWindow != null)
|
|
|
- {
|
|
|
- _hostWindow.WindowState = WindowState.Minimized;
|
|
|
- }
|
|
|
- };
|
|
|
+ minimiseButton.PointerReleased += (sender, e) => OnMinimize();
|
|
|
|
|
|
- fullScreenButton.PointerReleased += (sender, e) =>
|
|
|
- {
|
|
|
- if (_hostWindow != null)
|
|
|
- {
|
|
|
- _hostWindow.WindowState = _hostWindow.WindowState == WindowState.FullScreen ? WindowState.Normal : WindowState.FullScreen;
|
|
|
- }
|
|
|
- };
|
|
|
+ fullScreenButton.PointerReleased += (sender, e) => OnToggleFullScreen();
|
|
|
}
|
|
|
}
|
|
|
}
|