Browse Source

Merge remote-tracking branch 'origin/fixes/textProcessingBugs' into fixes/textProcessingBugs

pull/7509/head
Benedikt Stebner 5 years ago
parent
commit
92966f56d1
  1. 23
      readme.md
  2. 6
      src/Avalonia.Controls/ComboBox.cs
  3. 21
      src/Avalonia.Controls/ItemsControl.cs
  4. 6
      src/Avalonia.Controls/MenuBase.cs
  5. 6
      src/Avalonia.Controls/MenuItem.cs
  6. 2
      src/Avalonia.Controls/Presenters/CarouselPresenter.cs
  7. 2
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  8. 2
      src/Avalonia.Controls/TabControl.cs
  9. 2
      src/Avalonia.Controls/TreeView.cs
  10. 2
      src/Avalonia.Controls/TreeViewItem.cs
  11. 10149
      src/Avalonia.DesignerSupport/Remote/HtmlTransport/webapp/package-lock.json
  12. 51
      src/Avalonia.DesignerSupport/Remote/HtmlTransport/webapp/package.json
  13. 17
      src/Avalonia.DesignerSupport/Remote/HtmlTransport/webapp/webpack.config.js
  14. 6
      src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs

23
readme.md

@ -3,13 +3,11 @@
<br />
[![NuGet](https://img.shields.io/nuget/v/Avalonia.svg)](https://www.nuget.org/packages/Avalonia) [![downloads](https://img.shields.io/nuget/dt/avalonia)](https://www.nuget.org/packages/Avalonia) [![MyGet](https://img.shields.io/myget/avalonia-ci/vpre/Avalonia.svg?label=myget)](https://www.myget.org/gallery/avalonia-ci) ![Size](https://img.shields.io/github/repo-size/avaloniaui/avalonia.svg)
## 📖 About AvaloniaUI
## 📖 About
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 via .NET Framework and .NET Core, Linux via Xorg, macOS. 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.
Avalonia is a cross-platform UI framework for dotnet, providing a flexible styling system and supporting a wide range of Operating Systems such as Windows, Linux, MacOs. Avalonia is mature and production ready. We also have in beta release support for iOS, Andriod and in early stages support for browser via WASM.
<img src="https://user-images.githubusercontent.com/6759207/84751662-7c79da00-afc5-11ea-8780-dda28db70b76.png" width="700" />
([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
![image](https://user-images.githubusercontent.com/4672627/152126443-932966cf-57e7-4e77-9be6-62463a66b9f8.png)
To see the status of some of our features, please see our [Roadmap](https://github.com/AvaloniaUI/Avalonia/issues/2239). 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. [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!
@ -28,18 +26,15 @@ Install-Package Avalonia.Desktop
## Showcase
Examples of UIs built with Avalonia
![image](https://user-images.githubusercontent.com/4672627/84707589-5b69a880-af35-11ea-87a6-7ad57a31d314.png)
([Synfonia](https://github.com/jmacato/Synfonia))
<video src="https://user-images.githubusercontent.com/4672627/152325602-28df36ec-6444-44a6-aebe-90ad52c8f27a.mp4"></video>
([Lunacy](https://icons8.com/lunacy))
![image](https://user-images.githubusercontent.com/4672627/85069644-d8419000-b18a-11ea-8732-be9055bb61fd.PNG)
([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
![image](https://user-images.githubusercontent.com/4672627/152325740-261c27a3-e6f0-4662-bff7-4796d4940e04.png)
([PlasticSCM](https://www.plasticscm.com/))
![image](https://user-images.githubusercontent.com/4672627/85069659-dc6dad80-b18a-11ea-8375-39ef95315b5c.PNG)
([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
![image](https://user-images.githubusercontent.com/4672627/152326453-14944c4d-33da-4d50-a268-b87f80927adb.png)
([WasabiWallet](https://www.wasabiwallet.io/))
![image](https://user-images.githubusercontent.com/4672627/84708947-c3b98980-af37-11ea-8c9d-503334615bbf.png)
([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
## JetBrains Rider

6
src/Avalonia.Controls/ComboBox.cs

@ -360,12 +360,12 @@ namespace Avalonia.Controls
var selectedIndex = SelectedIndex;
if (IsDropDownOpen && selectedIndex != -1)
{
var container = ItemContainerGenerator!.ContainerFromIndex(selectedIndex);
var container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
if (container == null && SelectedIndex != -1)
{
ScrollIntoView(Selection.SelectedIndex);
container = ItemContainerGenerator!.ContainerFromIndex(selectedIndex);
container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
}
if (container != null && CanFocus(container))
@ -415,7 +415,7 @@ namespace Avalonia.Controls
private void SelectFocusedItem()
{
foreach (ItemContainerInfo dropdownItem in ItemContainerGenerator!.Containers)
foreach (ItemContainerInfo dropdownItem in ItemContainerGenerator.Containers)
{
if (dropdownItem.ContainerControl.IsFocused)
{

21
src/Avalonia.Controls/ItemsControl.cs

@ -79,7 +79,7 @@ namespace Avalonia.Controls
/// <summary>
/// Gets the <see cref="IItemContainerGenerator"/> for the control.
/// </summary>
public IItemContainerGenerator? ItemContainerGenerator
public IItemContainerGenerator ItemContainerGenerator
{
get
{
@ -87,13 +87,10 @@ namespace Avalonia.Controls
{
_itemContainerGenerator = CreateItemContainerGenerator();
if (_itemContainerGenerator != null)
{
_itemContainerGenerator.ItemTemplate = ItemTemplate;
_itemContainerGenerator.Materialized += (_, e) => OnContainersMaterialized(e);
_itemContainerGenerator.Dematerialized += (_, e) => OnContainersDematerialized(e);
_itemContainerGenerator.Recycled += (_, e) => OnContainersRecycled(e);
}
_itemContainerGenerator.ItemTemplate = ItemTemplate;
_itemContainerGenerator.Materialized += (_, e) => OnContainersMaterialized(e);
_itemContainerGenerator.Dematerialized += (_, e) => OnContainersDematerialized(e);
_itemContainerGenerator.Recycled += (_, e) => OnContainersRecycled(e);
}
return _itemContainerGenerator;
@ -240,14 +237,8 @@ namespace Avalonia.Controls
/// Creates the <see cref="ItemContainerGenerator"/> for the control.
/// </summary>
/// <returns>
/// An <see cref="IItemContainerGenerator"/> or null.
/// An <see cref="IItemContainerGenerator"/>.
/// </returns>
/// <remarks>
/// Certain controls such as <see cref="TabControl"/> don't actually create item
/// containers; however they want it to be ItemsControls so that they have an Items
/// property etc. In this case, a derived class can override this method to return null
/// in order to disable the creation of item containers.
/// </remarks>
protected virtual IItemContainerGenerator CreateItemContainerGenerator()
{
return new ItemContainerGenerator(this);

6
src/Avalonia.Controls/MenuBase.cs

@ -81,13 +81,13 @@ namespace Avalonia.Controls
{
var index = SelectedIndex;
return (index != -1) ?
(IMenuItem?)ItemContainerGenerator!.ContainerFromIndex(index) :
(IMenuItem?)ItemContainerGenerator.ContainerFromIndex(index) :
null;
}
set
{
SelectedIndex = value is not null ?
ItemContainerGenerator!.IndexFromContainer(value) : -1;
ItemContainerGenerator.IndexFromContainer(value) : -1;
}
}
@ -96,7 +96,7 @@ namespace Avalonia.Controls
{
get
{
return ItemContainerGenerator!.Containers
return ItemContainerGenerator.Containers
.Select(x => x.ContainerControl)
.OfType<IMenuItem>();
}

6
src/Avalonia.Controls/MenuItem.cs

@ -308,12 +308,12 @@ namespace Avalonia.Controls
{
var index = SelectedIndex;
return (index != -1) ?
(IMenuItem?)ItemContainerGenerator!.ContainerFromIndex(index) :
(IMenuItem?)ItemContainerGenerator.ContainerFromIndex(index) :
null;
}
set
{
SelectedIndex = value is not null ? ItemContainerGenerator!.IndexFromContainer(value) : -1;
SelectedIndex = value is not null ? ItemContainerGenerator.IndexFromContainer(value) : -1;
}
}
@ -322,7 +322,7 @@ namespace Avalonia.Controls
{
get
{
return ItemContainerGenerator!.Containers
return ItemContainerGenerator.Containers
.Select(x => x.ContainerControl)
.OfType<IMenuItem>();
}

2
src/Avalonia.Controls/Presenters/CarouselPresenter.cs

@ -170,7 +170,7 @@ namespace Avalonia.Controls.Presenters
{
if (fromIndex != toIndex)
{
var generator = ItemContainerGenerator!;
var generator = ItemContainerGenerator;
IControl? from = null;
IControl? to = null;

2
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -908,7 +908,7 @@ namespace Avalonia.Controls.Primitives
{
MarkContainerSelected(
container,
Selection.IsSelected(ItemContainerGenerator!.IndexFromContainer(container)));
Selection.IsSelected(ItemContainerGenerator.IndexFromContainer(container)));
}
}
}

2
src/Avalonia.Controls/TabControl.cs

@ -164,7 +164,7 @@ namespace Avalonia.Controls
else
{
var container = SelectedItem as IContentControl ??
ItemContainerGenerator!.ContainerFromIndex(SelectedIndex) as IContentControl;
ItemContainerGenerator.ContainerFromIndex(SelectedIndex) as IContentControl;
SelectedContentTemplate = container?.ContentTemplate;
SelectedContent = container?.Content;
}

2
src/Avalonia.Controls/TreeView.cs

@ -79,7 +79,7 @@ namespace Avalonia.Controls
/// Gets the <see cref="ITreeItemContainerGenerator"/> for the tree view.
/// </summary>
public new ITreeItemContainerGenerator ItemContainerGenerator =>
(ITreeItemContainerGenerator)base.ItemContainerGenerator!;
(ITreeItemContainerGenerator)base.ItemContainerGenerator;
/// <summary>
/// Gets or sets a value indicating whether to automatically scroll to newly selected items.

2
src/Avalonia.Controls/TreeViewItem.cs

@ -89,7 +89,7 @@ namespace Avalonia.Controls
/// Gets the <see cref="ITreeItemContainerGenerator"/> for the tree view.
/// </summary>
public new ITreeItemContainerGenerator ItemContainerGenerator =>
(ITreeItemContainerGenerator)base.ItemContainerGenerator!;
(ITreeItemContainerGenerator)base.ItemContainerGenerator;
/// <inheritdoc/>
protected override IItemContainerGenerator CreateItemContainerGenerator() => CreateTreeItemContainerGenerator<TreeViewItem>();

10149
src/Avalonia.DesignerSupport/Remote/HtmlTransport/webapp/package-lock.json

File diff suppressed because it is too large

51
src/Avalonia.DesignerSupport/Remote/HtmlTransport/webapp/package.json

@ -5,37 +5,36 @@
"main": "index.js",
"scripts": {
"webpack-ver": "cross-env NODE_ENV=production webpack --version",
"dist": "cross-env NODE_ENV=production webpack --display-error-details",
"watch": "cross-env NODE_ENV=development webpack --watch --display-error-details"
"dist": "cross-env NODE_ENV=production webpack",
"watch": "cross-env NODE_ENV=development webpack --watch"
},
"author": "",
"license": "ISC",
"devDependencies": {
"awesome-typescript-loader": "^5.0.0",
"clean-webpack-plugin": "^0.1.19",
"compression-webpack-plugin": "^2.0.0",
"copy-webpack-plugin": "^4.6.0",
"cross-env": "^5.1.6",
"css-loader": "^1.0.0",
"file-loader": "^1.1.11",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.4.1",
"source-map-loader": "^0.2.3",
"style-loader": "^0.21.0",
"to-string-loader": "^1.1.5",
"tsconfig-paths-webpack-plugin": "^3.2.0",
"typescript": "^2.9.2",
"url-loader": "^1.0.1",
"webpack": "~4.16.3",
"webpack-cli": "~2.1.3",
"webpack-livereload-plugin": "~2.1.1"
"clean-webpack-plugin": "^4.0.0",
"compression-webpack-plugin": "^9.2.0",
"cross-env": "^7.0.3",
"css-loader": "^6.5.1",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.0",
"mini-css-extract-plugin": "^2.5.3",
"source-map-loader": "^3.0.1",
"style-loader": "^3.3.1",
"to-string-loader": "^1.2.0",
"ts-loader": "^9.2.6",
"tsconfig-paths-webpack-plugin": "^3.5.2",
"typescript": "^4.5.5",
"url-loader": "^4.1.1",
"webpack": "^5.68.0",
"webpack-cli": "^4.9.2",
"webpack-livereload-plugin": "^3.0.2"
},
"dependencies": {
"@types/react": "^16.3.14",
"@types/react-dom": "^16.0.5",
"mobx": "4.3.0",
"mobx-react": "^5.1.2",
"react": "^16.3.2",
"react-dom": "^16.3.2"
"@types/react": "^17.0.38",
"@types/react-dom": "^17.0.11",
"mobx": "^6.3.13",
"mobx-react": "^7.2.1",
"react": "^17.0.2",
"react-dom": "^17.0.2"
}
}

17
src/Avalonia.DesignerSupport/Remote/HtmlTransport/webapp/webpack.config.js

@ -3,10 +3,9 @@ const path = require('path');
const LiveReloadPlugin = require('webpack-livereload-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const prod = process.env.NODE_ENV == 'production';
class Printer {
@ -17,6 +16,9 @@ class Printer {
}
const config = {
stats: {
errorDetails: true
},
entry: {
bundle: './src/index.tsx'
},
@ -42,7 +44,7 @@ const config = {
{
test: /\.(ts|tsx)$/,
exclude: /node_modules/,
use: 'awesome-typescript-loader'
use: 'ts-loader'
},
{
test: /\.css$/,
@ -93,7 +95,9 @@ const config = {
plugins:
[
new Printer(),
new CleanWebpackPlugin([path.resolve(__dirname, 'build')], { verbose: false }),
new CleanWebpackPlugin({
cleanAfterEveryBuildPatterns: ['dist']
}),
new MiniCssExtractPlugin({
filename: "[name].[chunkhash]h" +
".css",
@ -104,11 +108,6 @@ const config = {
template: path.resolve(__dirname, './src/index.html'),
filename: 'index.html' //relative to root of the application
}),
new CopyWebpackPlugin([
// relative path from src
//{ from: './src/favicon.ico' },
//{ from: './src/assets' }
]),
new CompressionPlugin({
test: /(\?.*)?$/i
})

6
src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs

@ -35,10 +35,10 @@ namespace Avalonia.Media.TextFormatting
/// <param name="maxLines">The maximum number of text lines.</param>
/// <param name="textStyleOverrides">The text style overrides.</param>
public TextLayout(
string text,
string? text,
Typeface typeface,
double fontSize,
IBrush foreground,
IBrush? foreground,
TextAlignment textAlignment = TextAlignment.Left,
TextWrapping textWrapping = TextWrapping.NoWrap,
TextTrimming textTrimming = TextTrimming.None,
@ -487,7 +487,7 @@ namespace Avalonia.Media.TextFormatting
/// <param name="lineHeight">The height of each line of text.</param>
/// <returns></returns>
private static TextParagraphProperties CreateTextParagraphProperties(Typeface typeface, double fontSize,
IBrush foreground, TextAlignment textAlignment, TextWrapping textWrapping,
IBrush? foreground, TextAlignment textAlignment, TextWrapping textWrapping,
TextDecorationCollection? textDecorations, FlowDirection flowDirection, double lineHeight)
{
var textRunStyle = new GenericTextRunProperties(typeface, fontSize, textDecorations, foreground);

Loading…
Cancel
Save