Browse Source

Hide ChromeOverlayLayer from public API

pull/20732/head
Nikita Tsukanov 1 month ago
parent
commit
efed355dbd
  1. 36
      api/Avalonia.nupkg.xml
  2. 21
      src/Avalonia.Controls/Primitives/ChromeOverlayLayer.cs
  3. 49
      src/Avalonia.Controls/Primitives/VisualLayerManager.cs
  4. 3
      src/Avalonia.Themes.Fluent/Controls/Window.xaml
  5. 3
      src/Avalonia.Themes.Simple/Controls/Window.xaml

36
api/Avalonia.nupkg.xml

@ -301,6 +301,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.ChromeOverlayLayer</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.IPopupHost</Target>
@ -667,6 +673,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.ChromeOverlayLayer</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.IPopupHost</Target>
@ -1291,6 +1303,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Controls.Primitives.VisualLayerManager.ChromeOverlayLayerProperty</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Controls.TextBlock.LetterSpacingProperty</Target>
@ -1615,6 +1633,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Controls.Primitives.VisualLayerManager.get_ChromeOverlayLayer</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Controls.Primitives.VisualLayerManager.get_LightDismissOverlayLayer</Target>
@ -2377,6 +2401,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Controls.Primitives.VisualLayerManager.ChromeOverlayLayerProperty</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Controls.TextBlock.LetterSpacingProperty</Target>
@ -2701,6 +2731,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Controls.Primitives.VisualLayerManager.get_ChromeOverlayLayer</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Controls.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Controls.Primitives.VisualLayerManager.get_LightDismissOverlayLayer</Target>

21
src/Avalonia.Controls/Primitives/ChromeOverlayLayer.cs

@ -4,27 +4,8 @@ using Avalonia.VisualTree;
namespace Avalonia.Controls.Primitives
{
public class ChromeOverlayLayer : Panel
internal class ChromeOverlayLayer : Panel
{
public static Panel? GetOverlayLayer(Visual visual)
{
foreach (var v in visual.GetVisualAncestors())
if (v is VisualLayerManager vlm)
if (vlm.OverlayLayer != null)
return vlm.ChromeOverlayLayer;
if (visual is TopLevel tl)
{
var layers = tl.GetVisualDescendants().OfType<VisualLayerManager>().FirstOrDefault();
return layers?.ChromeOverlayLayer;
}
return null;
}
public void Add(Control c)
{
base.Children.Add(c);
}
}
}

49
src/Avalonia.Controls/Primitives/VisualLayerManager.cs

@ -1,4 +1,5 @@
using System.Collections.Generic;
using Avalonia.Controls.Chrome;
using Avalonia.LogicalTree;
namespace Avalonia.Controls.Primitives
@ -14,9 +15,6 @@ namespace Avalonia.Controls.Primitives
private ILogicalRoot? _logicalRoot;
private readonly List<Control> _layers = new();
public static readonly StyledProperty<ChromeOverlayLayer?> ChromeOverlayLayerProperty =
AvaloniaProperty.Register<VisualLayerManager, ChromeOverlayLayer?>(nameof(ChromeOverlayLayer));
public bool IsPopup { get; set; }
internal AdornerLayer AdornerLayer
@ -30,29 +28,42 @@ namespace Avalonia.Controls.Primitives
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("AvaloniaProperty", "AVP1030")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("AvaloniaProperty", "AVP1031",
Justification = "A hack to make ChromeOverlayLayer lazily creatable. It is expected that GetValue(ChromeOverlayLayerProperty) alone won't work.")]
public ChromeOverlayLayer ChromeOverlayLayer
{
get
{
var current = GetValue(ChromeOverlayLayerProperty);
if (current is null)
{
var chromeOverlayLayer = new ChromeOverlayLayer();
AddLayer(chromeOverlayLayer, ChromeZIndex);
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
EnsureChromeOverlayIfNeeded();
base.OnAttachedToVisualTree(e);
}
SetValue(ChromeOverlayLayerProperty, chromeOverlayLayer);
void EnsureChromeOverlayIfNeeded()
{
// HACK: This is a replacement hack for the old set of hacks for TitleBar.
current = chromeOverlayLayer;
// Check if we are attached direclty-ish to a Window (i. e. no other VisualLayerManager in between).
// If we are, then we are the "main" VisualLayerManager and should create the ChromeOverlayLayer and add titlebar there
var parent = VisualParent;
while (parent != null)
{
if(parent is VisualLayerManager)
break;
else if (parent is Window window)
{
if (FindLayer<ChromeOverlayLayer>() == null)
{
var layer = new ChromeOverlayLayer();
AddLayer(layer, ChromeZIndex);
layer.Children.Add(new TitleBar());
}
break;
}
return current;
parent = parent.VisualParent;
}
}
internal OverlayLayer? OverlayLayer
{
get

3
src/Avalonia.Themes.Fluent/Controls/Window.xaml

@ -15,9 +15,6 @@
<Border Background="{TemplateBinding Background}" IsHitTestVisible="False" />
<Panel Background="Transparent" Margin="{TemplateBinding WindowDecorationMargin}" />
<VisualLayerManager>
<VisualLayerManager.ChromeOverlayLayer>
<TitleBar />
</VisualLayerManager.ChromeOverlayLayer>
<ContentPresenter Name="PART_ContentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"

3
src/Avalonia.Themes.Simple/Controls/Window.xaml

@ -18,9 +18,6 @@
<Panel Margin="{TemplateBinding WindowDecorationMargin}"
Background="Transparent" />
<VisualLayerManager>
<VisualLayerManager.ChromeOverlayLayer>
<TitleBar />
</VisualLayerManager.ChromeOverlayLayer>
<ContentPresenter Name="PART_ContentPresenter"
Margin="{TemplateBinding Padding}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"

Loading…
Cancel
Save