committed by
GitHub
128 changed files with 1259 additions and 377 deletions
@ -0,0 +1,337 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Avalonia.Controls.Platform; |
|||
using Avalonia.Controls.Primitives.PopupPositioning; |
|||
using Avalonia.Input; |
|||
using Avalonia.Input.Raw; |
|||
using Avalonia.Input.TextInput; |
|||
using Avalonia.Platform; |
|||
using Avalonia.Rendering; |
|||
|
|||
namespace Avalonia.Controls; |
|||
|
|||
internal class ValidatingToplevelImpl : ITopLevelImpl, ITopLevelImplWithNativeControlHost, |
|||
ITopLevelImplWithNativeMenuExporter, ITopLevelImplWithTextInputMethod |
|||
{ |
|||
private readonly ITopLevelImpl _impl; |
|||
private bool _disposed; |
|||
|
|||
public ValidatingToplevelImpl(ITopLevelImpl impl) |
|||
{ |
|||
_impl = impl ?? throw new InvalidOperationException( |
|||
"Could not create TopLevel implementation: maybe no windowing subsystem was initialized?"); |
|||
} |
|||
|
|||
public void Dispose() |
|||
{ |
|||
_disposed = true; |
|||
_impl.Dispose(); |
|||
} |
|||
|
|||
protected void CheckDisposed() |
|||
{ |
|||
if (_disposed) |
|||
throw new ObjectDisposedException(_impl.GetType().FullName); |
|||
} |
|||
|
|||
protected ITopLevelImpl Inner |
|||
{ |
|||
get |
|||
{ |
|||
CheckDisposed(); |
|||
return _impl; |
|||
} |
|||
} |
|||
|
|||
public static ITopLevelImpl Wrap(ITopLevelImpl impl) |
|||
{ |
|||
#if DEBUG
|
|||
if (impl is ValidatingToplevelImpl) |
|||
return impl; |
|||
return new ValidatingToplevelImpl(impl); |
|||
#else
|
|||
return impl; |
|||
#endif
|
|||
} |
|||
|
|||
public Size ClientSize => Inner.ClientSize; |
|||
public Size? FrameSize => Inner.FrameSize; |
|||
public double RenderScaling => Inner.RenderScaling; |
|||
public IEnumerable<object> Surfaces => Inner.Surfaces; |
|||
|
|||
public Action<RawInputEventArgs> Input |
|||
{ |
|||
get => Inner.Input; |
|||
set => Inner.Input = value; |
|||
} |
|||
|
|||
public Action<Rect> Paint |
|||
{ |
|||
get => Inner.Paint; |
|||
set => Inner.Paint = value; |
|||
} |
|||
|
|||
public Action<Size, PlatformResizeReason> Resized |
|||
{ |
|||
get => Inner.Resized; |
|||
set => Inner.Resized = value; |
|||
} |
|||
|
|||
public Action<double> ScalingChanged |
|||
{ |
|||
get => Inner.ScalingChanged; |
|||
set => Inner.ScalingChanged = value; |
|||
} |
|||
|
|||
public Action<WindowTransparencyLevel> TransparencyLevelChanged |
|||
{ |
|||
get => Inner.TransparencyLevelChanged; |
|||
set => Inner.TransparencyLevelChanged = value; |
|||
} |
|||
|
|||
public IRenderer CreateRenderer(IRenderRoot root) => Inner.CreateRenderer(root); |
|||
|
|||
public void Invalidate(Rect rect) => Inner.Invalidate(rect); |
|||
|
|||
public void SetInputRoot(IInputRoot inputRoot) => Inner.SetInputRoot(inputRoot); |
|||
|
|||
public Point PointToClient(PixelPoint point) => Inner.PointToClient(point); |
|||
|
|||
public PixelPoint PointToScreen(Point point) => Inner.PointToScreen(point); |
|||
|
|||
public void SetCursor(ICursorImpl cursor) => Inner.SetCursor(cursor); |
|||
|
|||
public Action Closed |
|||
{ |
|||
get => Inner.Closed; |
|||
set => Inner.Closed = value; |
|||
} |
|||
|
|||
public Action LostFocus |
|||
{ |
|||
get => Inner.LostFocus; |
|||
set => Inner.LostFocus = value; |
|||
} |
|||
|
|||
// Exception: for some reason we are notifying platform mouse device from TopLevel.cs
|
|||
public IMouseDevice MouseDevice => _impl.MouseDevice; |
|||
public IPopupImpl CreatePopup() => Inner.CreatePopup(); |
|||
|
|||
public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) => |
|||
Inner.SetTransparencyLevelHint(transparencyLevel); |
|||
|
|||
|
|||
public WindowTransparencyLevel TransparencyLevel => Inner.TransparencyLevel; |
|||
public AcrylicPlatformCompensationLevels AcrylicCompensationLevels => Inner.AcrylicCompensationLevels; |
|||
public INativeControlHostImpl NativeControlHost => (Inner as ITopLevelImplWithNativeControlHost)?.NativeControlHost; |
|||
|
|||
public ITopLevelNativeMenuExporter NativeMenuExporter => |
|||
(Inner as ITopLevelImplWithNativeMenuExporter)?.NativeMenuExporter; |
|||
|
|||
public ITextInputMethodImpl TextInputMethod => (Inner as ITopLevelImplWithTextInputMethod)?.TextInputMethod; |
|||
} |
|||
|
|||
internal class ValidatingWindowBaseImpl : ValidatingToplevelImpl, IWindowBaseImpl |
|||
{ |
|||
private readonly IWindowBaseImpl _impl; |
|||
|
|||
public ValidatingWindowBaseImpl(IWindowBaseImpl impl) : base(impl) |
|||
{ |
|||
_impl = impl; |
|||
} |
|||
|
|||
protected new IWindowBaseImpl Inner |
|||
{ |
|||
get |
|||
{ |
|||
CheckDisposed(); |
|||
return _impl; |
|||
} |
|||
} |
|||
|
|||
public static IWindowBaseImpl Wrap(IWindowBaseImpl impl) |
|||
{ |
|||
#if DEBUG
|
|||
if (impl is ValidatingToplevelImpl) |
|||
return impl; |
|||
return new ValidatingWindowBaseImpl(impl); |
|||
#else
|
|||
return impl; |
|||
#endif
|
|||
} |
|||
|
|||
public void Show(bool activate, bool isDialog) => Inner.Show(activate, isDialog); |
|||
|
|||
public void Hide() => Inner.Hide(); |
|||
|
|||
public double DesktopScaling => Inner.DesktopScaling; |
|||
public PixelPoint Position => Inner.Position; |
|||
|
|||
public Action<PixelPoint> PositionChanged |
|||
{ |
|||
get => Inner.PositionChanged; |
|||
set => Inner.PositionChanged = value; |
|||
} |
|||
|
|||
public void Activate() => Inner.Activate(); |
|||
|
|||
public Action Deactivated |
|||
{ |
|||
get => Inner.Deactivated; |
|||
set => Inner.Deactivated = value; |
|||
} |
|||
|
|||
public Action Activated |
|||
{ |
|||
get => Inner.Activated; |
|||
set => Inner.Deactivated = value; |
|||
} |
|||
|
|||
public IPlatformHandle Handle => Inner.Handle; |
|||
public Size MaxAutoSizeHint => Inner.MaxAutoSizeHint; |
|||
public void SetTopmost(bool value) => Inner.SetTopmost(value); |
|||
public IScreenImpl Screen => Inner.Screen; |
|||
} |
|||
|
|||
internal class ValidatingWindowImpl : ValidatingWindowBaseImpl, IWindowImpl |
|||
{ |
|||
private readonly IWindowImpl _impl; |
|||
|
|||
public ValidatingWindowImpl(IWindowImpl impl) : base(impl) |
|||
{ |
|||
_impl = impl; |
|||
} |
|||
|
|||
protected new IWindowImpl Inner |
|||
{ |
|||
get |
|||
{ |
|||
CheckDisposed(); |
|||
return _impl; |
|||
} |
|||
} |
|||
|
|||
public static IWindowImpl Wrap(IWindowImpl impl) |
|||
{ |
|||
#if DEBUG
|
|||
if (impl is ValidatingToplevelImpl) |
|||
return impl; |
|||
return new ValidatingWindowImpl(impl); |
|||
#else
|
|||
return impl; |
|||
#endif
|
|||
} |
|||
|
|||
public WindowState WindowState |
|||
{ |
|||
get => Inner.WindowState; |
|||
set => Inner.WindowState = value; |
|||
} |
|||
|
|||
public Action<WindowState> WindowStateChanged |
|||
{ |
|||
get => Inner.WindowStateChanged; |
|||
set => Inner.WindowStateChanged = value; |
|||
} |
|||
|
|||
public void SetTitle(string title) => Inner.SetTitle(title); |
|||
|
|||
public void SetParent(IWindowImpl parent) |
|||
{ |
|||
//Workaround. SetParent will cast IWindowImpl to WindowImpl but ValidatingWindowImpl isn't actual WindowImpl so it will fail with InvalidCastException.
|
|||
if (parent is ValidatingWindowImpl validatingToplevelImpl) |
|||
{ |
|||
Inner.SetParent(validatingToplevelImpl.Inner); |
|||
} |
|||
else |
|||
{ |
|||
Inner.SetParent(parent); |
|||
} |
|||
} |
|||
|
|||
public void SetEnabled(bool enable) => Inner.SetEnabled(enable); |
|||
|
|||
public Action GotInputWhenDisabled |
|||
{ |
|||
get => Inner.GotInputWhenDisabled; |
|||
set => Inner.GotInputWhenDisabled = value; |
|||
} |
|||
|
|||
public void SetSystemDecorations(SystemDecorations enabled) => Inner.SetSystemDecorations(enabled); |
|||
|
|||
public void SetIcon(IWindowIconImpl icon) => Inner.SetIcon(icon); |
|||
|
|||
public void ShowTaskbarIcon(bool value) => Inner.ShowTaskbarIcon(value); |
|||
|
|||
public void CanResize(bool value) => Inner.CanResize(value); |
|||
|
|||
public Func<bool> Closing |
|||
{ |
|||
get => Inner.Closing; |
|||
set => Inner.Closing = value; |
|||
} |
|||
|
|||
public bool IsClientAreaExtendedToDecorations => Inner.IsClientAreaExtendedToDecorations; |
|||
|
|||
public Action<bool> ExtendClientAreaToDecorationsChanged |
|||
{ |
|||
get => Inner.ExtendClientAreaToDecorationsChanged; |
|||
set => Inner.ExtendClientAreaToDecorationsChanged = value; |
|||
} |
|||
|
|||
public bool NeedsManagedDecorations => Inner.NeedsManagedDecorations; |
|||
public Thickness ExtendedMargins => Inner.ExtendedMargins; |
|||
public Thickness OffScreenMargin => Inner.OffScreenMargin; |
|||
public void BeginMoveDrag(PointerPressedEventArgs e) => Inner.BeginMoveDrag(e); |
|||
|
|||
public void BeginResizeDrag(WindowEdge edge, PointerPressedEventArgs e) => Inner.BeginResizeDrag(edge, e); |
|||
|
|||
public void Resize(Size clientSize, PlatformResizeReason reason) => |
|||
Inner.Resize(clientSize, reason); |
|||
|
|||
public void Move(PixelPoint point) => Inner.Move(point); |
|||
|
|||
public void SetMinMaxSize(Size minSize, Size maxSize) => Inner.SetMinMaxSize(minSize, maxSize); |
|||
|
|||
public void SetExtendClientAreaToDecorationsHint(bool extendIntoClientAreaHint) => |
|||
Inner.SetExtendClientAreaToDecorationsHint(extendIntoClientAreaHint); |
|||
|
|||
public void SetExtendClientAreaChromeHints(ExtendClientAreaChromeHints hints) => |
|||
Inner.SetExtendClientAreaChromeHints(hints); |
|||
|
|||
public void SetExtendClientAreaTitleBarHeightHint(double titleBarHeight) => |
|||
Inner.SetExtendClientAreaTitleBarHeightHint(titleBarHeight); |
|||
} |
|||
|
|||
internal class ValidatingPopupImpl : ValidatingWindowBaseImpl, IPopupImpl |
|||
{ |
|||
private readonly IPopupImpl _impl; |
|||
|
|||
public ValidatingPopupImpl(IPopupImpl impl) : base(impl) |
|||
{ |
|||
_impl = impl; |
|||
} |
|||
|
|||
protected new IPopupImpl Inner |
|||
{ |
|||
get |
|||
{ |
|||
CheckDisposed(); |
|||
return _impl; |
|||
} |
|||
} |
|||
|
|||
public static IPopupImpl Wrap(IPopupImpl impl) |
|||
{ |
|||
#if DEBUG
|
|||
if (impl is ValidatingToplevelImpl) |
|||
return impl; |
|||
return new ValidatingPopupImpl(impl); |
|||
#else
|
|||
return impl; |
|||
#endif
|
|||
} |
|||
|
|||
public IPopupPositioner PopupPositioner => Inner.PopupPositioner; |
|||
public void SetWindowManagerAddShadowHint(bool enabled) => Inner.SetWindowManagerAddShadowHint(enabled); |
|||
} |
|||
@ -0,0 +1,64 @@ |
|||
<Style |
|||
xmlns="https://github.com/avaloniaui" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:sys="clr-namespace:System;assembly=netstandard"> |
|||
<Style.Resources> |
|||
<Color x:Key="ThemeAccentColor">#CC119EDA</Color> |
|||
<Color x:Key="ThemeAccentColor2">#99119EDA</Color> |
|||
<Color x:Key="ThemeAccentColor3">#66119EDA</Color> |
|||
<Color x:Key="ThemeAccentColor4">#33119EDA</Color> |
|||
<Color x:Key="ThemeForegroundLowColor">#FF808080</Color> |
|||
<Color x:Key="HighlightForegroundColor">#FFFFFFFF</Color> |
|||
<Color x:Key="ErrorColor">#FFFF0000</Color> |
|||
<Color x:Key="ErrorLowColor">#10FF0000</Color> |
|||
<SolidColorBrush x:Key="HighlightForegroundBrush" Color="{StaticResource HighlightForegroundColor}" /> |
|||
<SolidColorBrush x:Key="ThemeForegroundLowBrush" Color="{StaticResource ThemeForegroundLowColor}" /> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush2" Color="{StaticResource ThemeAccentColor2}" /> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush3" Color="{StaticResource ThemeAccentColor3}" /> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush4" Color="{StaticResource ThemeAccentColor4}" /> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush" Color="{StaticResource ThemeAccentColor}" /> |
|||
<SolidColorBrush x:Key="ErrorBrush" Color="{StaticResource ErrorColor}" /> |
|||
<SolidColorBrush x:Key="ErrorLowBrush" Color="{StaticResource ErrorLowColor}" /> |
|||
<SolidColorBrush |
|||
x:Key="NotificationCardBackgroundBrush" |
|||
Opacity="0.75" |
|||
Color="#444444" /> |
|||
<SolidColorBrush |
|||
x:Key="NotificationCardInformationBackgroundBrush" |
|||
Opacity="0.75" |
|||
Color="#007ACC" /> |
|||
<SolidColorBrush |
|||
x:Key="NotificationCardSuccessBackgroundBrush" |
|||
Opacity="0.75" |
|||
Color="#1F9E45" /> |
|||
<SolidColorBrush |
|||
x:Key="NotificationCardWarningBackgroundBrush" |
|||
Opacity="0.75" |
|||
Color="#FDB328" /> |
|||
<SolidColorBrush |
|||
x:Key="NotificationCardErrorBackgroundBrush" |
|||
Opacity="0.75" |
|||
Color="#BD202C" /> |
|||
<SolidColorBrush x:Key="ThemeControlTransparentBrush" Color="Transparent" /> |
|||
<SolidColorBrush |
|||
x:Key="DatePickerFlyoutPresenterHighlightFill" |
|||
Opacity="0.4" |
|||
Color="{StaticResource ThemeAccentColor}" /> |
|||
<SolidColorBrush |
|||
x:Key="TimePickerFlyoutPresenterHighlightFill" |
|||
Opacity="0.4" |
|||
Color="{StaticResource ThemeAccentColor}" /> |
|||
<Thickness x:Key="ThemeBorderThickness">1</Thickness> |
|||
<sys:Double x:Key="ThemeDisabledOpacity">0.5</sys:Double> |
|||
|
|||
<sys:Double x:Key="FontSizeSmall">10</sys:Double> |
|||
<sys:Double x:Key="FontSizeNormal">12</sys:Double> |
|||
<sys:Double x:Key="FontSizeLarge">16</sys:Double> |
|||
|
|||
<sys:Double x:Key="ScrollBarThickness">18</sys:Double> |
|||
<sys:Double x:Key="ScrollBarThumbThickness">8</sys:Double> |
|||
|
|||
<sys:Double x:Key="IconElementThemeHeight">20</sys:Double> |
|||
<sys:Double x:Key="IconElementThemeWidth">20</sys:Double> |
|||
</Style.Resources> |
|||
</Style> |
|||
@ -1,82 +1,38 @@ |
|||
<Style xmlns="https://github.com/avaloniaui" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:sys="clr-namespace:System;assembly=netstandard"> |
|||
<Style |
|||
xmlns="https://github.com/avaloniaui" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:sys="clr-namespace:System;assembly=netstandard"> |
|||
<Style.Resources> |
|||
|
|||
<Color x:Key="ThemeAccentColor">#CC119EDA</Color> |
|||
<Color x:Key="ThemeAccentColor2">#99119EDA</Color> |
|||
<Color x:Key="ThemeAccentColor3">#66119EDA</Color> |
|||
<Color x:Key="ThemeAccentColor4">#33119EDA</Color> |
|||
|
|||
<Color x:Key="ThemeBackgroundColor">#FFFFFFFF</Color> |
|||
<Color x:Key="ThemeBorderLowColor">#FFAAAAAA</Color> |
|||
<Color x:Key="ThemeBorderMidColor">#FF888888</Color> |
|||
<Color x:Key="ThemeBorderHighColor">#FF333333</Color> |
|||
|
|||
|
|||
<Color x:Key="ThemeControlLowColor">#FF868999</Color> |
|||
<Color x:Key="ThemeControlMidColor">#FFF5F5F5</Color> |
|||
<Color x:Key="ThemeControlMidHighColor">#FFC2C3C9</Color> |
|||
<Color x:Key="ThemeControlHighColor">#FF686868</Color> |
|||
<Color x:Key="ThemeControlVeryHighColor">#FF5B5B5B</Color> |
|||
|
|||
<Color x:Key="ThemeControlHighlightLowColor">#FFF0F0F0</Color> |
|||
<Color x:Key="ThemeControlHighlightMidColor">#FFD0D0D0</Color> |
|||
<Color x:Key="ThemeControlHighlightHighColor">#FF808080</Color> |
|||
<Color x:Key="ThemeForegroundColor">#FF000000</Color> |
|||
<Color x:Key="ThemeForegroundLowColor">#FF808080</Color> |
|||
|
|||
<Color x:Key="HighlightColor">#FF086F9E</Color> |
|||
<Color x:Key="HighlightForegroundColor">#FFFFFFFF</Color> |
|||
<Color x:Key="ErrorColor">#FFFF0000</Color> |
|||
<Color x:Key="ErrorLowColor">#10FF0000</Color> |
|||
|
|||
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="{DynamicResource ThemeBackgroundColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeBorderLowBrush" Color="{DynamicResource ThemeBorderLowColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeBorderMidBrush" Color="{DynamicResource ThemeBorderMidColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeBorderHighBrush" Color="{DynamicResource ThemeBorderHighColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlLowBrush" Color="{DynamicResource ThemeControlLowColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlMidBrush" Color="{DynamicResource ThemeControlMidColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlMidHighBrush" Color="{DynamicResource ThemeControlMidHighColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlHighBrush" Color="{DynamicResource ThemeControlHighColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlVeryHighBrush" Color="{DynamicResource ThemeControlVeryHighColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlHighlightLowBrush" Color="{DynamicResource ThemeControlHighlightLowColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlHighlightMidBrush" Color="{DynamicResource ThemeControlHighlightMidColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeControlHighlightHighBrush" Color="{DynamicResource ThemeControlHighlightHighColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeForegroundBrush" Color="{DynamicResource ThemeForegroundColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeForegroundLowBrush" Color="{DynamicResource ThemeForegroundLowColor}"></SolidColorBrush> |
|||
|
|||
<SolidColorBrush x:Key="HighlightBrush" Color="{DynamicResource HighlightColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="HighlightForegroundBrush" Color="{DynamicResource HighlightForegroundColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush" Color="{DynamicResource ThemeAccentColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush2" Color="{DynamicResource ThemeAccentColor2}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush3" Color="{DynamicResource ThemeAccentColor3}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ThemeAccentBrush4" Color="{DynamicResource ThemeAccentColor4}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ErrorBrush" Color="{DynamicResource ErrorColor}"></SolidColorBrush> |
|||
<SolidColorBrush x:Key="ErrorLowBrush" Color="{DynamicResource ErrorLowColor}"></SolidColorBrush> |
|||
|
|||
<SolidColorBrush x:Key="NotificationCardBackgroundBrush" Color="#444444" Opacity="0.75"/> |
|||
<SolidColorBrush x:Key="NotificationCardInformationBackgroundBrush" Color="#007ACC" Opacity="0.75"/> |
|||
<SolidColorBrush x:Key="NotificationCardSuccessBackgroundBrush" Color="#1F9E45" Opacity="0.75"/> |
|||
<SolidColorBrush x:Key="NotificationCardWarningBackgroundBrush" Color="#FDB328" Opacity="0.75"/> |
|||
<SolidColorBrush x:Key="NotificationCardErrorBackgroundBrush" Color="#BD202C" Opacity="0.75"/> |
|||
|
|||
<SolidColorBrush x:Key="DatePickerFlyoutPresenterHighlightFill" Color="{DynamicResource ThemeAccentColor}" Opacity="0.4" /> |
|||
<SolidColorBrush x:Key="TimePickerFlyoutPresenterHighlightFill" Color="{DynamicResource ThemeAccentColor}" Opacity="0.4" /> |
|||
|
|||
<SolidColorBrush x:Key="ThemeControlTransparentBrush" Color="Transparent" /> |
|||
|
|||
<Thickness x:Key="ThemeBorderThickness">1</Thickness> |
|||
<sys:Double x:Key="ThemeDisabledOpacity">0.5</sys:Double> |
|||
|
|||
<sys:Double x:Key="FontSizeSmall">10</sys:Double> |
|||
<sys:Double x:Key="FontSizeNormal">12</sys:Double> |
|||
<sys:Double x:Key="FontSizeLarge">16</sys:Double> |
|||
|
|||
<sys:Double x:Key="ScrollBarThickness">18</sys:Double> |
|||
<sys:Double x:Key="ScrollBarThumbThickness">8</sys:Double> |
|||
|
|||
<sys:Double x:Key="IconElementThemeHeight">20</sys:Double> |
|||
<sys:Double x:Key="IconElementThemeWidth">20</sys:Double> |
|||
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="{StaticResource ThemeBackgroundColor}" /> |
|||
<SolidColorBrush x:Key="ThemeBorderLowBrush" Color="{StaticResource ThemeBorderLowColor}" /> |
|||
<SolidColorBrush x:Key="ThemeBorderMidBrush" Color="{StaticResource ThemeBorderMidColor}" /> |
|||
<SolidColorBrush x:Key="ThemeBorderHighBrush" Color="{StaticResource ThemeBorderHighColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlLowBrush" Color="{StaticResource ThemeControlLowColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlMidBrush" Color="{StaticResource ThemeControlMidColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlMidHighBrush" Color="{StaticResource ThemeControlMidHighColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlHighBrush" Color="{StaticResource ThemeControlHighColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlVeryHighBrush" Color="{StaticResource ThemeControlVeryHighColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlHighlightLowBrush" Color="{StaticResource ThemeControlHighlightLowColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlHighlightMidBrush" Color="{StaticResource ThemeControlHighlightMidColor}" /> |
|||
<SolidColorBrush x:Key="ThemeControlHighlightHighBrush" Color="{StaticResource ThemeControlHighlightHighColor}" /> |
|||
<SolidColorBrush x:Key="ThemeForegroundBrush" Color="{StaticResource ThemeForegroundColor}" /> |
|||
|
|||
<SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" /> |
|||
</Style.Resources> |
|||
</Style> |
|||
|
|||
@ -0,0 +1,166 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Avalonia.Controls; |
|||
using Avalonia.Markup.Xaml; |
|||
using Avalonia.Markup.Xaml.Styling; |
|||
using Avalonia.Styling; |
|||
#nullable enable |
|||
|
|||
namespace Avalonia.Themes.Default |
|||
{ |
|||
public class SimpleTheme : AvaloniaObject, IStyle, IResourceProvider |
|||
{ |
|||
public static readonly StyledProperty<SimpleThemeMode> ModeProperty = |
|||
AvaloniaProperty.Register<SimpleTheme, SimpleThemeMode>(nameof(Mode)); |
|||
|
|||
private readonly Uri _baseUri; |
|||
private bool _isLoading; |
|||
private IStyle? _loaded; |
|||
private Styles _sharedStyles = new(); |
|||
private Styles _simpleDark = new(); |
|||
private Styles _simpleLight = new(); |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="SimpleTheme"/> class.
|
|||
/// </summary>
|
|||
/// <param name="baseUri">The base URL for the XAML context.</param>
|
|||
public SimpleTheme(Uri baseUri) |
|||
{ |
|||
_baseUri = baseUri; |
|||
InitStyles(_baseUri); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="SimpleTheme"/> class.
|
|||
/// </summary>
|
|||
/// <param name="serviceProvider">The XAML service provider.</param>
|
|||
public SimpleTheme(IServiceProvider serviceProvider) |
|||
{ |
|||
var service = serviceProvider.GetService(typeof(IUriContext)); |
|||
if (service == null) |
|||
{ |
|||
throw new Exception("There is no service object of type IUriContext!"); |
|||
} |
|||
_baseUri = ((IUriContext)service).BaseUri; |
|||
InitStyles(_baseUri); |
|||
} |
|||
|
|||
public event EventHandler OwnerChanged |
|||
{ |
|||
add |
|||
{ |
|||
if (Loaded is IResourceProvider rp) |
|||
{ |
|||
rp.OwnerChanged += value; |
|||
} |
|||
} |
|||
remove |
|||
{ |
|||
if (Loaded is IResourceProvider rp) |
|||
{ |
|||
rp.OwnerChanged -= value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
IReadOnlyList<IStyle> IStyle.Children => _loaded?.Children ?? Array.Empty<IStyle>(); |
|||
|
|||
bool IResourceNode.HasResources => (Loaded as IResourceProvider)?.HasResources ?? false; |
|||
|
|||
public IStyle Loaded |
|||
{ |
|||
get |
|||
{ |
|||
if (_loaded == null) |
|||
{ |
|||
_isLoading = true; |
|||
|
|||
if (Mode == SimpleThemeMode.Light) |
|||
{ |
|||
_loaded = new Styles { _sharedStyles, _simpleLight }; |
|||
} |
|||
else if (Mode == SimpleThemeMode.Dark) |
|||
{ |
|||
_loaded = new Styles { _sharedStyles, _simpleDark }; |
|||
} |
|||
_isLoading = false; |
|||
} |
|||
|
|||
return _loaded!; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets the mode of the fluent theme (light, dark).
|
|||
/// </summary>
|
|||
public SimpleThemeMode Mode |
|||
{ |
|||
get => GetValue(ModeProperty); |
|||
set => SetValue(ModeProperty, value); |
|||
} |
|||
public IResourceHost? Owner => (Loaded as IResourceProvider)?.Owner; |
|||
|
|||
void IResourceProvider.AddOwner(IResourceHost owner) => (Loaded as IResourceProvider)?.AddOwner(owner); |
|||
|
|||
void IResourceProvider.RemoveOwner(IResourceHost owner) => (Loaded as IResourceProvider)?.RemoveOwner(owner); |
|||
|
|||
public SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host) => Loaded.TryAttach(target, host); |
|||
|
|||
public bool TryGetResource(object key, out object? value) |
|||
{ |
|||
if (!_isLoading && Loaded is IResourceProvider p) |
|||
{ |
|||
return p.TryGetResource(key, out value); |
|||
} |
|||
|
|||
value = null; |
|||
return false; |
|||
} |
|||
|
|||
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change) |
|||
{ |
|||
base.OnPropertyChanged(change); |
|||
if (change.Property == ModeProperty) |
|||
{ |
|||
if (Mode == SimpleThemeMode.Dark) |
|||
{ |
|||
(Loaded as Styles)![1] = _simpleDark[0]; |
|||
} |
|||
else |
|||
{ |
|||
(Loaded as Styles)![1] = _simpleLight[0]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
private void InitStyles(Uri baseUri) |
|||
{ |
|||
_sharedStyles = new Styles |
|||
{ |
|||
new StyleInclude(baseUri) |
|||
{ |
|||
Source = new Uri("avares://Avalonia.Themes.Default/DefaultTheme.xaml") |
|||
}, |
|||
new StyleInclude(baseUri) |
|||
{ |
|||
Source = new Uri("avares://Avalonia.Themes.Default/Accents/Base.xaml") |
|||
} |
|||
}; |
|||
_simpleLight = new Styles |
|||
{ |
|||
new StyleInclude(baseUri) |
|||
{ |
|||
Source = new Uri("avares://Avalonia.Themes.Default/Accents/BaseLight.xaml") |
|||
} |
|||
}; |
|||
|
|||
_simpleDark = new Styles |
|||
{ |
|||
new StyleInclude(baseUri) |
|||
{ |
|||
Source = new Uri("avares://Avalonia.Themes.Default/Accents/BaseDark.xaml") |
|||
} |
|||
}; |
|||
} |
|||
|
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
namespace Avalonia.Themes.Default |
|||
{ |
|||
public enum SimpleThemeMode |
|||
{ |
|||
Light, |
|||
Dark |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue