Browse Source

Merge branch 'master' into devtools-events-ux

pull/5866/head
Dariusz Komosiński 5 years ago
committed by GitHub
parent
commit
b2fe197865
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml
  2. 140
      src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml
  3. 2
      src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs
  4. 2
      src/Skia/Avalonia.Skia/TextShaperImpl.cs
  5. 18
      tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextFormatterTests.cs
  6. 43
      tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextShaperTests.cs

4
src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml

@ -163,6 +163,10 @@
<Style Selector="DataGridCell:invalid /template/ Rectangle#InvalidVisualElement"> <Style Selector="DataGridCell:invalid /template/ Rectangle#InvalidVisualElement">
<Setter Property="IsVisible" Value="True" /> <Setter Property="IsVisible" Value="True" />
</Style> </Style>
<Style Selector="DataGridCell > TextBox DataValidationErrors">
<Setter Property="Template" Value="{DynamicResource TooltipDataValidationContentTemplate}" />
<Setter Property="ErrorTemplate" Value="{DynamicResource TooltipDataValidationErrorTemplate}" />
</Style>
<Style Selector="DataGridColumnHeader"> <Style Selector="DataGridColumnHeader">
<Setter Property="Foreground" Value="{DynamicResource DataGridColumnHeaderForegroundBrush}" /> <Setter Property="Foreground" Value="{DynamicResource DataGridColumnHeaderForegroundBrush}" />

140
src/Avalonia.Themes.Fluent/Controls/DataValidationErrors.xaml

@ -1,44 +1,102 @@
<Style xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
Selector="DataValidationErrors" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=netstandard"> xmlns:sys="using:System">
<Design.PreviewWith> <Design.PreviewWith>
<Border Padding="20"> <Border Padding="20">
<TextBox Text="Sample"> <StackPanel Spacing="20">
<DataValidationErrors.Error> <TextBox Text="Sample">
<sys:Exception/> <DataValidationErrors.Error>
</DataValidationErrors.Error> <sys:Exception />
</TextBox> </DataValidationErrors.Error>
</TextBox>
<TextBox Text="Sample">
<TextBox.Styles>
<Style Selector="DataValidationErrors">
<Setter Property="Template" Value="{DynamicResource TooltipDataValidationContentTemplate}" />
<Setter Property="ErrorTemplate" Value="{DynamicResource TooltipDataValidationErrorTemplate}" />
</Style>
</TextBox.Styles>
<DataValidationErrors.Error>
<sys:Exception />
</DataValidationErrors.Error>
</TextBox>
</StackPanel>
</Border> </Border>
</Design.PreviewWith> </Design.PreviewWith>
<Setter Property="Template"> <Style Selector="DataValidationErrors">
<ControlTemplate> <Style.Resources>
<DockPanel LastChildFill="True"> <DataTemplate x:Key="InlineDataValidationErrorTemplate">
<ContentControl Margin="0 4 0 0" <ItemsControl Items="{Binding}">
DockPanel.Dock="Bottom" <ItemsControl.ItemTemplate>
ContentTemplate="{TemplateBinding ErrorTemplate}" <DataTemplate>
DataContext="{TemplateBinding Owner}" <TextBlock Foreground="{DynamicResource SystemControlErrorTextForegroundBrush}"
Content="{Binding (DataValidationErrors.Errors)}" Text="{Binding}"
IsVisible="{Binding (DataValidationErrors.HasErrors)}" /> TextWrapping="Wrap" />
<ContentPresenter </DataTemplate>
Name="PART_ContentPresenter" </ItemsControl.ItemTemplate>
Background="{TemplateBinding Background}" </ItemsControl>
BorderThickness="{TemplateBinding BorderThickness}" </DataTemplate>
ContentTemplate="{TemplateBinding ContentTemplate}" <ControlTemplate x:Key="InlineDataValidationContentTemplate" TargetType="DataValidationErrors">
Content="{TemplateBinding Content}" <DockPanel LastChildFill="True">
Padding="{TemplateBinding Padding}" /> <ContentControl x:Name="InlineDataValidationContentControl"
</DockPanel> Margin="0,4,0,0"
</ControlTemplate> Content="{Binding (DataValidationErrors.Errors)}"
</Setter> ContentTemplate="{TemplateBinding ErrorTemplate}"
<Setter Property="ErrorTemplate"> DataContext="{TemplateBinding Owner}"
<DataTemplate> DockPanel.Dock="Bottom"
<ItemsControl Items="{Binding}"> IsVisible="{Binding (DataValidationErrors.HasErrors)}" />
<ItemsControl.ItemTemplate> <ContentPresenter Name="PART_ContentPresenter"
<DataTemplate> Padding="{TemplateBinding Padding}"
<TextBlock Text="{Binding }" Foreground="{DynamicResource SystemControlErrorTextForegroundBrush}" TextWrapping="Wrap" /> Background="{TemplateBinding Background}"
</DataTemplate> BorderThickness="{TemplateBinding BorderThickness}"
</ItemsControl.ItemTemplate> Content="{TemplateBinding Content}"
</ItemsControl> ContentTemplate="{TemplateBinding ContentTemplate}" />
</DataTemplate> </DockPanel>
</Setter> </ControlTemplate>
</Style>
<DataTemplate x:Key="TooltipDataValidationErrorTemplate">
<Panel Name="PART_InlineErrorTemplatePanel" Background="Transparent">
<Panel.Styles>
<Style Selector="Panel#PART_InlineErrorTemplatePanel">
<Setter Property="Margin" Value="8,0" />
</Style>
<Style Selector="Panel#PART_InlineErrorTemplatePanel ToolTip">
<Setter Property="BorderBrush" Value="{DynamicResource SystemControlErrorTextForegroundBrush}" />
</Style>
<Style Selector="Panel#PART_InlineErrorTemplatePanel ToolTip TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
</Panel.Styles>
<ToolTip.Tip>
<ItemsControl Items="{Binding}" />
</ToolTip.Tip>
<Path Width="14"
Height="14"
Data="M14,7 A7,7 0 0,0 0,7 M0,7 A7,7 0 1,0 14,7 M7,3l0,5 M7,9l0,2"
Stroke="{DynamicResource SystemControlErrorTextForegroundBrush}"
StrokeThickness="2" />
</Panel>
</DataTemplate>
<ControlTemplate x:Key="TooltipDataValidationContentTemplate" TargetType="DataValidationErrors">
<DockPanel LastChildFill="True">
<ContentControl Content="{Binding (DataValidationErrors.Errors)}"
ContentTemplate="{TemplateBinding ErrorTemplate}"
DataContext="{TemplateBinding Owner}"
DockPanel.Dock="Right"
IsVisible="{Binding (DataValidationErrors.HasErrors)}" />
<ContentPresenter Name="PART_ContentPresenter"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</DockPanel>
</ControlTemplate>
</Style.Resources>
<Setter Property="Template" Value="{StaticResource InlineDataValidationContentTemplate}" />
<Setter Property="ErrorTemplate" Value="{StaticResource InlineDataValidationErrorTemplate}" />
</Style>
</Styles>

