Browse Source

Merge branch 'master' into totalsize

pull/6076/head
Jumar Macato 5 years ago
committed by GitHub
parent
commit
ab96bfe694
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      native/Avalonia.Native/src/OSX/window.mm
  2. 5
      samples/ControlCatalog/MainWindow.xaml.cs
  3. 3
      samples/RenderDemo/MainWindow.xaml
  4. 25
      samples/RenderDemo/Pages/CustomAnimatorPage.xaml
  5. 27
      samples/RenderDemo/Pages/CustomAnimatorPage.xaml.cs
  6. 16
      samples/RenderDemo/Pages/CustomStringAnimator.cs
  7. 29
      src/Avalonia.Animation/Animation.cs
  8. 4
      src/Avalonia.Diagnostics/Diagnostics/DevTools.cs
  9. 5
      src/Avalonia.Diagnostics/Diagnostics/DevToolsOptions.cs
  10. 9
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs
  11. 20
      src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs

11
native/Avalonia.Native/src/OSX/window.mm

@ -528,6 +528,7 @@ private:
bool _fullScreenActive; bool _fullScreenActive;
SystemDecorations _decorations; SystemDecorations _decorations;
AvnWindowState _lastWindowState; AvnWindowState _lastWindowState;
AvnWindowState _actualWindowState;
bool _inSetWindowState; bool _inSetWindowState;
NSRect _preZoomSize; NSRect _preZoomSize;
bool _transitioningWindowState; bool _transitioningWindowState;
@ -554,6 +555,7 @@ private:
_transitioningWindowState = false; _transitioningWindowState = false;
_inSetWindowState = false; _inSetWindowState = false;
_lastWindowState = Normal; _lastWindowState = Normal;
_actualWindowState = Normal;
WindowEvents = events; WindowEvents = events;
[Window setCanBecomeKeyAndMain]; [Window setCanBecomeKeyAndMain];
[Window disableCursorRects]; [Window disableCursorRects];
@ -648,7 +650,7 @@ private:
void WindowStateChanged () override void WindowStateChanged () override
{ {
if(!_inSetWindowState && !_transitioningWindowState) if(_shown && !_inSetWindowState && !_transitioningWindowState)
{ {
AvnWindowState state; AvnWindowState state;
GetWindowState(&state); GetWindowState(&state);
@ -978,14 +980,14 @@ private:
{ {
@autoreleasepool @autoreleasepool
{ {
if(_lastWindowState == state) if(_actualWindowState == state)
{ {
return S_OK; return S_OK;
} }
_inSetWindowState = true; _inSetWindowState = true;
auto currentState = _lastWindowState; auto currentState = _actualWindowState;
_lastWindowState = state; _lastWindowState = state;
if(currentState == Normal) if(currentState == Normal)
@ -1064,8 +1066,11 @@ private:
} }
break; break;
} }
_actualWindowState = _lastWindowState;
} }
_inSetWindowState = false; _inSetWindowState = false;
return S_OK; return S_OK;

5
samples/ControlCatalog/MainWindow.xaml.cs

@ -17,7 +17,10 @@ namespace ControlCatalog
public MainWindow() public MainWindow()
{ {
this.InitializeComponent(); this.InitializeComponent();
this.AttachDevTools(); this.AttachDevTools(new Avalonia.Diagnostics.DevToolsOptions()
{
StartupScreenIndex = 1,
});
//Renderer.DrawFps = true; //Renderer.DrawFps = true;
//Renderer.DrawDirtyRects = Renderer.DrawFps = true; //Renderer.DrawDirtyRects = Renderer.DrawFps = true;

3
samples/RenderDemo/MainWindow.xaml

@ -36,6 +36,9 @@
<TabItem Header="Transitions"> <TabItem Header="Transitions">
<pages:TransitionsPage/> <pages:TransitionsPage/>
</TabItem> </TabItem>
<TabItem Header="Custom Animator">
<pages:CustomAnimatorPage/>
</TabItem>
<TabItem Header="Clipping"> <TabItem Header="Clipping">
<pages:ClippingPage/> <pages:ClippingPage/>
</TabItem> </TabItem>

25
samples/RenderDemo/Pages/CustomAnimatorPage.xaml

@ -0,0 +1,25 @@
<UserControl
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pages="clr-namespace:RenderDemo.Pages"
x:Class="RenderDemo.Pages.CustomAnimatorPage"
MaxWidth="600">
<Grid>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock.Styles>
<Style Selector="TextBlock">
<Style.Animations>
<Animation Duration="0:0:1" IterationCount="Infinite">
<KeyFrame Cue="0%">
<Setter Property="Text" Value="" Animation.Animator="{x:Type pages:CustomStringAnimator}"/>
</KeyFrame>
<KeyFrame Cue="100%">
<Setter Property="Text" Value="0123456789" Animation.Animator="{x:Type pages:CustomStringAnimator}"/>
</KeyFrame>
</Animation>
</Style.Animations>
</Style>
</TextBlock.Styles>
</TextBlock>
</Grid>
</UserControl>

27
samples/RenderDemo/Pages/CustomAnimatorPage.xaml.cs

@ -0,0 +1,27 @@
using System.Reactive.Linq;
using Avalonia;
using Avalonia.Animation;
using Avalonia.Controls;
using Avalonia.Controls.Shapes;
using Avalonia.Data;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using RenderDemo.ViewModels;
namespace RenderDemo.Pages
{
public class CustomAnimatorPage : UserControl
{
public CustomAnimatorPage()
{
InitializeComponent();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
}
}

16
samples/RenderDemo/Pages/CustomStringAnimator.cs

@ -0,0 +1,16 @@
using Avalonia.Animation.Animators;
namespace RenderDemo.Pages
{
public class CustomStringAnimator : Animator<string>
{
public override string Interpolate(double progress, string oldValue, string newValue)
{
if (newValue.Length == 0) return "";
var step = 1.0 / newValue.Length;
var length = (int)(progress / step);
var result = newValue.Substring(0, length + 1);
return result;
}
}
}

29
src/Avalonia.Animation/Animation.cs

@ -194,6 +194,33 @@ namespace Avalonia.Animation
[Content] [Content]
public KeyFrames Children { get; } = new KeyFrames(); public KeyFrames Children { get; } = new KeyFrames();
// Store values for the Animator attached properties for IAnimationSetter objects.
private static readonly Dictionary<IAnimationSetter, Type> s_animators = new Dictionary<IAnimationSetter, Type>();
/// <summary>
/// Gets the value of the Animator attached property for a setter.
/// </summary>
/// <param name="setter">The animation setter.</param>
/// <returns>The property animator type.</returns>
public static Type GetAnimator(IAnimationSetter setter)
{
if (s_animators.TryGetValue(setter, out var type))
{
return type;
}
return null;
}
/// <summary>
/// Sets the value of the Animator attached property for a setter.
/// </summary>
/// <param name="setter">The animation setter.</param>
/// <param name="value">The property animator value.</param>
public static void SetAnimator(IAnimationSetter setter, Type value)
{
s_animators[setter] = value;
}
private readonly static List<(Func<AvaloniaProperty, bool> Condition, Type Animator)> Animators = new List<(Func<AvaloniaProperty, bool>, Type)> private readonly static List<(Func<AvaloniaProperty, bool> Condition, Type Animator)> Animators = new List<(Func<AvaloniaProperty, bool>, Type)>
{ {
( prop => typeof(bool).IsAssignableFrom(prop.PropertyType), typeof(BoolAnimator) ), ( prop => typeof(bool).IsAssignableFrom(prop.PropertyType), typeof(BoolAnimator) ),
@ -248,7 +275,7 @@ namespace Avalonia.Animation
{ {
foreach (var setter in keyframe.Setters) foreach (var setter in keyframe.Setters)
{ {
var handler = GetAnimatorType(setter.Property); var handler = Animation.GetAnimator(setter) ?? GetAnimatorType(setter.Property);
if (handler == null) if (handler == null)
{ {

4
src/Avalonia.Diagnostics/Diagnostics/DevTools.cs

@ -10,7 +10,8 @@ namespace Avalonia.Diagnostics
{ {
public static class DevTools public static class DevTools
{ {
private static readonly Dictionary<TopLevel, Window> s_open = new Dictionary<TopLevel, Window>(); private static readonly Dictionary<TopLevel, MainWindow> s_open =
new Dictionary<TopLevel, MainWindow>();
public static IDisposable Attach(TopLevel root, KeyGesture gesture) public static IDisposable Attach(TopLevel root, KeyGesture gesture)
{ {
@ -52,6 +53,7 @@ namespace Avalonia.Diagnostics
Width = options.Size.Width, Width = options.Size.Width,
Height = options.Size.Height, Height = options.Size.Height,
}; };
window.SetOptions(options);
window.Closed += DevToolsClosed; window.Closed += DevToolsClosed;
s_open.Add(root, window); s_open.Add(root, window);

5
src/Avalonia.Diagnostics/Diagnostics/DevToolsOptions.cs

@ -22,5 +22,10 @@ namespace Avalonia.Diagnostics
/// Gets or sets the initial size of the DevTools window. The default value is 1280x720. /// Gets or sets the initial size of the DevTools window. The default value is 1280x720.
/// </summary> /// </summary>
public Size Size { get; set; } = new Size(1280, 720); public Size Size { get; set; } = new Size(1280, 720);
/// <summary>
/// Get or set the startup screen index where the DevTools window will be displayed.
/// </summary>
public int? StartupScreenIndex { get; set; }
} }
} }

9
src/Avalonia.Diagnostics/Diagnostics/ViewModels/MainViewModel.cs

@ -151,7 +151,7 @@ namespace Avalonia.Diagnostics.ViewModels
get { return _pointerOverElement; } get { return _pointerOverElement; }
private set { RaiseAndSetIfChanged(ref _pointerOverElement, value); } private set { RaiseAndSetIfChanged(ref _pointerOverElement, value); }
} }
private void UpdateConsoleContext(ConsoleContext context) private void UpdateConsoleContext(ConsoleContext context)
{ {
context.root = _root; context.root = _root;
@ -213,5 +213,12 @@ namespace Avalonia.Diagnostics.ViewModels
tree.SelectControl(control); tree.SelectControl(control);
} }
} }
public int? StartupScreenIndex { get; private set; } = default;
public void SetOptions(DevToolsOptions options)
{
StartupScreenIndex = options.StartupScreenIndex;
}
} }
} }

20
src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs

@ -24,6 +24,23 @@ namespace Avalonia.Diagnostics.Views
_keySubscription = InputManager.Instance.Process _keySubscription = InputManager.Instance.Process
.OfType<RawKeyEventArgs>() .OfType<RawKeyEventArgs>()
.Subscribe(RawKeyDown); .Subscribe(RawKeyDown);
EventHandler? lh = default;
lh = (s, e) =>
{
this.Opened -= lh;
if ((DataContext as MainViewModel)?.StartupScreenIndex is int index)
{
var screens = this.Screens;
if (index > -1 && index < screens.ScreenCount)
{
var screen = screens.All[index];
this.Position = screen.Bounds.TopLeft;
this.WindowState = WindowState.Maximized;
}
}
};
this.Opened += lh;
} }
public TopLevel? Root public TopLevel? Root
@ -115,5 +132,8 @@ namespace Avalonia.Diagnostics.Views
} }
private void RootClosed(object? sender, EventArgs e) => Close(); private void RootClosed(object? sender, EventArgs e) => Close();
public void SetOptions(DevToolsOptions options) =>
(DataContext as MainViewModel)?.SetOptions(options);
} }
} }

Loading…
Cancel
Save