From eeef795c7b0caafeb394fab87e0984eb7f3cbadc Mon Sep 17 00:00:00 2001 From: polarboy Date: Wed, 7 Aug 2024 08:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20InnerRightContent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShowCase/LineEditShowCase.axaml | 7 +- src/AtomUI.Controls/Input/LineEdit.cs | 30 ++++ src/AtomUI.Controls/Input/LineEditKernel.cs | 3 +- src/AtomUI.Controls/Input/LineEditTheme.cs | 146 +++++++----------- 4 files changed, 94 insertions(+), 92 deletions(-) diff --git a/samples/AtomUI.Demo.Desktop/ShowCase/LineEditShowCase.axaml b/samples/AtomUI.Demo.Desktop/ShowCase/LineEditShowCase.axaml index 8939853c9..3a67bbd11 100644 --- a/samples/AtomUI.Demo.Desktop/ShowCase/LineEditShowCase.axaml +++ b/samples/AtomUI.Demo.Desktop/ShowCase/LineEditShowCase.axaml @@ -38,7 +38,12 @@ Title="Pre / Post tab" Description="Using pre and post tabs example."> - + + + diff --git a/src/AtomUI.Controls/Input/LineEdit.cs b/src/AtomUI.Controls/Input/LineEdit.cs index 204465446..eb074c32e 100644 --- a/src/AtomUI.Controls/Input/LineEdit.cs +++ b/src/AtomUI.Controls/Input/LineEdit.cs @@ -188,4 +188,34 @@ public class LineEdit : TextBox bottomRight:bottomRightRadius); } + protected override Size ArrangeOverride(Size finalSize) + { + var offsetLeft = 0d; + var offsetRight = finalSize.Width; + var controlRect = new Rect(new Point(0, 0), finalSize); + if (_leftAddOnPresenter is not null && _leftAddOnPresenter.IsVisible) { + offsetLeft += _leftAddOnPresenter.DesiredSize.Width - BorderThickness.Left; + _leftAddOnPresenter.Arrange(controlRect); + } + + if (_rightAddOnPresenter is not null && _rightAddOnPresenter.IsVisible) { + offsetRight -= _rightAddOnPresenter.DesiredSize.Width - BorderThickness.Right; + _rightAddOnPresenter.Arrange(controlRect); + } + + if (_lineEditKernel is not null) { + var width = offsetRight - offsetLeft; + if (_leftAddOnPresenter is not null && _leftAddOnPresenter.IsVisible) { + offsetLeft -= BorderThickness.Left; + width += BorderThickness.Left; + } + + if (_rightAddOnPresenter is not null && _rightAddOnPresenter.IsVisible) { + width += BorderThickness.Right; + } + _lineEditKernel.Arrange(new Rect(new Point(offsetLeft, 0), new Size(width, finalSize.Height))); + } + + return finalSize; + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Input/LineEditKernel.cs b/src/AtomUI.Controls/Input/LineEditKernel.cs index e2b466ab2..77af3f7b5 100644 --- a/src/AtomUI.Controls/Input/LineEditKernel.cs +++ b/src/AtomUI.Controls/Input/LineEditKernel.cs @@ -4,8 +4,6 @@ using Avalonia; using Avalonia.Animation; using Avalonia.Controls; using Avalonia.Controls.Presenters; -using Avalonia.Controls.Primitives; -using Avalonia.Layout; namespace AtomUI.Controls; @@ -89,6 +87,7 @@ internal class LineEditKernel : Border { _layout = new Panel(); Child = _layout; + Focusable = true; } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) diff --git a/src/AtomUI.Controls/Input/LineEditTheme.cs b/src/AtomUI.Controls/Input/LineEditTheme.cs index 82b3348ce..426190ea2 100644 --- a/src/AtomUI.Controls/Input/LineEditTheme.cs +++ b/src/AtomUI.Controls/Input/LineEditTheme.cs @@ -19,7 +19,7 @@ namespace AtomUI.Controls; [ControlThemeProvider] internal class LineEditTheme : BaseControlTheme { - public const string FrameDecoratorPart = "PART_FrameDecorator"; + public const string MainLayoutPart = "PART_FrameDecorator"; public const string TextPresenterPart = "PART_TextPresenter"; public const string WatermarkPart = "PART_Watermark"; public const string ScrollViewerPart = "PART_ScrollViewer"; @@ -37,46 +37,31 @@ internal class LineEditTheme : BaseControlTheme { return new FuncControlTemplate((lineEdit, scope) => { - var border = new Border() + var mainLayout = new Panel() { - Name = FrameDecoratorPart + Name = MainLayoutPart }; - - var grid = new Grid() - { - ShowGridLines = false - }; - ConfigureGrid(grid); - BuildGridChildren(lineEdit, grid, scope); - border.Child = grid; - return border; + BuildGridChildren(lineEdit, mainLayout, scope); + return mainLayout; }); } - protected virtual void ConfigureGrid(Grid grid) + protected virtual void BuildGridChildren(LineEdit lineEdit, Panel layout, INameScope scope) { - grid.ColumnDefinitions = new ColumnDefinitions() - { - new ColumnDefinition(GridLength.Auto), - new ColumnDefinition(GridLength.Star), - new ColumnDefinition(GridLength.Auto) - }; + BuildLeftAddOn(layout, scope); + BuildLineEditKernel(lineEdit, layout, scope); + BuildRightAddOn(layout, scope); } - protected virtual void BuildGridChildren(LineEdit lineEdit, Grid grid, INameScope scope) - { - BuildLeftAddOn(grid, scope); - BuildLineEditKernel(lineEdit, grid, scope); - BuildRightAddOn(grid, scope); - } - - protected virtual void BuildLeftAddOn(Grid grid, INameScope scope) + protected virtual void BuildLeftAddOn(Panel layout, INameScope scope) { var leftAddOnContentPresenter = new ContentPresenter() { Name = LeftAddOnPart, VerticalAlignment = VerticalAlignment.Stretch, - VerticalContentAlignment = VerticalAlignment.Center + VerticalContentAlignment = VerticalAlignment.Center, + HorizontalAlignment = HorizontalAlignment.Left, + Focusable = false }; CreateTemplateParentBinding(leftAddOnContentPresenter, ContentPresenter.ContentProperty, LineEdit.LeftAddOnProperty); @@ -90,14 +75,16 @@ internal class LineEditTheme : BaseControlTheme TokenResourceBinder.CreateTokenBinding(leftAddOnContentPresenter, ContentPresenter.BorderBrushProperty, GlobalResourceKey.ColorBorder); Grid.SetColumn(leftAddOnContentPresenter, 0); - grid.Children.Add(leftAddOnContentPresenter); + layout.Children.Add(leftAddOnContentPresenter); } - protected virtual void BuildLineEditKernel(LineEdit lineEdit, Grid grid, INameScope scope) + protected virtual void BuildLineEditKernel(LineEdit lineEdit, Panel layout, INameScope scope) { var kernelLayout = new LineEditKernel() { - Name = LineEditKernelPart + Name = LineEditKernelPart, + ZIndex = 1000, + Cursor = new Cursor(StandardCursorType.Ibeam) }; CreateTemplateParentBinding(kernelLayout, LineEditKernel.BorderThicknessProperty, LineEdit.BorderThicknessProperty); @@ -108,18 +95,19 @@ internal class LineEditTheme : BaseControlTheme BuildClearButton(kernelLayout, scope); BuildRevealButton(kernelLayout, scope); BuildInnerRightContent(kernelLayout, scope); - grid.Children.Add(kernelLayout); - Grid.SetColumn(kernelLayout, 1); + layout.Children.Add(kernelLayout); kernelLayout.RegisterInNameScope(scope); } - protected virtual void BuildRightAddOn(Grid grid, INameScope scope) + protected virtual void BuildRightAddOn(Panel layout, INameScope scope) { var rightAddOnContentPresenter = new ContentPresenter() { Name = RightAddOnPart, VerticalAlignment = VerticalAlignment.Stretch, - VerticalContentAlignment = VerticalAlignment.Center + VerticalContentAlignment = VerticalAlignment.Center, + HorizontalAlignment = HorizontalAlignment.Right, + Focusable = false }; CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.ContentProperty, LineEdit.RightAddOnProperty); CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.BorderThicknessProperty, LineEdit.BorderThicknessProperty); @@ -131,18 +119,19 @@ internal class LineEditTheme : BaseControlTheme TokenResourceBinder.CreateTokenBinding(rightAddOnContentPresenter, ContentPresenter.BorderBrushProperty, GlobalResourceKey.ColorBorder); rightAddOnContentPresenter.RegisterInNameScope(scope); - grid.Children.Add(rightAddOnContentPresenter); - Grid.SetColumn(rightAddOnContentPresenter, 2); + layout.Children.Add(rightAddOnContentPresenter); } protected virtual void BuildInnerLeftContent(LineEditKernel layout, INameScope scope) { var innerLeftContentPresenter = new ContentPresenter() { - Name = LeftInnerContentPart + Name = LeftInnerContentPart, + VerticalAlignment = VerticalAlignment.Center }; CreateTemplateParentBinding(innerLeftContentPresenter, ContentPresenter.IsVisibleProperty, LineEdit.InnerLeftContentProperty, - BindingMode.Default, ObjectConverters.IsNotNull); + BindingMode.Default, ObjectConverters.IsNotNull); + CreateTemplateParentBinding(innerLeftContentPresenter, ContentPresenter.ContentProperty, LineEdit.InnerLeftContentProperty); innerLeftContentPresenter.RegisterInNameScope(scope); layout.RightInnerContent = innerLeftContentPresenter; } @@ -154,7 +143,8 @@ internal class LineEditTheme : BaseControlTheme Name = RightInnerContentPart }; CreateTemplateParentBinding(innerRightContentPresenter, ContentPresenter.IsVisibleProperty, LineEdit.InnerRightContentProperty, - BindingMode.Default, ObjectConverters.IsNotNull); + BindingMode.Default, ObjectConverters.IsNotNull); + CreateTemplateParentBinding(innerRightContentPresenter, ContentPresenter.ContentProperty, LineEdit.InnerRightContentProperty); innerRightContentPresenter.RegisterInNameScope(scope); layout.RightInnerContent = innerRightContentPresenter; } @@ -251,7 +241,6 @@ internal class LineEditTheme : BaseControlTheme private void BuildFixedStyle() { - this.Add(LineEdit.CursorProperty, new Cursor(StandardCursorType.Ibeam)); this.Add(LineEdit.SelectionBrushProperty, GlobalResourceKey.SelectionBackground); this.Add(LineEdit.SelectionForegroundBrushProperty, GlobalResourceKey.SelectionForeground); this.Add(LineEdit.VerticalAlignmentProperty, VerticalAlignment.Center); @@ -272,7 +261,8 @@ internal class LineEditTheme : BaseControlTheme } { - var addOnStyle = new Style(selector => selector.Nesting().Template().OfType()); + var addOnStyle = new Style(selector => Selectors.Or(selector.Nesting().Template().Name(LeftAddOnPart), + selector.Nesting().Template().Name(RightAddOnPart))); addOnStyle.Add(ContentPresenter.PaddingProperty, LineEditResourceKey.PaddingLG); largeStyle.Add(addOnStyle); } @@ -290,7 +280,8 @@ internal class LineEditTheme : BaseControlTheme } { - var addOnStyle = new Style(selector => selector.Nesting().Template().OfType()); + var addOnStyle = new Style(selector => Selectors.Or(selector.Nesting().Template().Name(LeftAddOnPart), + selector.Nesting().Template().Name(RightAddOnPart))); addOnStyle.Add(ContentPresenter.PaddingProperty, LineEditResourceKey.Padding); middleStyle.Add(addOnStyle); } @@ -308,7 +299,8 @@ internal class LineEditTheme : BaseControlTheme } { - var addOnStyle = new Style(selector => selector.Nesting().Template().OfType()); + var addOnStyle = new Style(selector => Selectors.Or(selector.Nesting().Template().Name(LeftAddOnPart), + selector.Nesting().Template().Name(RightAddOnPart))); addOnStyle.Add(ContentPresenter.PaddingProperty, LineEditResourceKey.PaddingSM); smallStyle.Add(addOnStyle); } @@ -323,28 +315,19 @@ internal class LineEditTheme : BaseControlTheme private void BuildOutLineStyle() { var outlineStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.StyleVariantProperty, TextBoxVariant.Outline)); - { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, GlobalResourceKey.ColorBorder); - outlineStyle.Add(editKernelStyle); - } - + + var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); + editKernelStyle.Add(LineEditKernel.BorderBrushProperty, GlobalResourceKey.ColorBorder); + var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver)); - { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.HoverBorderColor); - hoverStyle.Add(editKernelStyle); - } - outlineStyle.Add(hoverStyle); + hoverStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.HoverBorderColor); + editKernelStyle.Add(hoverStyle); var focusStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.FocusWithIn)); - { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); - focusStyle.Add(editKernelStyle); - } - outlineStyle.Add(focusStyle); - + focusStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); + editKernelStyle.Add(focusStyle); + + outlineStyle.Add(editKernelStyle); Add(outlineStyle); } @@ -352,38 +335,23 @@ internal class LineEditTheme : BaseControlTheme { var filledStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.StyleVariantProperty, TextBoxVariant.Filled)); - { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, GlobalResourceKey.ColorTransparent); - editKernelStyle.Add(LineEditKernel.BackgroundProperty, GlobalResourceKey.ColorFillTertiary); - - filledStyle.Add(editKernelStyle); - } + var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); + + editKernelStyle.Add(LineEditKernel.BorderBrushProperty, GlobalResourceKey.ColorTransparent); + editKernelStyle.Add(LineEditKernel.BackgroundProperty, GlobalResourceKey.ColorFillTertiary); + filledStyle.Add(editKernelStyle); var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver)); - { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.BackgroundProperty, GlobalResourceKey.ColorFillSecondary); - - hoverStyle.Add(editKernelStyle); - } + hoverStyle.Add(LineEditKernel.BackgroundProperty, GlobalResourceKey.ColorFillSecondary); + editKernelStyle.Add(hoverStyle); - filledStyle.Add(hoverStyle); - var focusStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.FocusWithIn)); + focusStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); + focusStyle.Add(LineEditKernel.BackgroundProperty, LineEditResourceKey.ActiveBg); + editKernelStyle.Add(focusStyle); - { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); - editKernelStyle.Add(LineEditKernel.BackgroundProperty, LineEditResourceKey.ActiveBg); - - focusStyle.Add(editKernelStyle); - } - - filledStyle.Add(focusStyle); - + filledStyle.Add(editKernelStyle); Add(filledStyle); }