2
src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs

@ -422,7 +422,7 @@ namespace Avalonia.Media.TextFormatting
} }
else else
{ {
currentPosition = currentLength + lineBreaker.Current.PositionWrap; currentPosition = currentLength + measuredLength;
} }
breakFound = true; breakFound = true;

2
src/Skia/Avalonia.Skia/TextShaperImpl.cs

@ -87,7 +87,7 @@ namespace Avalonia.Skia
{ {
var nextCodepoint = Codepoint.ReadAt(text, i + 1, out _); var nextCodepoint = Codepoint.ReadAt(text, i + 1, out _);
if (nextCodepoint == '\r' && codepoint == '\n' || nextCodepoint == '\n' && codepoint == '\r') if (nextCodepoint == '\n' && codepoint == '\r')
{ {
count++; count++;

18
tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextFormatterTests.cs

@ -401,6 +401,24 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting
Assert.Equal(expectedOffset, textLine.Start); Assert.Equal(expectedOffset, textLine.Start);
} }
} }
[Fact]
public void Should_FormatLine_With_Emergency_Breaks()
{
using (Start())
{
var defaultProperties = new GenericTextRunProperties(Typeface.Default);
var paragraphProperties = new GenericTextParagraphProperties(defaultProperties, textWrap: TextWrapping.Wrap);
var textSource = new SingleBufferTextSource("0123456789_0123456789_0123456789_0123456789", defaultProperties);
var formatter = new TextFormatterImpl();
var textLine =
formatter.FormatLine(textSource, 0, 33, paragraphProperties);
Assert.NotNull(textLine.TextLineBreak?.RemainingCharacters);
}
}
public static IDisposable Start() public static IDisposable Start()
{ {

43
tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextShaperTests.cs

@ -0,0 +1,43 @@
using System;
using System.Globalization;
using Avalonia.Media;
using Avalonia.Media.TextFormatting;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.Skia.UnitTests.Media.TextFormatting
{
public class TextShaperTests
{
[Fact]
public void Should_Form_Clusters_For_BreakPairs()
{
using (Start())
{
var text = "\n\r\n".AsMemory();
var glyphRun = TextShaper.Current.ShapeText(
text,
Typeface.Default,
12,
CultureInfo.CurrentCulture);
Assert.Equal(glyphRun.Characters.Length, text.Length);
Assert.Equal(glyphRun.GlyphClusters.Length, text.Length);
Assert.Equal(0, glyphRun.GlyphClusters[0]);
Assert.Equal(1, glyphRun.GlyphClusters[1]);
Assert.Equal(1, glyphRun.GlyphClusters[2]);
}
}
private static IDisposable Start()
{
var disposable = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface
.With(renderInterface: new PlatformRenderInterface(null),
textShaperImpl: new TextShaperImpl(),
fontManagerImpl: new CustomFontManagerImpl()));
return disposable;
}
}
}
Loading…
Cancel
Save