From 7b9d32af85aa08580380ce81d0a999db727a3240 Mon Sep 17 00:00:00 2001 From: Nathan Garside Date: Sun, 9 Feb 2020 15:50:42 +0000 Subject: [PATCH 01/90] Rework system decorations --- native/Avalonia.Native/inc/avalonia-native.h | 2 +- native/Avalonia.Native/src/OSX/window.mm | 41 +++++++++++++---- samples/ControlCatalog/MainView.xaml | 11 ++++- samples/ControlCatalog/MainView.xaml.cs | 14 ++++++ src/Avalonia.Controls/Platform/IWindowImpl.cs | 2 +- src/Avalonia.Controls/Window.cs | 44 ++++++++++++++++++- .../Remote/PreviewerWindowImpl.cs | 2 +- src/Avalonia.DesignerSupport/Remote/Stubs.cs | 2 +- src/Avalonia.Native/WindowImpl.cs | 4 +- src/Avalonia.X11/X11Window.cs | 16 ++++--- .../Interop/UnmanagedMethods.cs | 10 +++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 20 +++++---- src/iOS/Avalonia.iOS/EmbeddableImpl.cs | 2 +- 13 files changed, 137 insertions(+), 33 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 4a960d47a1..ce4a592d67 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -236,7 +236,7 @@ AVNCOM(IAvnWindow, 04) : virtual IAvnWindowBase { virtual HRESULT ShowDialog (IAvnWindow* parent) = 0; virtual HRESULT SetCanResize(bool value) = 0; - virtual HRESULT SetHasDecorations(bool value) = 0; + virtual HRESULT SetHasDecorations(int value) = 0; virtual HRESULT SetTitle (void* utf8Title) = 0; virtual HRESULT SetTitleBarColor (AvnColor color) = 0; virtual HRESULT SetWindowState(AvnWindowState state) = 0; diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index b6ce172ffa..317d03162b 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -115,7 +115,6 @@ public: [NSApp activateIgnoringOtherApps:YES]; [Window setTitle:_lastTitle]; - [Window setTitleVisibility:NSWindowTitleVisible]; return S_OK; } @@ -411,7 +410,7 @@ class WindowImpl : public virtual WindowBaseImpl, public virtual IAvnWindow, pub { private: bool _canResize = true; - bool _hasDecorations = true; + int _hasDecorations = 2; CGRect _lastUndecoratedFrame; AvnWindowState _lastWindowState; @@ -476,12 +475,12 @@ private: bool IsZoomed () { - return _hasDecorations ? [Window isZoomed] : UndecoratedIsMaximized(); + return _hasDecorations > 0 ? [Window isZoomed] : UndecoratedIsMaximized(); } void DoZoom() { - if (_hasDecorations) + if (_hasDecorations > 0) { [Window performZoom:Window]; } @@ -506,13 +505,36 @@ private: } } - virtual HRESULT SetHasDecorations(bool value) override + virtual HRESULT SetHasDecorations(int value) override { @autoreleasepool { _hasDecorations = value; UpdateStyle(); + // full + if (_hasDecorations == 2) + { + [Window setHasShadow:YES]; + [Window setTitleVisibility:NSWindowTitleVisible]; + [Window setTitlebarAppearsTransparent:NO]; + [Window setTitle:_lastTitle]; + } + // border only + else if (_hasDecorations == 1) + { + [Window setHasShadow:YES]; + [Window setTitleVisibility:NSWindowTitleHidden]; + [Window setTitlebarAppearsTransparent:YES]; + } + // none + else + { + [Window setHasShadow:NO]; + [Window setTitleVisibility:NSWindowTitleHidden]; + [Window setTitlebarAppearsTransparent:YES]; + } + return S_OK; } } @@ -523,7 +545,6 @@ private: { _lastTitle = [NSString stringWithUTF8String:(const char*)utf8title]; [Window setTitle:_lastTitle]; - [Window setTitleVisibility:NSWindowTitleVisible]; return S_OK; } @@ -645,9 +666,11 @@ protected: virtual NSWindowStyleMask GetStyle() override { unsigned long s = NSWindowStyleMaskBorderless; - if(_hasDecorations) - s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; - if(_canResize) + if(_hasDecorations == 1) + s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskFullSizeContentView; + if(_hasDecorations == 2) + s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskBorderless; + if(_hasDecorations == 2 && _canResize) s = s | NSWindowStyleMaskResizable; return s; } diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index cbe2c62890..1c2653f73a 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -58,10 +58,17 @@ - + + + No Decorations + Border Only + Full Decorations + + Light Dark - + + diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs index acb9bc5bc6..5f71b2ecd9 100644 --- a/samples/ControlCatalog/MainView.xaml.cs +++ b/samples/ControlCatalog/MainView.xaml.cs @@ -56,6 +56,20 @@ namespace ControlCatalog } }; Styles.Add(light); + + var decorations = this.Find("Decorations"); + decorations.SelectionChanged += (sender, e) => + { + Window window = (Window)VisualRoot; + window.SystemDecorations = (SystemDecorations)decorations.SelectedIndex; + }; + } + + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + var decorations = this.Find("Decorations"); + decorations.SelectedIndex = (int)((Window)VisualRoot).SystemDecorations; } } } diff --git a/src/Avalonia.Controls/Platform/IWindowImpl.cs b/src/Avalonia.Controls/Platform/IWindowImpl.cs index 91b895f38a..238070bbef 100644 --- a/src/Avalonia.Controls/Platform/IWindowImpl.cs +++ b/src/Avalonia.Controls/Platform/IWindowImpl.cs @@ -36,7 +36,7 @@ namespace Avalonia.Platform /// /// Enables or disables system window decorations (title bar, buttons, etc) /// - void SetSystemDecorations(bool enabled); + void SetSystemDecorations(SystemDecorations enabled); /// /// Sets the icon of this window. diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index f66a248aaf..853347bf41 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -45,6 +45,27 @@ namespace Avalonia.Controls WidthAndHeight = 3, } + /// + /// Determines system decorations (title bar, border, etc) for a + /// + public enum SystemDecorations + { + /// + /// No decorations + /// + None = 0, + + /// + /// Window border without titlebar + /// + BorderOnly = 1, + + /// + /// Fully decorated (default) + /// + Full = 2 + } + /// /// A top-level window. /// @@ -59,9 +80,16 @@ namespace Avalonia.Controls /// /// Enables or disables system window decorations (title bar, buttons, etc) /// + [Obsolete("Use SystemDecorationsProperty instead")] public static readonly StyledProperty HasSystemDecorationsProperty = AvaloniaProperty.Register(nameof(HasSystemDecorations), true); + /// + /// Defines the property. + /// + public static readonly StyledProperty SystemDecorationsProperty = + AvaloniaProperty.Register(nameof(SystemDecorations), SystemDecorations.Full); + /// /// Enables or disables the taskbar icon /// @@ -125,7 +153,9 @@ namespace Avalonia.Controls BackgroundProperty.OverrideDefaultValue(typeof(Window), Brushes.White); TitleProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl?.SetTitle((string)e.NewValue)); HasSystemDecorationsProperty.Changed.AddClassHandler( - (s, e) => s.PlatformImpl?.SetSystemDecorations((bool)e.NewValue)); + (s, e) => s.PlatformImpl?.SetSystemDecorations(((bool)e.NewValue) ? SystemDecorations.Full : SystemDecorations.None)); + SystemDecorationsProperty.Changed.AddClassHandler( + (s, e) => s.PlatformImpl?.SetSystemDecorations((SystemDecorations)e.NewValue)); ShowInTaskbarProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.ShowTaskbarIcon((bool)e.NewValue)); @@ -140,7 +170,6 @@ namespace Avalonia.Controls MinHeightProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.SetMinMaxSize(new Size(w.MinWidth, (double)e.NewValue), new Size(w.MaxWidth, w.MaxHeight))); MaxWidthProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.SetMinMaxSize(new Size(w.MinWidth, w.MinHeight), new Size((double)e.NewValue, w.MaxHeight))); MaxHeightProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.SetMinMaxSize(new Size(w.MinWidth, w.MinHeight), new Size(w.MaxWidth, (double)e.NewValue))); - } /// @@ -192,12 +221,23 @@ namespace Avalonia.Controls /// Enables or disables system window decorations (title bar, buttons, etc) /// /// + [Obsolete("Use SystemDecorations instead")] public bool HasSystemDecorations { get { return GetValue(HasSystemDecorationsProperty); } set { SetValue(HasSystemDecorationsProperty, value); } } + /// + /// Sets the system decorations (title bar, border, etc) + /// + /// + public SystemDecorations SystemDecorations + { + get { return GetValue(SystemDecorationsProperty); } + set { SetValue(SystemDecorationsProperty, value); } + } + /// /// Enables or disables the taskbar icon /// diff --git a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs index 86e34ca6d4..7480b3519c 100644 --- a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs +++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs @@ -96,7 +96,7 @@ namespace Avalonia.DesignerSupport.Remote { } - public void SetSystemDecorations(bool enabled) + public void SetSystemDecorations(SystemDecorations enabled) { } diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index 4bba5ef41b..7bf1d236bd 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -110,7 +110,7 @@ namespace Avalonia.DesignerSupport.Remote { } - public void SetSystemDecorations(bool enabled) + public void SetSystemDecorations(SystemDecorations enabled) { } diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index c757576017..a540b026fa 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -68,9 +68,9 @@ namespace Avalonia.Native _native.CanResize = value; } - public void SetSystemDecorations(bool enabled) + public void SetSystemDecorations(SystemDecorations enabled) { - _native.HasDecorations = enabled; + _native.HasDecorations = (int)enabled; } public void SetTitleBarColor (Avalonia.Media.Color color) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 919abae243..b091ee212f 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -173,6 +173,7 @@ namespace Avalonia.X11 Surfaces = surfaces.ToArray(); UpdateMotifHints(); + UpdateSizeHints(null); _xic = XCreateIC(_x11.Xim, XNames.XNInputStyle, XIMProperties.XIMPreeditNothing | XIMProperties.XIMStatusNothing, XNames.XNClientWindow, _handle, IntPtr.Zero); XFlush(_x11.Display); @@ -219,12 +220,16 @@ namespace Avalonia.X11 var decorations = MotifDecorations.Menu | MotifDecorations.Title | MotifDecorations.Border | MotifDecorations.Maximize | MotifDecorations.Minimize | MotifDecorations.ResizeH; - if (_popup || !_systemDecorations) + if (_popup || _systemDecorations == SystemDecorations.None) { decorations = 0; } + else if (_systemDecorations == SystemDecorations.BorderOnly) + { + decorations = MotifDecorations.Border; + } - if (!_canResize) + if (!_canResize || _systemDecorations == SystemDecorations.BorderOnly) { functions &= ~(MotifFunctions.Resize | MotifFunctions.Maximize); decorations &= ~(MotifDecorations.Maximize | MotifDecorations.ResizeH); @@ -247,7 +252,7 @@ namespace Avalonia.X11 var min = _minMaxSize.minSize; var max = _minMaxSize.maxSize; - if (!_canResize) + if (!_canResize || _systemDecorations == SystemDecorations.BorderOnly) max = min = _realSize; if (preResize.HasValue) @@ -621,7 +626,7 @@ namespace Avalonia.X11 return rv; } - private bool _systemDecorations = true; + private SystemDecorations _systemDecorations = SystemDecorations.Full; private bool _canResize = true; private const int MaxWindowDimension = 100000; @@ -777,10 +782,11 @@ namespace Avalonia.X11 (int)(point.X * Scaling + Position.X), (int)(point.Y * Scaling + Position.Y)); - public void SetSystemDecorations(bool enabled) + public void SetSystemDecorations(SystemDecorations enabled) { _systemDecorations = enabled; UpdateMotifHints(); + UpdateSizeHints(null); } diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 904e122382..50b568cab2 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1298,7 +1298,17 @@ namespace Avalonia.Win32.Interop [DllImport("ole32.dll", CharSet = CharSet.Auto, ExactSpelling = true, PreserveSig = false)] internal static extern void DoDragDrop(IOleDataObject dataObject, IDropSource dropSource, int allowedEffects, out int finalEffect); + [DllImport("dwmapi.dll")] + public static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins); + [StructLayout(LayoutKind.Sequential)] + internal struct MARGINS + { + public int cxLeftWidth; + public int cxRightWidth; + public int cyTopHeight; + public int cyBottomHeight; + } public enum MONITOR { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index c16b76b539..d13c07279c 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -34,7 +34,7 @@ namespace Avalonia.Win32 private IInputRoot _owner; private ManagedDeferredRendererLock _rendererLock = new ManagedDeferredRendererLock(); private bool _trackingMouse; - private bool _decorated = true; + private SystemDecorations _decorated = SystemDecorations.Full; private bool _resizable = true; private bool _topmost = false; private bool _taskbarIcon = true; @@ -97,7 +97,7 @@ namespace Avalonia.Win32 { get { - if (_decorated) + if (_decorated == SystemDecorations.Full) { var style = UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); var exStyle = UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_EXSTYLE); @@ -281,7 +281,7 @@ namespace Avalonia.Win32 UnmanagedMethods.ShowWindow(_hwnd, UnmanagedMethods.ShowWindowCommand.Hide); } - public void SetSystemDecorations(bool value) + public void SetSystemDecorations(SystemDecorations value) { if (value == _decorated) { @@ -464,7 +464,7 @@ namespace Avalonia.Win32 return IntPtr.Zero; case WindowsMessage.WM_NCCALCSIZE: - if (ToInt32(wParam) == 1 && !_decorated) + if (ToInt32(wParam) == 1 && _decorated != SystemDecorations.Full) { return IntPtr.Zero; } @@ -682,14 +682,14 @@ namespace Avalonia.Win32 break; case WindowsMessage.WM_NCPAINT: - if (!_decorated) + if (_decorated != SystemDecorations.Full) { return IntPtr.Zero; } break; case WindowsMessage.WM_NCACTIVATE: - if (!_decorated) + if (_decorated != SystemDecorations.Full) { return new IntPtr(1); } @@ -1001,7 +1001,7 @@ namespace Avalonia.Win32 style |= WindowStyles.WS_OVERLAPPEDWINDOW; - if (!_decorated) + if (_decorated != SystemDecorations.Full) { style ^= (WindowStyles.WS_CAPTION | WindowStyles.WS_SYSMENU); } @@ -1011,6 +1011,10 @@ namespace Avalonia.Win32 style ^= (WindowStyles.WS_SIZEFRAME); } + MARGINS margins = new MARGINS(); + margins.cyBottomHeight = _decorated == SystemDecorations.BorderOnly ? 1 : 0; + UnmanagedMethods.DwmExtendFrameIntoClientArea(_hwnd, ref margins); + GetClientRect(_hwnd, out var oldClientRect); var oldClientRectOrigin = new UnmanagedMethods.POINT(); ClientToScreen(_hwnd, ref oldClientRectOrigin); @@ -1024,7 +1028,7 @@ namespace Avalonia.Win32 if (oldDecorated != _decorated) { var newRect = oldClientRect; - if (_decorated) + if (_decorated == SystemDecorations.Full) AdjustWindowRectEx(ref newRect, (uint)style, false, GetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE)); SetWindowPos(_hwnd, IntPtr.Zero, newRect.left, newRect.top, newRect.Width, newRect.Height, diff --git a/src/iOS/Avalonia.iOS/EmbeddableImpl.cs b/src/iOS/Avalonia.iOS/EmbeddableImpl.cs index 65a6c15971..838bf49846 100644 --- a/src/iOS/Avalonia.iOS/EmbeddableImpl.cs +++ b/src/iOS/Avalonia.iOS/EmbeddableImpl.cs @@ -20,7 +20,7 @@ namespace Avalonia.iOS return Disposable.Empty; } - public void SetSystemDecorations(bool enabled) + public void SetSystemDecorations(SystemDecorations enabled) { } From d44ad423a0b2fec410a3917dcfb27d2187e9c8b4 Mon Sep 17 00:00:00 2001 From: Nathan Garside Date: Mon, 10 Feb 2020 09:08:33 +0000 Subject: [PATCH 02/90] Use enum in macOS native --- native/Avalonia.Native/src/OSX/window.h | 6 ++ native/Avalonia.Native/src/OSX/window.mm | 100 +++++++++++++---------- 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index 3e626675d2..23e3c22db7 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -36,4 +36,10 @@ struct IWindowStateChanged virtual void WindowStateChanged () = 0; }; +typedef NS_ENUM(NSInteger, SystemDecorations) { + SystemDecorationsNone = 0, + SystemDecorationsBorderOnly = 1, + SystemDecorationsFull = 2, +}; + #endif /* window_h */ diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 317d03162b..4c70f661b7 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -410,7 +410,7 @@ class WindowImpl : public virtual WindowBaseImpl, public virtual IAvnWindow, pub { private: bool _canResize = true; - int _hasDecorations = 2; + SystemDecorations _hasDecorations = SystemDecorationsFull; CGRect _lastUndecoratedFrame; AvnWindowState _lastWindowState; @@ -475,23 +475,26 @@ private: bool IsZoomed () { - return _hasDecorations > 0 ? [Window isZoomed] : UndecoratedIsMaximized(); + return _hasDecorations != SystemDecorationsNone ? [Window isZoomed] : UndecoratedIsMaximized(); } void DoZoom() { - if (_hasDecorations > 0) + switch (_hasDecorations) { - [Window performZoom:Window]; - } - else - { - if (!UndecoratedIsMaximized()) - { - _lastUndecoratedFrame = [Window frame]; - } - - [Window zoom:Window]; + case SystemDecorationsNone: + if (!UndecoratedIsMaximized()) + { + _lastUndecoratedFrame = [Window frame]; + } + + [Window zoom:Window]; + break; + + case SystemDecorationsBorderOnly: + case SystemDecorationsFull: + [Window performZoom:Window]; + break; } } @@ -509,32 +512,31 @@ private: { @autoreleasepool { - _hasDecorations = value; + _hasDecorations = (SystemDecorations)value; UpdateStyle(); - - // full - if (_hasDecorations == 2) - { - [Window setHasShadow:YES]; - [Window setTitleVisibility:NSWindowTitleVisible]; - [Window setTitlebarAppearsTransparent:NO]; - [Window setTitle:_lastTitle]; - } - // border only - else if (_hasDecorations == 1) - { - [Window setHasShadow:YES]; - [Window setTitleVisibility:NSWindowTitleHidden]; - [Window setTitlebarAppearsTransparent:YES]; - } - // none - else + + switch (_hasDecorations) { - [Window setHasShadow:NO]; - [Window setTitleVisibility:NSWindowTitleHidden]; - [Window setTitlebarAppearsTransparent:YES]; + case SystemDecorationsNone: + [Window setHasShadow:NO]; + [Window setTitleVisibility:NSWindowTitleHidden]; + [Window setTitlebarAppearsTransparent:YES]; + break; + + case SystemDecorationsBorderOnly: + [Window setHasShadow:YES]; + [Window setTitleVisibility:NSWindowTitleHidden]; + [Window setTitlebarAppearsTransparent:YES]; + break; + + case SystemDecorationsFull: + [Window setHasShadow:YES]; + [Window setTitleVisibility:NSWindowTitleVisible]; + [Window setTitlebarAppearsTransparent:NO]; + [Window setTitle:_lastTitle]; + break; } - + return S_OK; } } @@ -666,12 +668,26 @@ protected: virtual NSWindowStyleMask GetStyle() override { unsigned long s = NSWindowStyleMaskBorderless; - if(_hasDecorations == 1) - s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskFullSizeContentView; - if(_hasDecorations == 2) - s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskBorderless; - if(_hasDecorations == 2 && _canResize) - s = s | NSWindowStyleMaskResizable; + + switch (_hasDecorations) + { + case SystemDecorationsNone: + break; + + case SystemDecorationsBorderOnly: + s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskFullSizeContentView; + break; + + case SystemDecorationsFull: + s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskBorderless; + if(_canResize) + { + s = s | NSWindowStyleMaskResizable; + } + + break; + } + return s; } }; From c0e337d61f1df5a8b53135b1179c449b3f6544dc Mon Sep 17 00:00:00 2001 From: Nathan Garside Date: Mon, 10 Feb 2020 09:44:20 +0000 Subject: [PATCH 03/90] Use enum in mac interop --- native/Avalonia.Native/inc/avalonia-native.h | 8 +++++++- native/Avalonia.Native/src/OSX/window.h | 6 ------ native/Avalonia.Native/src/OSX/window.mm | 4 ++-- src/Avalonia.Native/WindowImpl.cs | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index ce4a592d67..ee57f54e59 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -25,6 +25,12 @@ struct IAvnGlSurfaceRenderingSession; struct IAvnAppMenu; struct IAvnAppMenuItem; +enum SystemDecorations { + SystemDecorationsNone = 0, + SystemDecorationsBorderOnly = 1, + SystemDecorationsFull = 2, +}; + struct AvnSize { double Width, Height; @@ -236,7 +242,7 @@ AVNCOM(IAvnWindow, 04) : virtual IAvnWindowBase { virtual HRESULT ShowDialog (IAvnWindow* parent) = 0; virtual HRESULT SetCanResize(bool value) = 0; - virtual HRESULT SetHasDecorations(int value) = 0; + virtual HRESULT SetHasDecorations(SystemDecorations value) = 0; virtual HRESULT SetTitle (void* utf8Title) = 0; virtual HRESULT SetTitleBarColor (AvnColor color) = 0; virtual HRESULT SetWindowState(AvnWindowState state) = 0; diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index 23e3c22db7..3e626675d2 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -36,10 +36,4 @@ struct IWindowStateChanged virtual void WindowStateChanged () = 0; }; -typedef NS_ENUM(NSInteger, SystemDecorations) { - SystemDecorationsNone = 0, - SystemDecorationsBorderOnly = 1, - SystemDecorationsFull = 2, -}; - #endif /* window_h */ diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 4c70f661b7..2c03407732 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -508,11 +508,11 @@ private: } } - virtual HRESULT SetHasDecorations(int value) override + virtual HRESULT SetHasDecorations(SystemDecorations value) override { @autoreleasepool { - _hasDecorations = (SystemDecorations)value; + _hasDecorations = value; UpdateStyle(); switch (_hasDecorations) diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index a540b026fa..73ec81ce57 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -68,9 +68,9 @@ namespace Avalonia.Native _native.CanResize = value; } - public void SetSystemDecorations(SystemDecorations enabled) + public void SetSystemDecorations(Controls.SystemDecorations enabled) { - _native.HasDecorations = (int)enabled; + _native.HasDecorations = (Interop.SystemDecorations)enabled; } public void SetTitleBarColor (Avalonia.Media.Color color) From f564fd4ed9bf302f13c88d1a15ae7e2ff3f3b9e4 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 13 Feb 2020 12:40:57 +0100 Subject: [PATCH 04/90] Update readme.md --- readme.md | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/readme.md b/readme.md index 42b1e52205..40471b3b28 100644 --- a/readme.md +++ b/readme.md @@ -8,25 +8,21 @@ ## About -**Avalonia** is a WPF/UWP-inspired cross-platform XAML-based UI framework providing a flexible styling system and supporting a wide range of Operating Systems such as Windows (.NET Framework, .NET Core), Linux (via Xorg), macOS and with experimental support for Android and iOS. +**Avalonia** is a cross-platform XAML-based UI framework providing a flexible styling system and supporting a wide range of Operating Systems such as Windows (.NET Framework, .NET Core), Linux (via Xorg), macOS. -**Avalonia** is ready for **General-Purpose Desktop App Development**. However, there may be some bugs and [breaking changes](https://github.com/AvaloniaUI/Avalonia/wiki/Breaking-Changes) as we continue along into this project's development. To see the status of some of our features, please see our [Roadmap here](https://github.com/AvaloniaUI/Avalonia/issues/2239). +**Avalonia** is ready for **General-Purpose Desktop App Development**. However, there may be some bugs and breaking changes as we continue along into this project's development. -| Control catalog | Desktop platforms | Mobile platforms | -|---|---|---| -| | | | +To see the status of some of our features, please see our [Roadmap here](https://github.com/AvaloniaUI/Avalonia/issues/2239). -[Awesome Avalonia](https://github.com/AvaloniaCommunity/awesome-avalonia) is curated list of awesome Avalonia UI tools, libraries, projects and resources. +You can also see what [breaking changes](https://github.com/AvaloniaUI/Avalonia/issues/3538) we have planned and what our [past breaking changes](https://github.com/AvaloniaUI/Avalonia/wiki/Breaking-Changes) have been. -## Getting Started - -Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started. After installing it, open "New Project" dialog in Visual Studio, choose "Avalonia" in "Visual C#" section, select "Avalonia .NET Core Application" and press OK (screenshot). Now you can write code and markup that will work on multiple platforms! +[Awesome Avalonia](https://github.com/AvaloniaCommunity/awesome-avalonia) is community-curated list of awesome Avalonia UI tools, libraries, projects and resources. Go and see what people are building with Avalonia! -For those without Visual Studio, a starter guide for .NET Core CLI can be found [here](http://avaloniaui.net/docs/quickstart/create-new-project#net-core). +## Getting Started -If you need to develop Avalonia app with JetBrains Rider, go and *vote* on [this issue](https://youtrack.jetbrains.com/issue/RIDER-39247) in their tracker. JetBrains won't do things without their users telling them that they want the feature, so only **YOU** can make it happen. +The Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started, or you can use the .NET Core CLI. For a starer guide see our [documentation](http://avaloniaui.net/docs/quickstart/create-new-project). -Avalonia is delivered via NuGet package manager. You can find the packages here: [stable(ish)](https://www.nuget.org/packages/Avalonia/) +Avalonia is delivered via NuGet package manager. You can find the packages here: https://www.nuget.org/packages/Avalonia/ Use these commands in the Package Manager console to install Avalonia manually: ``` @@ -34,18 +30,17 @@ Install-Package Avalonia Install-Package Avalonia.Desktop ``` -## Bleeding Edge Builds +## JetBrains Rider -or use nightly build feeds as described here: -https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed +If you need to develop Avalonia app with JetBrains Rider, go and *vote* on [this issue](https://youtrack.jetbrains.com/issue/RIDER-39247) in their tracker. JetBrains won't do things without their users telling them that they want the feature, so only **YOU** can make it happen. -## Documentation +## Bleeding Edge Builds -You can take a look at the [getting started page](http://avaloniaui.net/docs/quickstart/) for an overview of how to get started but probably the best thing to do for now is to already know a little bit about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia). +We also have a [nightly build](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed) which tracks the current state of master. Although these packages are less stable than the release on NuGet.org, you'll get all the latest features and bugfixes right away and many of our users actually prefer this feed! -There's also a high-level [architecture document](http://avaloniaui.net/architecture/project-structure) that is currently a little bit out of date, and I've also started writing blog posts on Avalonia at http://grokys.github.io/. +## Documentation -Contributions for our docs are always welcome! +Documentation can be found on our website at http://avaloniaui.net/docs/. We also have a [tutorial](http://avaloniaui.net/docs/tutorial/) over there for newcomers. ## Building and Using @@ -60,14 +55,12 @@ Please read the [contribution guidelines](http://avaloniaui.net/contributing/con This project exists thanks to all the people who contribute. [[Contribute](http://avaloniaui.net/contributing/contributing)]. - ### Backers Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/Avalonia#backer)] - ### Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/Avalonia#sponsor)] From e5f0ac3dda380bf7a7058ed31df00a7e2383db3a Mon Sep 17 00:00:00 2001 From: Nathan Garside Date: Tue, 3 Mar 2020 22:23:13 +0000 Subject: [PATCH 05/90] Fix event binding for HasSystemDecorations property --- src/Avalonia.Controls/Window.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 853347bf41..b2bd52e8a2 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -153,9 +153,13 @@ namespace Avalonia.Controls BackgroundProperty.OverrideDefaultValue(typeof(Window), Brushes.White); TitleProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl?.SetTitle((string)e.NewValue)); HasSystemDecorationsProperty.Changed.AddClassHandler( - (s, e) => s.PlatformImpl?.SetSystemDecorations(((bool)e.NewValue) ? SystemDecorations.Full : SystemDecorations.None)); + (s, e) => s.SetValue(SystemDecorationsProperty, (bool)e.NewValue ? SystemDecorations.Full : SystemDecorations.None)); SystemDecorationsProperty.Changed.AddClassHandler( - (s, e) => s.PlatformImpl?.SetSystemDecorations((SystemDecorations)e.NewValue)); + (s, e) => + { + s.PlatformImpl?.SetSystemDecorations((SystemDecorations)e.NewValue); + s.SetValue(HasSystemDecorationsProperty, (SystemDecorations)e.NewValue != SystemDecorations.None); + }); ShowInTaskbarProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.ShowTaskbarIcon((bool)e.NewValue)); From 938fc79ca770f62d94df532f733f8fdb5eca7f82 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Thu, 5 Mar 2020 07:07:49 +0100 Subject: [PATCH 06/90] Add tests for the remaining break chars --- .../Avalonia.Skia.UnitTests/TextLayoutTests.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs b/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs index 435b34f836..702e2118f5 100644 --- a/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs +++ b/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs @@ -406,9 +406,13 @@ namespace Avalonia.Skia.UnitTests } [Theory] - [InlineData("abcde\r\n")] - [InlineData("abcde\n\r")] - public void Should_Break_With_BreakChar_Pair(string text) + [InlineData("abcde\r\n", 7)] // Carriage Return + Line Feed + [InlineData("abcde\n\r", 7)] // This isn't valid but we somehow have to support it. + [InlineData("abcde\u000A", 6)] // Line Feed + [InlineData("abcde\u000B", 6)] // Vertical Tab + [InlineData("abcde\u000C", 6)] // Form Feed + [InlineData("abcde\u000D", 6)] // Carriage Return + public void Should_Break_With_BreakChar(string text, int expectedLength) { using (Start()) { @@ -422,11 +426,14 @@ namespace Avalonia.Skia.UnitTests Assert.Equal(1, layout.TextLines[0].TextRuns.Count); - Assert.Equal(7, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters.Length); + Assert.Equal(expectedLength, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters.Length); Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[5]); - Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[6]); + if(expectedLength == 7) + { + Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[6]); + } } } From 6f96d464afc4fcb8116d845d7f3068d7e27b2ce0 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 20 Feb 2020 14:27:33 +0100 Subject: [PATCH 07/90] Pass ResourceChanged messages to child styles. Fixes #3590. --- src/Avalonia.Styling/StyledElement.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index 84df9d4b94..a3a5d7f53a 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -213,6 +213,7 @@ namespace Avalonia { _styles = new Styles(this); _styles.ResourcesChanged += ThisResourcesChanged; + NotifyResourcesChanged(new ResourcesChangedEventArgs()); } return _styles; From 7fb62b20fae4049d585cafd1a34d11530168f365 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 25 Feb 2020 16:21:34 +0100 Subject: [PATCH 08/90] Don't allow StyledElement.Styles to be set. It's not settable in Application and I can't see a reason it should be in `StyledElement`. Also add a `Styles` ctor that takes a parent. --- src/Avalonia.Styling/StyledElement.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index a3a5d7f53a..6b020dd1c0 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -209,11 +209,10 @@ namespace Avalonia { get { - if (_styles is null) + if (_styles == null) { _styles = new Styles(this); _styles.ResourcesChanged += ThisResourcesChanged; - NotifyResourcesChanged(new ResourcesChangedEventArgs()); } return _styles; From 6b902254bcc0c251d0c2255da2c1520ec04b63a5 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 26 Feb 2020 17:52:06 +0100 Subject: [PATCH 09/90] Refactored styling. - Don't use Rx in the styling system. Instead introduces `IStyleActivator` which is like an `IObservable`-lite in order to cut down on allocations. - #nullable enable on touched files --- src/Avalonia.Styling/StyledElement.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index 6b020dd1c0..0bd01d2634 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -207,9 +207,9 @@ namespace Avalonia /// public Styles Styles { - get + get { - if (_styles == null) + if (_styles is null) { _styles = new Styles(this); _styles.ResourcesChanged += ThisResourcesChanged; From 3dcaa174bfbf1eeac9bc393dba33a68cb0ddeb70 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 3 Mar 2020 09:27:06 +0100 Subject: [PATCH 10/90] Initial tests for add/remove styles. --- .../Avalonia.Styling.UnitTests/StyleTests.cs | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tests/Avalonia.Styling.UnitTests/StyleTests.cs b/tests/Avalonia.Styling.UnitTests/StyleTests.cs index 4c9b18c886..ef53e65aa6 100644 --- a/tests/Avalonia.Styling.UnitTests/StyleTests.cs +++ b/tests/Avalonia.Styling.UnitTests/StyleTests.cs @@ -244,6 +244,72 @@ namespace Avalonia.Styling.UnitTests Assert.Equal(new Thickness(0), border.BorderThickness); } + [Fact] + public void Style_Should_Be_Detached_From_Control_When_Removed() + { + using (UnitTestApplication.Start(TestServices.RealStyler)) + { + var border = new Border(); + var root = new TestRoot + { + Styles = + { + new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(4)), + } + } + }, + Child = border, + }; + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(4), border.BorderThickness); + + root.Styles.RemoveAt(0); + Assert.Equal(new Thickness(0), border.BorderThickness); + } + } + + [Fact] + public void Style_Should_Be_Atttached_To_Control_When_Added() + { + using (UnitTestApplication.Start(TestServices.RealStyler)) + { + var border = new Border(); + var root = new TestRoot + { + Styles = + { + new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(4)), + } + } + }, + Child = border, + }; + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(4), border.BorderThickness); + + root.Styles.Add(new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(6)), + } + }); + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(6), border.BorderThickness); + } + } + private class Class1 : Control { public static readonly StyledProperty FooProperty = From e9256a9e40027c721d5a6ff80bb2982c0e27fb0e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 3 Mar 2020 13:18:54 +0100 Subject: [PATCH 11/90] Initial implementation of add/remove styles. Only currently works on top-level `Styles` collections, not working in `Application.Styles`. --- src/Avalonia.Controls/Application.cs | 10 +- src/Avalonia.Layout/Layoutable.cs | 7 + src/Avalonia.Styling/StyledElement.cs | 102 ++++++++++++-- src/Avalonia.Styling/Styling/IStyleHost.cs | 16 +++ src/Avalonia.Styling/Styling/IStyleable.cs | 11 ++ src/Avalonia.Styling/Styling/Styles.cs | 130 ++++++++++++------ .../AvaloniaPropertyConverterTest.cs | 11 ++ 7 files changed, 236 insertions(+), 51 deletions(-) diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index d7b1aec0b7..c5d624da64 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Collections.Generic; using System.Reactive.Concurrency; using System.Threading; using Avalonia.Animation; @@ -214,6 +215,14 @@ namespace Avalonia Styles.TryGetResource(key, out value); } + void IStyleHost.StylesAdded(IReadOnlyList styles) + { + } + + void IStyleHost.StylesRemoved(IReadOnlyList styles) + { + } + /// /// Register's the services needed by Avalonia. /// @@ -286,6 +295,5 @@ namespace Avalonia get => _name; set => SetAndRaise(NameProperty, ref _name, value); } - } } diff --git a/src/Avalonia.Layout/Layoutable.cs b/src/Avalonia.Layout/Layoutable.cs index 9d0a5c57ee..5fbcb45d4b 100644 --- a/src/Avalonia.Layout/Layoutable.cs +++ b/src/Avalonia.Layout/Layoutable.cs @@ -507,6 +507,7 @@ namespace Avalonia.Layout { var margin = Margin; + ApplyStyling(); ApplyTemplate(); var constrained = LayoutHelper.ApplyLayoutConstraints( @@ -692,6 +693,12 @@ namespace Avalonia.Layout return finalSize; } + protected sealed override void InvalidateStyles() + { + base.InvalidateStyles(); + InvalidateMeasure(); + } + /// protected sealed override void OnVisualParentChanged(IVisual oldParent, IVisual newParent) { diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index 0bd01d2634..cee30efcf0 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -352,21 +352,34 @@ namespace Avalonia if (--_initCount == 0 && _logicalRoot != null) { - InitializeStylesIfNeeded(); - + ApplyStyling(); InitializeIfNeeded(); } } - private void InitializeStylesIfNeeded(bool force = false) + /// + /// Applies styling to the control if the control is initialized and styling is not + /// already applied. + /// + /// + /// A value indicating whether styling is now applied to the control. + /// + protected bool ApplyStyling() { - if (_initCount == 0 && (!_styled || force)) + if (_initCount == 0 && !_styled) { - ApplyStyling(); + AvaloniaLocator.Current.GetService()?.ApplyStyles(this); _styled = true; } + + return _styled; } + /// + /// Detaches all styles from the element and queues a restyle. + /// + protected virtual void InvalidateStyles() => DetachStyles(); + protected void InitializeIfNeeded() { if (_initCount == 0 && !IsInitialized) @@ -480,6 +493,20 @@ namespace Avalonia void IStyleable.DetachStyles() => DetachStyles(); + void IStyleable.DetachStyles(IReadOnlyList styles) => DetachStyles(styles); + + void IStyleable.InvalidateStyles() => InvalidateStyles(); + + void IStyleHost.StylesAdded(IReadOnlyList styles) + { + InvalidateStylesOnThisAndDescendents(); + } + + void IStyleHost.StylesRemoved(IReadOnlyList styles) + { + DetachStylesFromThisAndDescendents(styles); + } + protected virtual void LogicalChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) @@ -604,11 +631,6 @@ namespace Avalonia return null; } - private void ApplyStyling() - { - AvaloniaLocator.Current.GetService()?.ApplyStyles(this); - } - private static void ValidateLogicalChild(ILogical c) { if (c == null) @@ -635,7 +657,7 @@ namespace Avalonia { _logicalRoot = e.Root; - InitializeStylesIfNeeded(true); + ApplyStyling(); OnAttachedToLogicalTree(e); AttachedToLogicalTree?.Invoke(this, e); @@ -713,6 +735,64 @@ namespace Avalonia _appliedStyles.Clear(); } + + _styled = false; + } + + private void DetachStyles(IReadOnlyList styles) + { + styles = styles ?? throw new ArgumentNullException(nameof(styles)); + + if (_appliedStyles is null) + { + return; + } + + var count = styles.Count; + + for (var i = 0; i < count; ++i) + { + for (var j = _appliedStyles.Count - 1; j >= 0; --j) + { + var applied = _appliedStyles[j]; + + if (applied.Source == styles[i]) + { + applied.Dispose(); + _appliedStyles.RemoveAt(j); + } + } + } + } + + private void InvalidateStylesOnThisAndDescendents() + { + InvalidateStyles(); + + if (_logicalChildren is object) + { + var childCount = _logicalChildren.Count; + + for (var i = 0; i < childCount; ++i) + { + (_logicalChildren[i] as StyledElement)?.InvalidateStylesOnThisAndDescendents(); + } + } + } + + private void DetachStylesFromThisAndDescendents(IReadOnlyList styles) + { + DetachStyles(styles); + + if (_logicalChildren is object) + { + var childCount = _logicalChildren.Count; + + for (var i = 0; i < childCount; ++i) + { + (_logicalChildren[i] as StyledElement)?.DetachStylesFromThisAndDescendents(styles); + } + } } private void ClearLogicalParent(IEnumerable children) diff --git a/src/Avalonia.Styling/Styling/IStyleHost.cs b/src/Avalonia.Styling/Styling/IStyleHost.cs index fa722aeb41..73726f3056 100644 --- a/src/Avalonia.Styling/Styling/IStyleHost.cs +++ b/src/Avalonia.Styling/Styling/IStyleHost.cs @@ -2,6 +2,10 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System.Collections.Generic; + +#nullable enable + namespace Avalonia.Styling { /// @@ -27,5 +31,17 @@ namespace Avalonia.Styling /// Gets the parent style host element. /// IStyleHost StylingParent { get; } + + /// + /// Called when styles are added to . + /// + /// The added styles. + void StylesAdded(IReadOnlyList styles); + + /// + /// Called when styles are removed from . + /// + /// The removed styles. + void StylesRemoved(IReadOnlyList styles); } } diff --git a/src/Avalonia.Styling/Styling/IStyleable.cs b/src/Avalonia.Styling/Styling/IStyleable.cs index b01c779bcc..34687b070c 100644 --- a/src/Avalonia.Styling/Styling/IStyleable.cs +++ b/src/Avalonia.Styling/Styling/IStyleable.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Collections.Generic; using Avalonia.Collections; #nullable enable @@ -38,5 +39,15 @@ namespace Avalonia.Styling /// Detaches all styles applied to the element. /// void DetachStyles(); + + /// + /// Detaches a collection of styles, if applied to the element. + /// + void DetachStyles(IReadOnlyList styles); + + /// + /// Detaches all styles from the element and queues a restyle. + /// + void InvalidateStyles(); } } diff --git a/src/Avalonia.Styling/Styling/Styles.cs b/src/Avalonia.Styling/Styling/Styles.cs index 05cbba5ad2..edd729679d 100644 --- a/src/Avalonia.Styling/Styling/Styles.cs +++ b/src/Avalonia.Styling/Styling/Styles.cs @@ -27,40 +27,7 @@ namespace Avalonia.Styling public Styles() { _styles.ResetBehavior = ResetBehavior.Remove; - _styles.ForEachItem( - x => - { - if (x.ResourceParent == null && x is ISetResourceParent setParent) - { - setParent.SetParent(this); - setParent.ParentResourcesChanged(new ResourcesChangedEventArgs()); - } - - if (x.HasResources) - { - ResourcesChanged?.Invoke(this, new ResourcesChangedEventArgs()); - } - - x.ResourcesChanged += NotifyResourcesChanged; - _cache = null; - }, - x => - { - if (x.ResourceParent == this && x is ISetResourceParent setParent) - { - setParent.SetParent(null); - setParent.ParentResourcesChanged(new ResourcesChangedEventArgs()); - } - - if (x.HasResources) - { - ResourcesChanged?.Invoke(this, new ResourcesChangedEventArgs()); - } - - x.ResourcesChanged -= NotifyResourcesChanged; - _cache = null; - }, - () => { }); + _styles.CollectionChanged += OnCollectionChanged; } public Styles(IResourceNode parent) @@ -69,11 +36,7 @@ namespace Avalonia.Styling _parent = parent; } - public event NotifyCollectionChangedEventHandler CollectionChanged - { - add => _styles.CollectionChanged += value; - remove => _styles.CollectionChanged -= value; - } + public event NotifyCollectionChangedEventHandler? CollectionChanged; /// public event EventHandler? ResourcesChanged; @@ -257,6 +220,95 @@ namespace Avalonia.Styling NotifyResourcesChanged(e); } + private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + static IReadOnlyList ToReadOnlyList(IList list) + { + if (list is IReadOnlyList) + { + return (IReadOnlyList)list; + } + else + { + var result = new T[list.Count]; + list.CopyTo(result, 0); + return result; + } + } + + void Add(IList items) + { + for (var i = 0; i < items.Count; ++i) + { + var style = (IStyle)items[i]; + + if (style.ResourceParent == null && style is ISetResourceParent setParent) + { + setParent.SetParent(this); + setParent.ParentResourcesChanged(new ResourcesChangedEventArgs()); + } + + if (style.HasResources) + { + ResourcesChanged?.Invoke(this, new ResourcesChangedEventArgs()); + } + + style.ResourcesChanged += NotifyResourcesChanged; + _cache = null; + } + + if (_parent is IStyleHost host) + { + host.StylesAdded(ToReadOnlyList(items)); + } + } + + void Remove(IList items) + { + for (var i = 0; i < items.Count; ++i) + { + var style = (IStyle)items[i]; + + if (style.ResourceParent == this && style is ISetResourceParent setParent) + { + setParent.SetParent(null); + setParent.ParentResourcesChanged(new ResourcesChangedEventArgs()); + } + + if (style.HasResources) + { + ResourcesChanged?.Invoke(this, new ResourcesChangedEventArgs()); + } + + style.ResourcesChanged -= NotifyResourcesChanged; + _cache = null; + } + + if (_parent is IStyleHost host) + { + host.StylesRemoved(ToReadOnlyList(items)); + } + } + + switch (e.Action) + { + case NotifyCollectionChangedAction.Add: + Add(e.NewItems); + break; + case NotifyCollectionChangedAction.Remove: + Remove(e.OldItems); + break; + case NotifyCollectionChangedAction.Replace: + Remove(e.OldItems); + Add(e.NewItems); + break; + case NotifyCollectionChangedAction.Reset: + throw new InvalidOperationException("Reset should not be called on Styles."); + } + + CollectionChanged?.Invoke(this, e); + } + private void NotifyResourcesChanged(object sender, ResourcesChangedEventArgs e) { NotifyResourcesChanged(e); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs index ec9a6ba77f..d4953bf47e 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs @@ -9,6 +9,7 @@ using Avalonia.Styling; using Xunit; using System.ComponentModel; using Avalonia.Markup.Xaml.XamlIl.Runtime; +using System.Collections.Generic; namespace Avalonia.Markup.Xaml.UnitTests.Converters { @@ -144,6 +145,16 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters throw new NotImplementedException(); } + public void DetachStyles(IReadOnlyList styles) + { + throw new NotImplementedException(); + } + + public void InvalidateStyles() + { + throw new NotImplementedException(); + } + public void StyleApplied(IStyleInstance instance) { throw new NotImplementedException(); From 6db44298bb8f7670df0cee295c0164d470ca0833 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 5 Mar 2020 14:30:05 +0100 Subject: [PATCH 12/90] Handle adding/removing nested styles. --- src/Avalonia.Styling/StyledElement.cs | 40 +++++- src/Avalonia.Styling/Styling/IStyle.cs | 8 +- src/Avalonia.Styling/Styling/IStyleHost.cs | 4 +- src/Avalonia.Styling/Styling/Style.cs | 2 + src/Avalonia.Styling/Styling/Styles.cs | 29 +++-- .../Styling/StyleInclude.cs | 23 ++-- .../Avalonia.Styling.UnitTests/StyleTests.cs | 117 +++++++++++++++++- 7 files changed, 200 insertions(+), 23 deletions(-) diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index cee30efcf0..7b5cf4b7fa 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -504,7 +504,8 @@ namespace Avalonia void IStyleHost.StylesRemoved(IReadOnlyList styles) { - DetachStylesFromThisAndDescendents(styles); + var allStyles = RecurseStyles(styles); + DetachStylesFromThisAndDescendents(allStyles); } protected virtual void LogicalChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -830,5 +831,42 @@ namespace Avalonia { NotifyResourcesChanged(e); } + + private static IReadOnlyList RecurseStyles(IReadOnlyList styles) + { + var count = styles.Count; + List? result = null; + + for (var i = 0; i < count; ++i) + { + var style = styles[i]; + + if (style.Children.Count > 0) + { + if (result is null) + { + result = new List(styles); + } + + RecurseStyles(style.Children, result); + } + } + + return result ?? styles; + } + + private static void RecurseStyles(IReadOnlyList styles, List result) + { + var count = styles.Count; + + result.Capacity += count; + + for (var i = 0; i < count; ++i) + { + var style = styles[i]; + result.Add(style); + RecurseStyles(style.Children, result); + } + } } } diff --git a/src/Avalonia.Styling/Styling/IStyle.cs b/src/Avalonia.Styling/Styling/IStyle.cs index 8151aacf54..18866b0060 100644 --- a/src/Avalonia.Styling/Styling/IStyle.cs +++ b/src/Avalonia.Styling/Styling/IStyle.cs @@ -1,6 +1,7 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System.Collections.Generic; using Avalonia.Controls; #nullable enable @@ -13,7 +14,12 @@ namespace Avalonia.Styling public interface IStyle : IResourceNode { /// - /// Attaches the style to a control if the style's selector matches. + /// Gets a collection of child styles. + /// + IReadOnlyList Children { get; } + + /// + /// Attaches the style and any child styles to a control if the style's selector matches. /// /// The control to attach to. /// The element that hosts the style. diff --git a/src/Avalonia.Styling/Styling/IStyleHost.cs b/src/Avalonia.Styling/Styling/IStyleHost.cs index 73726f3056..182662b32e 100644 --- a/src/Avalonia.Styling/Styling/IStyleHost.cs +++ b/src/Avalonia.Styling/Styling/IStyleHost.cs @@ -33,13 +33,13 @@ namespace Avalonia.Styling IStyleHost StylingParent { get; } /// - /// Called when styles are added to . + /// Called when styles are added to or a nested styles collection. /// /// The added styles. void StylesAdded(IReadOnlyList styles); /// - /// Called when styles are removed from . + /// Called when styles are removed from or a nested styles collection. /// /// The removed styles. void StylesRemoved(IReadOnlyList styles); diff --git a/src/Avalonia.Styling/Styling/Style.cs b/src/Avalonia.Styling/Styling/Style.cs index 22adf573e8..2e0f564522 100644 --- a/src/Avalonia.Styling/Styling/Style.cs +++ b/src/Avalonia.Styling/Styling/Style.cs @@ -90,6 +90,8 @@ namespace Avalonia.Styling /// bool IResourceProvider.HasResources => _resources?.Count > 0; + IReadOnlyList IStyle.Children => Array.Empty(); + /// public SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host) { diff --git a/src/Avalonia.Styling/Styling/Styles.cs b/src/Avalonia.Styling/Styling/Styles.cs index edd729679d..c9278339b5 100644 --- a/src/Avalonia.Styling/Styling/Styles.cs +++ b/src/Avalonia.Styling/Styling/Styles.cs @@ -84,6 +84,8 @@ namespace Avalonia.Styling /// IStyle IReadOnlyList.this[int index] => _styles[index]; + IReadOnlyList IStyle.Children => this; + /// public IStyle this[int index] { @@ -257,10 +259,7 @@ namespace Avalonia.Styling _cache = null; } - if (_parent is IStyleHost host) - { - host.StylesAdded(ToReadOnlyList(items)); - } + GetHost()?.StylesAdded(ToReadOnlyList(items)); } void Remove(IList items) @@ -284,10 +283,7 @@ namespace Avalonia.Styling _cache = null; } - if (_parent is IStyleHost host) - { - host.StylesRemoved(ToReadOnlyList(items)); - } + GetHost()?.StylesRemoved(ToReadOnlyList(items)); } switch (e.Action) @@ -309,6 +305,23 @@ namespace Avalonia.Styling CollectionChanged?.Invoke(this, e); } + private IStyleHost? GetHost() + { + var node = _parent; + + while (node != null) + { + if (node is IStyleHost host) + { + return host; + } + + node = node.ResourceParent; + } + + return null; + } + private void NotifyResourcesChanged(object sender, ResourcesChangedEventArgs e) { NotifyResourcesChanged(e); diff --git a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs index e5e28b344f..46fc7c36da 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs @@ -6,6 +6,8 @@ using System; using Avalonia.Controls; using System.Collections.Generic; +#nullable enable + namespace Avalonia.Markup.Xaml.Styling { /// @@ -14,8 +16,8 @@ namespace Avalonia.Markup.Xaml.Styling public class StyleInclude : IStyle, ISetResourceParent { private Uri _baseUri; - private IStyle _loaded; - private IResourceNode _parent; + private IStyle[]? _loaded; + private IResourceNode? _parent; /// /// Initializes a new instance of the class. @@ -41,7 +43,7 @@ namespace Avalonia.Markup.Xaml.Styling /// /// Gets or sets the source URL. /// - public Uri Source { get; set; } + public Uri? Source { get; set; } /// /// Gets the loaded style. @@ -53,11 +55,12 @@ namespace Avalonia.Markup.Xaml.Styling if (_loaded == null) { var loader = new AvaloniaXamlLoader(); - _loaded = (IStyle)loader.Load(Source, _baseUri); - (_loaded as ISetResourceParent)?.SetParent(this); + var loaded = (IStyle)loader.Load(Source, _baseUri); + (loaded as ISetResourceParent)?.SetParent(this); + _loaded = new[] { loaded }; } - return _loaded; + return _loaded?[0]!; } } @@ -65,13 +68,15 @@ namespace Avalonia.Markup.Xaml.Styling bool IResourceProvider.HasResources => Loaded.HasResources; /// - IResourceNode IResourceNode.ResourceParent => _parent; + IResourceNode? IResourceNode.ResourceParent => _parent; + + IReadOnlyList IStyle.Children => _loaded ?? Array.Empty(); /// - public SelectorMatchResult TryAttach(IStyleable target, IStyleHost host) => Loaded.TryAttach(target, host); + public SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host) => Loaded.TryAttach(target, host); /// - public bool TryGetResource(object key, out object value) => Loaded.TryGetResource(key, out value); + public bool TryGetResource(object key, out object? value) => Loaded.TryGetResource(key, out value); /// void ISetResourceParent.ParentResourcesChanged(ResourcesChangedEventArgs e) diff --git a/tests/Avalonia.Styling.UnitTests/StyleTests.cs b/tests/Avalonia.Styling.UnitTests/StyleTests.cs index ef53e65aa6..619f72aab0 100644 --- a/tests/Avalonia.Styling.UnitTests/StyleTests.cs +++ b/tests/Avalonia.Styling.UnitTests/StyleTests.cs @@ -245,7 +245,7 @@ namespace Avalonia.Styling.UnitTests } [Fact] - public void Style_Should_Be_Detached_From_Control_When_Removed() + public void Removing_Style_Should_Detach_From_Control() { using (UnitTestApplication.Start(TestServices.RealStyler)) { @@ -274,7 +274,7 @@ namespace Avalonia.Styling.UnitTests } [Fact] - public void Style_Should_Be_Atttached_To_Control_When_Added() + public void Adding_Style_Should_Attach_To_Control() { using (UnitTestApplication.Start(TestServices.RealStyler)) { @@ -310,6 +310,119 @@ namespace Avalonia.Styling.UnitTests } } + [Fact] + public void Removing_Style_With_Nested_Style_Should_Detach_From_Control() + { + using (UnitTestApplication.Start(TestServices.RealStyler)) + { + var border = new Border(); + var root = new TestRoot + { + Styles = + { + new Styles + { + new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(4)), + } + } + } + }, + Child = border, + }; + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(4), border.BorderThickness); + + root.Styles.RemoveAt(0); + Assert.Equal(new Thickness(0), border.BorderThickness); + } + } + + [Fact] + public void Adding_Nested_Style_Should_Attach_To_Control() + { + using (UnitTestApplication.Start(TestServices.RealStyler)) + { + var border = new Border(); + var root = new TestRoot + { + Styles = + { + new Styles + { + new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(4)), + } + } + } + }, + Child = border, + }; + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(4), border.BorderThickness); + + ((Styles)root.Styles[0]).Add(new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(6)), + } + }); + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(6), border.BorderThickness); + } + } + + [Fact] + public void Removing_Nested_Style_Should_Detach_From_Control() + { + using (UnitTestApplication.Start(TestServices.RealStyler)) + { + var border = new Border(); + var root = new TestRoot + { + Styles = + { + new Styles + { + new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(4)), + } + }, + new Style(x => x.OfType()) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(6)), + } + }, + } + }, + Child = border, + }; + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(6), border.BorderThickness); + + ((Styles)root.Styles[0]).RemoveAt(1); + + root.Measure(Size.Infinity); + Assert.Equal(new Thickness(4), border.BorderThickness); + } + } + private class Class1 : Control { public static readonly StyledProperty FooProperty = From cfae69dfdc210cc6851e56f90801df22a9b9b298 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 20 Feb 2020 14:27:33 +0100 Subject: [PATCH 13/90] Pass ResourceChanged messages to child styles. Fixes #3590. --- src/Avalonia.Styling/StyledElement.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index 7b5cf4b7fa..385ce597b9 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -213,6 +213,7 @@ namespace Avalonia { _styles = new Styles(this); _styles.ResourcesChanged += ThisResourcesChanged; + NotifyResourcesChanged(new ResourcesChangedEventArgs()); } return _styles; From 119a975610b3bdf455a0febda5f907823592485d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 5 Mar 2020 18:11:33 +0100 Subject: [PATCH 14/90] Handle adding/removing application styles. --- src/Avalonia.Controls/Application.cs | 16 ++++++++ src/Avalonia.Controls/TopLevel.cs | 20 ++++++++-- src/Avalonia.Styling/Styling/IGlobalStyles.cs | 14 +++++++ .../TopLevelTests.cs | 39 +++++++++++++++++++ 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index c5d624da64..f8838e8cfb 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -46,6 +46,8 @@ namespace Avalonia private Styles _styles; private IResourceDictionary _resources; private bool _notifyingResourcesChanged; + private Action> _stylesAdded; + private Action> _stylesRemoved; /// /// Defines the property. @@ -202,6 +204,18 @@ namespace Avalonia /// public IApplicationLifetime ApplicationLifetime { get; set; } + event Action> IGlobalStyles.GlobalStylesAdded + { + add => _stylesAdded += value; + remove => _stylesAdded -= value; + } + + event Action> IGlobalStyles.GlobalStylesRemoved + { + add => _stylesRemoved += value; + remove => _stylesRemoved -= value; + } + /// /// Initializes the application by loading XAML etc. /// @@ -217,10 +231,12 @@ namespace Avalonia void IStyleHost.StylesAdded(IReadOnlyList styles) { + _stylesAdded?.Invoke(styles); } void IStyleHost.StylesRemoved(IReadOnlyList styles) { + _stylesRemoved?.Invoke(styles); } /// diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index cabadac7d6..f477379777 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -50,6 +50,7 @@ namespace Avalonia.Controls private readonly IAccessKeyHandler _accessKeyHandler; private readonly IKeyboardNavigationHandler _keyboardNavigationHandler; private readonly IPlatformRenderInterface _renderInterface; + private readonly IGlobalStyles _globalStyles; private Size _clientSize; private ILayoutManager _layoutManager; @@ -94,6 +95,7 @@ namespace Avalonia.Controls _inputManager = TryGetService(dependencyResolver); _keyboardNavigationHandler = TryGetService(dependencyResolver); _renderInterface = TryGetService(dependencyResolver); + _globalStyles = TryGetService(dependencyResolver); Renderer = impl.CreateRenderer(this); @@ -112,6 +114,13 @@ namespace Avalonia.Controls _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); + + if (_globalStyles is object) + { + _globalStyles.GlobalStylesAdded += ((IStyleHost)this).StylesAdded; + _globalStyles.GlobalStylesRemoved += ((IStyleHost)this).StylesRemoved; + } + styler?.ApplyStyles(this); ClientSize = impl.ClientSize; @@ -215,10 +224,7 @@ namespace Avalonia.Controls /// double IRenderRoot.RenderScaling => PlatformImpl?.Scaling ?? 1; - IStyleHost IStyleHost.StylingParent - { - get { return AvaloniaLocator.Current.GetService(); } - } + IStyleHost IStyleHost.StylingParent => _globalStyles; IRenderTarget IRenderRoot.CreateRenderTarget() => CreateRenderTarget(); @@ -267,6 +273,12 @@ namespace Avalonia.Controls /// protected virtual void HandleClosed() { + if (_globalStyles is object) + { + _globalStyles.GlobalStylesAdded -= ((IStyleHost)this).StylesAdded; + _globalStyles.GlobalStylesRemoved -= ((IStyleHost)this).StylesRemoved; + } + var logicalArgs = new LogicalTreeAttachmentEventArgs(this, this, null); ((ILogical)this).NotifyDetachedFromLogicalTree(logicalArgs); diff --git a/src/Avalonia.Styling/Styling/IGlobalStyles.cs b/src/Avalonia.Styling/Styling/IGlobalStyles.cs index 51393ef0b3..6152755a05 100644 --- a/src/Avalonia.Styling/Styling/IGlobalStyles.cs +++ b/src/Avalonia.Styling/Styling/IGlobalStyles.cs @@ -1,6 +1,11 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System; +using System.Collections.Generic; + +#nullable enable + namespace Avalonia.Styling { /// @@ -8,5 +13,14 @@ namespace Avalonia.Styling /// public interface IGlobalStyles : IStyleHost { + /// + /// Raised when styles are added to or a nested styles collection. + /// + public event Action> GlobalStylesAdded; + + /// + /// Raised when styles are removed from or a nested styles collection. + /// + public event Action> GlobalStylesRemoved; } } diff --git a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs index 91592b1ff7..26bf604187 100644 --- a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs @@ -9,6 +9,7 @@ using Avalonia.Input.Raw; using Avalonia.Layout; using Avalonia.LogicalTree; using Avalonia.Platform; +using Avalonia.Styling; using Avalonia.UnitTests; using Moq; using Xunit; @@ -269,6 +270,44 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void Reacts_To_Changes_In_Global_Styles() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var impl = new Mock(); + impl.SetupGet(x => x.Scaling).Returns(1); + + var child = new Border { Classes = { "foo" } }; + var target = new TestTopLevel(impl.Object) + { + Template = CreateTemplate(), + Content = child, + }; + + target.LayoutManager.ExecuteInitialLayoutPass(target); + + Assert.Equal(new Thickness(0), child.BorderThickness); + + var style = new Style(x => x.OfType().Class("foo")) + { + Setters = + { + new Setter(Border.BorderThicknessProperty, new Thickness(2)) + } + }; + + Application.Current.Styles.Add(style); + target.LayoutManager.ExecuteInitialLayoutPass(target); + + Assert.Equal(new Thickness(2), child.BorderThickness); + + Application.Current.Styles.Remove(style); + + Assert.Equal(new Thickness(0), child.BorderThickness); + } + } + private FuncControlTemplate CreateTemplate() { return new FuncControlTemplate((x, scope) => From a429159c3c32bca2b278763b02ebaede05148ab6 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Wed, 11 Mar 2020 17:20:52 -0400 Subject: [PATCH 15/90] Add SelectedText to TextBox --- src/Avalonia.Controls/TextBox.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index a438d7380b..943a73b427 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -275,6 +275,22 @@ namespace Avalonia.Controls } } + public string SelectedText + { + get { return GetSelection(); } + set + { + if (value == null) + { + return; + } + + _undoRedoHelper.Snapshot(); + HandleTextInput(value); + _undoRedoHelper.Snapshot(); + } + } + /// /// Gets or sets the horizontal alignment of the content within the control. /// From 47f487e768443813ea5e892bfa2e3ad8a6f0609a Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Wed, 11 Mar 2020 17:27:06 -0400 Subject: [PATCH 16/90] Add SelectedText unit tests --- .../TextBoxTests.cs | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 225eca17b2..14251454ea 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -385,6 +385,49 @@ namespace Avalonia.Controls.UnitTests Assert.True(target.SelectionEnd <= "123".Length); } } + + [Fact] + public void SelectedText_Changes_OnSelectionChange() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + Text = "0123456789" + }; + + Assert.True(target.SelectedText == ""); + + target.SelectionStart = 2; + target.SelectionEnd = 4; + + Assert.True(target.SelectedText == "23"); + } + } + + [Fact] + public void SelectedText_EditsText() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + Text = "0123" + }; + + target.SelectedText = "AA"; + Assert.True(target.Text == "AA0123"); + + target.SelectionStart = 1; + target.SelectionEnd = 3; + target.SelectedText = "BB"; + + Assert.True(target.Text == "ABB123"); + } + } + [Fact] public void CoerceCaretIndex_Doesnt_Cause_Exception_with_malformed_line_ending() { From 5d007606bad8a8d9509129f1b4f7e9d7d43aeadd Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Mar 2020 11:04:43 +0100 Subject: [PATCH 17/90] Rework HasSystemDecorations. Make it a direct property that is backed by `SystemDecorations`. Moved the changed handlers to `OnPropertyChanged`. --- src/Avalonia.Controls/Window.cs | 62 +++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 6154db9f8a..f4a3f05f03 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -2,19 +2,19 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.ComponentModel; +using System.Linq; using System.Reactive.Linq; using System.Threading.Tasks; using Avalonia.Controls.Platform; +using Avalonia.Data; using Avalonia.Input; +using Avalonia.Interactivity; using Avalonia.Layout; using Avalonia.Media; using Avalonia.Platform; using Avalonia.Styling; -using System.Collections.Generic; -using System.Linq; using JetBrains.Annotations; -using System.ComponentModel; -using Avalonia.Interactivity; namespace Avalonia.Controls { @@ -81,8 +81,11 @@ namespace Avalonia.Controls /// Enables or disables system window decorations (title bar, buttons, etc) /// [Obsolete("Use SystemDecorationsProperty instead")] - public static readonly StyledProperty HasSystemDecorationsProperty = - AvaloniaProperty.Register(nameof(HasSystemDecorations), true); + public static readonly DirectProperty HasSystemDecorationsProperty = + AvaloniaProperty.RegisterDirect( + nameof(HasSystemDecorations), + o => o.HasSystemDecorations, + (o, v) => o.HasSystemDecorations = v); /// /// Defines the property. @@ -152,15 +155,6 @@ namespace Avalonia.Controls { BackgroundProperty.OverrideDefaultValue(typeof(Window), Brushes.White); TitleProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl?.SetTitle((string)e.NewValue)); - HasSystemDecorationsProperty.Changed.AddClassHandler( - (s, e) => s.SetValue(SystemDecorationsProperty, (bool)e.NewValue ? SystemDecorations.Full : SystemDecorations.None)); - SystemDecorationsProperty.Changed.AddClassHandler( - (s, e) => - { - s.PlatformImpl?.SetSystemDecorations((SystemDecorations)e.NewValue); - s.SetValue(HasSystemDecorationsProperty, (SystemDecorations)e.NewValue != SystemDecorations.None); - }); - ShowInTaskbarProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.ShowTaskbarIcon((bool)e.NewValue)); IconProperty.Changed.AddClassHandler((s, e) => s.PlatformImpl?.SetIcon(((WindowIcon)e.NewValue)?.PlatformImpl)); @@ -169,7 +163,7 @@ namespace Avalonia.Controls WindowStateProperty.Changed.AddClassHandler( (w, e) => { if (w.PlatformImpl != null) w.PlatformImpl.WindowState = (WindowState)e.NewValue; }); - + MinWidthProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.SetMinMaxSize(new Size((double)e.NewValue, w.MinHeight), new Size(w.MaxWidth, w.MaxHeight))); MinHeightProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.SetMinMaxSize(new Size(w.MinWidth, (double)e.NewValue), new Size(w.MaxWidth, w.MaxHeight))); MaxWidthProperty.Changed.AddClassHandler((w, e) => w.PlatformImpl?.SetMinMaxSize(new Size(w.MinWidth, w.MinHeight), new Size((double)e.NewValue, w.MaxHeight))); @@ -224,12 +218,20 @@ namespace Avalonia.Controls /// /// Enables or disables system window decorations (title bar, buttons, etc) /// - /// [Obsolete("Use SystemDecorations instead")] public bool HasSystemDecorations { - get { return GetValue(HasSystemDecorationsProperty); } - set { SetValue(HasSystemDecorationsProperty, value); } + get => SystemDecorations == SystemDecorations.Full; + set + { + var oldValue = HasSystemDecorations; + + if (oldValue != value) + { + SystemDecorations = value ? SystemDecorations.Full : SystemDecorations.None; + RaisePropertyChanged(HasSystemDecorationsProperty, oldValue, value); + } + } } /// @@ -628,5 +630,27 @@ namespace Avalonia.Controls /// event needs to be raised. /// protected virtual void OnClosing(CancelEventArgs e) => Closing?.Invoke(this, e); + + protected override void OnPropertyChanged( + AvaloniaProperty property, + Optional oldValue, + BindingValue newValue, + BindingPriority priority) + { + if (property == SystemDecorationsProperty) + { + var typedNewValue = newValue.GetValueOrDefault(); + + PlatformImpl?.SetSystemDecorations(typedNewValue); + + var o = oldValue.GetValueOrDefault() == SystemDecorations.Full; + var n = typedNewValue == SystemDecorations.Full; + + if (o != n) + { + RaisePropertyChanged(HasSystemDecorationsProperty, o, n); + } + } + } } } From f98ee717f50c125176212f85b01d89c7fdf7c7fc Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Thu, 12 Mar 2020 10:32:45 -0400 Subject: [PATCH 18/90] Adjusted TextBox right-click behavior WPF does not allow dragging to change selection for right clicks Furthermore, it only changes the selection on mouse up of right click, not mouse down, and only if the user clicked outside the current selection. This commit adjusts TextBox selection behavior to work like WPF --- src/Avalonia.Controls/TextBox.cs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index a438d7380b..f9dd98634c 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -684,11 +684,12 @@ namespace Avalonia.Controls protected override void OnPointerPressed(PointerPressedEventArgs e) { var point = e.GetPosition(_presenter); - var index = CaretIndex = _presenter.GetCaretIndex(point); + var index = _presenter.GetCaretIndex(point); var text = Text; - if (text != null && e.MouseButton == MouseButton.Left) + if (text != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { + CaretIndex = index; switch (e.ClickCount) { case 1: @@ -714,7 +715,8 @@ namespace Avalonia.Controls protected override void OnPointerMoved(PointerEventArgs e) { - if (_presenter != null && e.Pointer.Captured == _presenter) + // selection should not change during pointer move if the user right clicks + if (_presenter != null && e.Pointer.Captured == _presenter && !e.GetCurrentPoint(this).Properties.IsRightButtonPressed) { var point = e.GetPosition(_presenter); @@ -727,6 +729,22 @@ namespace Avalonia.Controls { if (_presenter != null && e.Pointer.Captured == _presenter) { + if (e.InitialPressMouseButton == MouseButton.Right) + { + var point = e.GetPosition(_presenter); + var caretIndex = _presenter.GetCaretIndex(point); + + // see if mouse clicked inside current selection + // if it did not, we change the selection to where the user clicked + var firstSelection = Math.Min(SelectionStart, SelectionEnd); + var lastSelection = Math.Max(SelectionStart, SelectionEnd); + var didClickInSelection = SelectionStart != SelectionEnd && + caretIndex >= firstSelection && caretIndex <= lastSelection; + if (!didClickInSelection) + { + CaretIndex = SelectionEnd = SelectionStart = caretIndex; + } + } e.Pointer.Capture(null); } } From 1f18bd3e66e79f55fdaa9bc04479843e75d0cee7 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Thu, 12 Mar 2020 10:41:33 -0400 Subject: [PATCH 19/90] Only calculate caret index on pointer pressed if left mouse down --- src/Avalonia.Controls/TextBox.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index f9dd98634c..c4bfb5f1b1 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -683,13 +683,12 @@ namespace Avalonia.Controls protected override void OnPointerPressed(PointerPressedEventArgs e) { - var point = e.GetPosition(_presenter); - var index = _presenter.GetCaretIndex(point); var text = Text; if (text != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { - CaretIndex = index; + var point = e.GetPosition(_presenter); + var index = CaretIndex = _presenter.GetCaretIndex(point); switch (e.ClickCount) { case 1: From dc93d14a1b09a21ab457c6d8f47827fb76d9a320 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sun, 15 Mar 2020 20:17:11 +0100 Subject: [PATCH 20/90] Return IReadOnlyList from most of the AvaloniaPropertyRegistry calls so users are not forced into allocating enumerators. --- src/Avalonia.Base/AvaloniaObject.cs | 6 +- src/Avalonia.Base/AvaloniaPropertyRegistry.cs | 60 +++++++++++++++---- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 88b99cd99a..51062f1568 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -80,8 +80,12 @@ namespace Avalonia _inheritanceParent?.RemoveInheritanceChild(this); _inheritanceParent = value; - foreach (var property in AvaloniaPropertyRegistry.Instance.GetRegisteredInherited(GetType())) + var properties = AvaloniaPropertyRegistry.Instance.GetRegisteredInherited(GetType()); + var propertiesCount = properties.Count; + + for (var i = 0; i < propertiesCount; i++) { + var property = properties[i]; if (valuestore?.IsSet(property) == true) { // If local value set there can be no change. diff --git a/src/Avalonia.Base/AvaloniaPropertyRegistry.cs b/src/Avalonia.Base/AvaloniaPropertyRegistry.cs index 29ab10278b..11bd58d05c 100644 --- a/src/Avalonia.Base/AvaloniaPropertyRegistry.cs +++ b/src/Avalonia.Base/AvaloniaPropertyRegistry.cs @@ -3,9 +3,7 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; -using Avalonia.Data; namespace Avalonia { @@ -49,7 +47,7 @@ namespace Avalonia /// /// The type. /// A collection of definitions. - public IEnumerable GetRegistered(Type type) + public IReadOnlyList GetRegistered(Type type) { Contract.Requires(type != null); @@ -83,7 +81,7 @@ namespace Avalonia /// /// The type. /// A collection of definitions. - public IEnumerable GetRegisteredAttached(Type type) + public IReadOnlyList GetRegisteredAttached(Type type) { Contract.Requires(type != null); @@ -114,7 +112,7 @@ namespace Avalonia /// /// The type. /// A collection of definitions. - public IEnumerable GetRegisteredDirect(Type type) + public IReadOnlyList GetRegisteredDirect(Type type) { Contract.Requires(type != null); @@ -145,7 +143,7 @@ namespace Avalonia /// /// The type. /// A collection of definitions. - public IEnumerable GetRegisteredInherited(Type type) + public IReadOnlyList GetRegisteredInherited(Type type) { Contract.Requires(type != null); @@ -157,16 +155,27 @@ namespace Avalonia result = new List(); var visited = new HashSet(); - foreach (var property in GetRegistered(type)) + var registered = GetRegistered(type); + var registeredCount = registered.Count; + + for (var i = 0; i < registeredCount; i++) { + var property = registered[i]; + if (property.Inherits) { result.Add(property); visited.Add(property); } } - foreach (var property in GetRegisteredAttached(type)) + + var registeredAttached = GetRegisteredAttached(type); + var registeredAttachedCount = registeredAttached.Count; + + for (var i = 0; i < registeredAttachedCount; i++) { + var property = registeredAttached[i]; + if (property.Inherits) { if (!visited.Contains(property)) @@ -185,7 +194,7 @@ namespace Avalonia /// /// The object. /// A collection of definitions. - public IEnumerable GetRegistered(IAvaloniaObject o) + public IReadOnlyList GetRegistered(IAvaloniaObject o) { Contract.Requires(o != null); @@ -229,8 +238,13 @@ namespace Avalonia throw new InvalidOperationException("Attached properties not supported."); } - foreach (AvaloniaProperty x in GetRegistered(type)) + var registered = GetRegistered(type); + var registeredCount = registered.Count; + + for (var i = 0; i < registeredCount; i++) { + AvaloniaProperty x = registered[i]; + if (x.Name == name) { return x; @@ -276,8 +290,13 @@ namespace Avalonia return property; } - foreach (var p in GetRegisteredDirect(o.GetType())) + var registeredDirect = GetRegisteredDirect(o.GetType()); + var registeredDirectCount = registeredDirect.Count; + + for (var i = 0; i < registeredDirectCount; i++) { + var p = registeredDirect[i]; + if (p == property) { return (DirectPropertyBase)p; @@ -308,8 +327,23 @@ namespace Avalonia Contract.Requires(type != null); Contract.Requires(property != null); - return Instance.GetRegistered(type).Any(x => x == property) || - Instance.GetRegisteredAttached(type).Any(x => x == property); + static bool ContainsProperty(IReadOnlyList properties, AvaloniaProperty property) + { + var propertiesCount = properties.Count; + + for (var i = 0; i < propertiesCount; i++) + { + if (properties[i] == property) + { + return true; + } + } + + return false; + } + + return ContainsProperty(Instance.GetRegistered(type), property) || + ContainsProperty(Instance.GetRegisteredAttached(type), property); } /// From 0e03dab3fecbf312e81578b23ae64acb45dff62e Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sun, 15 Mar 2020 20:18:15 +0100 Subject: [PATCH 21/90] Remove dead code. --- src/Avalonia.Base/AvaloniaPropertyRegistry.cs | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/Avalonia.Base/AvaloniaPropertyRegistry.cs b/src/Avalonia.Base/AvaloniaPropertyRegistry.cs index 11bd58d05c..7d3d5492b6 100644 --- a/src/Avalonia.Base/AvaloniaPropertyRegistry.cs +++ b/src/Avalonia.Base/AvaloniaPropertyRegistry.cs @@ -26,8 +26,6 @@ namespace Avalonia new Dictionary>(); private readonly Dictionary> _directCache = new Dictionary>(); - private readonly Dictionary> _initializedCache = - new Dictionary>(); private readonly Dictionary> _inheritedCache = new Dictionary>(); @@ -408,7 +406,6 @@ namespace Avalonia } _registeredCache.Clear(); - _initializedCache.Clear(); _inheritedCache.Clear(); } @@ -445,32 +442,7 @@ namespace Avalonia } _attachedCache.Clear(); - _initializedCache.Clear(); _inheritedCache.Clear(); } - - private readonly struct PropertyInitializationData - { - public AvaloniaProperty Property { get; } - public object Value { get; } - public bool IsDirect { get; } - public IDirectPropertyAccessor DirectAccessor { get; } - - public PropertyInitializationData(AvaloniaProperty property, IDirectPropertyAccessor directAccessor) - { - Property = property; - Value = null; - IsDirect = true; - DirectAccessor = directAccessor; - } - - public PropertyInitializationData(AvaloniaProperty property, IStyledPropertyAccessor styledAccessor, Type type) - { - Property = property; - Value = styledAccessor.GetDefaultValue(type); - IsDirect = false; - DirectAccessor = null; - } - } } } From a8663cd1f349cb3525e464e4fb6e51ef4973604e Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Tue, 17 Mar 2020 12:27:05 -0400 Subject: [PATCH 22/90] Fix middle click being able to change selection --- src/Avalonia.Controls/TextBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index c4bfb5f1b1..cd5dff2c9a 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -715,7 +715,7 @@ namespace Avalonia.Controls protected override void OnPointerMoved(PointerEventArgs e) { // selection should not change during pointer move if the user right clicks - if (_presenter != null && e.Pointer.Captured == _presenter && !e.GetCurrentPoint(this).Properties.IsRightButtonPressed) + if (_presenter != null && e.Pointer.Captured == _presenter && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { var point = e.GetPosition(_presenter); From 4b13d3c04a8e108b03115b1127823089eda96506 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 17 Mar 2020 21:58:09 +0100 Subject: [PATCH 23/90] Add benchmarks for TextBox and Button. --- ...endarBenchmark.cs => ControlsBenchmark.cs} | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) rename tests/Avalonia.Benchmarks/Layout/{CalendarBenchmark.cs => ControlsBenchmark.cs} (64%) diff --git a/tests/Avalonia.Benchmarks/Layout/CalendarBenchmark.cs b/tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs similarity index 64% rename from tests/Avalonia.Benchmarks/Layout/CalendarBenchmark.cs rename to tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs index c55912d94d..de40c247e6 100644 --- a/tests/Avalonia.Benchmarks/Layout/CalendarBenchmark.cs +++ b/tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs @@ -7,12 +7,12 @@ using BenchmarkDotNet.Attributes; namespace Avalonia.Benchmarks.Layout { [MemoryDiagnoser] - public class CalendarBenchmark : IDisposable + public class ControlsBenchmark : IDisposable { private readonly IDisposable _app; private readonly TestRoot _root; - public CalendarBenchmark() + public ControlsBenchmark() { _app = UnitTestApplication.Start( TestServices.StyledWindow.With( @@ -38,6 +38,28 @@ namespace Avalonia.Benchmarks.Layout _root.LayoutManager.ExecuteLayoutPass(); } + [Benchmark] + [MethodImpl(MethodImplOptions.NoInlining)] + public void CreateButton() + { + var button = new Button(); + + _root.Child = button; + + _root.LayoutManager.ExecuteLayoutPass(); + } + + [Benchmark] + [MethodImpl(MethodImplOptions.NoInlining)] + public void CreateTextBox() + { + var textBox = new TextBox(); + + _root.Child = textBox; + + _root.LayoutManager.ExecuteLayoutPass(); + } + public void Dispose() { _app.Dispose(); From b3a8b39670c06bb25978e9c35555eaacc3952aad Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 17 Mar 2020 21:58:26 +0100 Subject: [PATCH 24/90] Remove extra allocations from Scrollbar constructor. --- src/Avalonia.Controls/Primitives/ScrollBar.cs | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index 4d3ae3c5b8..982c1cdbfc 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -2,8 +2,6 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; -using System.Reactive; -using System.Reactive.Linq; using Avalonia.Data; using Avalonia.Interactivity; using Avalonia.Input; @@ -57,6 +55,16 @@ namespace Avalonia.Controls.Primitives { Thumb.DragDeltaEvent.AddClassHandler((x, e) => x.OnThumbDragDelta(e), RoutingStrategies.Bubble); Thumb.DragCompletedEvent.AddClassHandler((x, e) => x.OnThumbDragComplete(e), RoutingStrategies.Bubble); + + static void AffectsIsVisible(AvaloniaProperty property) + { + property.Changed.AddClassHandler((x, e) => x.CalculateIsVisible()); + } + + AffectsIsVisible(MinimumProperty); + AffectsIsVisible(MaximumProperty); + AffectsIsVisible(ViewportSizeProperty); + AffectsIsVisible(VisibilityProperty); } /// @@ -64,13 +72,6 @@ namespace Avalonia.Controls.Primitives /// public ScrollBar() { - var isVisible = Observable.Merge( - this.GetObservable(MinimumProperty).Select(_ => Unit.Default), - this.GetObservable(MaximumProperty).Select(_ => Unit.Default), - this.GetObservable(ViewportSizeProperty).Select(_ => Unit.Default), - this.GetObservable(VisibilityProperty).Select(_ => Unit.Default)) - .Select(_ => CalculateIsVisible()); - this.Bind(IsVisibleProperty, isVisible, BindingPriority.Style); UpdatePseudoClasses(Orientation); } @@ -107,24 +108,18 @@ namespace Avalonia.Controls.Primitives /// /// Calculates whether the scrollbar should be visible. /// - /// The scrollbar's visibility. - private bool CalculateIsVisible() + private void CalculateIsVisible() { - switch (Visibility) + var isVisible = Visibility switch { - case ScrollBarVisibility.Visible: - return true; - - case ScrollBarVisibility.Disabled: - case ScrollBarVisibility.Hidden: - return false; - - case ScrollBarVisibility.Auto: - return double.IsNaN(ViewportSize) || Maximum > 0; - - default: - throw new InvalidOperationException("Invalid value for ScrollBar.Visibility."); - } + ScrollBarVisibility.Visible => true, + ScrollBarVisibility.Disabled => false, + ScrollBarVisibility.Hidden => false, + ScrollBarVisibility.Auto => (double.IsNaN(ViewportSize) || Maximum > 0), + _ => throw new InvalidOperationException("Invalid value for ScrollBar.Visibility.") + }; + + SetValue(IsVisibleProperty, isVisible, BindingPriority.Style); } protected override void OnKeyDown(KeyEventArgs e) From 6c29598071feb2b47925cce2c0a23d271d08e4fb Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Tue, 17 Mar 2020 17:12:08 -0400 Subject: [PATCH 25/90] Fix clicking TextBox border moving to end Twofold fix: 1) Cursor doesn't show IBeam when not in DockPanel 2) If you do click the border, it just focuses the text box -- it does not move the selection --- src/Avalonia.Controls/TextBox.cs | 3 ++- src/Avalonia.Themes.Default/TextBox.xaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 4acfb75cb9..52b6a3c041 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -701,7 +701,8 @@ namespace Avalonia.Controls { var text = Text; - if (text != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + var clickInfo = e.GetCurrentPoint(this); + if (text != null && clickInfo.Properties.IsLeftButtonPressed && !(clickInfo.Pointer?.Captured is Border)) { var point = e.GetPosition(_presenter); var index = CaretIndex = _presenter.GetCaretIndex(point); diff --git a/src/Avalonia.Themes.Default/TextBox.xaml b/src/Avalonia.Themes.Default/TextBox.xaml index 2c4cafde26..4fb3653e89 100644 --- a/src/Avalonia.Themes.Default/TextBox.xaml +++ b/src/Avalonia.Themes.Default/TextBox.xaml @@ -69,7 +69,7 @@ - + + + + + + +"; + var loader = new AvaloniaXamlLoader(); + var window = (Window)loader.Load(xaml); + var foo = window.FindControl("foo"); + var bar = window.FindControl("bar"); + var baz = window.FindControl("baz"); + + Assert.Equal(Brushes.Red, foo.Background); + Assert.Equal(Brushes.Red, bar.Background); + Assert.Null(baz.Background); + } + } + + [Fact] + public void Style_Can_Use_Or_Selector_2() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + + + + + + + + +"; + var loader = new AvaloniaXamlLoader(); + var window = (Window)loader.Load(xaml); + var border = window.FindControl("border"); + var canvas = window.FindControl("canvas"); + var listBox = window.FindControl("listBox"); + + Assert.Equal(Brushes.Red, border.Background); + Assert.Equal(Brushes.Red, canvas.Background); + Assert.Equal(Brushes.Red, listBox.Background); + } + } } } From 33d3a66c8621f60c8d6e2fb6bab03e00a253bf86 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 18 Mar 2020 11:21:40 +0100 Subject: [PATCH 27/90] Fix comma (or) style selector. - `Selector.Or`'s first parameter isn't a `Selector` - remove that check as I don't think it's needed anyway - Make sure last selector is added to `XamlIlOrSelectorNode` Fixes #2838 --- .../Transformers/AvaloniaXamlIlSelectorTransformer.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs index aac07f5b6e..96d78b5092 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs @@ -104,6 +104,11 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers } } + if (results != null && result != null) + { + results.Add(result); + } + return results ?? result; } @@ -158,9 +163,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers protected void EmitCall(XamlIlEmitContext context, IXamlIlEmitter codeGen, Func method) { var selectors = context.Configuration.TypeSystem.GetType("Avalonia.Styling.Selectors"); - var found = selectors.FindMethod(m => m.IsStatic && m.Parameters.Count > 0 && - m.Parameters[0].FullName == "Avalonia.Styling.Selector" - && method(m)); + var found = selectors.FindMethod(m => m.IsStatic && m.Parameters.Count > 0 && method(m)); codeGen.EmitCall(found); } } From bd571c3459eb179271f28d929312ac8467523a37 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 18 Mar 2020 12:42:57 +0100 Subject: [PATCH 28/90] Remove manual capacity management. --- src/Avalonia.Styling/StyledElement.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Avalonia.Styling/StyledElement.cs b/src/Avalonia.Styling/StyledElement.cs index 385ce597b9..241ca1d0ec 100644 --- a/src/Avalonia.Styling/StyledElement.cs +++ b/src/Avalonia.Styling/StyledElement.cs @@ -207,7 +207,7 @@ namespace Avalonia /// public Styles Styles { - get + get { if (_styles is null) { @@ -860,8 +860,6 @@ namespace Avalonia { var count = styles.Count; - result.Capacity += count; - for (var i = 0; i < count; ++i) { var style = styles[i]; From 30458c81c505f305f1520ae759d0b0a65a6f632b Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 19 Mar 2020 13:10:37 -0300 Subject: [PATCH 29/90] Fix OSX binding to WindowState. --- native/Avalonia.Native/src/OSX/window.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 2c03407732..2c1208a38d 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -426,6 +426,7 @@ private: ComPtr WindowEvents; WindowImpl(IAvnWindowEvents* events, IAvnGlContext* gl) : WindowBaseImpl(events, gl) { + _lastWindowState = Normal; WindowEvents = events; [Window setCanBecomeKeyAndMain]; [Window disableCursorRects]; @@ -439,7 +440,7 @@ private: [[Window parentWindow] removeChildWindow:Window]; WindowBaseImpl::Show(); - return SetWindowState(Normal); + return SetWindowState(_lastWindowState); } } From f7aa466803deed6f030ff86fd1bb265d8d904a9b Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Fri, 20 Mar 2020 21:58:46 +0100 Subject: [PATCH 30/90] Include last line when constraint is surpassed --- .../Media/TextFormatting/TextLayout.cs | 27 ++++----- .../TextLayoutTests.cs | 58 ++++++++++++++----- 2 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs index 3f0cf7c680..4b5568e71a 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs @@ -233,16 +233,16 @@ namespace Avalonia.Media.TextFormatting var textLine = TextFormatter.Current.FormatLine(textSource, 0, MaxWidth, _paragraphProperties); + UpdateBounds(textLine, ref left, ref right, ref bottom); + + textLines.Add(textLine); + if (!double.IsPositiveInfinity(MaxHeight) && bottom + textLine.LineMetrics.Size.Height > MaxHeight) { currentPosition = _text.Length; break; } - UpdateBounds(textLine, ref left, ref right, ref bottom); - - textLines.Add(textLine); - if (_paragraphProperties.TextTrimming != TextTrimming.None) { currentPosition += remainingLength; @@ -254,22 +254,15 @@ namespace Avalonia.Media.TextFormatting currentPosition += textLine.Text.Length; } + } - if (lineBreaker.Current.Required && currentPosition == _text.Length) - { - var emptyTextLine = CreateEmptyTextLine(currentPosition); - - if (!double.IsPositiveInfinity(MaxHeight) && bottom + emptyTextLine.LineMetrics.Size.Height > MaxHeight) - { - break; - } - - UpdateBounds(emptyTextLine, ref left, ref right, ref bottom); + if (lineBreaker.Current.Required && currentPosition == _text.Length) + { + var emptyTextLine = CreateEmptyTextLine(currentPosition); - textLines.Add(emptyTextLine); + UpdateBounds(emptyTextLine, ref left, ref right, ref bottom); - break; - } + textLines.Add(emptyTextLine); } Bounds = new Rect(left, 0, right, bottom); diff --git a/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs b/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs index 702e2118f5..15ad51ec47 100644 --- a/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs +++ b/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs @@ -29,10 +29,10 @@ namespace Avalonia.Skia.UnitTests var layout = new TextLayout( s_multiLineText, - Typeface.Default, + Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides : spans); + textStyleOverrides: spans); var textLine = layout.TextLines[0]; @@ -72,16 +72,16 @@ namespace Avalonia.Skia.UnitTests 12.0f, Brushes.Black.ToImmutable(), textWrapping: TextWrapping.Wrap, - maxWidth : 25); + maxWidth: 25); var actual = new TextLayout( s_multiLineText, Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textWrapping : TextWrapping.Wrap, - maxWidth : 25, - textStyleOverrides : spans); + textWrapping: TextWrapping.Wrap, + maxWidth: 25, + textStyleOverrides: spans); Assert.Equal(expected.TextLines.Count, actual.TextLines.Count); @@ -115,7 +115,7 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides : spans); + textStyleOverrides: spans); var textLine = layout.TextLines[0]; @@ -153,7 +153,7 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides : spans); + textStyleOverrides: spans); var textLine = layout.TextLines[0]; @@ -190,7 +190,7 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides : spans); + textStyleOverrides: spans); var textLine = layout.TextLines[0]; @@ -301,8 +301,8 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textWrapping : TextWrapping.Wrap, - maxWidth : 180, + textWrapping: TextWrapping.Wrap, + maxWidth: 180, textStyleOverrides: spans); Assert.Equal( @@ -332,8 +332,8 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - maxWidth : 200, - maxHeight : 125, + maxWidth: 200, + maxHeight: 125, textStyleOverrides: spans); Assert.Equal(foreground, layout.TextLines[0].TextRuns[1].Style.Foreground); @@ -430,7 +430,7 @@ namespace Avalonia.Skia.UnitTests Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[5]); - if(expectedLength == 7) + if (expectedLength == 7) { Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[6]); } @@ -480,12 +480,38 @@ namespace Avalonia.Skia.UnitTests } } + [InlineData("0123456789\r0123456789", 2)] + [InlineData("0123456789", 1)] + [Theory] + public void Should_Include_Last_Line_When_Constraint_Is_Surpassed(string text, int numberOfLines) + { + using (Start()) + { + var glyphTypeface = Typeface.Default.GlyphTypeface; + + var emHeight = glyphTypeface.DesignEmHeight; + + var lineHeight = (glyphTypeface.Descent - glyphTypeface.Ascent) * (12.0 / emHeight); + + var layout = new TextLayout( + text, + Typeface.Default, + 12, + Brushes.Black.ToImmutable(), + maxHeight: lineHeight * numberOfLines - lineHeight * 0.5); + + Assert.Equal(numberOfLines, layout.TextLines.Count); + + Assert.Equal(numberOfLines * lineHeight, layout.Bounds.Height); + } + } + public static IDisposable Start() { var disposable = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface - .With(renderInterface: new PlatformRenderInterface(null), + .With(renderInterface: new PlatformRenderInterface(null), textShaperImpl: new TextShaperImpl(), - fontManagerImpl : new CustomFontManagerImpl())); + fontManagerImpl: new CustomFontManagerImpl())); return disposable; } From 95f78bbd3f52e1991777bd9e84401dd5f11994b9 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Fri, 20 Mar 2020 22:00:06 +0100 Subject: [PATCH 31/90] Include last line when constraint is surpassed --- .../TextLayoutTests.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs b/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs index 15ad51ec47..1f89a5833c 100644 --- a/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs +++ b/tests/Avalonia.Skia.UnitTests/TextLayoutTests.cs @@ -29,10 +29,10 @@ namespace Avalonia.Skia.UnitTests var layout = new TextLayout( s_multiLineText, - Typeface.Default, + Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides: spans); + textStyleOverrides : spans); var textLine = layout.TextLines[0]; @@ -72,16 +72,16 @@ namespace Avalonia.Skia.UnitTests 12.0f, Brushes.Black.ToImmutable(), textWrapping: TextWrapping.Wrap, - maxWidth: 25); + maxWidth : 25); var actual = new TextLayout( s_multiLineText, Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textWrapping: TextWrapping.Wrap, - maxWidth: 25, - textStyleOverrides: spans); + textWrapping : TextWrapping.Wrap, + maxWidth : 25, + textStyleOverrides : spans); Assert.Equal(expected.TextLines.Count, actual.TextLines.Count); @@ -115,7 +115,7 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides: spans); + textStyleOverrides : spans); var textLine = layout.TextLines[0]; @@ -153,7 +153,7 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides: spans); + textStyleOverrides : spans); var textLine = layout.TextLines[0]; @@ -190,7 +190,7 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textStyleOverrides: spans); + textStyleOverrides : spans); var textLine = layout.TextLines[0]; @@ -301,8 +301,8 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - textWrapping: TextWrapping.Wrap, - maxWidth: 180, + textWrapping : TextWrapping.Wrap, + maxWidth : 180, textStyleOverrides: spans); Assert.Equal( @@ -332,8 +332,8 @@ namespace Avalonia.Skia.UnitTests Typeface.Default, 12.0f, Brushes.Black.ToImmutable(), - maxWidth: 200, - maxHeight: 125, + maxWidth : 200, + maxHeight : 125, textStyleOverrides: spans); Assert.Equal(foreground, layout.TextLines[0].TextRuns[1].Style.Foreground); @@ -430,7 +430,7 @@ namespace Avalonia.Skia.UnitTests Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[5]); - if (expectedLength == 7) + if(expectedLength == 7) { Assert.Equal(5, ((ShapedTextRun)layout.TextLines[0].TextRuns[0]).GlyphRun.GlyphClusters[6]); } @@ -509,9 +509,9 @@ namespace Avalonia.Skia.UnitTests public static IDisposable Start() { var disposable = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface - .With(renderInterface: new PlatformRenderInterface(null), + .With(renderInterface: new PlatformRenderInterface(null), textShaperImpl: new TextShaperImpl(), - fontManagerImpl: new CustomFontManagerImpl())); + fontManagerImpl : new CustomFontManagerImpl())); return disposable; } From 0ca4c77acc508f0300afb7a56e96c612a5f2e0d2 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Sun, 22 Mar 2020 20:01:00 +0100 Subject: [PATCH 32/90] Only calculate glyph advances for non fixed pitch fonts --- src/Avalonia.Controls/TextBlock.cs | 34 +++---- src/Avalonia.Visuals/Media/GlyphRun.cs | 46 +++++---- .../TextFormatting/SimpleTextFormatter.cs | 89 ++++++------------ src/Avalonia.Visuals/Utility/ReadOnlySlice.cs | 15 +++ .../Avalonia.Skia/PlatformRenderInterface.cs | 26 +++-- src/Skia/Avalonia.Skia/TextShaperImpl.cs | 72 ++++++++++---- .../Assets/NotoSans-Italic.ttf | Bin 0 -> 470472 bytes .../CustomFontManagerImpl.cs | 5 +- .../SimpleTextFormatterTests.cs | 66 ++++++++++++- 9 files changed, 223 insertions(+), 130 deletions(-) create mode 100644 tests/Avalonia.RenderTests/Assets/NotoSans-Italic.ttf diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index 0278360ba5..d5908a2a23 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -117,28 +117,18 @@ namespace Avalonia.Controls { ClipToBoundsProperty.OverrideDefaultValue(true); - AffectsRender( - BackgroundProperty, ForegroundProperty, FontSizeProperty, - FontWeightProperty, FontStyleProperty, TextWrappingProperty, - TextTrimmingProperty, TextAlignmentProperty, FontFamilyProperty, - TextDecorationsProperty, TextProperty, PaddingProperty); - - AffectsMeasure( - FontSizeProperty, FontWeightProperty, FontStyleProperty, - FontFamilyProperty, TextTrimmingProperty, TextProperty, - PaddingProperty); - - Observable.Merge( - TextProperty.Changed, - ForegroundProperty.Changed, - TextAlignmentProperty.Changed, - TextWrappingProperty.Changed, - TextTrimmingProperty.Changed, - FontSizeProperty.Changed, - FontStyleProperty.Changed, - FontWeightProperty.Changed, - FontFamilyProperty.Changed, - TextDecorationsProperty.Changed, + AffectsRender(BackgroundProperty, ForegroundProperty, + TextAlignmentProperty, TextDecorationsProperty); + + AffectsMeasure(FontSizeProperty, FontWeightProperty, + FontStyleProperty, TextWrappingProperty, FontFamilyProperty, + TextTrimmingProperty, TextProperty, PaddingProperty); + + Observable.Merge(TextProperty.Changed, ForegroundProperty.Changed, + TextAlignmentProperty.Changed, TextWrappingProperty.Changed, + TextTrimmingProperty.Changed, FontSizeProperty.Changed, + FontStyleProperty.Changed, FontWeightProperty.Changed, + FontFamilyProperty.Changed, TextDecorationsProperty.Changed, PaddingProperty.Changed ).AddClassHandler((x, _) => x.InvalidateTextLayout()); } diff --git a/src/Avalonia.Visuals/Media/GlyphRun.cs b/src/Avalonia.Visuals/Media/GlyphRun.cs index 9b10981fa7..1b54d187d3 100644 --- a/src/Avalonia.Visuals/Media/GlyphRun.cs +++ b/src/Avalonia.Visuals/Media/GlyphRun.cs @@ -274,27 +274,39 @@ namespace Avalonia.Media var currentX = 0.0; var index = 0; - for (; index < GlyphIndices.Length; index++) + if (GlyphTypeface.IsFixedPitch) { - double advance; + var glyph = GlyphIndices[index]; - if (GlyphAdvances.IsEmpty) - { - var glyph = GlyphIndices[index]; + var advance = GlyphTypeface.GetGlyphAdvance(glyph) * Scale; - advance = GlyphTypeface.GetGlyphAdvance(glyph) * Scale; - } - else + index = Math.Min(GlyphIndices.Length - 1, + (int)Math.Round(distance / advance, MidpointRounding.AwayFromZero)); + } + else + { + for (; index < GlyphIndices.Length; index++) { - advance = GlyphAdvances[index]; - } + double advance; - if (currentX + advance >= distance) - { - break; - } + if (GlyphAdvances.IsEmpty) + { + var glyph = GlyphIndices[index]; + + advance = GlyphTypeface.GetGlyphAdvance(glyph) * Scale; + } + else + { + advance = GlyphAdvances[index]; + } - currentX += advance; + if (currentX + advance >= distance) + { + break; + } + + currentX += advance; + } } var characterHit = FindNearestCharacterHit(GlyphClusters[index], out var width); @@ -473,9 +485,7 @@ namespace Avalonia.Media /// private Rect CalculateBounds() { - var scale = FontRenderingEmSize / GlyphTypeface.DesignEmHeight; - - var height = (GlyphTypeface.Descent - GlyphTypeface.Ascent + GlyphTypeface.LineGap) * scale; + var height = (GlyphTypeface.Descent - GlyphTypeface.Ascent + GlyphTypeface.LineGap) * Scale; var width = 0.0; diff --git a/src/Avalonia.Visuals/Media/TextFormatting/SimpleTextFormatter.cs b/src/Avalonia.Visuals/Media/TextFormatting/SimpleTextFormatter.cs index 30d513386e..f84e45d4c6 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/SimpleTextFormatter.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/SimpleTextFormatter.cs @@ -10,15 +10,7 @@ namespace Avalonia.Media.TextFormatting { private static readonly ReadOnlySlice s_ellipsis = new ReadOnlySlice(new[] { '\u2026' }); - /// - /// Formats a text line. - /// - /// The text source. - /// The first character index to start the text line from. - /// A value that specifies the width of the paragraph that the line fills. - /// A value that represents paragraph properties, - /// such as TextWrapping, TextAlignment, or TextStyle. - /// The formatted line. + /// public override TextLine FormatLine(ITextSource textSource, int firstTextSourceIndex, double paragraphWidth, TextParagraphProperties paragraphProperties) { @@ -61,17 +53,18 @@ namespace Avalonia.Media.TextFormatting /// private List FormatTextRuns(ITextSource textSource, int firstTextSourceIndex, out TextPointer textPointer) { - var start = firstTextSourceIndex; + var start = -1; + var length = 0; var textRuns = new List(); while (true) { - var textRun = textSource.GetTextRun(firstTextSourceIndex); + var textRun = textSource.GetTextRun(firstTextSourceIndex + length); - if (textRun.Text.IsEmpty) + if (start == -1) { - break; + start = textRun.Text.Start; } if (textRun is TextEndOfLine) @@ -79,29 +72,33 @@ namespace Avalonia.Media.TextFormatting break; } - if (!(textRun is TextCharacters)) + switch (textRun) { - throw new NotSupportedException("Run type not supported by the formatter."); - } + case TextCharacters textCharacters: - var runText = textRun.Text; + var runText = textCharacters.Text; - while (!runText.IsEmpty) - { - var shapableTextStyleRun = CreateShapableTextStyleRun(runText, textRun.Style); + while (!runText.IsEmpty) + { + var shapableTextStyleRun = CreateShapableTextStyleRun(runText, textRun.Style); - var shapedRun = new ShapedTextRun(runText.Take(shapableTextStyleRun.TextPointer.Length), - shapableTextStyleRun.Style); + var shapedRun = new ShapedTextRun(runText.Take(shapableTextStyleRun.TextPointer.Length), + shapableTextStyleRun.Style); - textRuns.Add(shapedRun); + textRuns.Add(shapedRun); - runText = runText.Skip(shapedRun.Text.Length); + runText = runText.Skip(shapedRun.Text.Length); + } + + break; + default: + throw new NotSupportedException("Run type not supported by the formatter."); } - firstTextSourceIndex += textRun.Text.Length; + length += textRun.Text.Length; } - textPointer = new TextPointer(start, firstTextSourceIndex - start); + textPointer = new TextPointer(start, length); return textRuns; } @@ -115,7 +112,7 @@ namespace Avalonia.Media.TextFormatting /// The text runs to perform the trimming on. /// The text that was used to construct the text runs. /// - private TextLine PerformTextTrimming(TextPointer text, IReadOnlyList textRuns, + private static TextLine PerformTextTrimming(TextPointer text, IReadOnlyList textRuns, double paragraphWidth, TextParagraphProperties paragraphProperties) { var textTrimming = paragraphProperties.TextTrimming; @@ -195,7 +192,7 @@ namespace Avalonia.Media.TextFormatting /// The text to analyze for break opportunities. /// /// - private TextLine PerformTextWrapping(TextPointer text, IReadOnlyList textRuns, + private static TextLine PerformTextWrapping(TextPointer text, IReadOnlyList textRuns, double paragraphWidth, TextParagraphProperties paragraphProperties) { var availableWidth = paragraphWidth; @@ -267,41 +264,13 @@ namespace Avalonia.Media.TextFormatting /// The text run. /// The available width. /// - private int MeasureText(ShapedTextRun textRun, double availableWidth) + private static int MeasureText(ShapedTextRun textRun, double availableWidth) { - if (textRun.GlyphRun.Bounds.Width < availableWidth) - { - return textRun.Text.Length; - } - - var measuredWidth = 0.0; - - var index = 0; - - for (; index < textRun.GlyphRun.GlyphAdvances.Length; index++) - { - var advance = textRun.GlyphRun.GlyphAdvances[index]; - - if (measuredWidth + advance > availableWidth) - { - index--; - break; - } - - measuredWidth += advance; - } - - if(index < 0) - { - return 0; - } - - var cluster = textRun.GlyphRun.GlyphClusters[index]; + var glyphRun = textRun.GlyphRun; - var characterHit = textRun.GlyphRun.FindNearestCharacterHit(cluster, out _); + var characterHit = glyphRun.GetCharacterHitFromDistance(availableWidth, out _); - return characterHit.FirstCharacterIndex - textRun.GlyphRun.Characters.Start + - (textRun.GlyphRun.IsLeftToRight ? characterHit.TrailingLength : 0); + return characterHit.FirstCharacterIndex + characterHit.TrailingLength - textRun.Text.Start; } /// diff --git a/src/Avalonia.Visuals/Utility/ReadOnlySlice.cs b/src/Avalonia.Visuals/Utility/ReadOnlySlice.cs index f0feb7958e..ca6117c5b5 100644 --- a/src/Avalonia.Visuals/Utility/ReadOnlySlice.cs +++ b/src/Avalonia.Visuals/Utility/ReadOnlySlice.cs @@ -69,6 +69,11 @@ namespace Avalonia.Utility /// A that contains the specified number of elements from the specified start. public ReadOnlySlice AsSlice(int start, int length) { + if (IsEmpty) + { + return this; + } + if (start < Start || start > End) { throw new ArgumentOutOfRangeException(nameof(start)); @@ -91,6 +96,11 @@ namespace Avalonia.Utility /// A that contains the specified number of elements from the start of this slice. public ReadOnlySlice Take(int length) { + if (IsEmpty) + { + return this; + } + if (length > Length) { throw new ArgumentOutOfRangeException(nameof(length)); @@ -106,6 +116,11 @@ namespace Avalonia.Utility /// A that contains the elements that occur after the specified index in this slice. public ReadOnlySlice Skip(int length) { + if (IsEmpty) + { + return this; + } + if (length > Length) { throw new ArgumentOutOfRangeException(nameof(length)); diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index 63b6cb70da..4adbc2844c 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -173,16 +173,26 @@ namespace Avalonia.Skia using (var textBlobBuilder = new SKTextBlobBuilder()) { + SKTextBlob textBlob; + + width = 0; + var scale = (float)(glyphRun.FontRenderingEmSize / glyphTypeface.DesignEmHeight); if (glyphRun.GlyphOffsets.IsEmpty) { - width = 0; + if (glyphTypeface.IsFixedPitch) + { + textBlobBuilder.AddRun(paint, 0, 0, glyphRun.GlyphIndices.Buffer.Span); - var buffer = textBlobBuilder.AllocateHorizontalRun(paint, count, 0); + textBlob = textBlobBuilder.Build(); - if (!glyphTypeface.IsFixedPitch) + width = glyphTypeface.GetGlyphAdvance(glyphRun.GlyphIndices[0]) * scale * glyphRun.GlyphIndices.Length; + } + else { + var buffer = textBlobBuilder.AllocateHorizontalRun(paint, count, 0); + var positions = buffer.GetPositionSpan(); for (var i = 0; i < count; i++) @@ -198,9 +208,11 @@ namespace Avalonia.Skia width += glyphRun.GlyphAdvances[i]; } } - } - buffer.SetGlyphs(glyphRun.GlyphIndices.Buffer.Span); + buffer.SetGlyphs(glyphRun.GlyphIndices.Buffer.Span); + + textBlob = textBlobBuilder.Build(); + } } else { @@ -229,9 +241,9 @@ namespace Avalonia.Skia buffer.SetGlyphs(glyphRun.GlyphIndices.Buffer.Span); width = currentX; - } - var textBlob = textBlobBuilder.Build(); + textBlob = textBlobBuilder.Build(); + } return new GlyphRunImpl(paint, textBlob); } diff --git a/src/Skia/Avalonia.Skia/TextShaperImpl.cs b/src/Skia/Avalonia.Skia/TextShaperImpl.cs index 32fe48fe49..7a0823a223 100644 --- a/src/Skia/Avalonia.Skia/TextShaperImpl.cs +++ b/src/Skia/Avalonia.Skia/TextShaperImpl.cs @@ -1,4 +1,5 @@ -using Avalonia.Media; +using System; +using Avalonia.Media; using Avalonia.Media.TextFormatting; using Avalonia.Media.TextFormatting.Unicode; using Avalonia.Platform; @@ -72,36 +73,32 @@ namespace Avalonia.Skia var textScale = textFormat.FontRenderingEmSize / scaleX; - var len = buffer.Length; + var bufferLength = buffer.Length; - var info = buffer.GetGlyphInfoSpan(); + var glyphInfos = buffer.GetGlyphInfoSpan(); - var pos = buffer.GetGlyphPositionSpan(); + var glyphPositions = buffer.GetGlyphPositionSpan(); - var glyphIndices = new ushort[len]; + var glyphIndices = new ushort[bufferLength]; - var clusters = new ushort[len]; + var clusters = new ushort[bufferLength]; - var glyphAdvances = new double[len]; + double[] glyphAdvances = null; - var glyphOffsets = new Vector[len]; + Vector[] glyphOffsets = null; - for (var i = 0; i < len; i++) + for (var i = 0; i < bufferLength; i++) { - glyphIndices[i] = (ushort)info[i].Codepoint; + glyphIndices[i] = (ushort)glyphInfos[i].Codepoint; - clusters[i] = (ushort)(text.Start + info[i].Cluster); + clusters[i] = (ushort)(text.Start + glyphInfos[i].Cluster); - var advanceX = pos[i].XAdvance * textScale; - // Depends on direction of layout - //var advanceY = pos[i].YAdvance * textScale; - - glyphAdvances[i] = advanceX; - - var offsetX = pos[i].XOffset * textScale; - var offsetY = pos[i].YOffset * textScale; + if (!glyphTypeface.IsFixedPitch) + { + SetAdvance(glyphPositions, i, textScale, ref glyphAdvances); + } - glyphOffsets[i] = new Vector(offsetX, offsetY); + SetOffset(glyphPositions, i, textScale, ref glyphOffsets); } return new GlyphRun(glyphTypeface, textFormat.FontRenderingEmSize, @@ -112,5 +109,40 @@ namespace Avalonia.Skia new ReadOnlySlice(clusters)); } } + + private static void SetOffset(ReadOnlySpan glyphPositions, int index, double textScale, + ref Vector[] offsetBuffer) + { + var position = glyphPositions[index]; + + if (position.XOffset == 0 && position.YOffset == 0) + { + return; + } + + if (offsetBuffer == null) + { + offsetBuffer = new Vector[glyphPositions.Length]; + } + + var offsetX = position.XOffset * textScale; + + var offsetY = position.YOffset * textScale; + + offsetBuffer[index] = new Vector(offsetX, offsetY); + } + + private static void SetAdvance(ReadOnlySpan glyphPositions, int index, double textScale, + ref double[] advanceBuffer) + { + if (advanceBuffer == null) + { + advanceBuffer = new double[glyphPositions.Length]; + } + + // Depends on direction of layout + // advanceBuffer[index] = buffer.GlyphPositions[index].YAdvance * textScale; + advanceBuffer[index] = glyphPositions[index].XAdvance * textScale; + } } } diff --git a/tests/Avalonia.RenderTests/Assets/NotoSans-Italic.ttf b/tests/Avalonia.RenderTests/Assets/NotoSans-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1639ad7d402a6df3c944da1688392c0d28f0f1e9 GIT binary patch literal 470472 zcmdpf3w%>W_W#V>=H|AE%{xugBuyV8VnswmiilVNc`fo15eth5hzQ6cVnsznM68I2 zh=_gv=Adbl|EUSNDE?Y5DJkFo%WMx9_Un*AzT* zR_|mXB6cCX6Rz%kLGzK0sV#-HPDd<*`t<2|#p<5EH-!1T4TvLp?4MXf*zWuAv8y&*^mc!v;9p-vm=;t)U@7&>|#ud$a;o~3hyN?jf zOGe&$;|-b9zHTM->yG00hEX>Zjj=s$ZzS~T

`heZ#1sPc&WQ!|z=}=zYfAdfT`~ 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

  • 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

    +|6nEzo_e6@b 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

    `2@K*efKJ4nsG2F9I_Jt=fL)#= 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

    U_5I^dp};LaleqZx6o;4!;y|v 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 RNQS5=vT>qjqt?3N{{h+YHRAvP literal 0 HcmV?d00001 diff --git a/tests/Avalonia.Skia.UnitTests/CustomFontManagerImpl.cs b/tests/Avalonia.Skia.UnitTests/CustomFontManagerImpl.cs index a53e2ab188..aef2423f8a 100644 --- a/tests/Avalonia.Skia.UnitTests/CustomFontManagerImpl.cs +++ b/tests/Avalonia.Skia.UnitTests/CustomFontManagerImpl.cs @@ -14,12 +14,14 @@ namespace Avalonia.Skia.UnitTests private readonly Typeface _defaultTypeface = new Typeface("resm:Avalonia.Skia.UnitTests.Assets?assembly=Avalonia.Skia.UnitTests#Noto Mono"); + private readonly Typeface _italicTypeface = + new Typeface("resm:Avalonia.Skia.UnitTests.Assets?assembly=Avalonia.Skia.UnitTests#Noto Sans"); private readonly Typeface _emojiTypeface = new Typeface("resm:Avalonia.Skia.UnitTests.Assets?assembly=Avalonia.Skia.UnitTests#Twitter Color Emoji"); public CustomFontManagerImpl() { - _customTypefaces = new[] { _emojiTypeface, _defaultTypeface }; + _customTypefaces = new[] { _emojiTypeface, _italicTypeface, _defaultTypeface }; } public string GetDefaultFontFamilyName() @@ -56,6 +58,7 @@ namespace Avalonia.Skia.UnitTests switch (typeface.FontFamily.Name) { case "Twitter Color Emoji": + case "Noto Sans": case "Noto Mono": var typefaceCollection = SKTypefaceCollectionCache.GetOrAddTypefaceCollection(typeface.FontFamily); var skTypeface = typefaceCollection.Get(typeface); diff --git a/tests/Avalonia.Skia.UnitTests/SimpleTextFormatterTests.cs b/tests/Avalonia.Skia.UnitTests/SimpleTextFormatterTests.cs index f424027910..8e695a11c8 100644 --- a/tests/Avalonia.Skia.UnitTests/SimpleTextFormatterTests.cs +++ b/tests/Avalonia.Skia.UnitTests/SimpleTextFormatterTests.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using Avalonia.Media; using Avalonia.Media.TextFormatting; +using Avalonia.Media.TextFormatting.Unicode; using Avalonia.UnitTests; using Avalonia.Utility; using Xunit; @@ -240,7 +242,9 @@ namespace Avalonia.Skia.UnitTests { var cluster = glyphRun.GlyphClusters[i]; - var advance = glyphRun.GlyphAdvances[i]; + var glyph = glyphRun.GlyphIndices[i]; + + var advance = glyphRun.GlyphTypeface.GetGlyphAdvance(glyph) * glyphRun.Scale; var distance = textLine.GetDistanceFromCharacterHit(new CharacterHit(cluster)); @@ -280,7 +284,9 @@ namespace Avalonia.Skia.UnitTests { var cluster = glyphRun.GlyphClusters[i]; - var advance = glyphRun.GlyphAdvances[i]; + var glyph = glyphRun.GlyphIndices[i]; + + var advance = glyphRun.GlyphTypeface.GetGlyphAdvance(glyph) * glyphRun.Scale; characterHit = textLine.GetCharacterHitFromDistance(currentDistance); @@ -296,6 +302,62 @@ namespace Avalonia.Skia.UnitTests } } + [InlineData("Whether to turn off HTTPS. This option only applies if Individual, " + + "IndividualB2C, SingleOrg, or MultiOrg aren't used for ‑‑auth." + , "Noto Sans", 40)] + [InlineData("01234 56789 01234 56789", "Noto Mono", 7)] + [Theory] + public void Should_Wrap_Text(string text, string familyName, int numberOfCharactersPerLine) + { + using (Start()) + { + var lineBreaker = new LineBreakEnumerator(text.AsMemory()); + + var expected = new List(); + + while (lineBreaker.MoveNext()) + { + expected.Add(lineBreaker.Current.PositionWrap - 1); + } + + var typeface = new Typeface("resm:Avalonia.Skia.UnitTests.Assets?assembly=Avalonia.Skia.UnitTests#" + + familyName); + + var defaultStyle = new TextStyle(typeface); + + var textSource = new SimpleTextSource(text, defaultStyle); + + var formatter = new SimpleTextFormatter(); + + var glyph = typeface.GlyphTypeface.GetGlyph('a'); + + var advance = typeface.GlyphTypeface.GetGlyphAdvance(glyph) * + (12.0 / typeface.GlyphTypeface.DesignEmHeight); + + var paragraphWidth = advance * numberOfCharactersPerLine; + + var currentPosition = 0; + + while (currentPosition < text.Length) + { + var textLine = + formatter.FormatLine(textSource, currentPosition, paragraphWidth, + new TextParagraphProperties(defaultStyle, textWrapping: TextWrapping.Wrap)); + + Assert.True(expected.Contains(textLine.Text.End)); + + var index = expected.IndexOf(textLine.Text.End); + + for (var i = 0; i <= index; i++) + { + expected.RemoveAt(0); + } + + currentPosition += textLine.Text.Length; + } + } + } + public static IDisposable Start() { var disposable = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface From 7f0c502c296e5936385a36dd99e3e97ad0cb5ea4 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 23 Mar 2020 12:51:26 +0200 Subject: [PATCH 33/90] add simple unit test for multibinding --- .../AvaloniaObjectTests_MultiBinding.cs | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs new file mode 100644 index 0000000000..30693e2cb3 --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs @@ -0,0 +1,59 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Reactive.Linq; +using System.Reactive.Subjects; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Xunit; + +namespace Avalonia.Base.UnitTests +{ + public class AvaloniaObjectTests_MultiBinding + { + [Fact] + public void Should_Update() + { + var target = new Class1(); + + var b = new Subject(); + + var mb = new MultiBinding() + { + Converter = StringJoinConverter, + Bindings = new[] + { + b.ToBinding() + } + }; + target.Bind(Class1.FooProperty, mb); + + Assert.Equal(null, target.Foo); + + b.OnNext("Foo"); + + Assert.Equal("Foo", target.Foo); + + b.OnNext("Bar"); + + Assert.Equal("Bar", target.Foo); + } + + private static IMultiValueConverter StringJoinConverter = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); + + private class Class1 : AvaloniaObject + { + public static readonly StyledProperty FooProperty = + AvaloniaProperty.Register("Foo"); + + public string Foo + { + get => GetValue(FooProperty); + set => SetValue(FooProperty, value); + } + } + } +} From 613ba3ffd2e207220aa56ab4bd2006210a63119c Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 23 Mar 2020 12:52:09 +0200 Subject: [PATCH 34/90] add another test for multibinding --- .../AvaloniaObjectTests_MultiBinding.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs index 30693e2cb3..19ffb014d4 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs @@ -42,6 +42,35 @@ namespace Avalonia.Base.UnitTests Assert.Equal("Bar", target.Foo); } + [Fact] + public void Should_Update_With_Multiple_Bindings() + { + var target = new Class1(); + + var bindings = Enumerable.Range(0, 3).Select(i => new BehaviorSubject("Empty")).ToArray(); + + var mb = new MultiBinding() + { + Converter = StringJoinConverter, + Bindings = bindings.Select(b => b.ToBinding()).ToArray() + }; + target.Bind(Class1.FooProperty, mb); + + Assert.Equal("Empty,Empty,Empty", target.Foo); + + bindings[0].OnNext("Foo"); + + Assert.Equal("Foo,Empty,Empty", target.Foo); + + bindings[1].OnNext("Bar"); + + Assert.Equal("Foo,Bar,Empty", target.Foo); + + bindings[2].OnNext("Baz"); + + Assert.Equal("Foo,Bar,Baz", target.Foo); + } + private static IMultiValueConverter StringJoinConverter = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); private class Class1 : AvaloniaObject From 50deb04e7ab060e42c078a51c30e5b529019dbb9 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 23 Mar 2020 12:56:25 +0200 Subject: [PATCH 35/90] add failing unit test for #3692 --- .../AvaloniaObjectTests_MultiBinding.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs index 19ffb014d4..8560966fb7 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs @@ -71,6 +71,34 @@ namespace Avalonia.Base.UnitTests Assert.Equal("Foo,Bar,Baz", target.Foo); } + [Fact] + public void Should_Update_When_Null_Value_In_Bindings() + { + var target = new Class1(); + + var b = new Subject(); + + var mb = new MultiBinding() + { + Converter = StringJoinConverter, + Bindings = new[] + { + b.ToBinding() + } + }; + target.Bind(Class1.FooProperty, mb); + + Assert.Equal(null, target.Foo); + + b.OnNext("Foo"); + + Assert.Equal("Foo", target.Foo); + + b.OnNext(null); + + Assert.Equal("", target.Foo); + } + private static IMultiValueConverter StringJoinConverter = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); private class Class1 : AvaloniaObject From ec92b90e81601a040fd9d25d0b70d5aebeb49e7c Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 23 Mar 2020 12:57:27 +0200 Subject: [PATCH 36/90] add a test for multibinding with StringFormat --- .../AvaloniaObjectTests_MultiBinding.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs index 8560966fb7..ab413dd550 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs @@ -99,6 +99,30 @@ namespace Avalonia.Base.UnitTests Assert.Equal("", target.Foo); } + [Fact] + public void Should_Update_When_Null_Value_In_Bindings_With_StringFormat() + { + var target = new Class1(); + + var b = new Subject(); + + var mb = new MultiBinding() + { + StringFormat = "Converted: {0}", + Bindings = new[] + { + b.ToBinding() + } + }; + target.Bind(Class1.FooProperty, mb); + + Assert.Equal(null, target.Foo); + b.OnNext("Foo"); + Assert.Equal("Converted: Foo", target.Foo); + b.OnNext(null); + Assert.Equal("Converted: ", target.Foo); + } + private static IMultiValueConverter StringJoinConverter = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); private class Class1 : AvaloniaObject From 3dc5b8bda19f1031e95760f4964098e4b01c5f64 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 23 Mar 2020 12:59:30 +0200 Subject: [PATCH 37/90] add failing test for the core reason of the issue #3692 --- .../AvaloniaObjectTests_MultiBinding.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs index ab413dd550..757160a0a4 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs @@ -123,6 +123,44 @@ namespace Avalonia.Base.UnitTests Assert.Equal("Converted: ", target.Foo); } + [Fact] + public void MultiValueConverter_Should_Not_Skip_Valid_Null_ReferenceType_Value() + { + var target = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); + + object value = target.Convert(new[] { "Foo", "Bar", "Baz" }, typeof(string), null, CultureInfo.InvariantCulture); + + Assert.Equal("Foo,Bar,Baz", value); + + value = target.Convert(new[] { null, "Bar", "Baz" }, typeof(string), null, CultureInfo.InvariantCulture); + + Assert.Equal(",Bar,Baz", value); + } + + [Fact] + public void MultiValueConverter_Should_Not_Skip_Valid_Default_ValueType_Value() + { + var target = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); + + IList create(string[] values) => + values.Select(v => (object)(v != null ? new StringValueTypeWrapper() { Value = v } : default)).ToList(); + + object value = target.Convert(create(new[] { "Foo", "Bar", "Baz" }), typeof(string), null, CultureInfo.InvariantCulture); + + Assert.Equal("Foo,Bar,Baz", value); + + value = target.Convert(create(new[] { null, "Bar", "Baz" }), typeof(string), null, CultureInfo.InvariantCulture); + + Assert.Equal(",Bar,Baz", value); + } + + private struct StringValueTypeWrapper + { + public string Value; + + public override string ToString() => Value; + } + private static IMultiValueConverter StringJoinConverter = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); private class Class1 : AvaloniaObject From 6e54db32e94d1166fa74b0391eafe1ddd6a49d9b Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 23 Mar 2020 13:22:58 +0200 Subject: [PATCH 38/90] fix #3692 --- .../Data/Converters/FuncMultiValueConverter.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs b/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs index 6e1c4cb0e3..887641b5c3 100644 --- a/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs +++ b/src/Avalonia.Base/Data/Converters/FuncMultiValueConverter.cs @@ -30,7 +30,23 @@ namespace Avalonia.Data.Converters /// public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) { - var converted = values.OfType().ToList(); + //standard OfType skip null values, even they are valid for the Type + static IEnumerable OfTypeWithDefaultSupport(IList list) + { + foreach (object obj in list) + { + if (obj is TIn result) + { + yield return result; + } + else if (Equals(obj, default(TIn))) + { + yield return default(TIn); + } + } + } + + var converted = OfTypeWithDefaultSupport(values).ToList(); if (converted.Count == values.Count) { From 6b84fc2ad552403a8c10346a1e6a62e918fb14e4 Mon Sep 17 00:00:00 2001 From: Jumar Macato Date: Thu, 26 Mar 2020 22:16:29 +0800 Subject: [PATCH 39/90] Don't constrain header's ContentPresenter on TreeViewItem --- src/Avalonia.Themes.Default/TreeViewItem.xaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Avalonia.Themes.Default/TreeViewItem.xaml b/src/Avalonia.Themes.Default/TreeViewItem.xaml index 0d826806d0..a3f8d8b7f7 100644 --- a/src/Avalonia.Themes.Default/TreeViewItem.xaml +++ b/src/Avalonia.Themes.Default/TreeViewItem.xaml @@ -17,8 +17,7 @@ BorderThickness="{TemplateBinding BorderThickness}" TemplatedControl.IsTemplateFocusTarget="True"> Date: Fri, 27 Mar 2020 15:20:42 +0100 Subject: [PATCH 40/90] Get rid of class handler in favor of OnPropertyChanged. --- src/Avalonia.Controls/Primitives/ScrollBar.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index 982c1cdbfc..161c7121c5 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -55,16 +55,6 @@ namespace Avalonia.Controls.Primitives { Thumb.DragDeltaEvent.AddClassHandler((x, e) => x.OnThumbDragDelta(e), RoutingStrategies.Bubble); Thumb.DragCompletedEvent.AddClassHandler((x, e) => x.OnThumbDragComplete(e), RoutingStrategies.Bubble); - - static void AffectsIsVisible(AvaloniaProperty property) - { - property.Changed.AddClassHandler((x, e) => x.CalculateIsVisible()); - } - - AffectsIsVisible(MinimumProperty); - AffectsIsVisible(MaximumProperty); - AffectsIsVisible(ViewportSizeProperty); - AffectsIsVisible(VisibilityProperty); } /// @@ -106,9 +96,9 @@ namespace Avalonia.Controls.Primitives public event EventHandler Scroll; /// - /// Calculates whether the scrollbar should be visible. + /// Calculates and updates whether the scrollbar should be visible. /// - private void CalculateIsVisible() + private void UpdateIsVisible() { var isVisible = Visibility switch { @@ -148,6 +138,16 @@ namespace Avalonia.Controls.Primitives { UpdatePseudoClasses(newValue.GetValueOrDefault()); } + else + { + if (property == MinimumProperty || + property == MaximumProperty || + property == ViewportSizeProperty || + property == VisibilityProperty) + { + UpdateIsVisible(); + } + } } protected override void OnTemplateApplied(TemplateAppliedEventArgs e) From 96bd813fe449f0079792441e05e471d1d5c87042 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 27 Mar 2020 17:44:21 +0300 Subject: [PATCH 41/90] [X11] When not mapped change _NET_WM_STATE property directly See https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm46175134492192 --- src/Avalonia.X11/X11Window.cs | 46 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 2492f5a43a..8419e7dab2 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -546,14 +546,14 @@ namespace Avalonia.X11 } else if (value == WindowState.Maximized) { - SendNetWMMessage(_x11.Atoms._NET_WM_STATE, (IntPtr)0, _x11.Atoms._NET_WM_STATE_HIDDEN, IntPtr.Zero); - SendNetWMMessage(_x11.Atoms._NET_WM_STATE, (IntPtr)1, _x11.Atoms._NET_WM_STATE_MAXIMIZED_VERT, + ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_HIDDEN); + ChangeWMAtoms(true, _x11.Atoms._NET_WM_STATE_MAXIMIZED_VERT, _x11.Atoms._NET_WM_STATE_MAXIMIZED_HORZ); } else { - SendNetWMMessage(_x11.Atoms._NET_WM_STATE, (IntPtr)0, _x11.Atoms._NET_WM_STATE_HIDDEN, IntPtr.Zero); - SendNetWMMessage(_x11.Atoms._NET_WM_STATE, (IntPtr)0, _x11.Atoms._NET_WM_STATE_MAXIMIZED_VERT, + ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_HIDDEN); + ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_MAXIMIZED_VERT, _x11.Atoms._NET_WM_STATE_MAXIMIZED_HORZ); } } @@ -989,8 +989,7 @@ namespace Avalonia.X11 public void SetTopmost(bool value) { - SendNetWMMessage(_x11.Atoms._NET_WM_STATE, - (IntPtr)(value ? 1 : 0), _x11.Atoms._NET_WM_STATE_ABOVE, IntPtr.Zero); + ChangeWMAtoms(value, _x11.Atoms._NET_WM_STATE_ABOVE); } public void ShowDialog(IWindowImpl parent) @@ -1017,8 +1016,41 @@ namespace Avalonia.X11 public void ShowTaskbarIcon(bool value) { + ChangeWMAtoms(!value, _x11.Atoms._NET_WM_STATE_SKIP_TASKBAR); + } + + void ChangeWMAtoms(bool enable, params IntPtr[] atoms) + { + if (atoms.Length < 1 || atoms.Length > 4) + throw new ArgumentException(); + + if (!_mapped) + { + XGetWindowProperty(_x11.Display, _handle, _x11.Atoms._NET_WM_STATE, IntPtr.Zero, new IntPtr(256), + false, (IntPtr)Atom.XA_ATOM, out _, out _, out var nitems, out _, + out var prop); + var ptr = (IntPtr*)prop.ToPointer(); + var newAtoms = new HashSet(); + for (var c = 0; c < nitems.ToInt64(); c++) + newAtoms.Add(*ptr); + XFree(prop); + foreach(var atom in atoms) + if (enable) + newAtoms.Add(atom); + else + newAtoms.Remove(atom); + + XChangeProperty(_x11.Display, _handle, _x11.Atoms._NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, + PropertyMode.Replace, newAtoms.ToArray(), newAtoms.Count); + } + SendNetWMMessage(_x11.Atoms._NET_WM_STATE, - (IntPtr)(value ? 0 : 1), _x11.Atoms._NET_WM_STATE_SKIP_TASKBAR, IntPtr.Zero); + (IntPtr)(enable ? 1 : 0), + atoms[0], + atoms.Length > 1 ? atoms[1] : IntPtr.Zero, + atoms.Length > 2 ? atoms[2] : IntPtr.Zero, + atoms.Length > 3 ? atoms[3] : IntPtr.Zero + ); } public IPopupPositioner PopupPositioner { get; } From 5a3602ffd52ed2e802fa2d6d04664bedb9c51c62 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 27 Mar 2020 16:50:45 -0300 Subject: [PATCH 42/90] OSX backend calls OnResized to keep WindowState inSync. --- native/Avalonia.Native/src/OSX/window.h | 1 + native/Avalonia.Native/src/OSX/window.mm | 100 ++++++++++++++--------- 2 files changed, 62 insertions(+), 39 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index 3e626675d2..2bcc4947de 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -34,6 +34,7 @@ struct INSWindowHolder struct IWindowStateChanged { virtual void WindowStateChanged () = 0; + virtual void OnResized () = 0; }; #endif /* window_h */ diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 2c1208a38d..9de283598a 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -31,9 +31,11 @@ public: AvnPoint lastPositionSet; NSString* _lastTitle; IAvnAppMenu* _mainMenu; + bool _shown; WindowBaseImpl(IAvnWindowBaseEvents* events, IAvnGlContext* gl) { + _shown = false; _mainMenu = nullptr; BaseEvents = events; _glContext = gl; @@ -115,6 +117,8 @@ public: [NSApp activateIgnoringOtherApps:YES]; [Window setTitle:_lastTitle]; + + _shown = true; return S_OK; } @@ -615,57 +619,64 @@ private: { _lastWindowState = state; - switch (state) { - case Maximized: - lastPositionSet.X = 0; - lastPositionSet.Y = 0; - - if([Window isMiniaturized]) - { - [Window deminiaturize:Window]; - } - - if(!IsZoomed()) - { - DoZoom(); - } - break; - - case Minimized: - [Window miniaturize:Window]; - break; - - default: - if([Window isMiniaturized]) - { - [Window deminiaturize:Window]; - } - - if(IsZoomed()) - { - DoZoom(); - } - break; + if(_shown) + { + switch (state) { + case Maximized: + lastPositionSet.X = 0; + lastPositionSet.Y = 0; + + if([Window isMiniaturized]) + { + [Window deminiaturize:Window]; + } + + if(!IsZoomed()) + { + DoZoom(); + } + break; + + case Minimized: + [Window miniaturize:Window]; + break; + + default: + if([Window isMiniaturized]) + { + [Window deminiaturize:Window]; + } + + if(IsZoomed()) + { + DoZoom(); + } + break; + } } return S_OK; } } - -protected: + +public: virtual void OnResized () override { - auto windowState = [Window isMiniaturized] ? Minimized - : (IsZoomed() ? Maximized : Normal); - - if (windowState != _lastWindowState) + if(_shown) { - _lastWindowState = windowState; + auto windowState = [Window isMiniaturized] ? Minimized + : (IsZoomed() ? Maximized : Normal); - WindowEvents->WindowStateChanged(windowState); + if (windowState != _lastWindowState) + { + _lastWindowState = windowState; + + WindowEvents->WindowStateChanged(windowState); + } } } +protected: virtual NSWindowStyleMask GetStyle() override { unsigned long s = NSWindowStyleMaskBorderless; @@ -1360,6 +1371,16 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent } } +- (void)windowDidResize:(NSNotification *)notification +{ + auto parent = dynamic_cast(_parent.operator->()); + + if(parent != nullptr) + { + parent->OnResized(); + } +} + - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame { return true; @@ -1430,6 +1451,7 @@ protected: [Window setContentSize:NSSize{x, y}]; [Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(lastPositionSet))]; + return S_OK; } } From e97c74003671796a375f6dbfebbf9eb816b78ac7 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 27 Mar 2020 18:39:39 -0300 Subject: [PATCH 43/90] no need to cast to call OnResized. --- native/Avalonia.Native/src/OSX/window.h | 1 - native/Avalonia.Native/src/OSX/window.mm | 9 ++------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index 2bcc4947de..3e626675d2 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -34,7 +34,6 @@ struct INSWindowHolder struct IWindowStateChanged { virtual void WindowStateChanged () = 0; - virtual void OnResized () = 0; }; #endif /* window_h */ diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 9de283598a..0f2138d32a 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -404,6 +404,7 @@ protected: [Window setStyleMask:GetStyle()]; } +public: virtual void OnResized () { @@ -659,7 +660,6 @@ private: } } -public: virtual void OnResized () override { if(_shown) @@ -1373,12 +1373,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (void)windowDidResize:(NSNotification *)notification { - auto parent = dynamic_cast(_parent.operator->()); - - if(parent != nullptr) - { - parent->OnResized(); - } + _parent->OnResized(); } - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame From 764e7aff01a276677c96614bbb89f9436ce1d499 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Mon, 23 Mar 2020 21:11:00 +0100 Subject: [PATCH 44/90] Initial refactor of win32 window. --- samples/ControlCatalog/Pages/DialogsPage.xaml | 1 + .../ControlCatalog/Pages/DialogsPage.xaml.cs | 31 +- src/Avalonia.Controls/Window.cs | 2 + .../Avalonia.Win32/WindowImpl.WndProc.cs | 436 +++++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 1002 ++++++----------- 5 files changed, 784 insertions(+), 688 deletions(-) create mode 100644 src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml b/samples/ControlCatalog/Pages/DialogsPage.xaml index 60f8e3656e..1ed5c0cbfd 100644 --- a/samples/ControlCatalog/Pages/DialogsPage.xaml +++ b/samples/ControlCatalog/Pages/DialogsPage.xaml @@ -9,5 +9,6 @@ + diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs index d207689223..0e266dac2b 100644 --- a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs +++ b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs @@ -61,14 +61,29 @@ namespace ControlCatalog.Pages new DecoratedWindow().ShowDialog(GetWindow()); }; this.FindControl