From cfd2be07eccae6aa975a19442717de79562317ec Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 7 Jan 2017 19:50:41 +0100 Subject: [PATCH 01/95] Added LayoutUpdated event. Fixes #825. --- src/Avalonia.Layout/Layoutable.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Avalonia.Layout/Layoutable.cs b/src/Avalonia.Layout/Layoutable.cs index 7624928e4b..5abd6c52f7 100644 --- a/src/Avalonia.Layout/Layoutable.cs +++ b/src/Avalonia.Layout/Layoutable.cs @@ -154,6 +154,11 @@ namespace Avalonia.Layout VerticalAlignmentProperty); } + /// + /// Occurs when a layout pass completes for the control. + /// + public event EventHandler LayoutUpdated; + /// /// Gets or sets the width of the element. /// @@ -357,6 +362,8 @@ namespace Avalonia.Layout IsArrangeValid = true; ArrangeCore(rect); _previousArrange = rect; + + LayoutUpdated?.Invoke(this, EventArgs.Empty); } } From 8c6d8ae8326e1cc20fed3ce015883fa8879affec Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Feb 2017 21:22:26 +0300 Subject: [PATCH 02/95] [DROID] Implemented Popups, fixed AppBuilder --- .../ControlCatalog.Android.csproj | 6 +- .../Avalonia.Android/ActivityTracker.cs | 47 ++++++ .../Avalonia.Android/AndroidPlatform.cs | 4 +- src/Android/Avalonia.Android/AppBuilder.cs | 26 +++ .../Avalonia.Android/Avalonia.Android.csproj | 3 + .../Avalonia.Android/AvaloniaActivity.cs | 15 +- src/Android/Avalonia.Android/AvaloniaView.cs | 18 ++- .../SkiaPlatform/AndroidFramebuffer.cs | 4 + .../InvalidationAwareSurfaceView.cs | 24 +-- .../Platform/SkiaPlatform/PopupImpl.cs | 91 +++++++++++ .../Platform/SkiaPlatform/TopLevelImpl.cs | 152 +++++++++++------- .../Helpers/AndroidKeyboardEventsHelper.cs | 6 +- .../Helpers/AndroidTouchEventsHelper.cs | 10 +- src/Avalonia.Controls/AppBuilderBase.cs | 4 +- .../AppBuilder.cs | 3 +- src/Skia/Avalonia.Skia/BitmapImpl.cs | 5 +- 16 files changed, 321 insertions(+), 97 deletions(-) create mode 100644 src/Android/Avalonia.Android/ActivityTracker.cs create mode 100644 src/Android/Avalonia.Android/AppBuilder.cs create mode 100644 src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj index fa29610b18..41d6329d26 100644 --- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj +++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj @@ -29,7 +29,7 @@ 4 True None - False + True False False armeabi;armeabi-v7a;x86 @@ -112,10 +112,6 @@ {7062ae20-5dcc-4442-9645-8195bdece63e} Avalonia.Diagnostics - - {4a1abb09-9047-4bd5-a4ad-a055e52c5ee0} - Avalonia.DotNetFrameworkRuntime - {5fb2b005-0a7f-4dad-add4-3ed01444e63d} Avalonia.HtmlRenderer diff --git a/src/Android/Avalonia.Android/ActivityTracker.cs b/src/Android/Avalonia.Android/ActivityTracker.cs new file mode 100644 index 0000000000..2ad1d9e361 --- /dev/null +++ b/src/Android/Avalonia.Android/ActivityTracker.cs @@ -0,0 +1,47 @@ +using Android.App; +using Android.OS; + +namespace Avalonia.Android +{ + internal class ActivityTracker : Java.Lang.Object, global::Android.App.Application.IActivityLifecycleCallbacks + { + public static Activity Current { get; private set; } + public void OnActivityCreated(Activity activity, Bundle savedInstanceState) + { + Current = activity; + } + + public void OnActivityDestroyed(Activity activity) + { + if (Current == activity) + Current = null; + } + + public void OnActivityPaused(Activity activity) + { + if (Current == activity) + Current = null; + } + + public void OnActivityResumed(Activity activity) + { + Current = activity; + } + + public void OnActivitySaveInstanceState(Activity activity, Bundle outState) + { + Current = activity; + } + + public void OnActivityStarted(Activity activity) + { + Current = activity; + } + + public void OnActivityStopped(Activity activity) + { + if (Current == activity) + Current = null; + } + } +} \ No newline at end of file diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index 5b3170a0c7..2089359c26 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -62,6 +62,8 @@ namespace Avalonia.Android .Bind().ToConstant(new AssetLoader(app.GetType().Assembly)); SkiaPlatform.Initialize(); + ((global::Android.App.Application) global::Android.App.Application.Context.ApplicationContext) + .RegisterActivityLifecycleCallbacks(new ActivityTracker()); } public IWindowImpl CreateWindow() @@ -76,7 +78,7 @@ namespace Avalonia.Android public IPopupImpl CreatePopup() { - throw new NotImplementedException(); + return new PopupImpl(); } } } \ No newline at end of file diff --git a/src/Android/Avalonia.Android/AppBuilder.cs b/src/Android/Avalonia.Android/AppBuilder.cs new file mode 100644 index 0000000000..6078e3bb98 --- /dev/null +++ b/src/Android/Avalonia.Android/AppBuilder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Android.App; +using Android.Content; +using Android.OS; +using Android.Runtime; +using Android.Views; +using Android.Widget; +using Avalonia.Controls; +using Avalonia.Platform; +using Avalonia.Shared.PlatformSupport; + +namespace Avalonia +{ + public sealed class AppBuilder : AppBuilderBase + { + public AppBuilder() : base(new StandardRuntimePlatform(), + builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType()?.Assembly)) + { + + } + } +} \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 0dfab3f518..3ee2f5af64 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -61,8 +61,10 @@ + + @@ -72,6 +74,7 @@ + diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs index a9b04c882b..21ce555086 100644 --- a/src/Android/Avalonia.Android/AvaloniaActivity.cs +++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs @@ -14,16 +14,17 @@ namespace Avalonia.Android { public abstract class AvaloniaActivity : Activity { - AvaloniaView _view; + + internal AvaloniaView View; object _content; protected override void OnCreate(Bundle savedInstanceState) { RequestWindowFeature(WindowFeatures.NoTitle); - _view = new AvaloniaView(this); + View = new AvaloniaView(this); if(_content != null) - _view.Content = _content; - SetContentView(_view); + View.Content = _content; + SetContentView(View); TakeKeyEvents(true); base.OnCreate(savedInstanceState); } @@ -37,14 +38,14 @@ namespace Avalonia.Android set { _content = value; - if (_view != null) - _view.Content = value; + if (View != null) + View.Content = value; } } public override bool DispatchKeyEvent(KeyEvent e) { - return _view.DispatchKeyEvent(e); + return View.DispatchKeyEvent(e); } } } \ No newline at end of file diff --git a/src/Android/Avalonia.Android/AvaloniaView.cs b/src/Android/Avalonia.Android/AvaloniaView.cs index 71eea14a1d..6c4274a6e4 100644 --- a/src/Android/Avalonia.Android/AvaloniaView.cs +++ b/src/Android/Avalonia.Android/AvaloniaView.cs @@ -10,6 +10,7 @@ using Android.Runtime; using Android.Views; using Android.Widget; using Avalonia.Android.Platform.SkiaPlatform; +using Avalonia.Controls; using Avalonia.Controls.Embedding; using Avalonia.Platform; @@ -23,7 +24,7 @@ namespace Avalonia.Android public AvaloniaView(Context context) : base(context) { _view = new ViewImpl(context); - AddView(_view); + AddView(_view.View); _root = new EmbeddableControlRoot(_view); _root.Prepare(); } @@ -36,7 +37,7 @@ namespace Avalonia.Android public override bool DispatchKeyEvent(KeyEvent e) { - return _view.DispatchKeyEvent(e); + return _view.View.DispatchKeyEvent(e); } class ViewImpl : TopLevelImpl, IEmbeddableWindowImpl @@ -45,8 +46,8 @@ namespace Avalonia.Android public ViewImpl(Context context) : base(context) { - Focusable = true; - FocusChange += ViewImpl_FocusChange; + View.Focusable = true; + View.FocusChange += ViewImpl_FocusChange; } private void ViewImpl_FocusChange(object sender, FocusChangeEventArgs e) @@ -54,6 +55,15 @@ namespace Avalonia.Android if(!e.HasFocus) LostFocus?.Invoke(); } + + protected override void OnResized(Size size) + { + MaxClientSize = size; + base.OnResized(size); + } + + public WindowState WindowState { get; set; } + public IDisposable ShowDialog() => null; } } } \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs index 982c79560b..55e729f5a2 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs @@ -12,7 +12,11 @@ namespace Avalonia.Android.Platform.SkiaPlatform public AndroidFramebuffer(Surface surface) { + if(surface == null) + throw new ArgumentNullException(nameof(surface)); _window = ANativeWindow_fromSurface(JNIEnv.Handle, surface.Handle); + if (_window == IntPtr.Zero) + throw new Exception("Unable to obtain ANativeWindow"); ANativeWindow_Buffer buffer; var rc = new ARect() { diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs index 2213ebddcc..d2d5909815 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs @@ -18,14 +18,13 @@ namespace Avalonia.Android { public abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, IPlatformHandle { - private readonly Context _context; bool _invalidateQueued; readonly object _lock = new object(); private readonly Handler _handler; + public InvalidationAwareSurfaceView(Context context) : base(context) { - _context = context; Holder.AddCallback(this); _handler = new Handler(context.MainLooper); } @@ -38,13 +37,11 @@ namespace Avalonia.Android return; _handler.Post(() => { - lock (_lock) - { - _invalidateQueued = false; - } + if (Holder.Surface?.IsValid != true) + return; try { - Draw(); + DoDraw(); } catch (Exception e) { @@ -67,20 +64,29 @@ namespace Avalonia.Android public void SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) { Log.Info("AVALONIA", "Surface Changed"); - Draw(); + DoDraw(); } public void SurfaceCreated(ISurfaceHolder holder) { Log.Info("AVALONIA", "Surface Created"); - Draw(); + DoDraw(); } public void SurfaceDestroyed(ISurfaceHolder holder) { Log.Info("AVALONIA", "Surface Destroyed"); + } + protected void DoDraw() + { + lock (_lock) + { + _invalidateQueued = false; + } + Draw(); + } protected abstract void Draw(); public string HandleDescriptor => "SurfaceView"; } diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs new file mode 100644 index 0000000000..e39ba2c121 --- /dev/null +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Android.App; +using Android.Content; +using Android.Graphics; +using Android.OS; +using Android.Runtime; +using Android.Views; +using Android.Widget; +using Avalonia.Platform; + +namespace Avalonia.Android.Platform.SkiaPlatform +{ + class PopupImpl : TopLevelImpl, IPopupImpl + { + private Point _position; + private bool _isAdded; + public PopupImpl() : base(ActivityTracker.Current, true) + { + } + + private Size _clientSize = new Size(1, 1); + public override Size ClientSize + { + get { return base.ClientSize; } + set + { + if(View == null) + return; + _clientSize = value; + UpdateParams(); + } + } + + public override Point Position + { + get { return _position; } + set + { + _position = value; + PositionChanged?.Invoke(_position); + UpdateParams(); + } + } + + WindowManagerLayoutParams CreateParams() => new WindowManagerLayoutParams(0, + WindowManagerFlags.NotTouchModal, Format.Translucent) + { + Gravity = GravityFlags.Left | GravityFlags.Top, + WindowAnimations = 0, + X = (int) _position.X, + Y = (int) _position.Y, + Width = Math.Max(1, (int) _clientSize.Width), + Height = Math.Max(1, (int) _clientSize.Height) + }; + + void UpdateParams() + { + if (_isAdded) + ActivityTracker.Current?.WindowManager?.UpdateViewLayout(View, CreateParams()); + } + + public override void Show() + { + if (_isAdded) + return; + ActivityTracker.Current.WindowManager.AddView(View, CreateParams()); + _isAdded = true; + } + + public override void Hide() + { + if (_isAdded) + { + var wm = View.Context.ApplicationContext.GetSystemService(Context.WindowService) + .JavaCast(); + wm.RemoveView(View); + _isAdded = false; + } + } + + public override void Dispose() + { + Hide(); + base.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 26d2b0aad9..d34981b964 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -9,42 +9,32 @@ using Avalonia.Input.Raw; using Avalonia.Platform; using System; using System.Collections.Generic; +using System.Reactive.Disposables; using Avalonia.Controls; using Avalonia.Controls.Platform.Surfaces; namespace Avalonia.Android.Platform.SkiaPlatform { - class TopLevelImpl : InvalidationAwareSurfaceView, IAndroidView, ITopLevelImpl, - ISurfaceHolderCallback, IFramebufferPlatformSurface + class TopLevelImpl : IAndroidView, ITopLevelImpl, IFramebufferPlatformSurface { - protected AndroidKeyboardEventsHelper _keyboardHelper; + private readonly AndroidKeyboardEventsHelper _keyboardHelper; + private readonly AndroidTouchEventsHelper _touchHelper; + private ViewImpl _view; - private AndroidTouchEventsHelper _touchHelper; - - public TopLevelImpl(Context context) : base(context) + public TopLevelImpl(Context context, bool placeOnTop = false) { + _view = new ViewImpl(context, this, placeOnTop); _keyboardHelper = new AndroidKeyboardEventsHelper(this); - _touchHelper = new AndroidTouchEventsHelper(this, () => InputRoot, p => GetAvaloniaPointFromEvent(p)); + _touchHelper = new AndroidTouchEventsHelper(this, () => InputRoot, + p => GetAvaloniaPointFromEvent(p)); - MaxClientSize = new Size(Resources.DisplayMetrics.WidthPixels, Resources.DisplayMetrics.HeightPixels); - ClientSize = MaxClientSize; + MaxClientSize = new Size(_view.Resources.DisplayMetrics.WidthPixels, + _view.Resources.DisplayMetrics.HeightPixels); } - - void ISurfaceHolderCallback.SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) - { - var newSize = new Size(width, height); - if (newSize != ClientSize) - { - MaxClientSize = newSize; - ClientSize = newSize; - Resized?.Invoke(ClientSize); - } - base.SurfaceChanged(holder, format, width, height); - } - + private bool _handleEvents; public bool HandleEvents @@ -56,17 +46,24 @@ namespace Avalonia.Android.Platform.SkiaPlatform _keyboardHelper.HandleEvents = _handleEvents; } } - public WindowState WindowState - { - get { return WindowState.Normal; } - set { } - } - + public virtual Point GetAvaloniaPointFromEvent(MotionEvent e) => new Point(e.GetX(), e.GetY()); public IInputRoot InputRoot { get; private set; } - public Size ClientSize { get; set; } + public virtual Size ClientSize + { + get + { + if (_view == null) + return new Size(0, 0); + return new Size(_view.Width, _view.Height); + } + set + { + + } + } public Action Closed { get; set; } @@ -74,7 +71,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Action Input { get; set; } - public Size MaxClientSize { get; private set; } + public Size MaxClientSize { get; protected set; } public Action Paint { get; set; } @@ -84,21 +81,21 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Action PositionChanged { get; set; } - public View View => this; + public View View => _view; Action ITopLevelImpl.Activated { get; set; } - IPlatformHandle ITopLevelImpl.Handle => this; + IPlatformHandle ITopLevelImpl.Handle => _view; - public IEnumerable Surfaces => new object[] { this }; + public IEnumerable Surfaces => new object[] {this}; public void Activate() { } - public void Hide() + public virtual void Hide() { - this.Visibility = ViewStates.Invisible; + _view.Visibility = ViewStates.Invisible; } public void SetSystemDecorations(bool enabled) @@ -107,7 +104,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public void Invalidate(Rect rect) { - if (Holder?.Surface?.IsValid == true) base.Invalidate(); + if (_view.Holder?.Surface?.IsValid == true) _view.Invalidate(); } public Point PointToClient(Point point) @@ -134,9 +131,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform { } - public void Show() + public virtual void Show() { - this.Visibility = ViewStates.Visible; + _view.Visibility = ViewStates.Visible; } public void BeginMoveDrag() @@ -149,43 +146,80 @@ namespace Avalonia.Android.Platform.SkiaPlatform //Not supported } - public Point Position { get; set; } + public virtual Point Position { get; set; } public double Scaling => 1; - public IDisposable ShowDialog() + void Draw() { - throw new NotImplementedException(); + Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); } - public override bool DispatchTouchEvent(MotionEvent e) + public void SetIcon(IWindowIconImpl icon) { - bool callBase; - bool? result = _touchHelper.DispatchTouchEvent(e, out callBase); - bool baseResult = callBase ? base.DispatchTouchEvent(e) : false; - - return result != null ? result.Value : baseResult; + // No window icons for mobile platforms } - public override bool DispatchKeyEvent(KeyEvent e) + public virtual void Dispose() { - bool callBase; - bool? res = _keyboardHelper.DispatchKeyEvent(e, out callBase); - bool baseResult = callBase ? base.DispatchKeyEvent(e) : false; - - return res != null ? res.Value : baseResult; + _view.Dispose(); + _view = null; } - - protected override void Draw() + + protected virtual void OnResized(Size size) { - Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); + Resized?.Invoke(size); } - public void SetIcon(IWindowIconImpl icon) + class ViewImpl : InvalidationAwareSurfaceView, ISurfaceHolderCallback { - // No window icons for mobile platforms + private readonly TopLevelImpl _tl; + private Size _oldSize; + public ViewImpl(Context context, TopLevelImpl tl, bool placeOnTop) : base(context) + { + _tl = tl; + if (placeOnTop) + SetZOrderOnTop(true); + } + + protected override void Draw() + { + _tl.Draw(); + } + + public override bool DispatchTouchEvent(MotionEvent e) + { + bool callBase; + bool? result = _tl._touchHelper.DispatchTouchEvent(e, out callBase); + bool baseResult = callBase ? base.DispatchTouchEvent(e) : false; + + return result != null ? result.Value : baseResult; + } + + public override bool DispatchKeyEvent(KeyEvent e) + { + bool callBase; + bool? res = _tl._keyboardHelper.DispatchKeyEvent(e, out callBase); + bool baseResult = callBase ? base.DispatchKeyEvent(e) : false; + + return res != null ? res.Value : baseResult; + } + + + void ISurfaceHolderCallback.SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) + { + var newSize = new Size(width, height); + + if (newSize != _oldSize) + { + _oldSize = newSize; + _tl.OnResized(newSize); + } + + base.SurfaceChanged(holder, format, width, height); + } } - ILockedFramebuffer IFramebufferPlatformSurface.Lock()=>new AndroidFramebuffer(Holder.Surface); + ILockedFramebuffer IFramebufferPlatformSurface.Lock()=>new AndroidFramebuffer(_view.Holder.Surface); } } \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs index 7bac0ff814..ab990066de 100644 --- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs +++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs @@ -12,7 +12,7 @@ using System.ComponentModel; namespace Avalonia.Android.Platform.Specific.Helpers { - public class AndroidKeyboardEventsHelper : IDisposable where TView : View, ITopLevelImpl, IAndroidView + public class AndroidKeyboardEventsHelper : IDisposable where TView :ITopLevelImpl, IAndroidView { private TView _view; private IInputElement _lastFocusedElement; @@ -90,7 +90,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers private void TryShowHideKeyboard(IInputElement element, bool value) { - var input = _view.Context.GetSystemService(Context.InputMethodService).JavaCast(); + var input = _view.View.Context.GetSystemService(Context.InputMethodService).JavaCast(); if (value) { @@ -102,7 +102,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers else { //hide keyboard - input.HideSoftInputFromWindow(_view.WindowToken, HideSoftInputFlags.None); + input.HideSoftInputFromWindow(_view.View.WindowToken, HideSoftInputFlags.None); } } diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs index a448044ee6..702829b91c 100644 --- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs +++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs @@ -8,7 +8,7 @@ using System; namespace Avalonia.Android.Platform.Specific.Helpers { - public class AndroidTouchEventsHelper : IDisposable where TView : View, ITopLevelImpl, IAndroidView + public class AndroidTouchEventsHelper : IDisposable where TView : ITopLevelImpl, IAndroidView { private TView _view; public bool HandleEvents { get; set; } @@ -63,10 +63,10 @@ namespace Avalonia.Android.Platform.Specific.Helpers //if point is in view otherwise it's possible avalonia not to find the proper window to dispatch the event _point = _getPointFunc(e); - double x = _view.GetX(); - double y = _view.GetY(); - double r = x + _view.Width; - double b = y + _view.Height; + double x = _view.View.GetX(); + double y = _view.View.GetY(); + double r = x + _view.View.Width; + double b = y + _view.View.Height; if (x <= _point.X && r >= _point.X && y <= _point.Y && b >= _point.Y) { diff --git a/src/Avalonia.Controls/AppBuilderBase.cs b/src/Avalonia.Controls/AppBuilderBase.cs index c53cca19d1..b098c270a5 100644 --- a/src/Avalonia.Controls/AppBuilderBase.cs +++ b/src/Avalonia.Controls/AppBuilderBase.cs @@ -60,10 +60,10 @@ namespace Avalonia.Controls /// public Action BeforeStartCallback { get; private set; } = builder => { }; - protected AppBuilderBase(IRuntimePlatform platform, Action platformSevices) + protected AppBuilderBase(IRuntimePlatform platform, Action platformSevices) { RuntimePlatform = platform; - RuntimePlatformServicesInitializer = platformSevices; + RuntimePlatformServicesInitializer = () => platformSevices((TAppBuilder)this); } /// diff --git a/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs b/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs index 3385e25d4f..f643bfe6e2 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs +++ b/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs @@ -17,7 +17,8 @@ namespace Avalonia /// Initializes a new instance of the class. /// public AppBuilder() - : base(new StandardRuntimePlatform(), () => StandardRuntimePlatformServices.Register()) + : base(new StandardRuntimePlatform(), + builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType()?.Assembly)) { } diff --git a/src/Skia/Avalonia.Skia/BitmapImpl.cs b/src/Skia/Avalonia.Skia/BitmapImpl.cs index 232f2721e1..7d99156a1d 100644 --- a/src/Skia/Avalonia.Skia/BitmapImpl.cs +++ b/src/Skia/Avalonia.Skia/BitmapImpl.cs @@ -63,7 +63,10 @@ namespace Avalonia.Skia private static SKSurface CreateSurface(SKBitmap bitmap) { IntPtr length; - return SKSurface.Create(bitmap.Info, bitmap.GetPixels(out length), bitmap.RowBytes); + var rv = SKSurface.Create(bitmap.Info, bitmap.GetPixels(out length), bitmap.RowBytes); + if (rv == null) + throw new Exception("Unable to create Skia surface"); + return rv; } public BitmapDrawingContext(SKSurface surface) : base(surface.Canvas) From b2a0f150f246906effd098bf5665bb1828bc2523 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Feb 2017 21:34:58 +0300 Subject: [PATCH 03/95] Fixed AppBuilder for net core --- src/Avalonia.DotNetCoreRuntime/AppBuilder.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.DotNetCoreRuntime/AppBuilder.cs b/src/Avalonia.DotNetCoreRuntime/AppBuilder.cs index 5a6b82573b..2b9b3083b1 100644 --- a/src/Avalonia.DotNetCoreRuntime/AppBuilder.cs +++ b/src/Avalonia.DotNetCoreRuntime/AppBuilder.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Avalonia.Controls; @@ -15,7 +16,9 @@ namespace Avalonia /// Initializes a new instance of the class. /// public AppBuilder() - : base(new StandardRuntimePlatform(), () => StandardRuntimePlatformServices.Register()) + : base(new StandardRuntimePlatform(), + builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType() + ?.GetTypeInfo().Assembly)) { } From 185a42ea095d4aa92c490e66af60c7a8ac22dfcc Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Feb 2017 21:39:21 +0300 Subject: [PATCH 04/95] Fixed references for Avalonia.AndroidTestApplication --- .../Avalonia.AndroidTestApplication.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj index 0e94cecc2d..d09f162150 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj +++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj @@ -171,10 +171,6 @@ {3e10a5fa-e8da-48b1-ad44-6a5b6cb7750f} Avalonia.Themes.Default - - {4a1abb09-9047-4bd5-a4ad-a055e52c5ee0} - Avalonia.DotNetFrameworkRuntime - {5fb2b005-0a7f-4dad-add4-3ed01444e63d} Avalonia.HtmlRenderer From f2f30fe0068f7c739ea9fe39c6edb6f214827a29 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Feb 2017 23:47:08 +0300 Subject: [PATCH 05/95] Implemented WindowState for GTK3 --- src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 21 +++++++++++++ src/Gtk/Avalonia.Gtk3/WindowImpl.cs | 41 ++++++++++++++++++++----- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index cffdebeeab..45c197e71d 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -156,6 +156,22 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate IntPtr gdk_window_get_pointer(IntPtr raw, out int x, out int y, out int mask); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate GdkWindowState gdk_window_get_state(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_iconify(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_deiconify(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_maximize(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_unmaximize(IntPtr window); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate void gtk_window_set_geometry_hints(GtkWindow window, IntPtr geometry_widget, ref GdkGeometry geometry, GdkWindowHints geom_mask); @@ -303,6 +319,11 @@ namespace Avalonia.Gtk3.Interop public static D.gdk_cursor_new GdkCursorNew; public static D.gdk_window_get_origin GdkWindowGetOrigin; public static D.gdk_window_get_pointer GdkWindowGetPointer; + public static D.gdk_window_get_state GdkWindowGetState; + public static D.gdk_window_iconify GdkWindowIconify; + public static D.gdk_window_deiconify GdkWindowDeiconify; + public static D.gdk_window_maximize GdkWindowMaximize; + public static D.gdk_window_unmaximize GdkWindowUnmaximize; public static D.gdk_window_begin_move_drag GdkWindowBeginMoveDrag; public static D.gdk_window_begin_resize_drag GdkWindowBeginResizeDrag; public static D.gdk_event_request_motions GdkEventRequestMotions; diff --git a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs index d1a689b75f..631944872f 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs @@ -7,21 +7,42 @@ namespace Avalonia.Gtk3 { class WindowImpl : TopLevelImpl, IWindowImpl { - public WindowState WindowState { get; set; } //STUB + public WindowImpl() : base(Native.GtkWindowNew(GtkWindowType.TopLevel)) + { + } + public void SetTitle(string title) { using (var t = new Utf8Buffer(title)) Native.GtkWindowSetTitle(GtkWidget, t); } - class EmptyDisposable : IDisposable + public WindowState WindowState { - public void Dispose() + get + { + var state = Native.GdkWindowGetState(Native.GtkWidgetGetWindow(GtkWidget)); + if (state.HasFlag(GdkWindowState.Iconified)) + return WindowState.Minimized; + if (state.HasFlag(GdkWindowState.Maximized)) + return WindowState.Maximized; + return WindowState.Normal; + } + set { - + var w = Native.GtkWidgetGetWindow(GtkWidget); + if (value == WindowState.Minimized) + Native.GdkWindowIconify(w); + else if (value == WindowState.Maximized) + Native.GdkWindowMaximize(w); + else + { + Native.GdkWindowUnmaximize(w); + Native.GdkWindowDeiconify(w); + } } } - + public IDisposable ShowDialog() { Native.GtkWindowSetModal(GtkWidget, true); @@ -33,13 +54,17 @@ namespace Avalonia.Gtk3 public void SetIcon(IWindowIconImpl icon) => Native.GtkWindowSetIcon(GtkWidget, (Pixbuf) icon); - public WindowImpl() : base(Native.GtkWindowNew(GtkWindowType.TopLevel)) + public void SetCoverTaskbarWhenMaximized(bool enable) { + //Why do we even have that? } - public void SetCoverTaskbarWhenMaximized(bool enable) + class EmptyDisposable : IDisposable { - //Why do we even have that? + public void Dispose() + { + + } } } } From 10bf7385456f694587785fafb59f30a8c968ba3f Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Feb 2017 01:07:34 +0300 Subject: [PATCH 06/95] [GTK3] Implemented HiDPI support (needs GTK 3.10) --- src/Gtk/Avalonia.Gtk3/FramebufferManager.cs | 2 +- .../Avalonia.Gtk3/ImageSurfaceFramebuffer.cs | 21 ++++++++++++++++--- src/Gtk/Avalonia.Gtk3/Interop/DynLoader.cs | 10 ++++----- src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 9 ++++++++ src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs | 10 +++++---- src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs | 11 ++++++++-- 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs index 0a0a8fe0a6..1b2317ed6a 100644 --- a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs @@ -26,7 +26,7 @@ namespace Avalonia.Gtk3 throw new InvalidOperationException("Window is not in drawing state"); var width = (int) _window.ClientSize.Width; var height = (int) _window.ClientSize.Height; - return new ImageSurfaceFramebuffer(_window.CurrentCairoContext, width, height); + return new ImageSurfaceFramebuffer(_window.CurrentCairoContext, _window.GtkWidget, width, height); } } } diff --git a/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs b/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs index d1964bf05d..3263018a17 100644 --- a/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs +++ b/src/Gtk/Avalonia.Gtk3/ImageSurfaceFramebuffer.cs @@ -13,12 +13,19 @@ namespace Avalonia.Gtk3 class ImageSurfaceFramebuffer : ILockedFramebuffer { private IntPtr _context; + private readonly GtkWidget _widget; private CairoSurface _surface; + private int _factor; - public ImageSurfaceFramebuffer(IntPtr context, int width, int height) + public ImageSurfaceFramebuffer(IntPtr context, GtkWidget widget, int width, int height) { _context = context; + _widget = widget; + _factor = (int)(Native.GtkWidgetGetScaleFactor?.Invoke(_widget) ?? 1u); + width *= _factor; + height *= _factor; _surface = Native.CairoImageSurfaceCreate(1, width, height); + Width = width; Height = height; Address = Native.CairoImageSurfaceGetData(_surface); @@ -31,6 +38,7 @@ namespace Avalonia.Gtk3 if(_context == IntPtr.Zero || _surface == null) return; Native.CairoSurfaceMarkDirty(_surface); + Native.CairoScale(_context, 1d / _factor, 1d / _factor); Native.CairoSetSourceSurface(_context, _surface, 0, 0); Native.CairoPaint(_context); _context = IntPtr.Zero; @@ -43,8 +51,15 @@ namespace Avalonia.Gtk3 public int Height { get; } public int RowBytes { get; } - //TODO: Proper DPI detect - public Size Dpi => new Size(96, 96); + + public Size Dpi + { + get + { + + return new Size(96, 96) * _factor; + } + } public PixelFormat Format => PixelFormat.Bgra8888; } diff --git a/src/Gtk/Avalonia.Gtk3/Interop/DynLoader.cs b/src/Gtk/Avalonia.Gtk3/Interop/DynLoader.cs index afe526e2c3..93fb82d285 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/DynLoader.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/DynLoader.cs @@ -13,7 +13,7 @@ namespace Avalonia.Gtk3.Interop internal interface IDynLoader { IntPtr LoadLibrary(string dll); - IntPtr GetProcAddress(IntPtr dll, string proc); + IntPtr GetProcAddress(IntPtr dll, string proc, bool optional); } @@ -91,10 +91,10 @@ namespace Avalonia.Gtk3.Interop return handle; } - public IntPtr GetProcAddress(IntPtr dll, string proc) + public IntPtr GetProcAddress(IntPtr dll, string proc, bool optional) { var ptr = DlSym(dll, proc); - if (ptr == IntPtr.Zero) + if (ptr == IntPtr.Zero && !optional) throw new NativeException(DlErrorString()); return ptr; } @@ -118,10 +118,10 @@ namespace Avalonia.Gtk3.Interop throw new NativeException("Error loading " + dll + " error " + err); } - IntPtr IDynLoader.GetProcAddress(IntPtr dll, string proc) + IntPtr IDynLoader.GetProcAddress(IntPtr dll, string proc, bool optional) { var ptr = GetProcAddress(dll, proc); - if (ptr == IntPtr.Zero) + if (ptr == IntPtr.Zero && !optional) throw new NativeException("Error " + Marshal.GetLastWin32Error()); return ptr; } diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index 45c197e71d..9f38861b07 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -50,6 +50,10 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] public delegate IntPtr gtk_widget_get_window(GtkWidget gtkWidget); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk, optional: true)] + public delegate uint gtk_widget_get_scale_factor(GtkWidget gtkWidget); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] public delegate IntPtr gtk_widget_get_screen(GtkWidget gtkWidget); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] @@ -130,6 +134,9 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_set_source_surface(IntPtr cr, CairoSurface surface, double x, double y); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] + public delegate void cairo_scale(IntPtr context, double sx, double sy); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] public delegate void cairo_paint(IntPtr context); @@ -275,6 +282,7 @@ namespace Avalonia.Gtk3.Interop public static D.gtk_widget_hide GtkWidgetHide; public static D.gdk_get_native_handle GetNativeGdkWindowHandle; public static D.gtk_widget_get_window GtkWidgetGetWindow; + public static D.gtk_widget_get_scale_factor GtkWidgetGetScaleFactor; public static D.gtk_widget_get_screen GtkWidgetGetScreen; public static D.gtk_widget_realize GtkWidgetRealize; public static D.gtk_window_get_size GtkWindowGetSize; @@ -343,6 +351,7 @@ namespace Avalonia.Gtk3.Interop public static D.cairo_surface_flush CairoSurfaceFlush; public static D.cairo_surface_destroy CairoSurfaceDestroy; public static D.cairo_set_source_surface CairoSetSourceSurface; + public static D.cairo_scale CairoScale; public static D.cairo_paint CairoPaint; } diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs b/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs index c6b6326f80..cf065b86dc 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Resolver.cs @@ -128,9 +128,11 @@ namespace Avalonia.Gtk3.Interop if(import == null) continue; IntPtr lib = dlls[import.Dll]; - - var funcPtr = loader.GetProcAddress(lib, import.Name ?? fieldInfo.FieldType.Name); - fieldInfo.SetValue(null, Marshal.GetDelegateForFunctionPointer(funcPtr, fieldInfo.FieldType)); + + var funcPtr = loader.GetProcAddress(lib, import.Name ?? fieldInfo.FieldType.Name, import.Optional); + + if (funcPtr != IntPtr.Zero) + fieldInfo.SetValue(null, Marshal.GetDelegateForFunctionPointer(funcPtr, fieldInfo.FieldType)); } var nativeHandleNames = new[] { "gdk_win32_window_get_handle", "gdk_x11_window_get_xid", "gdk_quartz_window_get_nswindow" }; @@ -139,7 +141,7 @@ namespace Avalonia.Gtk3.Interop try { Native.GetNativeGdkWindowHandle = (Native.D.gdk_get_native_handle)Marshal - .GetDelegateForFunctionPointer(loader.GetProcAddress(dlls[GtkDll.Gdk], name), typeof(Native.D.gdk_get_native_handle)); + .GetDelegateForFunctionPointer(loader.GetProcAddress(dlls[GtkDll.Gdk], name, false), typeof(Native.D.gdk_get_native_handle)); break; } catch { } diff --git a/src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs index aadbe16d1d..0063c13910 100644 --- a/src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs @@ -21,6 +21,7 @@ namespace Avalonia.Gtk3 protected readonly List Disposables = new List(); private Size _lastSize; private Point _lastPosition; + private double _lastScaling; private uint _lastKbdEvent; private uint _lastSmoothScrollEvent; @@ -63,7 +64,12 @@ namespace Avalonia.Gtk3 PositionChanged?.Invoke(pos); _lastPosition = pos; } - + var scaling = Scaling; + if (_lastScaling != scaling) + { + ScalingChanged?.Invoke(scaling); + _lastScaling = scaling; + } return false; } @@ -228,7 +234,8 @@ namespace Avalonia.Gtk3 } - public double Scaling => 1; //TODO: Implement scaling + public double Scaling => (double) 1 / (Native.GtkWidgetGetScaleFactor?.Invoke(GtkWidget) ?? 1); + public IPlatformHandle Handle => this; string IPlatformHandle.HandleDescriptor => "HWND"; From b96c2de97b6e19a06e463720366f8fa89350b4e8 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Feb 2017 01:41:17 +0300 Subject: [PATCH 07/95] Moved hiddenPostTransform inside Skia backend --- src/Avalonia.Visuals/Media/DrawingContext.cs | 9 +-------- src/Skia/Avalonia.Skia.iOS/RenderTarget.cs | 4 +--- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 10 ++++++++-- src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs | 5 ++--- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/Avalonia.Visuals/Media/DrawingContext.cs b/src/Avalonia.Visuals/Media/DrawingContext.cs index ddaa681bab..3d6f14cfce 100644 --- a/src/Avalonia.Visuals/Media/DrawingContext.cs +++ b/src/Avalonia.Visuals/Media/DrawingContext.cs @@ -12,10 +12,6 @@ namespace Avalonia.Media { private readonly IDrawingContextImpl _impl; private int _currentLevel; - //Internal tranformation that is applied but not exposed anywhere - //To be used for DPI scaling, etc - private Matrix? _hiddenPostTransform = Matrix.Identity; - static readonly Stack> StateStackPool = new Stack>(); @@ -39,10 +35,9 @@ namespace Avalonia.Media } } - public DrawingContext(IDrawingContextImpl impl, Matrix? hiddenPostTransform = null) + public DrawingContext(IDrawingContextImpl impl) { _impl = impl; - _hiddenPostTransform = hiddenPostTransform; } @@ -60,8 +55,6 @@ namespace Avalonia.Media { _currentTransform = value; var transform = _currentTransform*_currentContainerTransform; - if (_hiddenPostTransform.HasValue) - transform = transform*_hiddenPostTransform.Value; _impl.Transform = transform; } } diff --git a/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs b/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs index abe663e44b..d097f35ce1 100644 --- a/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs +++ b/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs @@ -103,9 +103,7 @@ namespace Avalonia.Skia canvas.Clear(SKColors.Red); canvas.ResetMatrix(); - return - new DrawingContext( - new WindowDrawingContextImpl(this)); + return new DrawingContext(new WindowDrawingContextImpl(this)); } public void Present() diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index e72e7514fb..27f5fd815f 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -10,13 +10,16 @@ namespace Avalonia.Skia { internal class DrawingContextImpl : IDrawingContextImpl { + private readonly Matrix? _postTransform; private readonly IDisposable[] _disposables; private Stack maskStack = new Stack(); public SKCanvas Canvas { get; private set; } - public DrawingContextImpl(SKCanvas canvas, params IDisposable[] disposables) + public DrawingContextImpl(SKCanvas canvas, Matrix? postTransform = null, params IDisposable[] disposables) { + if (_postTransform.HasValue && !_postTransform.Value.IsIdentity) + _postTransform = postTransform; _disposables = disposables; Canvas = canvas; Canvas.Clear(); @@ -360,7 +363,10 @@ namespace Avalonia.Skia return; _currentTransform = value; - Canvas.SetMatrix(value.ToSKMatrix()); + var transform = value; + if (_postTransform.HasValue) + transform *= _postTransform.Value; + Canvas.SetMatrix(transform.ToSKMatrix()); } } } diff --git a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs index 7aa487808a..b273d6209f 100644 --- a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs @@ -89,9 +89,8 @@ namespace Avalonia.Skia canvas.Save(); canvas.Clear(SKColors.Red); canvas.ResetMatrix(); - - return new DrawingContext(new DrawingContextImpl(canvas, canvas, surface, shim, fb), - Matrix.CreateScale(fb.Dpi.Width / 96, fb.Dpi.Height / 96)); + var scale = Matrix.CreateScale(fb.Dpi.Width / 96, fb.Dpi.Height / 96); + return new DrawingContext(new DrawingContextImpl(canvas, scale, canvas, surface, shim, fb)); } } } From 7e163ef3104ec6adb27edd0f1a6ee3edbc4cb448 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Feb 2017 21:25:08 +0300 Subject: [PATCH 08/95] Somewhat fixed iOS. Now also using framebuffer model --- Avalonia.sln | 34 --- samples/ControlCatalog.iOS/AppDelegate.cs | 11 +- .../ControlCatalog.iOS.csproj | 17 +- src/Shared/PlatformSupport/AssetLoader.cs | 18 +- .../Avalonia.Skia.iOS.TestApp/AppDelegate.cs | 74 ------ .../Avalonia.Skia.iOS.TestApp.csproj | 143 ---------- ...valonia.Skia.iOS.TestApp.v2.ncrunchproject | 26 -- .../Entitlements.plist | 5 - .../GettingStarted.Xamarin | 4 - src/Skia/Avalonia.Skia.iOS.TestApp/Info.plist | 42 --- src/Skia/Avalonia.Skia.iOS.TestApp/Main.cs | 15 -- .../Avalonia.Skia.iOS.TestApp/MainView.cs | 77 ------ .../Properties/AssemblyInfo.cs | 36 --- .../Resources/LaunchScreen.xib | 43 --- .../PlatformRenderingInterfaceIos.cs | 6 +- src/iOS/Avalonia.iOS/AppBuilder.cs | 21 ++ src/iOS/Avalonia.iOS/Avalonia.iOS.csproj | 11 +- .../AvaloniaRootViewController.cs | 58 ++++ src/iOS/Avalonia.iOS/AvaloniaView.cs | 248 ++---------------- src/iOS/Avalonia.iOS/AvaloniaWindow.cs | 31 +++ src/iOS/Avalonia.iOS/DisplayLinkRenderLoop.cs | 35 +++ src/iOS/Avalonia.iOS/EmbeddableImpl.cs | 28 ++ src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs | 59 +++++ src/iOS/Avalonia.iOS/Extensions.cs | 10 + .../PlatformThreadingInterface.cs | 106 +++----- .../Specific/KeyboardEventsHelper.cs | 2 +- src/iOS/Avalonia.iOS/TopLevelImpl.cs | 192 ++++++++++++++ src/iOS/Avalonia.iOS/WindowingPlatformImpl.cs | 14 +- src/iOS/Avalonia.iOS/iOSPlatform.cs | 14 +- .../AppDelegate.cs | 16 +- .../Avalonia.iOSTestApplication.csproj | 6 + .../SimpleApp.xaml | 6 + .../SimpleApp.xaml.cs | 20 ++ .../SimpleControl.cs | 20 ++ 34 files changed, 605 insertions(+), 843 deletions(-) delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/AppDelegate.cs delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.v2.ncrunchproject delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Entitlements.plist delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/GettingStarted.Xamarin delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Info.plist delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Main.cs delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/MainView.cs delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Properties/AssemblyInfo.cs delete mode 100644 src/Skia/Avalonia.Skia.iOS.TestApp/Resources/LaunchScreen.xib create mode 100644 src/iOS/Avalonia.iOS/AppBuilder.cs create mode 100644 src/iOS/Avalonia.iOS/AvaloniaRootViewController.cs create mode 100644 src/iOS/Avalonia.iOS/AvaloniaWindow.cs create mode 100644 src/iOS/Avalonia.iOS/DisplayLinkRenderLoop.cs create mode 100644 src/iOS/Avalonia.iOS/EmbeddableImpl.cs create mode 100644 src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs create mode 100644 src/iOS/Avalonia.iOS/TopLevelImpl.cs create mode 100644 src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml create mode 100644 src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml.cs create mode 100644 src/iOS/Avalonia.iOSTestApplication/SimpleControl.cs diff --git a/Avalonia.sln b/Avalonia.sln index 4e897b86c7..905970433c 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -99,8 +99,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Skia.Desktop", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Skia.Android", "src\Skia\Avalonia.Skia.Android\Avalonia.Skia.Android.csproj", "{BD43F7C0-396B-4AA1-BAD9-DFDE54D51298}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Skia.iOS.TestApp", "src\Skia\Avalonia.Skia.iOS.TestApp\Avalonia.Skia.iOS.TestApp.csproj", "{DA49C5F3-BE95-461C-B999-072128CCF59E}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Skia.iOS", "src\Skia\Avalonia.Skia.iOS\Avalonia.Skia.iOS.csproj", "{47BE08A7-5985-410B-9FFC-2264B8EA595F}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Android", "Android", "{7CF9789C-F1D3-4D0E-90E5-F1DF67A2753F}" @@ -178,15 +176,12 @@ Global tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13 src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4 - src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{811a76cf-1cf6-440f-963b-bbe31bd72a82}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{925dd807-b651-475f-9f7c-cbeb974ce43d}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{925dd807-b651-475f-9f7c-cbeb974ce43d}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 - src\Shared\RenderHelpers\RenderHelpers.projitems*{bd43f7c0-396b-4aa1-bad9-dfde54d51298}*SharedItemsImports = 4 - src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{bd43f7c0-396b-4aa1-bad9-dfde54d51298}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{d35a9f3d-8bb0-496e-bf72-444038a7debb}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{dabfd304-d6a4-4752-8123-c2ccf7ac7831}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{e106cf37-4066-4615-b684-172a6d30b058}*SharedItemsImports = 4 @@ -1486,34 +1481,6 @@ Global {BD43F7C0-396B-4AA1-BAD9-DFDE54D51298}.Release|Mono.ActiveCfg = Release|Any CPU {BD43F7C0-396B-4AA1-BAD9-DFDE54D51298}.Release|x86.ActiveCfg = Release|Any CPU {BD43F7C0-396B-4AA1-BAD9-DFDE54D51298}.Release|x86.Build.0 = Release|Any CPU - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|Mono.ActiveCfg = Ad-Hoc|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|iPhone.ActiveCfg = AppStore|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|iPhone.Build.0 = AppStore|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|Mono.ActiveCfg = AppStore|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.AppStore|x86.ActiveCfg = AppStore|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|Any CPU.ActiveCfg = Debug|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|iPhone.ActiveCfg = Debug|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|iPhone.Build.0 = Debug|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|Mono.ActiveCfg = Debug|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|Any CPU.ActiveCfg = Release|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|iPhone.ActiveCfg = Release|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|iPhone.Build.0 = Release|iPhone - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|Mono.ActiveCfg = Release|iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E}.Release|x86.ActiveCfg = Release|iPhoneSimulator {47BE08A7-5985-410B-9FFC-2264B8EA595F}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU {47BE08A7-5985-410B-9FFC-2264B8EA595F}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU {47BE08A7-5985-410B-9FFC-2264B8EA595F}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU @@ -2502,7 +2469,6 @@ Global {2F59F3D0-748D-4652-B01E-E0D954756308} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E} {925DD807-B651-475F-9F7C-CBEB974CE43D} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E} {BD43F7C0-396B-4AA1-BAD9-DFDE54D51298} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E} - {DA49C5F3-BE95-461C-B999-072128CCF59E} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E} {47BE08A7-5985-410B-9FFC-2264B8EA595F} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E} {7B92AF71-6287-4693-9DCB-BD5B6E927E23} = {7CF9789C-F1D3-4D0E-90E5-F1DF67A2753F} {FF69B927-C545-49AE-8E16-3D14D621AA12} = {7CF9789C-F1D3-4D0E-90E5-F1DF67A2753F} diff --git a/samples/ControlCatalog.iOS/AppDelegate.cs b/samples/ControlCatalog.iOS/AppDelegate.cs index 1871facf55..a8fc6b30a0 100644 --- a/samples/ControlCatalog.iOS/AppDelegate.cs +++ b/samples/ControlCatalog.iOS/AppDelegate.cs @@ -2,6 +2,8 @@ using Foundation; using UIKit; using Avalonia; using Avalonia.Controls; +using Avalonia.iOS; +using Avalonia.Media; namespace ControlCatalog { @@ -11,6 +13,8 @@ namespace ControlCatalog [Register("AppDelegate")] public partial class AppDelegate : UIApplicationDelegate { + public override UIWindow Window { get; set; } + // // This method is invoked when the application has loaded and is ready to run. In this // method you should instantiate the window, load the UI into it and then make the window @@ -22,10 +26,9 @@ namespace ControlCatalog { AppBuilder.Configure() .UseiOS() - .UseSkiaViewHost() - .UseSkia() - .Start(); - + .UseSkia().SetupWithoutStarting(); + Window = new AvaloniaWindow() {Content = new MainView(), StatusBarColor = Colors.LightSteelBlue}; + Window.MakeKeyAndVisible(); return true; } } diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj index 1c4d31b62c..d0c73b2553 100644 --- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj +++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj @@ -20,8 +20,21 @@ 4 false i386 - None - true + SdkOnly + True + 9.1 + False + False + False + False + False + False + False + False + True + Default + HttpClientHandler + False none diff --git a/src/Shared/PlatformSupport/AssetLoader.cs b/src/Shared/PlatformSupport/AssetLoader.cs index 8da663f554..bbf19f731d 100644 --- a/src/Shared/PlatformSupport/AssetLoader.cs +++ b/src/Shared/PlatformSupport/AssetLoader.cs @@ -85,7 +85,7 @@ namespace Avalonia.Shared.PlatformSupport { var asm = GetAssembly(uri) ?? GetAssembly(baseUri) ?? _defaultAssembly; - if (asm == null && _defaultAssembly == null) + if (asm == null) { throw new ArgumentException( "No default assembly, entry assembly or explicit assembly specified; " + @@ -95,17 +95,6 @@ namespace Avalonia.Shared.PlatformSupport IAssetDescriptor rv; var resourceKey = uri.AbsolutePath; - -#if __IOS__ - // TODO: HACK: to get iOS up and running. Using Shared projects for resources - // is flawed as this alters the reource key locations across platforms - // I think we need to use Portable libraries from now on to avoid that. - if(asm.Name.Contains("iOS")) - { - resourceKey = resourceKey.Replace("TestApplication", "Avalonia.iOSTestApplication"); - } -#endif - asm.Resources.TryGetValue(resourceKey, out rv); return rv; } @@ -150,7 +139,10 @@ namespace Avalonia.Shared.PlatformSupport // #if NETSTANDARD AssemblyNameCache[name] = rv = new AssemblyDescriptor(Assembly.Load(new AssemblyName(name))); -#elif !__IOS__ +#elif __IOS__ + throw new InvalidOperationException( + $"Assembly {name} needs to be referenced and explicitly loaded before loading resources"); +#else AssemblyNameCache[name] = rv = new AssemblyDescriptor(Assembly.Load(name)); #endif } diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/AppDelegate.cs b/src/Skia/Avalonia.Skia.iOS.TestApp/AppDelegate.cs deleted file mode 100644 index b40a253c99..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/AppDelegate.cs +++ /dev/null @@ -1,74 +0,0 @@ -using Foundation; -using UIKit; - -namespace Avalonia.Skia.iOS.TestApp -{ - // The UIApplicationDelegate for the application. This class is responsible for launching the - // User Interface of the application, as well as listening (and optionally responding) to application events from iOS. - [Register("AppDelegate")] - public class AppDelegate : UIApplicationDelegate - { - // class-level declarations - - public override UIWindow Window - { - get; - set; - } - - class Controller : UIViewController - { - public override void LoadView() - { - View = new MainView(); - } - } - - public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) - { - // create a new window instance based on the screen size - Window = new UIWindow(UIScreen.MainScreen.Bounds); - - // If you have defined a root view controller, set it here: - Window.RootViewController = new Controller(); - - // make the window visible - Window.MakeKeyAndVisible(); - - return true; - } - - public override void OnResignActivation(UIApplication application) - { - // Invoked when the application is about to move from active to inactive state. - // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) - // or when the user quits the application and it begins the transition to the background state. - // Games should use this method to pause the game. - } - - public override void DidEnterBackground(UIApplication application) - { - // Use this method to release shared resources, save user data, invalidate timers and store the application state. - // If your application supports background exection this method is called instead of WillTerminate when the user quits. - } - - public override void WillEnterForeground(UIApplication application) - { - // Called as part of the transiton from background to active state. - // Here you can undo many of the changes made on entering the background. - } - - public override void OnActivated(UIApplication application) - { - // Restart any tasks that were paused (or not yet started) while the application was inactive. - // If the application was previously in the background, optionally refresh the user interface. - } - - public override void WillTerminate(UIApplication application) - { - // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground. - } - } -} - - diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj b/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj deleted file mode 100644 index 9cef634048..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj +++ /dev/null @@ -1,143 +0,0 @@ - - - - Debug - iPhoneSimulator - {DA49C5F3-BE95-461C-B999-072128CCF59E} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - Avalonia.Skia.iOS.TestApp - Resources - AvaloniaSkiaiOSTestApp - - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - i386 - SdkOnly - true - - - none - true - bin\iPhoneSimulator\Release - prompt - 4 - None - i386 - false - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARMv7, ARM64 - Entitlements.plist - iPhone Developer - true - - - - - - - none - true - bin\iPhone\Release - prompt - 4 - Entitlements.plist - ARMv7, ARM64 - false - iPhone Developer - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARMv7, ARM64 - Entitlements.plist - True - Automatic:AdHoc - iPhone Distribution - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARMv7, ARM64 - Entitlements.plist - Automatic:AppStore - iPhone Distribution - - - - - - - - - - - - - - - - - - - - {d211e587-d8bc-45b9-95a4-f297c8fa5200} - Avalonia.Animation - - - {b09b78d8-9b26-48b0-9149-d64a2f120f3f} - Avalonia.Base - - - {d2221c82-4a25-4583-9b43-d791e3f6820c} - Avalonia.Controls - - - {62024b2d-53eb-4638-b26b-85eeaa54866e} - Avalonia.Input - - - {42472427-4774-4c81-8aff-9f27b8e31721} - Avalonia.Layout - - - {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.Visuals - - - {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} - Avalonia.Styling - - - {47be08a7-5985-410b-9ffc-2264b8ea595f} - Avalonia.Skia.iOS - false - false - - - - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.v2.ncrunchproject b/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Entitlements.plist b/src/Skia/Avalonia.Skia.iOS.TestApp/Entitlements.plist deleted file mode 100644 index 0c67376eba..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Entitlements.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/GettingStarted.Xamarin b/src/Skia/Avalonia.Skia.iOS.TestApp/GettingStarted.Xamarin deleted file mode 100644 index 810f716685..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/GettingStarted.Xamarin +++ /dev/null @@ -1,4 +0,0 @@ - - GS\iOS\CS\iOSApp\GettingStarted.html - false - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Info.plist b/src/Skia/Avalonia.Skia.iOS.TestApp/Info.plist deleted file mode 100644 index ca8cbf88f9..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - CFBundleDisplayName - Avalonia.Skia.iOS.TestApp - CFBundleIdentifier - com.companyname.Avalonia.Skia.iOS.TestApp - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - MinimumOSVersion - 8.0 - UIDeviceFamily - - 1 - 2 - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Main.cs b/src/Skia/Avalonia.Skia.iOS.TestApp/Main.cs deleted file mode 100644 index 3f73331c9e..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Main.cs +++ /dev/null @@ -1,15 +0,0 @@ -using UIKit; - -namespace Avalonia.Skia.iOS.TestApp -{ - public class Application - { - // This is the main entry point of the application. - static void Main(string[] args) - { - // if you want to use a different Application Delegate class from "AppDelegate" - // you can specify it here. - UIApplication.Main(args, null, "AppDelegate"); - } - } -} \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/MainView.cs b/src/Skia/Avalonia.Skia.iOS.TestApp/MainView.cs deleted file mode 100644 index c27f54b277..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/MainView.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Diagnostics; -using System.Drawing; -using CoreAnimation; -using CoreGraphics; -using CoreMedia; -using Foundation; -using Avalonia.Media; -using Avalonia.Platform; -using UIKit; - -namespace Avalonia.Skia.iOS.TestApp -{ - [Register("MainView")] - public class MainView : SkiaView - { - private IRenderTarget _target; - FormattedText _text; - public MainView() - { - AutoresizingMask = UIViewAutoresizing.All; - SkiaPlatform.Initialize(); - _target = AvaloniaLocator.Current.GetService() - .CreateRenderTarget(AvaloniaPlatformHandle); - UpdateText(0); - } - double _radians = 0; - - - void UpdateText(int fps) - { - _text?.Dispose(); - _text = new FormattedText("FPS: " + fps, "Arial", 15, FontStyle.Normal, TextAlignment.Left, - FontWeight.Normal); - } - - double _lastFps; - int _frames; - Stopwatch St = Stopwatch.StartNew(); - protected override void Draw() - { - _radians += 0.02; - var scale = UIScreen.MainScreen.Scale; - int width = (int) (Bounds.Width*scale), height = (int) (Bounds.Height*scale); - using (var ctx = _target.CreateDrawingContext()) - { - ctx.FillRectangle(Brushes.Green, new Rect(0, 0, width, height)); - ctx.DrawText(Brushes.Red, new Point(50, 50), _text); - var rc = new Rect(0, 0, width/3, height/3); - using (ctx.PushPostTransform( - Avalonia.Matrix.CreateTranslation(-width/6, -width/6)* - Avalonia.Matrix.CreateRotation(_radians)* - Avalonia.Matrix.CreateTranslation(width/2, height/2))) - { - ctx.FillRectangle(new LinearGradientBrush() - { - GradientStops = - { - new GradientStop() {Color = Colors.Blue}, - new GradientStop(Colors.Red, 1) - } - }, rc, 5); - } - } - _frames++; - var now = St.Elapsed.TotalSeconds; - var elapsed = now - _lastFps; - if (elapsed > 1) - { - UpdateText((int) (_frames/elapsed)); - _frames = 0; - _lastFps = now; - } - DrawOnNextFrame(); - } - } -} \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Properties/AssemblyInfo.cs b/src/Skia/Avalonia.Skia.iOS.TestApp/Properties/AssemblyInfo.cs deleted file mode 100644 index 666846c18a..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Avalonia.Skia.iOS.TestApp")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Avalonia.Skia.iOS.TestApp")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("da49c5f3-be95-461c-b999-072128ccf59e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Resources/LaunchScreen.xib b/src/Skia/Avalonia.Skia.iOS.TestApp/Resources/LaunchScreen.xib deleted file mode 100644 index 3f72070c91..0000000000 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Resources/LaunchScreen.xib +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs b/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs index fdc7389800..64bd67eee9 100644 --- a/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs +++ b/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using Avalonia.Controls.Platform.Surfaces; using Avalonia.Platform; using Foundation; using UIKit; @@ -12,7 +13,10 @@ namespace Avalonia.Skia { public IRenderTarget CreateRenderTarget(IEnumerable surfaces) { - return new WindowRenderTarget(); + var fb = surfaces?.OfType().FirstOrDefault(); + if (fb == null) + throw new Exception("Avalonia.Skia.Deskop currently only supports framebuffer render target"); + return new FramebufferRenderTarget(fb); } } } \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/AppBuilder.cs b/src/iOS/Avalonia.iOS/AppBuilder.cs new file mode 100644 index 0000000000..06ac7ed6cd --- /dev/null +++ b/src/iOS/Avalonia.iOS/AppBuilder.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Avalonia.Controls; +using Avalonia.Platform; +using Avalonia.Shared.PlatformSupport; +using Foundation; +using UIKit; + +namespace Avalonia +{ + public class AppBuilder : AppBuilderBase + { + public AppBuilder() : base(new StandardRuntimePlatform(), + builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType().Assembly)) + { + + } + } +} \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index cbe17022b1..d7cba35d29 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -23,6 +23,7 @@ false true iPhone Developer + true none @@ -32,13 +33,21 @@ 4 false iPhone Developer + true + + + + + + + - + diff --git a/src/iOS/Avalonia.iOS/AvaloniaRootViewController.cs b/src/iOS/Avalonia.iOS/AvaloniaRootViewController.cs new file mode 100644 index 0000000000..52f55d6574 --- /dev/null +++ b/src/iOS/Avalonia.iOS/AvaloniaRootViewController.cs @@ -0,0 +1,58 @@ +using Avalonia.Media; +using CoreGraphics; +using UIKit; + +namespace Avalonia.iOS +{ + class AvaloniaRootViewController : UIViewController + { + private object _content; + private Color _statusBarColor = Colors.White; + + public object Content + { + get { return _content; } + set + { + _content = value; + var view = (View as AvaloniaView); + if (view != null) + view.Content = value; + } + } + + public Color StatusBarColor + { + get { return _statusBarColor; } + set + { + _statusBarColor = value; + var view = (View as AvaloniaView); + if (view != null) + view.BackgroundColor = value.ToUiColor(); + } + } + + void AutoFit() + { + var needFlip = !UIDevice.CurrentDevice.CheckSystemVersion(8, 0) && + (InterfaceOrientation == UIInterfaceOrientation.LandscapeLeft + || InterfaceOrientation == UIInterfaceOrientation.LandscapeRight); + // Bounds here (if top level) needs to correspond with the rendertarget + var frame = UIScreen.MainScreen.Bounds; + if (needFlip) + frame = new CGRect(frame.Y, frame.X, frame.Height, frame.Width); + ((AvaloniaView) View).Padding = + new Thickness(0, UIApplication.SharedApplication.StatusBarFrame.Size.Height, 0, 0); + View.Frame = frame; + } + + public override void LoadView() + { + View = new AvaloniaView() {Content = Content, BackgroundColor = _statusBarColor.ToUiColor()}; + UIApplication.Notifications.ObserveDidChangeStatusBarOrientation(delegate { AutoFit(); }); + UIApplication.Notifications.ObserveDidChangeStatusBarFrame(delegate { AutoFit(); }); + AutoFit(); + } + } +} \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/AvaloniaView.cs b/src/iOS/Avalonia.iOS/AvaloniaView.cs index f9df1fac5e..d70a31a706 100644 --- a/src/iOS/Avalonia.iOS/AvaloniaView.cs +++ b/src/iOS/Avalonia.iOS/AvaloniaView.cs @@ -1,249 +1,51 @@ -using System; +using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reactive.Disposables; using System.Text; -using CoreAnimation; +using Avalonia.Controls.Embedding; using CoreGraphics; -using Foundation; -using Avalonia.Controls.Platform; -using Avalonia.Input; -using Avalonia.Input.Raw; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Skia.iOS; using UIKit; -using Avalonia.iOS.Specific; -using ObjCRuntime; -using Avalonia.Controls; namespace Avalonia.iOS { - [Adopts("UIKeyInput")] - class AvaloniaView : SkiaView, IWindowImpl + public class AvaloniaView : UIView { - private readonly UIWindow _window; - private readonly UIViewController _controller; - private IInputRoot _inputRoot; - private readonly KeyboardEventsHelper _keyboardHelper; - private Point _position; + private EmbeddableImpl _impl; + private EmbeddableControlRoot _root; + private Thickness _padding; - public AvaloniaView(UIWindow window, UIViewController controller) : base(onFrame => PlatformThreadingInterface.Instance.Render = onFrame) + public Thickness Padding { - if (controller == null) throw new ArgumentNullException(nameof(controller)); - _window = window; - _controller = controller; - _keyboardHelper = new KeyboardEventsHelper(this); - AutoresizingMask = UIViewAutoresizing.All; - AutoFit(); - UIApplication.Notifications.ObserveDidChangeStatusBarOrientation(delegate { AutoFit(); }); - UIApplication.Notifications.ObserveDidChangeStatusBarFrame(delegate { AutoFit(); }); - } - - [Export("hasText")] - bool HasText => _keyboardHelper.HasText(); - - [Export("insertText:")] - void InsertText(string text) => _keyboardHelper.InsertText(text); - - [Export("deleteBackward")] - void DeleteBackward() => _keyboardHelper.DeleteBackward(); - - public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder(); - - void AutoFit() - { - var needFlip = !UIDevice.CurrentDevice.CheckSystemVersion(8, 0) && - (_controller.InterfaceOrientation == UIInterfaceOrientation.LandscapeLeft - || _controller.InterfaceOrientation == UIInterfaceOrientation.LandscapeRight); - - // Bounds here (if top level) needs to correspond with the rendertarget - var frame = UIScreen.MainScreen.Bounds; - if (needFlip) - Frame = new CGRect(frame.Y, frame.X, frame.Height, frame.Width); - else - Frame = frame; - } - - public Action Activated { get; set; } - public Action Closed { get; set; } - public Action Deactivated { get; set; } - public Action Input { get; set; } - public Action Paint { get; set; } - public Action Resized { get; set; } - public Action ScalingChanged { get; set; } - public Action PositionChanged { get; set; } - - public IPlatformHandle Handle => AvaloniaPlatformHandle; - - public double Scaling - { - get - { - // This does not appear to make any difference, but on iOS we - // have Retina (x2) and we probably want this eventually - return 1; //UIScreen.MainScreen.Scale; - } - } - - public WindowState WindowState - { - get { return WindowState.Normal; } - set { } - } - - public override void LayoutSubviews() => Resized?.Invoke(ClientSize); - - public Size ClientSize - { - get { return Bounds.Size.ToAvalonia(); } - set { Resized?.Invoke(ClientSize); } - } - - public void Activate() - { - } - - protected override void Draw() - { - Paint?.Invoke(new Rect(new Point(), ClientSize)); - } - - public void Invalidate(Rect rect) => DrawOnNextFrame(); - - public void SetInputRoot(IInputRoot inputRoot) => _inputRoot = inputRoot; - - public Point PointToClient(Point point) => point; - - public Point PointToScreen(Point point) => point; - - public void SetCursor(IPlatformHandle cursor) - { - //Not supported - } - - public void Show() - { - _keyboardHelper.ActivateAutoShowKeybord(); - } - - public void BeginMoveDrag() - { - //Not supported - } - - public void BeginResizeDrag(WindowEdge edge) - { - //Not supported - } - - public Point Position - { - get { return _position; } + get { return _padding; } set { - _position = value; - PositionChanged?.Invoke(_position); + _padding = value; + SetNeedsLayout(); } } - public Size MaxClientSize => Bounds.Size.ToAvalonia(); - - public IEnumerable Surfaces => new object[] { this }; - - public void SetTitle(string title) - { - //Not supported - } - - public IDisposable ShowDialog() + public AvaloniaView() { - //Not supported - return Disposable.Empty; - } - - public void Hide() - { - //Not supported - } - - public void SetSystemDecorations(bool enabled) - { - //Not supported - } - - public override void TouchesEnded(NSSet touches, UIEvent evt) - { - var touch = touches.AnyObject as UITouch; - if (touch != null) - { - var location = touch.LocationInView(this).ToAvalonia(); - - Input?.Invoke(new RawMouseEventArgs( - iOSPlatform.MouseDevice, - (uint)touch.Timestamp, - _inputRoot, - RawMouseEventType.LeftButtonUp, - location, - InputModifiers.None)); - } - } - - Point _touchLastPoint; - public override void TouchesBegan(NSSet touches, UIEvent evt) - { - var touch = touches.AnyObject as UITouch; - if (touch != null) - { - var location = touch.LocationInView(this).ToAvalonia(); - _touchLastPoint = location; - Input?.Invoke(new RawMouseEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, _inputRoot, - RawMouseEventType.Move, location, InputModifiers.None)); - - Input?.Invoke(new RawMouseEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, _inputRoot, - RawMouseEventType.LeftButtonDown, location, InputModifiers.None)); - } - } - - public override void TouchesMoved(NSSet touches, UIEvent evt) - { - var touch = touches.AnyObject as UITouch; - if (touch != null) - { - var location = touch.LocationInView(this).ToAvalonia(); - if (iOSPlatform.MouseDevice.Captured != null) - Input?.Invoke(new RawMouseEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, _inputRoot, - RawMouseEventType.Move, location, InputModifiers.LeftMouseButton)); - else - { - //magic number based on test - correction of 0.02 is working perfect - double correction = 0.02; - - Input?.Invoke(new RawMouseWheelEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, - _inputRoot, location, (location - _touchLastPoint) * correction, InputModifiers.LeftMouseButton)); - } - _touchLastPoint = location; - } + + _impl = new EmbeddableImpl(); + AddSubview(_impl); + BackgroundColor = UIColor.White; + AutoresizingMask = UIViewAutoresizing.All; + _root = new EmbeddableControlRoot(_impl); + _root.Prepare(); } - public void SetIcon(IWindowIconImpl icon) + public override void LayoutSubviews() { + _impl.Frame = new CGRect(Padding.Left, Padding.Top, + Frame.Width - Padding.Left - Padding.Right, + Frame.Height - Padding.Top - Padding.Bottom); } - } - - class AvaloniaViewController : UIViewController - { - public AvaloniaView AvaloniaView { get; } - public AvaloniaViewController(UIWindow window) - { - AvaloniaView = new AvaloniaView(window, this); - } - public override void LoadView() + public object Content { - View = AvaloniaView; + get { return _root.Content; } + set { _root.Content = value; } } } } diff --git a/src/iOS/Avalonia.iOS/AvaloniaWindow.cs b/src/iOS/Avalonia.iOS/AvaloniaWindow.cs new file mode 100644 index 0000000000..d3f88e0e1e --- /dev/null +++ b/src/iOS/Avalonia.iOS/AvaloniaWindow.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Avalonia.Media; +using Foundation; +using UIKit; + +namespace Avalonia.iOS +{ + public sealed class AvaloniaWindow : UIWindow + { + readonly AvaloniaRootViewController _controller = new AvaloniaRootViewController(); + public object Content + { + get { return _controller.Content; } + set { _controller.Content = value; } + } + + public AvaloniaWindow() : base(UIScreen.MainScreen.Bounds) + { + RootViewController = _controller; + } + + public Color StatusBarColor + { + get { return _controller.StatusBarColor; } + set { _controller.StatusBarColor = value; } + } + } +} \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/DisplayLinkRenderLoop.cs b/src/iOS/Avalonia.iOS/DisplayLinkRenderLoop.cs new file mode 100644 index 0000000000..ef045f61bf --- /dev/null +++ b/src/iOS/Avalonia.iOS/DisplayLinkRenderLoop.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Avalonia.Rendering; +using CoreAnimation; +using Foundation; +using UIKit; + +namespace Avalonia.iOS +{ + class DisplayLinkRenderLoop : IRenderLoop + { + public event EventHandler Tick; + private CADisplayLink _link; + public DisplayLinkRenderLoop() + { + + _link = CADisplayLink.Create(OnFrame); + _link.AddToRunLoop(NSRunLoop.Main, NSRunLoop.NSDefaultRunLoopMode); + } + + private void OnFrame() + { + try + { + Tick?.Invoke(this, new EventArgs()); + } + catch (Exception e) + { + //TODO: log + } + } + } +} \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/EmbeddableImpl.cs b/src/iOS/Avalonia.iOS/EmbeddableImpl.cs new file mode 100644 index 0000000000..50a3cd9ec0 --- /dev/null +++ b/src/iOS/Avalonia.iOS/EmbeddableImpl.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Reactive.Disposables; +using System.Text; +using Avalonia.Platform; +using UIKit; + +namespace Avalonia.iOS +{ + class EmbeddableImpl : TopLevelImpl, IEmbeddableWindowImpl + { + public void SetTitle(string title) + { + + } + + public IDisposable ShowDialog() + { + return Disposable.Empty; + } + + public void SetSystemDecorations(bool enabled) + { + } + + public event Action LostFocus; + } +} diff --git a/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs b/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs new file mode 100644 index 0000000000..1baed80ed7 --- /dev/null +++ b/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Avalonia.Controls.Platform.Surfaces; +using CoreGraphics; +using UIKit; + +namespace Avalonia.iOS +{ + + /// + /// This is a bit weird, but CG doesn't provide proper bitmap + /// with lockable bits, but can create one from data pointer + /// So we are using our own buffer here. + /// + class EmulatedFramebuffer : ILockedFramebuffer + { + + public EmulatedFramebuffer(UIView view) + { + var factor = (int) UIScreen.MainScreen.Scale; + var frame = view.Frame; + Width = (int) frame.Width * factor; + Height = (int) frame.Height * factor; + RowBytes = Width * 4; + Dpi = new Size(96, 96) * factor; + Format = PixelFormat.Rgba8888; + Address = Marshal.AllocHGlobal(Height * RowBytes); + } + + public void Dispose() + { + if (Address == IntPtr.Zero) + return; + var nfo = (int) CGBitmapFlags.ByteOrder32Big | (int) CGImageAlphaInfo.PremultipliedLast; + using (var colorSpace = CGColorSpace.CreateDeviceRGB()) + using (var bContext = new CGBitmapContext(Address, Width, Height, 8, Width * 4, + colorSpace, (CGImageAlphaInfo) nfo)) + using (var image = bContext.ToImage()) + using (var context = UIGraphics.GetCurrentContext()) + { + // flip the image for CGContext.DrawImage + context.TranslateCTM(0, Height); + context.ScaleCTM(1, -1); + context.DrawImage(new CGRect(0, 0, Width, Height), image); + } + Marshal.FreeHGlobal(Address); + Address = IntPtr.Zero; + } + + public IntPtr Address { get; private set; } + public int Width { get; } + public int Height { get; } + public int RowBytes { get; } + public Size Dpi { get; } + public PixelFormat Format { get; } + } +} diff --git a/src/iOS/Avalonia.iOS/Extensions.cs b/src/iOS/Avalonia.iOS/Extensions.cs index d2d7c1cfe2..5364129911 100644 --- a/src/iOS/Avalonia.iOS/Extensions.cs +++ b/src/iOS/Avalonia.iOS/Extensions.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Text; +using Avalonia.Media; using CoreGraphics; +using UIKit; namespace Avalonia.iOS { @@ -11,5 +13,13 @@ namespace Avalonia.iOS public static Size ToAvalonia(this CGSize size) => new Size(size.Width, size.Height); public static Point ToAvalonia(this CGPoint point) => new Point(point.X, point.Y); + + static nfloat ColorComponent(byte c) => ((float) c) / 255; + + public static UIColor ToUiColor(this Color color)=>new UIColor( + ColorComponent(color.R), + ColorComponent(color.G), + ColorComponent(color.B), + ColorComponent(color.A)); } } diff --git a/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs b/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs index 4831c23855..e2e72f4c3c 100644 --- a/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs +++ b/src/iOS/Avalonia.iOS/PlatformThreadingInterface.cs @@ -14,91 +14,59 @@ namespace Avalonia.iOS { class PlatformThreadingInterface : IPlatformThreadingInterface { - static Stopwatch St = Stopwatch.StartNew(); - class Timer + private bool _signaled; + public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface(); + public bool CurrentThreadIsLoopThread => NSThread.Current.IsMainThread; + + public event Action Signaled; + public void RunLoop(CancellationToken cancellationToken) { - readonly Action _tick; - readonly TimeSpan _interval; - TimeSpan _nextTick; + //Mobile platforms are using external main loop + throw new NotSupportedException(); + } + /* + class Timer : NSObject + { + private readonly Action _tick; + private NSTimer _timer; - public Timer(Action tick, TimeSpan interval) + public Timer(TimeSpan interval, Action tick) { _tick = tick; - _interval = interval; - _nextTick = St.Elapsed + _interval; + _timer = new NSTimer(NSDate.Now, interval.TotalSeconds, true, OnTick); } - public void Tick(TimeSpan now) + [Export("onTick")] + private void OnTick(NSTimer nsTimer) { - if (now > _nextTick) - { - _nextTick = now + _interval; - _tick(); - } + _tick(); } - } - readonly List _timers = new List(); - bool _signaled; - readonly object _lock = new object(); - private CADisplayLink _link; - public Action Render { get; set; } - - PlatformThreadingInterface() - { - // For some reason it doesn't work when I specify OnFrame method directly - // ReSharper disable once ConvertClosureToMethodGroup - (_link = CADisplayLink.Create(() => OnFrame())).AddToRunLoop(NSRunLoop.Main, NSRunLoop.NSDefaultRunLoopMode); - } - - private void OnFrame() - { - var now = St.Elapsed; - List timers; - lock (_lock) - timers = _timers.ToList(); - - foreach (var timer in timers) - timer.Tick(now); - - do + protected override void Dispose(bool disposing) { - lock (_lock) - if (!_signaled) - break; - else - _signaled = false; - Signaled?.Invoke(); - } while (false); - Render?.Invoke(); - } - - public void RunLoop(CancellationToken cancellationToken) - { - } + if(disposing) + _timer.Dispose(); + base.Dispose(disposing); + } + }*/ public IDisposable StartTimer(TimeSpan interval, Action tick) - { - lock (_lock) - { - var timer = new Timer(tick, interval); - _timers.Add(timer); - return Disposable.Create(() => - { - lock (_lock) _timers.Remove(timer); - }); - } - } + => NSTimer.CreateRepeatingScheduledTimer(interval, _ => tick()); public void Signal() { - lock (_lock) + lock (this) + { + if(_signaled) + return; _signaled = true; + } + NSRunLoop.Main.BeginInvokeOnMainThread(() => + { + lock (this) + _signaled = false; + Signaled?.Invoke(); + }); } - - public bool CurrentThreadIsLoopThread => NSThread.Current.IsMainThread; - public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface(); - - public event Action Signaled; } } diff --git a/src/iOS/Avalonia.iOS/Specific/KeyboardEventsHelper.cs b/src/iOS/Avalonia.iOS/Specific/KeyboardEventsHelper.cs index 80c6fc5f49..567bb9a5e0 100644 --- a/src/iOS/Avalonia.iOS/Specific/KeyboardEventsHelper.cs +++ b/src/iOS/Avalonia.iOS/Specific/KeyboardEventsHelper.cs @@ -37,7 +37,7 @@ namespace Avalonia.iOS.Specific /// view.ResignFirstResponder(); /// /// View that needs keyboard events and show/hide keyboard - internal class KeyboardEventsHelper where TView : UIView, IWindowImpl + internal class KeyboardEventsHelper where TView : UIView, ITopLevelImpl { private TView _view; private IInputElement _lastFocusedElement; diff --git a/src/iOS/Avalonia.iOS/TopLevelImpl.cs b/src/iOS/Avalonia.iOS/TopLevelImpl.cs new file mode 100644 index 0000000000..96ab2786f7 --- /dev/null +++ b/src/iOS/Avalonia.iOS/TopLevelImpl.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reactive.Disposables; +using System.Text; +using CoreAnimation; +using CoreGraphics; +using Foundation; +using Avalonia.Controls.Platform; +using Avalonia.Input; +using Avalonia.Input.Raw; +using Avalonia.Media; +using Avalonia.Platform; +using Avalonia.Skia.iOS; +using UIKit; +using Avalonia.iOS.Specific; +using ObjCRuntime; +using Avalonia.Controls; +using Avalonia.Controls.Platform.Surfaces; + +namespace Avalonia.iOS +{ + [Adopts("UIKeyInput")] + class TopLevelImpl : UIView, ITopLevelImpl, IFramebufferPlatformSurface + { + private IInputRoot _inputRoot; + private readonly KeyboardEventsHelper _keyboardHelper; + private Point _position; + + public TopLevelImpl() + { + _keyboardHelper = new KeyboardEventsHelper(this); + AutoresizingMask = UIViewAutoresizing.All; + } + + [Export("hasText")] + public bool HasText => _keyboardHelper.HasText(); + + [Export("insertText:")] + public void InsertText(string text) => _keyboardHelper.InsertText(text); + + [Export("deleteBackward")] + public void DeleteBackward() => _keyboardHelper.DeleteBackward(); + + public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder(); + + public Action Activated { get; set; } + public Action Closed { get; set; } + public Action Deactivated { get; set; } + public Action Input { get; set; } + public Action Paint { get; set; } + public Action Resized { get; set; } + public Action ScalingChanged { get; set; } + public Action PositionChanged { get; set; } + + public IPlatformHandle Handle => null; + + public double Scaling => UIScreen.MainScreen.Scale; + + public WindowState WindowState + { + get { return WindowState.Normal; } + set { } + } + + public override void LayoutSubviews() => Resized?.Invoke(ClientSize); + + public Size ClientSize + { + get { return Bounds.Size.ToAvalonia(); } + set { InvokeOnMainThread(() => Resized?.Invoke(ClientSize)); } + } + + public void Activate() + { + } + + public override void Draw(CGRect rect) + { + Paint?.Invoke(new Rect(rect.X, rect.Y, rect.Width, rect.Height)); + } + + public void Invalidate(Rect rect) => SetNeedsDisplay(); + + public void SetInputRoot(IInputRoot inputRoot) => _inputRoot = inputRoot; + + public Point PointToClient(Point point) => point; + + public Point PointToScreen(Point point) => point; + + public void SetCursor(IPlatformHandle cursor) + { + //Not supported + } + + public void Show() + { + _keyboardHelper.ActivateAutoShowKeybord(); + } + + public void BeginMoveDrag() + { + //Not supported + } + + public void BeginResizeDrag(WindowEdge edge) + { + //Not supported + } + + public Point Position + { + get { return _position; } + set + { + _position = value; + PositionChanged?.Invoke(_position); + } + } + + public Size MaxClientSize => Bounds.Size.ToAvalonia(); + + public IEnumerable Surfaces => new object[] { this }; + + + public void Hide() + { + //Not supported + } + + public override void TouchesEnded(NSSet touches, UIEvent evt) + { + var touch = touches.AnyObject as UITouch; + if (touch != null) + { + var location = touch.LocationInView(this).ToAvalonia(); + + Input?.Invoke(new RawMouseEventArgs( + iOSPlatform.MouseDevice, + (uint)touch.Timestamp, + _inputRoot, + RawMouseEventType.LeftButtonUp, + location, + InputModifiers.None)); + } + } + + Point _touchLastPoint; + public override void TouchesBegan(NSSet touches, UIEvent evt) + { + var touch = touches.AnyObject as UITouch; + if (touch != null) + { + var location = touch.LocationInView(this).ToAvalonia(); + _touchLastPoint = location; + Input?.Invoke(new RawMouseEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, _inputRoot, + RawMouseEventType.Move, location, InputModifiers.None)); + + Input?.Invoke(new RawMouseEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, _inputRoot, + RawMouseEventType.LeftButtonDown, location, InputModifiers.None)); + } + } + + public override void TouchesMoved(NSSet touches, UIEvent evt) + { + var touch = touches.AnyObject as UITouch; + if (touch != null) + { + var location = touch.LocationInView(this).ToAvalonia(); + if (iOSPlatform.MouseDevice.Captured != null) + Input?.Invoke(new RawMouseEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, _inputRoot, + RawMouseEventType.Move, location, InputModifiers.LeftMouseButton)); + else + { + //magic number based on test - correction of 0.02 is working perfect + double correction = 0.02; + + Input?.Invoke(new RawMouseWheelEventArgs(iOSPlatform.MouseDevice, (uint)touch.Timestamp, + _inputRoot, location, (location - _touchLastPoint) * correction, InputModifiers.LeftMouseButton)); + } + _touchLastPoint = location; + } + } + + public void SetIcon(IWindowIconImpl icon) + { + } + + public ILockedFramebuffer Lock() => new EmulatedFramebuffer(this); + } +} diff --git a/src/iOS/Avalonia.iOS/WindowingPlatformImpl.cs b/src/iOS/Avalonia.iOS/WindowingPlatformImpl.cs index b6a683e10a..5cac259ce7 100644 --- a/src/iOS/Avalonia.iOS/WindowingPlatformImpl.cs +++ b/src/iOS/Avalonia.iOS/WindowingPlatformImpl.cs @@ -3,26 +3,16 @@ using System; namespace Avalonia.iOS { - // This is somewhat generic, could probably put this elsewhere. But I don't think - // it should part of the iOS App Delegate - // class WindowingPlatformImpl : IWindowingPlatform { - private readonly IWindowImpl _window; - - public WindowingPlatformImpl(IWindowImpl window) - { - _window = window; - } - public IWindowImpl CreateWindow() { - return _window; + throw new NotSupportedException(); } public IEmbeddableWindowImpl CreateEmbeddableWindow() { - throw new NotImplementedException(); + throw new NotSupportedException(); } public IPopupImpl CreatePopup() diff --git a/src/iOS/Avalonia.iOS/iOSPlatform.cs b/src/iOS/Avalonia.iOS/iOSPlatform.cs index 1b69735221..165b7d44f9 100644 --- a/src/iOS/Avalonia.iOS/iOSPlatform.cs +++ b/src/iOS/Avalonia.iOS/iOSPlatform.cs @@ -8,6 +8,7 @@ using Avalonia.Shared.PlatformSupport; using Avalonia.Skia; using UIKit; using Avalonia.Controls; +using Avalonia.Rendering; namespace Avalonia { @@ -18,7 +19,7 @@ namespace Avalonia builder.UseWindowingSubsystem(iOSPlatform.Initialize, "iOS"); return builder; } - + /* // TODO: Can we merge this with UseSkia somehow once HW/platform cleanup is done? public static T UseSkiaViewHost(this T builder) where T : AppBuilderBase, new() { @@ -33,16 +34,13 @@ namespace Avalonia SkiaPlatform.Initialize(); return builder; - } + }*/ } } namespace Avalonia.iOS { - // TODO: Perhaps we should make this class handle all these interfaces directly, like we - // do for Win32 and Gtk platforms - // - public class iOSPlatform //: IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform + public class iOSPlatform { internal static MouseDevice MouseDevice; internal static KeyboardDevice KeyboardDevice; @@ -62,7 +60,9 @@ namespace Avalonia.iOS .Bind().ToConstant(MouseDevice) .Bind().ToSingleton() .Bind().ToConstant(PlatformThreadingInterface.Instance) - .Bind().ToSingleton(); + .Bind().ToSingleton() + .Bind().ToSingleton() + .Bind().ToSingleton(); } } } diff --git a/src/iOS/Avalonia.iOSTestApplication/AppDelegate.cs b/src/iOS/Avalonia.iOSTestApplication/AppDelegate.cs index 211b7d5daa..4591fb2ae8 100644 --- a/src/iOS/Avalonia.iOSTestApplication/AppDelegate.cs +++ b/src/iOS/Avalonia.iOSTestApplication/AppDelegate.cs @@ -7,7 +7,6 @@ using Avalonia.Controls; using Avalonia.iOS; using Avalonia.Media; using Avalonia.Threading; -using TestApplication; using UIKit; namespace Avalonia.iOSTestApplication @@ -18,6 +17,8 @@ namespace Avalonia.iOSTestApplication [Register("AppDelegate")] public partial class AppDelegate : UIApplicationDelegate { + public override UIWindow Window { get; set; } + // // This method is invoked when the application has loaded and is ready to run. In this // method you should instantiate the window, load the UI into it and then make the window @@ -27,16 +28,9 @@ namespace Avalonia.iOSTestApplication // public override bool FinishedLaunching(UIApplication uiapp, NSDictionary options) { - var app = new App(); - - AppBuilder.Configure(app) - .UseiOS() - .UseSkiaViewHost() - .UseSkia() - .SetupWithoutStarting(); - - app.Run(); - + AppBuilder.Configure().UseSkia().UseiOS().SetupWithoutStarting(); + Window = new AvaloniaWindow { Content = new SimpleControl()}; + Window.MakeKeyAndVisible(); return true; } } diff --git a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj index 88123bf56c..ff7aa94502 100644 --- a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj +++ b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj @@ -97,6 +97,8 @@ + + @@ -196,5 +198,9 @@ false + + + + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml b/src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml new file mode 100644 index 0000000000..214bcd8797 --- /dev/null +++ b/src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml.cs b/src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml.cs new file mode 100644 index 0000000000..b287755ef6 --- /dev/null +++ b/src/iOS/Avalonia.iOSTestApplication/SimpleApp.xaml.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Avalonia.Markup.Xaml; +using Foundation; +using UIKit; + +namespace Avalonia.iOSTestApplication +{ + public class SimpleApp : Avalonia.Application + { + public override void Initialize() + { + //Enforce load + new Avalonia.Themes.Default.DefaultTheme(); + AvaloniaXamlLoader.Load(this); + } + } +} \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/SimpleControl.cs b/src/iOS/Avalonia.iOSTestApplication/SimpleControl.cs new file mode 100644 index 0000000000..7e888f65bc --- /dev/null +++ b/src/iOS/Avalonia.iOSTestApplication/SimpleControl.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Avalonia.Controls; +using Avalonia.Media; + +namespace Avalonia.iOSTestApplication +{ + class SimpleControl : ContentControl + { + public SimpleControl() + { + Content = new Button() {Content = "WAT"}; + MinWidth = 100; + MinHeight = 200; + Background = Brushes.CadetBlue; + } + } +} \ No newline at end of file From 1f91e01293a52d217d394ec675a52f8ad88a4634 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Feb 2017 21:39:24 +0300 Subject: [PATCH 09/95] [SKIA] One codebase to rule them all --- Avalonia.sln | 2 ++ .../AndroidPlatformRenderInterface.cs | 27 ------------------- .../Avalonia.Skia.Android.csproj | 3 --- .../Avalonia.Skia.Desktop.NetStandard.csproj | 3 --- .../Avalonia.Skia.Desktop.csproj | 1 - .../PlatformRenderInterfaceDesktop.cs | 21 --------------- .../Avalonia.Skia.iOS.csproj | 1 - .../PlatformRenderingInterfaceIos.cs | 22 --------------- .../Avalonia.Skia/PlatformRenderInterface.cs | 10 +++++++ 9 files changed, 12 insertions(+), 78 deletions(-) delete mode 100644 src/Skia/Avalonia.Skia.Android/AndroidPlatformRenderInterface.cs delete mode 100644 src/Skia/Avalonia.Skia.Desktop/PlatformRenderInterfaceDesktop.cs delete mode 100644 src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs diff --git a/Avalonia.sln b/Avalonia.sln index 905970433c..3ab8048857 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -182,6 +182,8 @@ Global src\Shared\RenderHelpers\RenderHelpers.projitems*{925dd807-b651-475f-9f7c-cbeb974ce43d}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{925dd807-b651-475f-9f7c-cbeb974ce43d}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 + src\Shared\RenderHelpers\RenderHelpers.projitems*{bd43f7c0-396b-4aa1-bad9-dfde54d51298}*SharedItemsImports = 4 + src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{bd43f7c0-396b-4aa1-bad9-dfde54d51298}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{d35a9f3d-8bb0-496e-bf72-444038a7debb}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{dabfd304-d6a4-4752-8123-c2ccf7ac7831}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{e106cf37-4066-4615-b684-172a6d30b058}*SharedItemsImports = 4 diff --git a/src/Skia/Avalonia.Skia.Android/AndroidPlatformRenderInterface.cs b/src/Skia/Avalonia.Skia.Android/AndroidPlatformRenderInterface.cs deleted file mode 100644 index be02111cbd..0000000000 --- a/src/Skia/Avalonia.Skia.Android/AndroidPlatformRenderInterface.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using Android.App; -using Android.Content; -using Android.OS; -using Android.Runtime; -using Android.Views; -using Android.Widget; -using Avalonia.Controls.Platform.Surfaces; -using Avalonia.Platform; - -namespace Avalonia.Skia -{ - partial class PlatformRenderInterface - { - public IRenderTarget CreateRenderTarget(IEnumerable surfaces) - { - var fb = surfaces?.OfType().FirstOrDefault(); - if (fb == null) - throw new ArgumentException("Avalonia.Skia.Android is only capable of drawing on framebuffer"); - return new FramebufferRenderTarget(fb); - } - } -} \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index ef950fe786..c644bd84b3 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -85,9 +85,6 @@ Avalonia.Styling - - - diff --git a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj index fde3375c43..f421ed04f4 100644 --- a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj +++ b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj @@ -44,9 +44,6 @@ Properties\SharedAssemblyInfo.cs - - PlatformRenderInterfaceDesktop.cs - diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj index c07db0908f..74d592f9bf 100644 --- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj +++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj @@ -71,7 +71,6 @@ - diff --git a/src/Skia/Avalonia.Skia.Desktop/PlatformRenderInterfaceDesktop.cs b/src/Skia/Avalonia.Skia.Desktop/PlatformRenderInterfaceDesktop.cs deleted file mode 100644 index 9382a4f6e2..0000000000 --- a/src/Skia/Avalonia.Skia.Desktop/PlatformRenderInterfaceDesktop.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Controls.Platform.Surfaces; -using Avalonia.Platform; - -namespace Avalonia.Skia -{ - partial class PlatformRenderInterface - { - public IRenderTarget CreateRenderTarget(IEnumerable surfaces) - { - var fb = surfaces?.OfType().FirstOrDefault(); - if (fb == null) - throw new Exception("Avalonia.Skia.Deskop currently only supports framebuffer render target"); - return new FramebufferRenderTarget(fb); - } - } -} diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index 0b1f8c9b62..08fcd61471 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -37,7 +37,6 @@ true - diff --git a/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs b/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs deleted file mode 100644 index 64bd67eee9..0000000000 --- a/src/Skia/Avalonia.Skia.iOS/PlatformRenderingInterfaceIos.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Avalonia.Controls.Platform.Surfaces; -using Avalonia.Platform; -using Foundation; -using UIKit; - -namespace Avalonia.Skia -{ - partial class PlatformRenderInterface - { - public IRenderTarget CreateRenderTarget(IEnumerable surfaces) - { - var fb = surfaces?.OfType().FirstOrDefault(); - if (fb == null) - throw new Exception("Avalonia.Skia.Deskop currently only supports framebuffer render target"); - return new FramebufferRenderTarget(fb); - } - } -} \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index 4cfe1e3e40..f0735bb0df 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; +using Avalonia.Controls.Platform.Surfaces; using Avalonia.Media; using Avalonia.Platform; using Avalonia.Rendering; @@ -64,5 +66,13 @@ namespace Avalonia.Skia return new BitmapImpl(width, height); } + + public virtual IRenderTarget CreateRenderTarget(IEnumerable surfaces) + { + var fb = surfaces?.OfType().FirstOrDefault(); + if (fb == null) + throw new Exception("Skia backend currently only supports framebuffer render target"); + return new FramebufferRenderTarget(fb); + } } } From dd25cffdcce3886c4a9906bee7b319ce67ffb37b Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 13 Feb 2017 02:13:13 +0300 Subject: [PATCH 10/95] [WIN32_CORE] Use flat GDI+ API for icon loading --- .../Avalonia.Win32.NetStandard.csproj | 2 + .../ComStreamWrapper.cs | 197 ++++++++++++++++++ .../Avalonia.Win32.NetStandard/Gdip.cs | 128 ++++++++++++ .../Avalonia.Win32.NetStandard/IconImpl.cs | 30 ++- .../NativeWin32Platform.cs | 16 +- 5 files changed, 368 insertions(+), 5 deletions(-) create mode 100644 src/Windows/Avalonia.Win32.NetStandard/ComStreamWrapper.cs create mode 100644 src/Windows/Avalonia.Win32.NetStandard/Gdip.cs diff --git a/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj b/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj index e4a34a8b91..95d1b8a345 100644 --- a/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj +++ b/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj @@ -75,6 +75,8 @@ + + diff --git a/src/Windows/Avalonia.Win32.NetStandard/ComStreamWrapper.cs b/src/Windows/Avalonia.Win32.NetStandard/ComStreamWrapper.cs new file mode 100644 index 0000000000..083021f58d --- /dev/null +++ b/src/Windows/Avalonia.Win32.NetStandard/ComStreamWrapper.cs @@ -0,0 +1,197 @@ +// +// System.Drawing.ComIStreamWrapper.cs +// +// Author: +// Kornél Pál +// +// Copyright (C) 2005-2008 Kornél Pál +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using STATSTG = System.Runtime.InteropServices.ComTypes.STATSTG; + +namespace Avalonia.Win32 +{ + // Stream to IStream wrapper for COM interop + internal sealed class ComIStreamWrapper : IStream + { + private const int STG_E_INVALIDFUNCTION = unchecked((int)0x80030001); + + private readonly Stream baseStream; + private long position = -1; + + internal ComIStreamWrapper(Stream stream) + { + baseStream = stream; + } + + private void SetSizeToPosition() + { + if (position != -1) + { + if (position > baseStream.Length) + baseStream.SetLength(position); + baseStream.Position = position; + position = -1; + } + } + + public void Read(byte[] pv, int cb, IntPtr pcbRead) + { + int read = 0; + + if (cb != 0) + { + SetSizeToPosition(); + read = baseStream.Read(pv, 0, cb); + } + + if (pcbRead != IntPtr.Zero) + Marshal.WriteInt32(pcbRead, read); + } + + public void Write(byte[] pv, int cb, IntPtr pcbWritten) + { + if (cb != 0) + { + SetSizeToPosition(); + baseStream.Write(pv, 0, cb); + } + + if (pcbWritten != IntPtr.Zero) + Marshal.WriteInt32(pcbWritten, cb); + } + + public void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition) + { + long length = baseStream.Length; + long newPosition; + + switch ((SeekOrigin)dwOrigin) + { + case SeekOrigin.Begin: + newPosition = dlibMove; + break; + case SeekOrigin.Current: + if (position == -1) + newPosition = baseStream.Position + dlibMove; + else + newPosition = position + dlibMove; + break; + case SeekOrigin.End: + newPosition = length + dlibMove; + break; + default: + throw new COMException(null, STG_E_INVALIDFUNCTION); + } + + if (newPosition > length) + position = newPosition; + else + { + baseStream.Position = newPosition; + position = -1; + } + + if (plibNewPosition != IntPtr.Zero) + Marshal.WriteInt64(plibNewPosition, newPosition); + } + + public void SetSize(long libNewSize) + { + baseStream.SetLength(libNewSize); + } + + public void CopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten) + { + byte[] buffer; + long written = 0; + int read; + int count; + + if (cb != 0) + { + if (cb < 4096) + count = (int)cb; + else + count = 4096; + buffer = new byte[count]; + SetSizeToPosition(); + while (true) + { + if ((read = baseStream.Read(buffer, 0, count)) == 0) + break; + pstm.Write(buffer, read, IntPtr.Zero); + written += read; + if (written >= cb) + break; + if (cb - written < 4096) + count = (int)(cb - written); + } + } + + if (pcbRead != IntPtr.Zero) + Marshal.WriteInt64(pcbRead, written); + if (pcbWritten != IntPtr.Zero) + Marshal.WriteInt64(pcbWritten, written); + } + + public void Commit(int grfCommitFlags) + { + baseStream.Flush(); + SetSizeToPosition(); + } + + public void Revert() + { + throw new COMException(null, STG_E_INVALIDFUNCTION); + } + + public void LockRegion(long libOffset, long cb, int dwLockType) + { + throw new COMException(null, STG_E_INVALIDFUNCTION); + } + + public void UnlockRegion(long libOffset, long cb, int dwLockType) + { + throw new COMException(null, STG_E_INVALIDFUNCTION); + } + + public void Stat(out STATSTG pstatstg, int grfStatFlag) + { + pstatstg = new STATSTG(); + pstatstg.cbSize = baseStream.Length; + } + + public void Clone(out IStream ppstm) + { + ppstm = null; + throw new COMException(null, STG_E_INVALIDFUNCTION); + } + } +} \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32.NetStandard/Gdip.cs b/src/Windows/Avalonia.Win32.NetStandard/Gdip.cs new file mode 100644 index 0000000000..b3d1c28689 --- /dev/null +++ b/src/Windows/Avalonia.Win32.NetStandard/Gdip.cs @@ -0,0 +1,128 @@ +// +// Code copy-pasted from from Mono / System.Drawing.*.cs +// Original license below: +// +// Authors: +// Alexandre Pigolkine (pigolkine@gmx.de) +// Jordi Mas (jordi@ximian.com) +// Sanjay Gupta (gsanjay@novell.com) +// Ravindra (rkumar@novell.com) +// Peter Dennis Bartok (pbartok@novell.com) +// Sebastien Pouliot +// +// +// Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Win32 +{ + static class Gdip + { + public enum Status + { + Ok = 0, + GenericError = 1, + InvalidParameter = 2, + OutOfMemory = 3, + ObjectBusy = 4, + InsufficientBuffer = 5, + NotImplemented = 6, + Win32Error = 7, + WrongState = 8, + Aborted = 9, + FileNotFound = 10, + ValueOverflow = 11, + AccessDenied = 12, + UnknownImageFormat = 13, + FontFamilyNotFound = 14, + FontStyleNotFound = 15, + NotTrueTypeFont = 16, + UnsupportedGdiplusVersion = 17, + GdiplusNotInitialized = 18, + PropertyNotFound = 19, + PropertyNotSupported = 20, + ProfileNotFound = 21 + } + + [StructLayout(LayoutKind.Sequential)] + internal struct GdiplusStartupInput + { + // internalted to silent compiler + internal uint GdiplusVersion; + internal IntPtr DebugEventCallback; + internal int SuppressBackgroundThread; + internal int SuppressExternalCodecs; + + internal static GdiplusStartupInput MakeGdiplusStartupInput() + { + GdiplusStartupInput result = new GdiplusStartupInput(); + result.GdiplusVersion = 1; + result.DebugEventCallback = IntPtr.Zero; + result.SuppressBackgroundThread = 0; + result.SuppressExternalCodecs = 0; + return result; + } + } + + [StructLayout(LayoutKind.Sequential)] + internal struct GdiplusStartupOutput + { + internal IntPtr NotificationHook; + internal IntPtr NotificationUnhook; + + internal static GdiplusStartupOutput MakeGdiplusStartupOutput() + { + GdiplusStartupOutput result = new GdiplusStartupOutput(); + result.NotificationHook = result.NotificationUnhook = IntPtr.Zero; + return result; + } + } + + + [DllImport("gdiplus.dll")] + public static extern Status GdiplusStartup(ref ulong token, ref GdiplusStartupInput input, ref GdiplusStartupOutput output); + + [DllImport("gdiplus.dll", ExactSpelling = true, CharSet = CharSet.Unicode)] + public static extern Status GdipLoadImageFromStream([MarshalAs(UnmanagedType.Interface, MarshalTypeRef = typeof(IStream))] IStream stream, out IntPtr image); + [DllImport("gdiplus.dll")] + public static extern Status GdipCreateHICONFromBitmap(IntPtr bmp, out IntPtr HandleIcon); + + [DllImport("gdiplus.dll")] + internal static extern Status GdipDisposeImage(IntPtr image); + + static Gdip() + { + ulong token = 0; + var input = GdiplusStartupInput.MakeGdiplusStartupInput(); + var output = GdiplusStartupOutput.MakeGdiplusStartupOutput(); + GdiplusStartup(ref token, ref input, ref output); + } + } +} diff --git a/src/Windows/Avalonia.Win32.NetStandard/IconImpl.cs b/src/Windows/Avalonia.Win32.NetStandard/IconImpl.cs index f21737027f..49d039e655 100644 --- a/src/Windows/Avalonia.Win32.NetStandard/IconImpl.cs +++ b/src/Windows/Avalonia.Win32.NetStandard/IconImpl.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; using System.Text; using System.Threading.Tasks; using Avalonia.Platform; @@ -10,10 +12,34 @@ namespace Avalonia.Win32 { public class IconImpl : IWindowIconImpl { - public IntPtr HIcon { get; set; } + private readonly MemoryStream _ms; + + public IconImpl(Stream data) + { + _ms = new MemoryStream(); + data.CopyTo(_ms); + _ms.Seek(0, SeekOrigin.Begin); + IntPtr bitmap; + var status = Gdip.GdipLoadImageFromStream(new ComIStreamWrapper(_ms), out bitmap); + if (status != Gdip.Status.Ok) + throw new Exception("Unable to load icon, gdip status: " + (int) status); + IntPtr icon; + status = Gdip.GdipCreateHICONFromBitmap(bitmap, out icon); + if (status != Gdip.Status.Ok) + throw new Exception("Unable to create HICON, gdip status: " + (int)status); + Gdip.GdipDisposeImage(bitmap); + HIcon = icon; + } + + public IntPtr HIcon { get;} public void Save(Stream outputStream) { - throw new NotImplementedException(); + lock (_ms) + { + _ms.Seek(0, SeekOrigin.Begin); + _ms.CopyTo(outputStream); + } } + } } diff --git a/src/Windows/Avalonia.Win32.NetStandard/NativeWin32Platform.cs b/src/Windows/Avalonia.Win32.NetStandard/NativeWin32Platform.cs index a269334be7..2695a5b8b6 100644 --- a/src/Windows/Avalonia.Win32.NetStandard/NativeWin32Platform.cs +++ b/src/Windows/Avalonia.Win32.NetStandard/NativeWin32Platform.cs @@ -11,10 +11,20 @@ namespace Avalonia.Win32 partial class Win32Platform { //TODO: An actual implementation - public IWindowIconImpl LoadIcon(string fileName) => new IconImpl(); + public IWindowIconImpl LoadIcon(string fileName) + { + //No file IO for netstandard, still waiting for proper net core tooling + throw new NotSupportedException(); + } - public IWindowIconImpl LoadIcon(Stream stream) => new IconImpl(); + public IWindowIconImpl LoadIcon(Stream stream) => new IconImpl(stream); - public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) => new IconImpl(); + public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) + { + var ms = new MemoryStream(); + bitmap.Save(ms); + ms.Seek(0, SeekOrigin.Begin); + return new IconImpl(ms); + } } } From d7bee430152d78d2059c545f7e7e2fd09e648dcc Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 13 Feb 2017 21:24:12 +0300 Subject: [PATCH 11/95] Check for Windows version in Direct2D platform --- .../ExportWindowingSubsystemAttribute.cs | 5 ++++- .../AppBuilder.cs | 18 ++++++++++++++++-- src/Avalonia.Visuals/Avalonia.Visuals.csproj | 1 + .../ExportRenderingSubsystemAttribute.cs | 5 ++++- .../Platform/IModuleEnvironmentChecker.cs | 7 +++++++ .../Avalonia.Direct2D1.csproj | 1 + .../Properties/AssemblyInfo.cs | 3 ++- .../WindowsVersionChecker.cs | 15 +++++++++++++++ 8 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs create mode 100644 src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs diff --git a/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs b/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs index 628f73ca80..420c56111f 100644 --- a/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs +++ b/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs @@ -9,16 +9,19 @@ namespace Avalonia.Platform [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class ExportWindowingSubsystemAttribute : Attribute { - public ExportWindowingSubsystemAttribute(OperatingSystemType requiredRuntimePlatform, int priority, string name, Type initializationType, string initializationMethod) + public ExportWindowingSubsystemAttribute(OperatingSystemType requiredRuntimePlatform, int priority, string name, Type initializationType, + string initializationMethod, Type environmentChecker = null) { Name = name; InitializationType = initializationType; InitializationMethod = initializationMethod; + EnvironmentChecker = environmentChecker; RequiredOS = requiredRuntimePlatform; Priority = priority; } public string InitializationMethod { get; private set; } + public Type EnvironmentChecker { get; } public Type InitializationType { get; private set; } public string Name { get; private set; } public int Priority { get; private set; } diff --git a/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs b/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs index f643bfe6e2..fc7fdd2431 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs +++ b/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs @@ -31,6 +31,20 @@ namespace Avalonia Instance = app; } + bool CheckEnvironment(Type checkerType) + { + if (checkerType == null) + return true; + try + { + return ((IModuleEnvironmentChecker) Activator.CreateInstance(checkerType)).IsCompatible; + } + catch + { + return false; + } + } + /// /// Instructs the to use the best settings for the platform. /// @@ -43,13 +57,13 @@ namespace Avalonia var windowingSubsystemAttribute = (from assembly in RuntimePlatform.GetLoadedAssemblies() from attribute in assembly.GetCustomAttributes() - where attribute.RequiredOS == os + where attribute.RequiredOS == os && CheckEnvironment(attribute.EnvironmentChecker) orderby attribute.Priority ascending select attribute).First(); var renderingSubsystemAttribute = (from assembly in RuntimePlatform.GetLoadedAssemblies() from attribute in assembly.GetCustomAttributes() - where attribute.RequiredOS == os + where attribute.RequiredOS == os && CheckEnvironment(attribute.EnvironmentChecker) where attribute.RequiresWindowingSubsystem == null || attribute.RequiresWindowingSubsystem == windowingSubsystemAttribute.Name orderby attribute.Priority ascending diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index dd43f1d8f0..a0ed19d2b4 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -102,6 +102,7 @@ + diff --git a/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs b/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs index a020bf9b1c..73526d7622 100644 --- a/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs +++ b/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs @@ -9,16 +9,19 @@ namespace Avalonia.Platform [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class ExportRenderingSubsystemAttribute : Attribute { - public ExportRenderingSubsystemAttribute(OperatingSystemType requiredOS, int priority, string name, Type initializationType, string initializationMethod) + public ExportRenderingSubsystemAttribute(OperatingSystemType requiredOS, int priority, string name, Type initializationType, string initializationMethod, + Type environmentChecker = null) { Name = name; InitializationType = initializationType; InitializationMethod = initializationMethod; + EnvironmentChecker = environmentChecker; RequiredOS = requiredOS; Priority = priority; } public string InitializationMethod { get; private set; } + public Type EnvironmentChecker { get; } public Type InitializationType { get; private set; } public string Name { get; private set; } public int Priority { get; private set; } diff --git a/src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs b/src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs new file mode 100644 index 0000000000..d8d3a19af6 --- /dev/null +++ b/src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs @@ -0,0 +1,7 @@ +namespace Avalonia.Platform +{ + public interface IModuleEnvironmentChecker + { + bool IsCompatible { get; } + } +} \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index a84a56d0d7..a055a337eb 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -83,6 +83,7 @@ + diff --git a/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs b/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs index 3ab086b156..63d9c5bfe3 100644 --- a/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs +++ b/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs @@ -6,5 +6,6 @@ using Avalonia.Platform; using Avalonia.Direct2D1; [assembly: AssemblyTitle("Avalonia.Direct2D1")] -[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 1, "Direct2D1", typeof(Direct2D1Platform), nameof(Direct2D1Platform.Initialize))] +[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 1, "Direct2D1", typeof(Direct2D1Platform), nameof(Direct2D1Platform.Initialize), + typeof(WindowsVersionChecker))] diff --git a/src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs b/src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs new file mode 100644 index 0000000000..875167b71a --- /dev/null +++ b/src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Platform; + +namespace Avalonia.Direct2D1 +{ + class WindowsVersionChecker : IModuleEnvironmentChecker + { + //Direct2D backend doesn't work with Win7 anymore + public bool IsCompatible => Environment.OSVersion.Version >= new Version(6, 2); + } +} From 4d3d42b6002621bf7316f6e92aaf09080a34d5a8 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 14 Feb 2017 21:23:20 +0300 Subject: [PATCH 12/95] [SKIA] Fixed DPI scaling issues introduced by b96c2de --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 27f5fd815f..0e40f578c0 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -18,11 +18,12 @@ namespace Avalonia.Skia public DrawingContextImpl(SKCanvas canvas, Matrix? postTransform = null, params IDisposable[] disposables) { - if (_postTransform.HasValue && !_postTransform.Value.IsIdentity) + if (postTransform.HasValue && !postTransform.Value.IsIdentity) _postTransform = postTransform; _disposables = disposables; Canvas = canvas; Canvas.Clear(); + Transform = Matrix.Identity; } public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect) @@ -352,7 +353,7 @@ namespace Avalonia.Skia Canvas.Restore(); } - private Matrix _currentTransform = Matrix.Identity; + private Matrix _currentTransform; public Matrix Transform { From f21212e76a4f3bb50a3826d7e814443f5092f3ad Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 17 Feb 2017 06:36:17 +0300 Subject: [PATCH 13/95] Refactored out WindowBase from TopLevel --- Avalonia.sln | 6 +- .../Platform/SkiaPlatform/PopupImpl.cs | 16 +- .../Platform/SkiaPlatform/TopLevelImpl.cs | 4 +- .../Avalonia.Controls.csproj | 2 + .../Embedding/EmbeddableControlRoot.cs | 4 +- src/Avalonia.Controls/Menu.cs | 12 +- .../Platform/IEmbeddableWindowImpl.cs | 2 +- src/Avalonia.Controls/Platform/IPopupImpl.cs | 2 +- .../Platform/ITopLevelImpl.cs | 78 ++----- .../Platform/IWindowBaseImpl.cs | 69 +++++++ src/Avalonia.Controls/Platform/IWindowImpl.cs | 2 +- .../Platform/PlatformManager.cs | 2 +- .../Presenters/ItemVirtualizerSimple.cs | 14 +- src/Avalonia.Controls/Primitives/Popup.cs | 10 +- src/Avalonia.Controls/Primitives/PopupRoot.cs | 2 +- src/Avalonia.Controls/TopLevel.cs | 155 +------------- src/Avalonia.Controls/Window.cs | 2 +- src/Avalonia.Controls/WindowBase.cs | 191 ++++++++++++++++++ .../DesignerAssist.cs | 3 +- src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs | 7 +- src/Gtk/Avalonia.Gtk/WindowImpl.cs | 8 +- src/Gtk/Avalonia.Gtk/WindowImplBase.cs | 6 +- src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj | 2 +- src/Gtk/Avalonia.Gtk3/FramebufferManager.cs | 4 +- src/Gtk/Avalonia.Gtk3/PopupImpl.cs | 2 +- src/Gtk/Avalonia.Gtk3/SystemDialogs.cs | 4 +- .../{TopLevelImpl.cs => WindowBaseImpl.cs} | 17 +- src/Gtk/Avalonia.Gtk3/WindowImpl.cs | 2 +- .../Embedding/WinFormsAvaloniaControlHost.cs | 10 +- src/Windows/Avalonia.Win32/Win32Platform.cs | 4 +- src/Windows/Avalonia.Win32/WindowImpl.cs | 30 +-- 31 files changed, 377 insertions(+), 295 deletions(-) create mode 100644 src/Avalonia.Controls/Platform/IWindowBaseImpl.cs create mode 100644 src/Avalonia.Controls/WindowBase.cs rename src/Gtk/Avalonia.Gtk3/{TopLevelImpl.cs => WindowBaseImpl.cs} (97%) diff --git a/Avalonia.sln b/Avalonia.sln index 3ab8048857..b940efd76b 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26127.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject @@ -169,13 +169,13 @@ Global src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{2f59f3d0-748d-4652-b01e-e0d954756308}*SharedItemsImports = 13 src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 src\Shared\RenderHelpers\RenderHelpers.projitems*{3e908f67-5543-4879-a1dc-08eace79b3cd}*SharedItemsImports = 4 - src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{40759a76-d0f2-464e-8000-6ff0f5c4bd7c}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{4488ad85-1495-4809-9aa4-ddfe0a48527e}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{47be08a7-5985-410b-9ffc-2264b8ea595f}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{47be08a7-5985-410b-9ffc-2264b8ea595f}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13 src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4 + src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{811a76cf-1cf6-440f-963b-bbe31bd72a82}*SharedItemsImports = 4 diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs index e39ba2c121..7cfe04e5d6 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs @@ -18,21 +18,19 @@ namespace Avalonia.Android.Platform.SkiaPlatform { private Point _position; private bool _isAdded; + Action IWindowBaseImpl.Activated { get; set; } public PopupImpl() : base(ActivityTracker.Current, true) { } private Size _clientSize = new Size(1, 1); - public override Size ClientSize + + public void Resize(Size value) { - get { return base.ClientSize; } - set - { - if(View == null) - return; - _clientSize = value; - UpdateParams(); - } + if (View == null) + return; + _clientSize = value; + UpdateParams(); } public override Point Position diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index d34981b964..124f22458e 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -83,9 +83,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public View View => _view; - Action ITopLevelImpl.Activated { get; set; } - - IPlatformHandle ITopLevelImpl.Handle => _view; + public IPlatformHandle Handle => _view; public IEnumerable Surfaces => new object[] {this}; diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index c05e44b357..6119103e6d 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -57,6 +57,7 @@ + @@ -65,6 +66,7 @@ + diff --git a/src/Avalonia.Controls/Embedding/EmbeddableControlRoot.cs b/src/Avalonia.Controls/Embedding/EmbeddableControlRoot.cs index fc58e751f4..4688017187 100644 --- a/src/Avalonia.Controls/Embedding/EmbeddableControlRoot.cs +++ b/src/Avalonia.Controls/Embedding/EmbeddableControlRoot.cs @@ -11,12 +11,11 @@ namespace Avalonia.Controls.Embedding { public EmbeddableControlRoot(IEmbeddableWindowImpl impl) : base(impl) { - PlatformImpl.Show(); + } public EmbeddableControlRoot() : base(PlatformManager.CreateEmbeddableWindow()) { - PlatformImpl.Show(); } public new IEmbeddableWindowImpl PlatformImpl => (IEmbeddableWindowImpl) base.PlatformImpl; @@ -25,7 +24,6 @@ namespace Avalonia.Controls.Embedding { EnsureInitialized(); ApplyTemplate(); - PlatformImpl.Show(); LayoutManager.Instance.ExecuteInitialLayoutPass(this); } diff --git a/src/Avalonia.Controls/Menu.cs b/src/Avalonia.Controls/Menu.cs index 2185fd982b..e919275d4f 100644 --- a/src/Avalonia.Controls/Menu.cs +++ b/src/Avalonia.Controls/Menu.cs @@ -103,9 +103,11 @@ namespace Avalonia.Controls { base.OnAttachedToVisualTree(e); - var topLevel = e.Root as TopLevel; + var topLevel = (TopLevel)e.Root; + var window = e.Root as Window; - topLevel.Deactivated += Deactivated; + if (window != null) + window.Deactivated += Deactivated; var pointerPress = topLevel.AddHandler( PointerPressedEvent, @@ -114,7 +116,11 @@ namespace Avalonia.Controls _subscription = new CompositeDisposable( pointerPress, - Disposable.Create(() => topLevel.Deactivated -= Deactivated), + Disposable.Create(() => + { + if (window != null) + window.Deactivated -= Deactivated; + }), InputManager.Instance.Process.Subscribe(ListenForNonClientClick)); var inputRoot = e.Root as IInputRoot; diff --git a/src/Avalonia.Controls/Platform/IEmbeddableWindowImpl.cs b/src/Avalonia.Controls/Platform/IEmbeddableWindowImpl.cs index 45b15e5f45..3f974f3748 100644 --- a/src/Avalonia.Controls/Platform/IEmbeddableWindowImpl.cs +++ b/src/Avalonia.Controls/Platform/IEmbeddableWindowImpl.cs @@ -8,7 +8,7 @@ namespace Avalonia.Platform /// /// Defines a platform-specific embeddable window implementation. /// - public interface IEmbeddableWindowImpl : IWindowImpl + public interface IEmbeddableWindowImpl : ITopLevelImpl { event Action LostFocus; } diff --git a/src/Avalonia.Controls/Platform/IPopupImpl.cs b/src/Avalonia.Controls/Platform/IPopupImpl.cs index 34b3b8b557..1b606f550b 100644 --- a/src/Avalonia.Controls/Platform/IPopupImpl.cs +++ b/src/Avalonia.Controls/Platform/IPopupImpl.cs @@ -6,7 +6,7 @@ namespace Avalonia.Platform /// /// Defines a platform-specific popup window implementation. /// - public interface IPopupImpl : ITopLevelImpl + public interface IPopupImpl : IWindowBaseImpl { } diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index 77884acf73..16f436fd45 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Avalonia.Controls; using Avalonia.Input; using Avalonia.Input.Raw; @@ -19,25 +18,15 @@ namespace Avalonia.Platform public interface ITopLevelImpl : IDisposable { /// - /// Gets or sets the client size of the window. + /// Gets the client size of the toplevel. /// - Size ClientSize { get; set; } + Size ClientSize { get; } /// - /// Gets the maximum size of a window on the system. - /// - Size MaxClientSize { get; } - - /// - /// Gets the scaling factor for the window. + /// Gets the scaling factor for the toplevel. /// double Scaling { get; } - /// - /// Gets the platform window handle. - /// - IPlatformHandle Handle { get; } - /// /// The list of native platform's surfaces that can be consumed by rendering subsystems. /// @@ -51,57 +40,32 @@ namespace Avalonia.Platform IEnumerable Surfaces { get; } /// - /// Gets or sets a method called when the window is activated (receives focus). - /// - Action Activated { get; set; } - - /// - /// Gets or sets a method called when the window is closed. - /// - Action Closed { get; set; } - - /// - /// Gets or sets a method called when the window is deactivated (loses focus). - /// - Action Deactivated { get; set; } - - /// - /// Gets or sets a method called when the window receives input. + /// Gets or sets a method called when the toplevel receives input. /// Action Input { get; set; } /// - /// Gets or sets a method called when the window requires painting. + /// Gets or sets a method called when the toplevel requires painting. /// Action Paint { get; set; } /// - /// Gets or sets a method called when the window is resized. + /// Gets or sets a method called when the toplevel is resized. /// Action Resized { get; set; } /// - /// Gets or sets a method called when the window's scaling changes. + /// Gets or sets a method called when the toplevel's scaling changes. /// Action ScalingChanged { get; set; } /// - /// Gets or sets a method called when the window's position changes. - /// - Action PositionChanged { get; set; } - - /// - /// Activates the window. - /// - void Activate(); - - /// - /// Invalidates a rect on the window. + /// Invalidates a rect on the toplevel. /// void Invalidate(Rect rect); /// - /// Sets the for the window. + /// Sets the for the toplevel. /// void SetInputRoot(IInputRoot inputRoot); @@ -120,32 +84,14 @@ namespace Avalonia.Platform Point PointToScreen(Point point); /// - /// Sets the cursor associated with the window. + /// Sets the cursor associated with the toplevel. /// /// The cursor. Use null for default cursor void SetCursor(IPlatformHandle cursor); /// - /// Shows the toplevel. - /// - void Show(); - - /// - /// Hides the window. - /// - void Hide(); - - /// - /// Starts moving a window with left button being held. Should be called from left mouse button press event handler. - /// - void BeginMoveDrag(); - - /// - /// Starts resizing a window. This function is used if an application has window resizing controls. - /// Should be called from left mouse button press event handler + /// Gets or sets a method called when the underlying implementation is destroyed. /// - void BeginResizeDrag(WindowEdge edge); - - Point Position { get; set; } + Action Closed { get; set; } } } diff --git a/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs b/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs new file mode 100644 index 0000000000..3f65d9f74e --- /dev/null +++ b/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs @@ -0,0 +1,69 @@ +using System; +using Avalonia.Controls; + +namespace Avalonia.Platform +{ + public interface IWindowBaseImpl : ITopLevelImpl + { + /// + /// Shows the toplevel. + /// + void Show(); + + /// + /// Hides the window. + /// + void Hide(); + + /// + /// Starts moving a window with left button being held. Should be called from left mouse button press event handler. + /// + void BeginMoveDrag(); + + /// + /// Starts resizing a window. This function is used if an application has window resizing controls. + /// Should be called from left mouse button press event handler + /// + void BeginResizeDrag(WindowEdge edge); + + /// + /// Gets position of the window relatively to the screen + /// + Point Position { get; set; } + + /// + /// Gets or sets a method called when the window's position changes. + /// + Action PositionChanged { get; set; } + + /// + /// Activates the window. + /// + void Activate(); + + /// + /// Gets or sets a method called when the window is deactivated (loses focus). + /// + Action Deactivated { get; set; } + + /// + /// Gets or sets a method called when the window is activated (receives focus). + /// + Action Activated { get; set; } + + /// + /// Gets the platform window handle. + /// + IPlatformHandle Handle { get; } + + /// + /// Gets the maximum size of a window on the system. + /// + Size MaxClientSize { get; } + + /// + /// Gets the client size of the toplevel. + /// + void Resize(Size size); + } +} \ No newline at end of file diff --git a/src/Avalonia.Controls/Platform/IWindowImpl.cs b/src/Avalonia.Controls/Platform/IWindowImpl.cs index 609e9834cb..69b946346e 100644 --- a/src/Avalonia.Controls/Platform/IWindowImpl.cs +++ b/src/Avalonia.Controls/Platform/IWindowImpl.cs @@ -9,7 +9,7 @@ namespace Avalonia.Platform /// /// Defines a platform-specific window implementation. /// - public interface IWindowImpl : ITopLevelImpl + public interface IWindowImpl : IWindowBaseImpl { /// /// Gets or sets the minimized/maximized state of the window. diff --git a/src/Avalonia.Controls/Platform/PlatformManager.cs b/src/Avalonia.Controls/Platform/PlatformManager.cs index 8f069a3ab2..fa01b9e839 100644 --- a/src/Avalonia.Controls/Platform/PlatformManager.cs +++ b/src/Avalonia.Controls/Platform/PlatformManager.cs @@ -31,7 +31,7 @@ namespace Avalonia.Controls.Platform throw new Exception("Could not CreateWindow(): IWindowingPlatform is not registered."); } - return s_designerMode ? platform.CreateEmbeddableWindow() : platform.CreateWindow(); + return s_designerMode ? (IWindowImpl)platform.CreateEmbeddableWindow() : platform.CreateWindow(); } public static IEmbeddableWindowImpl CreateEmbeddableWindow() diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 228ad65ffa..01111d7b54 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -97,7 +97,11 @@ namespace Avalonia.Controls.Presenters /// public override Size MeasureOverride(Size availableSize) { - var window = Owner.GetVisualRoot() as TopLevel; + var maxAvailableSize = (Owner.GetVisualRoot() as WindowBase)?.PlatformImpl?.MaxClientSize; + if (!maxAvailableSize.HasValue) + { + maxAvailableSize = (Owner.GetVisualRoot() as TopLevel)?.ClientSize; + } // If infinity is passed as the available size and we're virtualized then we need to // fill the available space, but to do that we *don't* want to materialize all our @@ -107,9 +111,9 @@ namespace Avalonia.Controls.Presenters { if (availableSize.Height == double.PositiveInfinity) { - if (window != null) + if (maxAvailableSize.HasValue) { - availableSize = availableSize.WithHeight(window.PlatformImpl.MaxClientSize.Height); + availableSize = availableSize.WithHeight(maxAvailableSize.Value.Height); } } @@ -119,9 +123,9 @@ namespace Avalonia.Controls.Presenters { if (availableSize.Width == double.PositiveInfinity) { - if (window != null) + if (maxAvailableSize.HasValue) { - availableSize = availableSize.WithWidth(window.PlatformImpl.MaxClientSize.Width); + availableSize = availableSize.WithWidth(maxAvailableSize.Value.Width); } } diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index 63f3fb647b..bb2a61c024 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -213,7 +213,9 @@ namespace Avalonia.Controls.Primitives if (_topLevel != null) { - _topLevel.Deactivated += TopLevelDeactivated; + var window = _topLevel as Window; + if (window != null) + window.Deactivated += WindowDeactivated; _topLevel.AddHandler(PointerPressedEvent, PointerPressedOutside, RoutingStrategies.Tunnel); _nonClientListener = InputManager.Instance.Process.Subscribe(ListenForNonClientClick); } @@ -239,7 +241,9 @@ namespace Avalonia.Controls.Primitives if (_topLevel != null) { _topLevel.RemoveHandler(PointerPressedEvent, PointerPressedOutside); - _topLevel.Deactivated -= TopLevelDeactivated; + var window = _topLevel as Window; + if (window != null) + window.Deactivated -= WindowDeactivated; _nonClientListener?.Dispose(); _nonClientListener = null; } @@ -381,7 +385,7 @@ namespace Avalonia.Controls.Primitives } } - private void TopLevelDeactivated(object sender, EventArgs e) + private void WindowDeactivated(object sender, EventArgs e) { if (!StaysOpen) { diff --git a/src/Avalonia.Controls/Primitives/PopupRoot.cs b/src/Avalonia.Controls/Primitives/PopupRoot.cs index f67bbef5e1..5e5177b29d 100644 --- a/src/Avalonia.Controls/Primitives/PopupRoot.cs +++ b/src/Avalonia.Controls/Primitives/PopupRoot.cs @@ -15,7 +15,7 @@ namespace Avalonia.Controls.Primitives /// /// The root window of a . /// - public class PopupRoot : TopLevel, IInteractive, IHostedVisualTreeRoot, IDisposable + public class PopupRoot : WindowBase, IInteractive, IHostedVisualTreeRoot, IDisposable { private IDisposable _presenterSubscription; diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 1853d67019..45bb655184 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -18,12 +18,12 @@ using Avalonia.VisualTree; namespace Avalonia.Controls { /// - /// Base class for top-level windows. + /// Base class for top-level widgets. /// /// - /// This class acts as a base for top level windows such as and - /// . It handles scheduling layout, styling and rendering as well as - /// tracking the window and state. + /// This class acts as a base for top level widget. + /// It handles scheduling layout, styling and rendering as well as + /// tracking the widget's . /// public abstract class TopLevel : ContentControl, IInputRoot, ILayoutRoot, IRenderRoot, ICloseable, IStyleRoot { @@ -33,12 +33,6 @@ namespace Avalonia.Controls public static readonly DirectProperty ClientSizeProperty = AvaloniaProperty.RegisterDirect(nameof(ClientSize), o => o.ClientSize); - /// - /// Defines the property. - /// - public static readonly DirectProperty IsActiveProperty = - AvaloniaProperty.RegisterDirect(nameof(IsActive), o => o.IsActive); - /// /// Defines the property. /// @@ -51,7 +45,6 @@ namespace Avalonia.Controls private readonly IApplicationLifecycle _applicationLifecycle; private readonly IPlatformRenderInterface _renderInterface; private Size _clientSize; - private bool _isActive; /// /// Initializes static members of the class. @@ -100,21 +93,20 @@ namespace Avalonia.Controls Renderer = rendererFactory?.CreateRenderer(this, renderLoop); PlatformImpl.SetInputRoot(this); - PlatformImpl.Activated = HandleActivated; - PlatformImpl.Deactivated = HandleDeactivated; + PlatformImpl.Closed = HandleClosed; PlatformImpl.Input = HandleInput; PlatformImpl.Paint = Renderer != null ? (Action)Renderer.Render : null; PlatformImpl.Resized = HandleResized; PlatformImpl.ScalingChanged = HandleScalingChanged; - PlatformImpl.PositionChanged = HandlePositionChanged; + _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); styler?.ApplyStyles(this); ClientSize = PlatformImpl.ClientSize; - this.GetObservable(ClientSizeProperty).Skip(1).Subscribe(x => PlatformImpl.ClientSize = x); + this.GetObservable(PointerOverElementProperty) .Select( x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty()) @@ -126,26 +118,11 @@ namespace Avalonia.Controls } } - /// - /// Fired when the window is activated. - /// - public event EventHandler Activated; - /// /// Fired when the window is closed. /// public event EventHandler Closed; - /// - /// Fired when the window is deactivated. - /// - public event EventHandler Deactivated; - - /// - /// Fired when the window position is changed. - /// - public event EventHandler PositionChanged; - /// /// Gets or sets the client size of the window. /// @@ -155,24 +132,6 @@ namespace Avalonia.Controls private set { SetAndRaise(ClientSizeProperty, ref _clientSize, value); } } - /// - /// Gets a value that indicates whether the window is active. - /// - public bool IsActive - { - get { return _isActive; } - private set { SetAndRaise(IsActiveProperty, ref _isActive, value); } - } - - /// - /// Gets or sets the window position in screen coordinates. - /// - public Point Position - { - get { return PlatformImpl.Position; } - set { PlatformImpl.Position = value; } - } - /// /// Gets the platform-specific window implementation. /// @@ -225,15 +184,6 @@ namespace Avalonia.Controls get { return AvaloniaLocator.Current.GetService(); } } - /// - /// Whether an auto-size operation is in progress. - /// - protected bool AutoSizing - { - get; - private set; - } - /// IRenderTarget IRenderRoot.CreateRenderTarget() { @@ -258,43 +208,6 @@ namespace Avalonia.Controls return PlatformImpl.PointToScreen(p); } - /// - /// Activates the window. - /// - public void Activate() - { - PlatformImpl.Activate(); - } - - /// - /// Begins an auto-resize operation. - /// - /// A disposable used to finish the operation. - /// - /// When an auto-resize operation is in progress any resize events received will not be - /// cause the new size to be written to the and - /// properties. - /// - protected IDisposable BeginAutoSizing() - { - AutoSizing = true; - return Disposable.Create(() => AutoSizing = false); - } - - /// - /// Carries out the arrange pass of the window. - /// - /// The final window size. - /// The parameter unchanged. - protected override Size ArrangeOverride(Size finalSize) - { - using (BeginAutoSizing()) - { - PlatformImpl.ClientSize = finalSize; - } - - return base.ArrangeOverride(PlatformImpl.ClientSize); - } /// /// Handles a resize notification from . @@ -302,12 +215,6 @@ namespace Avalonia.Controls /// The new client size. protected virtual void HandleResized(Size clientSize) { - if (!AutoSizing) - { - Width = clientSize.Width; - Height = clientSize.Height; - } - ClientSize = clientSize; LayoutManager.Instance.ExecuteLayoutPass(); PlatformImpl.Invalidate(new Rect(clientSize)); @@ -358,23 +265,6 @@ namespace Avalonia.Controls return result; } - /// - /// Handles an activated notification from . - /// - private void HandleActivated() - { - Activated?.Invoke(this, EventArgs.Empty); - - var scope = this as IFocusScope; - - if (scope != null) - { - FocusManager.Instance.SetFocusScope(scope); - } - - IsActive = true; - } - /// /// Handles a closed notification from . /// @@ -398,16 +288,6 @@ namespace Avalonia.Controls { } - /// - /// Handles a deactivated notification from . - /// - private void HandleDeactivated() - { - IsActive = false; - - Deactivated?.Invoke(this, EventArgs.Empty); - } - /// /// Handles input from . /// @@ -416,26 +296,5 @@ namespace Avalonia.Controls { _inputManager.ProcessInput(e); } - - /// - /// Handles a window position change notification from - /// . - /// - /// The window position. - private void HandlePositionChanged(Point pos) - { - PositionChanged?.Invoke(this, new PointEventArgs(pos)); - } - - /// - /// Starts moving a window with left button being held. Should be called from left mouse button press event handler - /// - public void BeginMoveDrag() => PlatformImpl.BeginMoveDrag(); - - /// - /// Starts resizing a window. This function is used if an application has window resizing controls. - /// Should be called from left mouse button press event handler - /// - public void BeginResizeDrag(WindowEdge edge) => PlatformImpl.BeginResizeDrag(edge); } } diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 40c52a748d..992279d981 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -43,7 +43,7 @@ namespace Avalonia.Controls /// /// A top-level window. /// - public class Window : TopLevel, IStyleable, IFocusScope, ILayoutRoot, INameScope + public class Window : WindowBase, IStyleable, IFocusScope, ILayoutRoot, INameScope { private static IList s_windows = new List(); diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs new file mode 100644 index 0000000000..88c4a0ccb1 --- /dev/null +++ b/src/Avalonia.Controls/WindowBase.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Disposables; +using System.Reactive.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Controls.Primitives; +using Avalonia.Input; +using Avalonia.Layout; +using Avalonia.Platform; + +namespace Avalonia.Controls +{ + /// + /// Base class for top-level windows. + /// + /// + /// This class acts as a base for top level windows such as and + /// . It handles scheduling layout, styling and rendering as well as + /// tracking the window and state. + /// + public class WindowBase : TopLevel + { + /// + /// Defines the property. + /// + public static readonly DirectProperty IsActiveProperty = + AvaloniaProperty.RegisterDirect(nameof(IsActive), o => o.IsActive); + + private bool _isActive; + + public WindowBase(IWindowBaseImpl impl) : this(impl, AvaloniaLocator.Current) + { + } + + public WindowBase(IWindowBaseImpl impl, IAvaloniaDependencyResolver dependencyResolver) : base(impl, dependencyResolver) + { + PlatformImpl.Activated = HandleActivated; + PlatformImpl.Deactivated = HandleDeactivated; + PlatformImpl.PositionChanged = HandlePositionChanged; + this.GetObservable(ClientSizeProperty).Skip(1).Subscribe(x => PlatformImpl.Resize(x)); + } + + /// + /// Fired when the window is activated. + /// + public event EventHandler Activated; + + /// + /// Fired when the window is deactivated. + /// + public event EventHandler Deactivated; + + /// + /// Fired when the window position is changed. + /// + public event EventHandler PositionChanged; + + public new IWindowBaseImpl PlatformImpl => (IWindowBaseImpl) base.PlatformImpl; + + + /// + /// Gets a value that indicates whether the window is active. + /// + public bool IsActive + { + get { return _isActive; } + private set { SetAndRaise(IsActiveProperty, ref _isActive, value); } + } + + /// + /// Gets or sets the window position in screen coordinates. + /// + public Point Position + { + get { return PlatformImpl.Position; } + set { PlatformImpl.Position = value; } + } + + /// + /// Whether an auto-size operation is in progress. + /// + protected bool AutoSizing + { + get; + private set; + } + + /// + /// Activates the window. + /// + public void Activate() + { + PlatformImpl.Activate(); + } + + + /// + /// Begins an auto-resize operation. + /// + /// A disposable used to finish the operation. + /// + /// When an auto-resize operation is in progress any resize events received will not be + /// cause the new size to be written to the and + /// properties. + /// + protected IDisposable BeginAutoSizing() + { + AutoSizing = true; + return Disposable.Create(() => AutoSizing = false); + } + + /// + /// Carries out the arrange pass of the window. + /// + /// The final window size. + /// The parameter unchanged. + protected override Size ArrangeOverride(Size finalSize) + { + using (BeginAutoSizing()) + { + PlatformImpl.Resize(finalSize); + } + + return base.ArrangeOverride(PlatformImpl.ClientSize); + } + + /// + /// Handles a resize notification from . + /// + /// The new client size. + protected override void HandleResized(Size clientSize) + { + if (!AutoSizing) + { + Width = clientSize.Width; + Height = clientSize.Height; + } + base.HandleResized(clientSize); + } + + /// + /// Handles a window position change notification from + /// . + /// + /// The window position. + private void HandlePositionChanged(Point pos) + { + PositionChanged?.Invoke(this, new PointEventArgs(pos)); + } + + /// + /// Handles an activated notification from . + /// + private void HandleActivated() + { + Activated?.Invoke(this, EventArgs.Empty); + + var scope = this as IFocusScope; + + if (scope != null) + { + FocusManager.Instance.SetFocusScope(scope); + } + + IsActive = true; + } + + /// + /// Handles a deactivated notification from . + /// + private void HandleDeactivated() + { + IsActive = false; + + Deactivated?.Invoke(this, EventArgs.Empty); + } + + /// + /// Starts moving a window with left button being held. Should be called from left mouse button press event handler + /// + public void BeginMoveDrag() => PlatformImpl.BeginMoveDrag(); + + /// + /// Starts resizing a window. This function is used if an application has window resizing controls. + /// Should be called from left mouse button press event handler + /// + public void BeginResizeDrag(WindowEdge edge) => PlatformImpl.BeginResizeDrag(edge); + } +} diff --git a/src/Avalonia.DesignerSupport/DesignerAssist.cs b/src/Avalonia.DesignerSupport/DesignerAssist.cs index 95e7345227..c9ae89354c 100644 --- a/src/Avalonia.DesignerSupport/DesignerAssist.cs +++ b/src/Avalonia.DesignerSupport/DesignerAssist.cs @@ -75,8 +75,7 @@ namespace Avalonia.DesignerSupport private static void SetScalingFactor(double factor) { PlatformManager.SetDesignerScalingFactor(factor); - if (s_currentWindow != null) - s_currentWindow.PlatformImpl.ClientSize = s_currentWindow.ClientSize; + s_currentWindow?.PlatformImpl.Resize(s_currentWindow.ClientSize); } static Window s_currentWindow; diff --git a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs index a5a34cd47b..997a63246b 100644 --- a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs +++ b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs @@ -36,15 +36,18 @@ namespace Avalonia.Gtk public override Size ClientSize { get { return new Size(Widget.Allocation.Width, Widget.Allocation.Height); } - set {} } - //Stubs are needed for future GTK designer embedding support public override void SetTitle(string title) { } + public override void Resize(Size value) + { + + } + public override IDisposable ShowDialog() => Disposable.Create(() => { }); public override void SetSystemDecorations(bool enabled) diff --git a/src/Gtk/Avalonia.Gtk/WindowImpl.cs b/src/Gtk/Avalonia.Gtk/WindowImpl.cs index eca7c24136..d0c1715ee2 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk/WindowImpl.cs @@ -61,11 +61,11 @@ namespace Avalonia.Gtk Window.GetSize(out width, out height); return new Size(width, height); } + } - set - { - Window.Resize((int)value.Width, (int)value.Height); - } + public override void Resize(Size value) + { + Window.Resize((int)value.Width, (int)value.Height); } public override void SetTitle(string title) diff --git a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs b/src/Gtk/Avalonia.Gtk/WindowImplBase.cs index 4d7552aa72..93e2652c6e 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs +++ b/src/Gtk/Avalonia.Gtk/WindowImplBase.cs @@ -63,8 +63,8 @@ namespace Avalonia.Gtk _imContext.ClientWindow = _window.GdkWindow; } - public abstract Size ClientSize { get; set; } - + public abstract Size ClientSize { get; } + public abstract void Resize(Size value); public Size MaxClientSize { @@ -184,7 +184,7 @@ namespace Avalonia.Gtk public abstract void BeginResizeDrag(WindowEdge edge); public abstract Point Position { get; set; } - void ITopLevelImpl.Activate() + void IWindowBaseImpl.Activate() { _window.Activate(); } diff --git a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj index 785baeba8a..958af437a6 100644 --- a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj +++ b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj @@ -66,7 +66,7 @@ - + diff --git a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs index 1b2317ed6a..e52f0efb81 100644 --- a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs @@ -9,8 +9,8 @@ namespace Avalonia.Gtk3 { class FramebufferManager : IFramebufferPlatformSurface, IDisposable { - private readonly TopLevelImpl _window; - public FramebufferManager(TopLevelImpl window) + private readonly WindowBaseImpl _window; + public FramebufferManager(WindowBaseImpl window) { _window = window; } diff --git a/src/Gtk/Avalonia.Gtk3/PopupImpl.cs b/src/Gtk/Avalonia.Gtk3/PopupImpl.cs index 5d23148b76..8fd1c28ea4 100644 --- a/src/Gtk/Avalonia.Gtk3/PopupImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/PopupImpl.cs @@ -9,7 +9,7 @@ using Avalonia.Platform; namespace Avalonia.Gtk3 { - class PopupImpl : TopLevelImpl, IPopupImpl + class PopupImpl : WindowBaseImpl, IPopupImpl { static GtkWindow CreateWindow() { diff --git a/src/Gtk/Avalonia.Gtk3/SystemDialogs.cs b/src/Gtk/Avalonia.Gtk3/SystemDialogs.cs index 04c224ff5b..efdadc2379 100644 --- a/src/Gtk/Avalonia.Gtk3/SystemDialogs.cs +++ b/src/Gtk/Avalonia.Gtk3/SystemDialogs.cs @@ -77,14 +77,14 @@ namespace Avalonia.Gtk3 public Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) { - return ShowDialog(dialog.Title, ((TopLevelImpl) parent)?.GtkWidget, + return ShowDialog(dialog.Title, ((WindowBaseImpl) parent)?.GtkWidget, dialog is OpenFileDialog ? GtkFileChooserAction.Open : GtkFileChooserAction.Save, (dialog as OpenFileDialog)?.AllowMultiple ?? false, dialog.InitialFileName); } public async Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) { - var res = await ShowDialog(dialog.Title, ((TopLevelImpl) parent)?.GtkWidget, + var res = await ShowDialog(dialog.Title, ((WindowBaseImpl) parent)?.GtkWidget, GtkFileChooserAction.SelectFolder, false, dialog.InitialDirectory); return res?.FirstOrDefault(); } diff --git a/src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs similarity index 97% rename from src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs rename to src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 0063c13910..478580e65e 100644 --- a/src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -12,7 +12,7 @@ using Avalonia.Platform; namespace Avalonia.Gtk3 { - abstract class TopLevelImpl : ITopLevelImpl, IPlatformHandle + abstract class WindowBaseImpl : IWindowBaseImpl, IPlatformHandle { public readonly GtkWindow GtkWidget; private IInputRoot _inputRoot; @@ -25,7 +25,7 @@ namespace Avalonia.Gtk3 private uint _lastKbdEvent; private uint _lastSmoothScrollEvent; - public TopLevelImpl(GtkWindow gtkWidget) + public WindowBaseImpl(GtkWindow gtkWidget) { GtkWidget = gtkWidget; @@ -318,12 +318,13 @@ namespace Avalonia.Gtk3 Native.GtkWindowGetSize(GtkWidget, out w, out h); return new Size(w, h); } - set - { - if (GtkWidget.IsClosed) - return; - Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height); - } + } + + public void Resize(Size value) + { + if (GtkWidget.IsClosed) + return; + Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height); } public Point Position diff --git a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs index 631944872f..f083185a84 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs @@ -5,7 +5,7 @@ using Avalonia.Platform; namespace Avalonia.Gtk3 { - class WindowImpl : TopLevelImpl, IWindowImpl + class WindowImpl : WindowBaseImpl, IWindowImpl { public WindowImpl() : base(Native.GtkWindowNew(GtkWindowType.TopLevel)) { diff --git a/src/Windows/Avalonia.Win32/Embedding/WinFormsAvaloniaControlHost.cs b/src/Windows/Avalonia.Win32/Embedding/WinFormsAvaloniaControlHost.cs index 3b52090493..bdee85c91e 100644 --- a/src/Windows/Avalonia.Win32/Embedding/WinFormsAvaloniaControlHost.cs +++ b/src/Windows/Avalonia.Win32/Embedding/WinFormsAvaloniaControlHost.cs @@ -15,10 +15,12 @@ namespace Avalonia.Win32.Embedding { private readonly EmbeddableControlRoot _root = new EmbeddableControlRoot(); + private IntPtr WindowHandle => ((WindowImpl) _root.PlatformImpl).Handle.Handle; + public WinFormsAvaloniaControlHost() { SetStyle(ControlStyles.AllPaintingInWmPaint, true); - UnmanagedMethods.SetParent(_root.PlatformImpl.Handle.Handle, Handle); + UnmanagedMethods.SetParent(WindowHandle, Handle); _root.Prepare(); if (_root.IsFocused) FocusManager.Instance.Focus(null); @@ -59,20 +61,20 @@ namespace Avalonia.Win32.Embedding private void RootGotFocus(object sender, Interactivity.RoutedEventArgs e) { - UnmanagedMethods.SetFocus(_root.PlatformImpl.Handle.Handle); + UnmanagedMethods.SetFocus(WindowHandle); } protected override void OnGotFocus(EventArgs e) { if (_root != null) - UnmanagedMethods.SetFocus(_root.PlatformImpl.Handle.Handle); + UnmanagedMethods.SetFocus(WindowHandle); } void FixPosition() { if (_root != null && Width > 0 && Height > 0) - UnmanagedMethods.MoveWindow(_root.PlatformImpl.Handle.Handle, 0, 0, Width, Height, true); + UnmanagedMethods.MoveWindow(WindowHandle, 0, 0, Width, Height, true); } diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 2aa9ea7d0a..e668fd964a 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -187,7 +187,9 @@ namespace Avalonia.Win32 #if NETSTANDARD throw new NotSupportedException(); #else - return new EmbeddedWindowImpl(); + var embedded = new EmbeddedWindowImpl(); + embedded.Show(); + return embedded; #endif } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index d9b200169f..0000b5c0a9 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -89,23 +89,23 @@ namespace Avalonia.Win32 UnmanagedMethods.GetClientRect(_hwnd, out rect); return new Size(rect.right, rect.bottom) / Scaling; } + } - set + public void Resize(Size value) + { + if (value != ClientSize) { - if (value != ClientSize) - { - value *= Scaling; - value += BorderThickness; - - UnmanagedMethods.SetWindowPos( - _hwnd, - IntPtr.Zero, - 0, - 0, - (int)value.Width, - (int)value.Height, - UnmanagedMethods.SetWindowPosFlags.SWP_RESIZE); - } + value *= Scaling; + value += BorderThickness; + + UnmanagedMethods.SetWindowPos( + _hwnd, + IntPtr.Zero, + 0, + 0, + (int)value.Width, + (int)value.Height, + UnmanagedMethods.SetWindowPosFlags.SWP_RESIZE); } } From f0285179bd526ccaf3c6d5dcb6d12e10a60c692b Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 19 Feb 2017 19:28:18 +0300 Subject: [PATCH 14/95] Fixed comments and solution --- Avalonia.sln | 5 +++-- src/Avalonia.Controls/WindowBase.cs | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Avalonia.sln b/Avalonia.sln index b940efd76b..ad14483b40 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26127.3 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject @@ -169,6 +169,7 @@ Global src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{2f59f3d0-748d-4652-b01e-e0d954756308}*SharedItemsImports = 13 src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 src\Shared\RenderHelpers\RenderHelpers.projitems*{3e908f67-5543-4879-a1dc-08eace79b3cd}*SharedItemsImports = 4 + src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{40759a76-d0f2-464e-8000-6ff0f5c4bd7c}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{4488ad85-1495-4809-9aa4-ddfe0a48527e}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{47be08a7-5985-410b-9ffc-2264b8ea595f}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{47be08a7-5985-410b-9ffc-2264b8ea595f}*SharedItemsImports = 4 diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs index 88c4a0ccb1..07597984c4 100644 --- a/src/Avalonia.Controls/WindowBase.cs +++ b/src/Avalonia.Controls/WindowBase.cs @@ -18,7 +18,7 @@ namespace Avalonia.Controls /// /// This class acts as a base for top level windows such as and /// . It handles scheduling layout, styling and rendering as well as - /// tracking the window and state. + /// tracking the window and state. /// public class WindowBase : TopLevel { @@ -142,7 +142,7 @@ namespace Avalonia.Controls /// /// Handles a window position change notification from - /// . + /// . /// /// The window position. private void HandlePositionChanged(Point pos) @@ -151,7 +151,7 @@ namespace Avalonia.Controls } /// - /// Handles an activated notification from . + /// Handles an activated notification from . /// private void HandleActivated() { @@ -168,7 +168,7 @@ namespace Avalonia.Controls } /// - /// Handles a deactivated notification from . + /// Handles a deactivated notification from . /// private void HandleDeactivated() { From d17b32d7bd1613472f0e9f87907577898c5e1ef2 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 19 Feb 2017 20:00:43 +0300 Subject: [PATCH 15/95] Fixed tests --- .../Avalonia.Controls.UnitTests.csproj | 1 + .../TopLevelTests.cs | 73 +--------- .../WindowBaseTests.cs | 126 ++++++++++++++++++ .../FullLayoutTests.cs | 5 +- 4 files changed, 132 insertions(+), 73 deletions(-) create mode 100644 tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index aea972ec42..c581cccf2f 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -101,6 +101,7 @@ + diff --git a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs index 0e783e3f8d..0614906306 100644 --- a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs @@ -106,28 +106,7 @@ namespace Avalonia.Controls.UnitTests } } - [Fact] - public void Impl_ClientSize_Should_Be_Set_After_Layout_Pass() - { - using (UnitTestApplication.Start(TestServices.StyledWindow)) - { - var impl = Mock.Of(x => x.Scaling == 1); - - var target = new TestTopLevel(impl) - { - Template = CreateTemplate(), - Content = new TextBlock - { - Width = 321, - Height = 432, - } - }; - - LayoutManager.Instance.ExecuteInitialLayoutPass(target); - - Mock.Get(impl).VerifySet(x => x.ClientSize = new Size(321, 432)); - } - } + [Fact] public void Width_And_Height_Should_Not_Be_Set_After_Layout_Pass() @@ -163,38 +142,6 @@ namespace Avalonia.Controls.UnitTests } } - [Fact] - public void Activate_Should_Call_Impl_Activate() - { - using (UnitTestApplication.Start(TestServices.StyledWindow)) - { - var impl = new Mock(); - var target = new TestTopLevel(impl.Object); - - target.Activate(); - - impl.Verify(x => x.Activate()); - } - } - - [Fact] - public void Impl_Activate_Should_Call_Raise_Activated_Event() - { - using (UnitTestApplication.Start(TestServices.StyledWindow)) - { - var impl = new Mock(); - impl.SetupAllProperties(); - - bool raised = false; - var target = new TestTopLevel(impl.Object); - target.Activated += (s, e) => raised = true; - - impl.Object.Activated(); - - Assert.True(raised); - } - } - [Fact] public void Impl_Close_Should_Call_Raise_Closed_Event() { @@ -213,24 +160,6 @@ namespace Avalonia.Controls.UnitTests } } - [Fact] - public void Impl_Deactivate_Should_Call_Raise_Activated_Event() - { - using (UnitTestApplication.Start(TestServices.StyledWindow)) - { - var impl = new Mock(); - impl.SetupAllProperties(); - - bool raised = false; - var target = new TestTopLevel(impl.Object); - target.Deactivated += (s, e) => raised = true; - - impl.Object.Deactivated(); - - Assert.True(raised); - } - } - [Fact] public void Impl_Input_Should_Pass_Input_To_InputManager() { diff --git a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs new file mode 100644 index 0000000000..d4b850d66e --- /dev/null +++ b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs @@ -0,0 +1,126 @@ +// 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.Reactive; +using System.Reactive.Subjects; +using Moq; +using Avalonia.Controls.Presenters; +using Avalonia.Controls.Templates; +using Avalonia.Input; +using Avalonia.Input.Raw; +using Avalonia.Layout; +using Avalonia.Platform; +using Avalonia.Rendering; +using Avalonia.Styling; +using Avalonia.UnitTests; +using Ploeh.AutoFixture; +using Ploeh.AutoFixture.AutoMoq; +using Xunit; + +namespace Avalonia.Controls.UnitTests +{ + public class WindowBaseTests + { + [Fact] + public void Impl_ClientSize_Should_Be_Set_After_Layout_Pass() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var impl = Mock.Of(x => x.Scaling == 1); + + var target = new TestWindowBase(impl) + { + Template = CreateTemplate(), + Content = new TextBlock + { + Width = 321, + Height = 432, + } + }; + + LayoutManager.Instance.ExecuteInitialLayoutPass(target); + + Mock.Get(impl).Verify(x => x.Resize(new Size(321, 432))); + } + } + + + [Fact] + public void Activate_Should_Call_Impl_Activate() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var impl = new Mock(); + var target = new TestWindowBase(impl.Object); + + target.Activate(); + + impl.Verify(x => x.Activate()); + } + } + + [Fact] + public void Impl_Activate_Should_Call_Raise_Activated_Event() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var impl = new Mock(); + impl.SetupAllProperties(); + + bool raised = false; + var target = new TestWindowBase(impl.Object); + target.Activated += (s, e) => raised = true; + + impl.Object.Activated(); + + Assert.True(raised); + } + } + + + [Fact] + public void Impl_Deactivate_Should_Call_Raise_Deativated_Event() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var impl = new Mock(); + impl.SetupAllProperties(); + + bool raised = false; + var target = new TestWindowBase(impl.Object); + target.Deactivated += (s, e) => raised = true; + + impl.Object.Deactivated(); + + Assert.True(raised); + } + } + + private FuncControlTemplate CreateTemplate() + { + return new FuncControlTemplate(x => + new ContentPresenter + { + Name = "PART_ContentPresenter", + [!ContentPresenter.ContentProperty] = x[!ContentControl.ContentProperty], + }); + } + + private class TestWindowBase : WindowBase + { + public bool IsClosed { get; private set; } + + public TestWindowBase(IWindowBaseImpl impl) + : base(impl) + { + } + + protected override void HandleApplicationExiting() + { + base.HandleApplicationExiting(); + IsClosed = true; + } + } + } +} diff --git a/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs b/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs index b3e9b981a5..9922b624e5 100644 --- a/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs +++ b/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs @@ -139,7 +139,10 @@ namespace Avalonia.Layout.UnitTests var renderInterface = fixture.Create(); var windowImpl = new Mock(); - windowImpl.SetupProperty(x => x.ClientSize); + Size clientSize = default(Size); + + windowImpl.SetupGet(x => x.ClientSize).Returns(() => clientSize); + windowImpl.Setup(x => x.Resize(It.IsAny())).Callback(s => clientSize = s); windowImpl.Setup(x => x.MaxClientSize).Returns(new Size(1024, 1024)); windowImpl.SetupGet(x => x.Scaling).Returns(1); From 46de034f981b1b1268e77b321ee44c87fe339b1e Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 19 Feb 2017 21:21:03 +0300 Subject: [PATCH 16/95] Don't skip tests that are passing now --- tests/Avalonia.RenderTests/Controls/BorderTests.cs | 6 ------ tests/Avalonia.RenderTests/Shapes/PathTests.cs | 11 +---------- tests/Avalonia.RenderTests/Shapes/PolygonTests.cs | 4 ---- tests/Avalonia.RenderTests/Shapes/PolylineTests.cs | 4 ---- 4 files changed, 1 insertion(+), 24 deletions(-) diff --git a/tests/Avalonia.RenderTests/Controls/BorderTests.cs b/tests/Avalonia.RenderTests/Controls/BorderTests.cs index e960070f82..369f4b3031 100644 --- a/tests/Avalonia.RenderTests/Controls/BorderTests.cs +++ b/tests/Avalonia.RenderTests/Controls/BorderTests.cs @@ -181,8 +181,6 @@ namespace Avalonia.Direct2D1.RenderTests.Controls #if AVALONIA_CAIRO [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for new FormattedText")] #else [Fact] #endif @@ -338,8 +336,6 @@ namespace Avalonia.Direct2D1.RenderTests.Controls #if AVALONIA_CAIRO [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for new FormattedText")] #else [Fact] #endif @@ -371,8 +367,6 @@ namespace Avalonia.Direct2D1.RenderTests.Controls #if AVALONIA_CAIRO [Fact(Skip = "Font scaling currently broken on cairo")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for new FormattedText")] #else [Fact] #endif diff --git a/tests/Avalonia.RenderTests/Shapes/PathTests.cs b/tests/Avalonia.RenderTests/Shapes/PathTests.cs index 2e5d528bce..4a4bf16b5d 100644 --- a/tests/Avalonia.RenderTests/Shapes/PathTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PathTests.cs @@ -299,11 +299,7 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes RenderToFile(target); CompareImages(); } -#if AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")] -#else - [Fact] -#endif + public void Path_Tick_Scaled() { Decorator target = new Decorator @@ -326,11 +322,6 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes CompareImages(); } -#if AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")] -#else - [Fact] -#endif public void Path_Tick_Scaled_Stroke_8px() { Decorator target = new Decorator diff --git a/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs b/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs index 21a48b6b64..0f0debb92d 100644 --- a/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PolygonTests.cs @@ -23,8 +23,6 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes #if AVALONIA_CAIRO [Fact(Skip = "Caused by cairo bug")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")] #else [Fact] #endif @@ -51,8 +49,6 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes #if AVALONIA_CAIRO [Fact(Skip = "Caused by cairo bug")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")] #else [Fact] #endif diff --git a/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs b/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs index 5506b29971..d8ebde5712 100644 --- a/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PolylineTests.cs @@ -23,8 +23,6 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes #if AVALONIA_CAIRO [Fact(Skip = "Caused by cairo bug")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")] #else [Fact] #endif @@ -53,8 +51,6 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes #if AVALONIA_CAIRO [Fact(Skip = "Caused by cairo bug")] -#elif AVALONIA_SKIA_SKIP_FAIL - [Fact(Skip = "Waiting for https://github.com/mono/SkiaSharp/pull/63")] #else [Fact] #endif From 32d307f0320c0339dffed1467cbe53f3f272caef Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 19 Feb 2017 21:21:16 +0300 Subject: [PATCH 17/95] Possible leaks --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 0e40f578c0..0b1ef3fea7 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -162,9 +162,9 @@ namespace Avalonia.Skia var end = linearGradient.EndPoint.ToPixels(targetSize).ToSKPoint(); // would be nice to cache these shaders possibly? - var shader = SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode); - paint.Shader = shader; - shader.Dispose(); + using (var shader = SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode)) + paint.Shader = shader; + } else { @@ -178,9 +178,9 @@ namespace Avalonia.Skia //paint.setAlpha(128); // would be nice to cache these shaders possibly? - var shader = SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode); - paint.Shader = shader; - shader.Dispose(); + using (var shader = SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode)) + paint.Shader = shader; + } } @@ -209,8 +209,8 @@ namespace Avalonia.Skia : tileBrush.TileMode == TileMode.FlipY || tileBrush.TileMode == TileMode.FlipXY ? SKShaderTileMode.Mirror : SKShaderTileMode.Repeat; - paint.Shader = SKShader.CreateBitmap(bitmap.Bitmap, tileX, tileY, translation); - paint.Shader.Dispose(); + using (var shader = SKShader.CreateBitmap(bitmap.Bitmap, tileX, tileY, translation)) + paint.Shader = shader; } return rv; From 026c9430554e9e5cfd8fc4b2e2dec2f2900d9e29 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 19 Feb 2017 21:30:04 +0300 Subject: [PATCH 18/95] Fixed tests --- src/Avalonia.Controls/TopLevel.cs | 4 +++- src/Avalonia.Controls/WindowBase.cs | 5 ++++- tests/Avalonia.Controls.UnitTests/TopLevelTests.cs | 1 - 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 45bb655184..4de0256a7d 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -129,7 +129,7 @@ namespace Avalonia.Controls public Size ClientSize { get { return _clientSize; } - private set { SetAndRaise(ClientSizeProperty, ref _clientSize, value); } + protected set { SetAndRaise(ClientSizeProperty, ref _clientSize, value); } } /// @@ -216,6 +216,8 @@ namespace Avalonia.Controls protected virtual void HandleResized(Size clientSize) { ClientSize = clientSize; + Width = clientSize.Width; + Height = clientSize.Height; LayoutManager.Instance.ExecuteLayoutPass(); PlatformImpl.Invalidate(new Rect(clientSize)); } diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs index 07597984c4..ac6eea8641 100644 --- a/src/Avalonia.Controls/WindowBase.cs +++ b/src/Avalonia.Controls/WindowBase.cs @@ -137,7 +137,10 @@ namespace Avalonia.Controls Width = clientSize.Width; Height = clientSize.Height; } - base.HandleResized(clientSize); + ClientSize = clientSize; + LayoutManager.Instance.ExecuteLayoutPass(); + PlatformImpl.Invalidate(new Rect(clientSize)); + } /// diff --git a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs index 0614906306..e19729706d 100644 --- a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs @@ -86,7 +86,6 @@ namespace Avalonia.Controls.UnitTests using (UnitTestApplication.Start(TestServices.StyledWindow)) { var impl = new Mock(); - impl.SetupProperty(x => x.ClientSize); impl.SetupProperty(x => x.Resized); impl.SetupGet(x => x.Scaling).Returns(1); From 03ae54cb25bd8b64b5ef0248066282d856d24a85 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 20 Feb 2017 03:21:08 +0300 Subject: [PATCH 19/95] Platform toplevel cleanup --- .../Platform/SkiaPlatform/PopupImpl.cs | 23 +++++- .../Platform/SkiaPlatform/TopLevelImpl.cs | 41 +--------- src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj | 2 +- src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs | 37 +-------- src/Gtk/Avalonia.Gtk/FramebufferManager.cs | 4 +- src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs | 4 +- .../{WindowImplBase.cs => TopLevelImpl.cs} | 82 ++++++++----------- src/Gtk/Avalonia.Gtk/WindowImpl.cs | 23 ++++-- src/iOS/Avalonia.iOS/TopLevelImpl.cs | 66 ++------------- 9 files changed, 88 insertions(+), 194 deletions(-) rename src/Gtk/Avalonia.Gtk/{WindowImplBase.cs => TopLevelImpl.cs} (79%) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs index 7cfe04e5d6..efbc71b808 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs @@ -10,6 +10,7 @@ using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; +using Avalonia.Controls; using Avalonia.Platform; namespace Avalonia.Android.Platform.SkiaPlatform @@ -19,6 +20,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform private Point _position; private bool _isAdded; Action IWindowBaseImpl.Activated { get; set; } + public Action PositionChanged { get; set; } + public Action Deactivated { get; set; } + public PopupImpl() : base(ActivityTracker.Current, true) { } @@ -33,7 +37,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform UpdateParams(); } - public override Point Position + public Point Position { get { return _position; } set @@ -85,5 +89,22 @@ namespace Avalonia.Android.Platform.SkiaPlatform Hide(); base.Dispose(); } + + + public void Activate() + { + } + + public void BeginMoveDrag() + { + //Not supported + } + + public void BeginResizeDrag(WindowEdge edge) + { + //Not supported + } + + } } \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 124f22458e..75772be171 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -67,8 +67,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Action Closed { get; set; } - public Action Deactivated { get; set; } - public Action Input { get; set; } public Size MaxClientSize { get; protected set; } @@ -79,27 +77,17 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Action ScalingChanged { get; set; } - public Action PositionChanged { get; set; } - public View View => _view; public IPlatformHandle Handle => _view; public IEnumerable Surfaces => new object[] {this}; - - public void Activate() - { - } - + public virtual void Hide() { _view.Visibility = ViewStates.Invisible; } - - public void SetSystemDecorations(bool enabled) - { - } - + public void Invalidate(Rect rect) { if (_view.Holder?.Surface?.IsValid == true) _view.Invalidate(); @@ -124,40 +112,19 @@ namespace Avalonia.Android.Platform.SkiaPlatform { InputRoot = inputRoot; } - - public void SetTitle(string title) - { - } - + public virtual void Show() { _view.Visibility = ViewStates.Visible; } - public void BeginMoveDrag() - { - //Not supported - } - - public void BeginResizeDrag(WindowEdge edge) - { - //Not supported - } - - public virtual Point Position { get; set; } - public double Scaling => 1; void Draw() { Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); } - - public void SetIcon(IWindowIconImpl icon) - { - // No window icons for mobile platforms - } - + public virtual void Dispose() { _view.Dispose(); diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index 07a9ab56ed..d7e4400a99 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -61,7 +61,7 @@ - + diff --git a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs index 997a63246b..4e8085a057 100644 --- a/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs +++ b/src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs @@ -12,7 +12,7 @@ using WindowEdge = Avalonia.Controls.WindowEdge; namespace Avalonia.Gtk { - class EmbeddableImpl : WindowImplBase, IEmbeddableWindowImpl + class EmbeddableImpl : TopLevelImpl, IEmbeddableWindowImpl { #pragma warning disable CS0067 // Method not used public event Action LostFocus; @@ -37,39 +37,6 @@ namespace Avalonia.Gtk { get { return new Size(Widget.Allocation.Width, Widget.Allocation.Height); } } - - //Stubs are needed for future GTK designer embedding support - public override void SetTitle(string title) - { - } - - public override void Resize(Size value) - { - - } - - public override IDisposable ShowDialog() => Disposable.Create(() => { }); - - public override void SetSystemDecorations(bool enabled) - { - } - - public override void SetIcon(IWindowIconImpl icon) - { - } - - public override void BeginMoveDrag() - { - } - - public override void BeginResizeDrag(WindowEdge edge) - { - } - - public override Point Position - { - get { return new Point(); } - set {} - } + } } diff --git a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs index 00a4727769..0c9ed44274 100644 --- a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs @@ -5,10 +5,10 @@ namespace Avalonia.Gtk { class FramebufferManager : IFramebufferPlatformSurface, IDisposable { - private readonly WindowImplBase _window; + private readonly TopLevelImpl _window; private SurfaceFramebuffer _fb; - public FramebufferManager(WindowImplBase window) + public FramebufferManager(TopLevelImpl window) { _window = window; } diff --git a/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs b/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs index 962621856a..05dc1bf02d 100644 --- a/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs +++ b/src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs @@ -15,7 +15,7 @@ namespace Avalonia.Gtk public Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) { var tcs = new TaskCompletionSource(); - var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((WindowImplBase)parent)?.Widget.Toplevel as Window, + var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((TopLevelImpl)parent)?.Widget.Toplevel as Window, dialog is OpenFileDialog ? FileChooserAction.Open : FileChooserAction.Save, @@ -57,7 +57,7 @@ namespace Avalonia.Gtk public Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) { var tcs = new TaskCompletionSource(); - var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((WindowImplBase)parent)?.Widget.Toplevel as Window, + var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((TopLevelImpl)parent)?.Widget.Toplevel as Window, FileChooserAction.SelectFolder, "Cancel", ResponseType.Cancel, "Select Folder", ResponseType.Accept) diff --git a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs similarity index 79% rename from src/Gtk/Avalonia.Gtk/WindowImplBase.cs rename to src/Gtk/Avalonia.Gtk/TopLevelImpl.cs index 93e2652c6e..a1bb3f847e 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImplBase.cs +++ b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs @@ -15,10 +15,10 @@ namespace Avalonia.Gtk { using Gtk = global::Gtk; - public abstract class WindowImplBase : IWindowImpl + public abstract class TopLevelImpl : ITopLevelImpl { private IInputRoot _inputRoot; - protected Gtk.Widget _window; + private Gtk.Widget _widget; private FramebufferManager _framebuffer; private Gtk.IMContext _imContext; @@ -27,44 +27,43 @@ namespace Avalonia.Gtk private static readonly Gdk.Cursor DefaultCursor = new Gdk.Cursor(CursorType.LeftPtr); - protected WindowImplBase(Gtk.Widget window) + protected TopLevelImpl(Gtk.Widget window) { - _window = window; + _widget = window; _framebuffer = new FramebufferManager(this); Init(); } void Init() { - Handle = _window as IPlatformHandle; - _window.Events = EventMask.AllEventsMask; + Handle = _widget as IPlatformHandle; + _widget.Events = EventMask.AllEventsMask; _imContext = new Gtk.IMMulticontext(); _imContext.Commit += ImContext_Commit; - _window.Realized += OnRealized; - _window.Realize(); - _window.ButtonPressEvent += OnButtonPressEvent; - _window.ButtonReleaseEvent += OnButtonReleaseEvent; - _window.ScrollEvent += OnScrollEvent; - _window.Destroyed += OnDestroyed; - _window.KeyPressEvent += OnKeyPressEvent; - _window.KeyReleaseEvent += OnKeyReleaseEvent; - _window.ExposeEvent += OnExposeEvent; - _window.MotionNotifyEvent += OnMotionNotifyEvent; + _widget.Realized += OnRealized; + _widget.Realize(); + _widget.ButtonPressEvent += OnButtonPressEvent; + _widget.ButtonReleaseEvent += OnButtonReleaseEvent; + _widget.ScrollEvent += OnScrollEvent; + _widget.Destroyed += OnDestroyed; + _widget.KeyPressEvent += OnKeyPressEvent; + _widget.KeyReleaseEvent += OnKeyReleaseEvent; + _widget.ExposeEvent += OnExposeEvent; + _widget.MotionNotifyEvent += OnMotionNotifyEvent; } public IPlatformHandle Handle { get; private set; } - public Gtk.Widget Widget => _window; + public Gtk.Widget Widget => _widget; public Gdk.Drawable CurrentDrawable { get; private set; } void OnRealized (object sender, EventArgs eventArgs) { - _imContext.ClientWindow = _window.GdkWindow; + _imContext.ClientWindow = _widget.GdkWindow; } public abstract Size ClientSize { get; } - public abstract void Resize(Size value); public Size MaxClientSize { @@ -72,7 +71,7 @@ namespace Avalonia.Gtk { // TODO: This should take into account things such as taskbar and window border // thickness etc. - return new Size(_window.Screen.Width, _window.Screen.Height); + return new Size(_widget.Screen.Width, _widget.Screen.Height); } } @@ -80,7 +79,7 @@ namespace Avalonia.Gtk { get { - switch (_window.GdkWindow.State) + switch (_widget.GdkWindow.State) { case Gdk.WindowState.Iconified: return Controls.WindowState.Minimized; @@ -96,14 +95,14 @@ namespace Avalonia.Gtk switch (value) { case Controls.WindowState.Minimized: - _window.GdkWindow.Iconify(); + _widget.GdkWindow.Iconify(); break; case Controls.WindowState.Maximized: - _window.GdkWindow.Maximize(); + _widget.GdkWindow.Maximize(); break; case Controls.WindowState.Normal: - _window.GdkWindow.Deiconify(); - _window.GdkWindow.Unmaximize(); + _widget.GdkWindow.Deiconify(); + _widget.GdkWindow.Unmaximize(); break; } } @@ -141,15 +140,15 @@ namespace Avalonia.Gtk public void Invalidate(Rect rect) { - if (_window?.GdkWindow != null) - _window.GdkWindow.InvalidateRect( + if (_widget?.GdkWindow != null) + _widget.GdkWindow.InvalidateRect( new Rectangle((int) rect.X, (int) rect.Y, (int) rect.Width, (int) rect.Height), true); } public Point PointToClient(Point point) { int x, y; - _window.GdkWindow.GetDeskrelativeOrigin(out x, out y); + _widget.GdkWindow.GetDeskrelativeOrigin(out x, out y); return new Point(point.X - x, point.Y - y); } @@ -157,7 +156,7 @@ namespace Avalonia.Gtk public Point PointToScreen(Point point) { int x, y; - _window.GdkWindow.GetDeskrelativeOrigin(out x, out y); + _widget.GdkWindow.GetDeskrelativeOrigin(out x, out y); return new Point(point.X + x, point.Y + y); } @@ -166,28 +165,15 @@ namespace Avalonia.Gtk _inputRoot = inputRoot; } - public abstract void SetTitle(string title); - public abstract IDisposable ShowDialog(); - public abstract void SetSystemDecorations(bool enabled); - public abstract void SetIcon(IWindowIconImpl icon); - public void SetCursor(IPlatformHandle cursor) { - _window.GdkWindow.Cursor = cursor != null ? new Gdk.Cursor(cursor.Handle) : DefaultCursor; + _widget.GdkWindow.Cursor = cursor != null ? new Gdk.Cursor(cursor.Handle) : DefaultCursor; } - public void Show() => _window.Show(); - - public void Hide() => _window.Hide(); - public abstract void BeginMoveDrag(); - public abstract void BeginResizeDrag(WindowEdge edge); - public abstract Point Position { get; set; } + public void Show() => _widget.Show(); - void IWindowBaseImpl.Activate() - { - _window.Activate(); - } + public void Hide() => _widget.Hide(); private static InputModifiers GetModifierKeys(ModifierType state) { @@ -317,9 +303,9 @@ namespace Avalonia.Gtk public void Dispose() { _framebuffer.Dispose(); - _window.Hide(); - _window.Dispose(); - _window = null; + _widget.Hide(); + _widget.Dispose(); + _widget = null; } } } diff --git a/src/Gtk/Avalonia.Gtk/WindowImpl.cs b/src/Gtk/Avalonia.Gtk/WindowImpl.cs index d0c1715ee2..d8555b4e05 100644 --- a/src/Gtk/Avalonia.Gtk/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk/WindowImpl.cs @@ -6,7 +6,7 @@ using Gdk; namespace Avalonia.Gtk { using Gtk = global::Gtk; - public class WindowImpl : WindowImplBase + public class WindowImpl : TopLevelImpl, IWindowImpl { private Gtk.Window _window; private Gtk.Window Window => _window ?? (_window = (Gtk.Window) Widget); @@ -63,22 +63,27 @@ namespace Avalonia.Gtk } } - public override void Resize(Size value) + public void Resize(Size value) { Window.Resize((int)value.Width, (int)value.Height); } - public override void SetTitle(string title) + public void SetTitle(string title) { Window.Title = title; } + void IWindowBaseImpl.Activate() + { + _window.Activate(); + } + void OnFocusActivated(object sender, EventArgs eventArgs) { Activated(); } - public override void BeginMoveDrag() + public void BeginMoveDrag() { int x, y; ModifierType mod; @@ -86,7 +91,7 @@ namespace Avalonia.Gtk Window.BeginMoveDrag(1, x, y, 0); } - public override void BeginResizeDrag(Controls.WindowEdge edge) + public void BeginResizeDrag(Controls.WindowEdge edge) { int x, y; ModifierType mod; @@ -94,7 +99,7 @@ namespace Avalonia.Gtk Window.BeginResizeDrag((Gdk.WindowEdge)(int)edge, 1, x, y, 0); } - public override Point Position + public Point Position { get { @@ -108,7 +113,7 @@ namespace Avalonia.Gtk } } - public override IDisposable ShowDialog() + public IDisposable ShowDialog() { Window.Modal = true; Window.Show(); @@ -116,9 +121,9 @@ namespace Avalonia.Gtk return Disposable.Empty; } - public override void SetSystemDecorations(bool enabled) => Window.Decorated = enabled; + public void SetSystemDecorations(bool enabled) => Window.Decorated = enabled; - public override void SetIcon(IWindowIconImpl icon) + public void SetIcon(IWindowIconImpl icon) { Window.Icon = ((IconImpl)icon).Pixbuf; } diff --git a/src/iOS/Avalonia.iOS/TopLevelImpl.cs b/src/iOS/Avalonia.iOS/TopLevelImpl.cs index 96ab2786f7..7949e331fe 100644 --- a/src/iOS/Avalonia.iOS/TopLevelImpl.cs +++ b/src/iOS/Avalonia.iOS/TopLevelImpl.cs @@ -32,6 +32,7 @@ namespace Avalonia.iOS { _keyboardHelper = new KeyboardEventsHelper(this); AutoresizingMask = UIViewAutoresizing.All; + _keyboardHelper.ActivateAutoShowKeybord(); } [Export("hasText")] @@ -44,37 +45,21 @@ namespace Avalonia.iOS public void DeleteBackward() => _keyboardHelper.DeleteBackward(); public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder(); - - public Action Activated { get; set; } + public Action Closed { get; set; } - public Action Deactivated { get; set; } public Action Input { get; set; } public Action Paint { get; set; } public Action Resized { get; set; } public Action ScalingChanged { get; set; } - public Action PositionChanged { get; set; } public IPlatformHandle Handle => null; public double Scaling => UIScreen.MainScreen.Scale; - public WindowState WindowState - { - get { return WindowState.Normal; } - set { } - } - + public override void LayoutSubviews() => Resized?.Invoke(ClientSize); - public Size ClientSize - { - get { return Bounds.Size.ToAvalonia(); } - set { InvokeOnMainThread(() => Resized?.Invoke(ClientSize)); } - } - - public void Activate() - { - } + public Size ClientSize => Bounds.Size.ToAvalonia(); public override void Draw(CGRect rect) { @@ -93,42 +78,9 @@ namespace Avalonia.iOS { //Not supported } - - public void Show() - { - _keyboardHelper.ActivateAutoShowKeybord(); - } - - public void BeginMoveDrag() - { - //Not supported - } - - public void BeginResizeDrag(WindowEdge edge) - { - //Not supported - } - - public Point Position - { - get { return _position; } - set - { - _position = value; - PositionChanged?.Invoke(_position); - } - } - - public Size MaxClientSize => Bounds.Size.ToAvalonia(); - + public IEnumerable Surfaces => new object[] { this }; - - - public void Hide() - { - //Not supported - } - + public override void TouchesEnded(NSSet touches, UIEvent evt) { var touch = touches.AnyObject as UITouch; @@ -182,11 +134,7 @@ namespace Avalonia.iOS _touchLastPoint = location; } } - - public void SetIcon(IWindowIconImpl icon) - { - } - + public ILockedFramebuffer Lock() => new EmulatedFramebuffer(this); } } From 432153c006726f862b492cf978b9d29b2eb5b201 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 20 Feb 2017 11:49:50 +0300 Subject: [PATCH 20/95] Readd [Fact] for path tests --- tests/Avalonia.RenderTests/Shapes/PathTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Avalonia.RenderTests/Shapes/PathTests.cs b/tests/Avalonia.RenderTests/Shapes/PathTests.cs index 4a4bf16b5d..a9c7004651 100644 --- a/tests/Avalonia.RenderTests/Shapes/PathTests.cs +++ b/tests/Avalonia.RenderTests/Shapes/PathTests.cs @@ -300,6 +300,7 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes CompareImages(); } + [Fact] public void Path_Tick_Scaled() { Decorator target = new Decorator @@ -322,6 +323,7 @@ namespace Avalonia.Direct2D1.RenderTests.Shapes CompareImages(); } + [Fact] public void Path_Tick_Scaled_Stroke_8px() { Decorator target = new Decorator From e1b2ac56977b08eba8ca19d1bd3168a983f79a1f Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 22 Feb 2017 18:31:35 +0300 Subject: [PATCH 21/95] Add a way to pass view model for the main window --- src/Avalonia.Controls/AppBuilderBase.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/AppBuilderBase.cs b/src/Avalonia.Controls/AppBuilderBase.cs index b098c270a5..97de093a59 100644 --- a/src/Avalonia.Controls/AppBuilderBase.cs +++ b/src/Avalonia.Controls/AppBuilderBase.cs @@ -115,13 +115,16 @@ namespace Avalonia.Controls /// Starts the application with an instance of . /// /// The window type. - public void Start() + /// A delegate that will be called to create a data context for the window (optional). + public void Start(Func dataContextProvider = null) where TMainWindow : Window, new() { Setup(); BeforeStartCallback(Self); var window = new TMainWindow(); + if (dataContextProvider != null) + window.DataContext = dataContextProvider(); window.Show(); Instance.Run(window); } From 6072bad3f677e2457772c86229b1f83f8de002b1 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 23 Feb 2017 00:03:05 +0300 Subject: [PATCH 22/95] Naming --- src/Avalonia.Controls/Platform/IWindowBaseImpl.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs b/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs index 3f65d9f74e..a5c7c60843 100644 --- a/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs +++ b/src/Avalonia.Controls/Platform/IWindowBaseImpl.cs @@ -62,8 +62,8 @@ namespace Avalonia.Platform Size MaxClientSize { get; } /// - /// Gets the client size of the toplevel. + /// Sets the client size of the toplevel. /// - void Resize(Size size); + void Resize(Size clientSize); } } \ No newline at end of file From 657c53fb7303a2a5c877d84926ca2a0bc4c5f5a4 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 23 Feb 2017 00:03:31 +0300 Subject: [PATCH 23/95] Make it clear that MaxClientSize is used when available --- src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 01111d7b54..96190720ae 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -97,11 +97,9 @@ namespace Avalonia.Controls.Presenters /// public override Size MeasureOverride(Size availableSize) { - var maxAvailableSize = (Owner.GetVisualRoot() as WindowBase)?.PlatformImpl?.MaxClientSize; - if (!maxAvailableSize.HasValue) - { - maxAvailableSize = (Owner.GetVisualRoot() as TopLevel)?.ClientSize; - } + var visualRoot = Owner.GetVisualRoot(); + var maxAvailableSize = (visualRoot as WindowBase)?.PlatformImpl?.MaxClientSize + ?? (visualRoot as TopLevel)?.ClientSize; // If infinity is passed as the available size and we're virtualized then we need to // fill the available space, but to do that we *don't* want to materialize all our From 7013033a1b75920f718e5fdbc423056e5ad9ef66 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 23 Feb 2017 06:17:19 +0300 Subject: [PATCH 24/95] Added `Bitmap(PixelFormat format, IntPtr data, int width, int height, int stride)` constructor --- .../Avalonia.Controls.csproj | 1 - .../Platform/Surfaces/ILockedFramebuffer.cs | 1 + .../Platform/Surfaces/PixelFormat.cs | 15 --- src/Avalonia.Visuals/Avalonia.Visuals.csproj | 1 + src/Avalonia.Visuals/Media/Imaging/Bitmap.cs | 14 +++ .../Platform/IPlatformRenderInterface.cs | 12 ++ src/Avalonia.Visuals/Platform/PixelFormat.cs | 9 ++ src/Gtk/Avalonia.Cairo/CairoPlatform.cs | 5 + .../Avalonia.Skia/FramebufferRenderTarget.cs | 17 +-- .../Avalonia.Skia/PlatformRenderInterface.cs | 10 ++ src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs | 13 +++ .../Avalonia.Direct2D1/Direct2D1Platform.cs | 5 + .../Media/Imaging/WicBitmapImpl.cs | 25 ++++ .../SwapChainRenderTarget.cs | 1 + .../Interop/UnmanagedMethods.cs | 3 + .../Avalonia.Win32/WindowFramebuffer.cs | 2 +- .../InputElement_HitTesting.cs | 5 + .../Avalonia.RenderTests.projitems | 1 + .../Avalonia.RenderTests/Media/BitmapTests.cs | 108 ++++++++++++++++++ .../VisualTree/MockRenderInterface.cs | 5 + ...ouldBeUsableAsBitmap_Bgra8888.expected.png | Bin 0 -> 800 bytes ...ShouldBeUsableAsBitmap_Rgb565.expected.png | Bin 0 -> 786 bytes ...ouldBeUsableAsBitmap_Rgba8888.expected.png | Bin 0 -> 800 bytes 23 files changed, 221 insertions(+), 32 deletions(-) delete mode 100644 src/Avalonia.Controls/Platform/Surfaces/PixelFormat.cs create mode 100644 src/Avalonia.Visuals/Platform/PixelFormat.cs create mode 100644 tests/Avalonia.RenderTests/Media/BitmapTests.cs create mode 100644 tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Bgra8888.expected.png create mode 100644 tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Rgb565.expected.png create mode 100644 tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Rgba8888.expected.png diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index 6119103e6d..cb1e421470 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -60,7 +60,6 @@ - diff --git a/src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs b/src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs index d6402d170d..b62060b029 100644 --- a/src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs +++ b/src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs @@ -1,4 +1,5 @@ using System; +using Avalonia.Platform; namespace Avalonia.Controls.Platform.Surfaces { diff --git a/src/Avalonia.Controls/Platform/Surfaces/PixelFormat.cs b/src/Avalonia.Controls/Platform/Surfaces/PixelFormat.cs deleted file mode 100644 index c9f8eabe97..0000000000 --- a/src/Avalonia.Controls/Platform/Surfaces/PixelFormat.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Avalonia.Controls.Platform.Surfaces -{ - public enum PixelFormat - { - Rgb565, - Rgba8888, - Bgra8888 - } -} diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index a0ed19d2b4..1ba4e730d9 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -103,6 +103,7 @@ + diff --git a/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs index 1800110e68..c9f7e0f7ac 100644 --- a/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs +++ b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs @@ -41,6 +41,20 @@ namespace Avalonia.Media.Imaging PlatformImpl = impl; } + /// + /// Initializes a new instance of the class. + /// + /// Pixel format + /// Pointer to source bytes + /// Bitmap width + /// Bitmap height + /// Bytes per row + public Bitmap(PixelFormat format, IntPtr data, int width, int height, int stride) + { + PlatformImpl = AvaloniaLocator.Current.GetService() + .LoadBitmap(format, data, width, height, stride); + } + /// /// Gets the width of the bitmap, in pixels. /// diff --git a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs index cdec0a07a1..7dc97b022e 100644 --- a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs +++ b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.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; using System.Collections.Generic; using System.IO; using Avalonia.Media; @@ -68,5 +69,16 @@ namespace Avalonia.Platform /// The stream to read the bitmap from. /// An . IBitmapImpl LoadBitmap(Stream stream); + + /// + /// Loads a bitmap implementation from a pixels in memory.. + /// + /// Pixel format + /// Pointer to source bytes + /// Bitmap width + /// Bitmap height + /// Bytes per row + /// An . + IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride); } } diff --git a/src/Avalonia.Visuals/Platform/PixelFormat.cs b/src/Avalonia.Visuals/Platform/PixelFormat.cs new file mode 100644 index 0000000000..526303ebb1 --- /dev/null +++ b/src/Avalonia.Visuals/Platform/PixelFormat.cs @@ -0,0 +1,9 @@ +namespace Avalonia.Platform +{ + public enum PixelFormat + { + Rgb565, + Rgba8888, + Bgra8888 + } +} diff --git a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs index e6c493320f..b47827cb02 100644 --- a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs +++ b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs @@ -91,5 +91,10 @@ namespace Avalonia.Cairo Gtk.Application.Init(); return new Gtk.Invisible().CreatePangoContext(); } + + public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride) + { + throw new NotSupportedException("No proper control over pixel format with Cairo, use Skia backend instead"); + } } } diff --git a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs index b273d6209f..b2b5a0653f 100644 --- a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs @@ -22,19 +22,6 @@ namespace Avalonia.Skia //Nothing to do here, since we don't own framebuffer } - - SKColorType TranslatePixelFormat(PixelFormat fmt) - { - if(fmt == PixelFormat.Rgb565) - return SKColorType.Rgb565; - if(fmt == PixelFormat.Bgra8888) - return SKColorType.Bgra8888; - if (fmt == PixelFormat.Rgba8888) - return SKColorType.Rgba8888; - throw new ArgumentException("Unknown pixel format: " + fmt); - } - - class PixelFormatShim : IDisposable { private readonly SKImageInfo _nfo; @@ -73,8 +60,8 @@ namespace Avalonia.Skia { var fb = _surface.Lock(); PixelFormatShim shim = null; - SKImageInfo framebuffer = new SKImageInfo(fb.Width, fb.Height, TranslatePixelFormat(fb.Format), - SKAlphaType.Opaque); + SKImageInfo framebuffer = new SKImageInfo(fb.Width, fb.Height, fb.Format.ToSkColorType(), + SKAlphaType.Premul); var surface = SKSurface.Create(framebuffer, fb.Address, fb.RowBytes) ?? (shim = new PixelFormatShim(framebuffer, fb.Address, fb.RowBytes)) .CreateSurface(); diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index f0735bb0df..1b898f0f48 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -52,6 +52,16 @@ namespace Avalonia.Skia } } + public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride) + { + using (var tmp = new SKBitmap()) + { + tmp.InstallPixels(new SKImageInfo(width, height, format.ToSkColorType(), SKAlphaType.Premul) + , data, stride); + return new BitmapImpl(tmp.Copy()); + } + } + public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) { return new Renderer(root, renderLoop); diff --git a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs index 0d0ab380c5..7540caacfe 100644 --- a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs +++ b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs @@ -1,4 +1,6 @@ +using System; using Avalonia.Media; +using Avalonia.Platform; using SkiaSharp; @@ -44,6 +46,17 @@ namespace Avalonia.Skia return new SKColor(c.R, c.G, c.B, c.A); } + public static SKColorType ToSkColorType(this PixelFormat fmt) + { + if (fmt == PixelFormat.Rgb565) + return SKColorType.Rgb565; + if (fmt == PixelFormat.Bgra8888) + return SKColorType.Bgra8888; + if (fmt == PixelFormat.Rgba8888) + return SKColorType.Rgba8888; + throw new ArgumentException("Unknown pixel format: " + fmt); + } + public static SKShaderTileMode ToSKShaderTileMode(this Media.GradientSpreadMethod m) { switch (m) diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index 34595fecc8..913e76f48e 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -133,5 +133,10 @@ namespace Avalonia.Direct2D1 { return new WicBitmapImpl(s_imagingFactory, stream); } + + public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride) + { + return new WicBitmapImpl(s_imagingFactory, format, data, width, height, stride); + } } } diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs index f17c516edd..4082bf6850 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs @@ -4,6 +4,9 @@ using System; using System.IO; using Avalonia.Platform; +using Avalonia.Win32.Interop; +using PixelFormat = SharpDX.WIC.PixelFormat; +using APixelFormat = Avalonia.Platform.PixelFormat; using SharpDX.WIC; namespace Avalonia.Direct2D1.Media @@ -64,6 +67,28 @@ namespace Avalonia.Direct2D1.Media BitmapCreateCacheOption.CacheOnLoad); } + public WicBitmapImpl(ImagingFactory factory, Platform.PixelFormat format, IntPtr data, int width, int height, int stride) + { + Guid fmt; + if (format == APixelFormat.Rgb565) + fmt = PixelFormat.Format16bppBGR565; + else if (format == APixelFormat.Bgra8888) + fmt = PixelFormat.Format32bppPBGRA; + else if (format == APixelFormat.Rgba8888) + fmt = PixelFormat.Format32bppPRGBA; + else throw new ArgumentException("Unknown pixel format"); + + WicImpl = new Bitmap(factory, width, height, fmt, BitmapCreateCacheOption.CacheOnDemand); + using (var l = WicImpl.Lock(BitmapLockFlags.Write)) + { + for (var row = 0; row < height; row++) + { + UnmanagedMethods.CopyMemory(new IntPtr(l.Data.DataPointer.ToInt64() + row * l.Stride), + new IntPtr(data.ToInt64() + row * stride), (uint) l.Data.Pitch); + } + } + } + /// /// Gets the width of the bitmap, in pixels. /// diff --git a/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs b/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs index 8362305b9f..119715b5fc 100644 --- a/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs @@ -9,6 +9,7 @@ using Avalonia.Win32.Interop; using SharpDX; using SharpDX.Direct2D1; using SharpDX.DXGI; +using PixelFormat = SharpDX.Direct2D1.PixelFormat; using AlphaMode = SharpDX.Direct2D1.AlphaMode; using Device = SharpDX.Direct2D1.Device; using Factory = SharpDX.Direct2D1.Factory; diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 65a9f96b71..fe04d2c011 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -909,6 +909,9 @@ namespace Avalonia.Win32.Interop uint dwMaximumSizeLow, string lpName); + [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] + public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); + public enum MONITOR { MONITOR_DEFAULTTONULL = 0x00000000, diff --git a/src/Windows/Avalonia.Win32/WindowFramebuffer.cs b/src/Windows/Avalonia.Win32/WindowFramebuffer.cs index b00348d97d..4cae5af237 100644 --- a/src/Windows/Avalonia.Win32/WindowFramebuffer.cs +++ b/src/Windows/Avalonia.Win32/WindowFramebuffer.cs @@ -2,7 +2,7 @@ using System.Runtime.InteropServices; using Avalonia.Controls.Platform.Surfaces; using Avalonia.Win32.Interop; -using PixelFormat = Avalonia.Controls.Platform.Surfaces.PixelFormat; +using PixelFormat = Avalonia.Platform.PixelFormat; namespace Avalonia.Win32 { diff --git a/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs b/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs index e00d504124..b0a57f6f4a 100644 --- a/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs +++ b/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs @@ -365,6 +365,11 @@ namespace Avalonia.Input.UnitTests throw new NotImplementedException(); } + public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride) + { + throw new NotImplementedException(); + } + class MockStreamGeometry : Avalonia.Platform.IStreamGeometryImpl { private MockStreamGeometryContext _impl = new MockStreamGeometryContext(); diff --git a/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems b/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems index ad3b182bdf..e26ac81dda 100644 --- a/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems +++ b/tests/Avalonia.RenderTests/Avalonia.RenderTests.projitems @@ -10,6 +10,7 @@ + diff --git a/tests/Avalonia.RenderTests/Media/BitmapTests.cs b/tests/Avalonia.RenderTests/Media/BitmapTests.cs new file mode 100644 index 0000000000..e7bd1054d4 --- /dev/null +++ b/tests/Avalonia.RenderTests/Media/BitmapTests.cs @@ -0,0 +1,108 @@ +// 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.IO; +using System.Runtime.InteropServices; +using Avalonia.Controls; +using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Controls.Shapes; +using Avalonia.Layout; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Xunit; + +#if AVALONIA_CAIRO +namespace Avalonia.Cairo.RenderTests.Media +#elif AVALONIA_SKIA +namespace Avalonia.Skia.RenderTests +#else +namespace Avalonia.Direct2D1.RenderTests.Media +#endif +{ + public class BitmapTests : TestBase + { + public BitmapTests() + : base(@"Media\Bitmap") + { + Directory.CreateDirectory(OutputPath); + } + + class Framebuffer : ILockedFramebuffer, IFramebufferPlatformSurface + { + public Framebuffer(PixelFormat fmt, int width, int height) + { + Format = fmt; + var bpp = fmt == PixelFormat.Rgb565 ? 2 : 4; + Width = width; + Height = height; + RowBytes = bpp * width; + Address = Marshal.AllocHGlobal(Height * RowBytes); + } + + public IntPtr Address { get; } + + public Size Dpi { get; } = new Size(96, 96); + + public PixelFormat Format { get; } + + public int Height { get; } + + public int RowBytes { get; } + + public int Width { get; } + + public void Dispose() + { + //no-op + } + + public ILockedFramebuffer Lock() + { + return this; + } + + public void Deallocate() => Marshal.FreeHGlobal(Address); + } + + +#if AVALONIA_SKIA + [Theory] +#else + [Theory(Skip = "Framebuffer not supported")] +#endif + [InlineData(PixelFormat.Rgba8888), InlineData(PixelFormat.Bgra8888), InlineData(PixelFormat.Rgb565)] + public void FramebufferRenderResultsShouldBeUsableAsBitmap(PixelFormat fmt) + { + var testName = nameof(FramebufferRenderResultsShouldBeUsableAsBitmap) + "_" + fmt; + var fb = new Framebuffer(fmt, 80, 80); + var r = Avalonia.AvaloniaLocator.Current.GetService(); + using (var target = r.CreateRenderTarget(new object[] { fb })) + using (var ctx = target.CreateDrawingContext()) + { + ctx.PushOpacity(0.8); + ctx.FillRectangle(Brushes.Chartreuse, new Rect(0, 0, 20, 100)); + ctx.FillRectangle(Brushes.Crimson, new Rect(20, 0, 20, 100)); + ctx.FillRectangle(Brushes.Gold, new Rect(40, 0, 20, 100)); + } + + var bmp = new Bitmap(fmt, fb.Address, fb.Width, fb.Height, fb.RowBytes); + fb.Deallocate(); + using (var rtb = new RenderTargetBitmap(100, 100)) + { + using (var ctx = rtb.CreateDrawingContext()) + { + ctx.FillRectangle(Brushes.Blue, new Rect(0, 0, 100, 100)); + ctx.FillRectangle(Brushes.Pink, new Rect(0, 20, 100, 10)); + + var rc = new Rect(0, 0, 60, 60); + ctx.DrawImage(bmp, 1, rc, rc); + } + rtb.Save(System.IO.Path.Combine(OutputPath, testName + ".out.png")); + } + CompareImages(testName); + + } + } +} diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs b/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs index ac31b3852b..7345826829 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs @@ -45,6 +45,11 @@ namespace Avalonia.Visuals.UnitTests.VisualTree throw new NotImplementedException(); } + public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, int width, int height, int stride) + { + throw new NotImplementedException(); + } + class MockStreamGeometry : IStreamGeometryImpl { private MockStreamGeometryContext _impl = new MockStreamGeometryContext(); diff --git a/tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Bgra8888.expected.png b/tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Bgra8888.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..19686464c546d3f56a55e15fc4df8bc574ecf13e GIT binary patch literal 800 zcmeAS@N?(olHy`uVBq!ia0vp^DIm0?E|u$lp4Sznk+pCI zt8&hw6|IZJx}ppYsSSFePk-;<{yg#k=k4>?e|`Nut9(N0JB8DC9H;GU)+uI> ze8#uwjBLtG>k~#GiPBBIAg^g;9psn|@-5J#JsUblxX|hXn_`Q3mNMsM`qKH18@E56 ndHCa*hZWCgD4b?9|371-;u7va=|XQ{s%G$X^>bP0l+XkKg^yP@ literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Rgb565.expected.png b/tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Rgb565.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d20008a1bde3d523b8be3c2dc29af79b52303f GIT binary patch literal 786 zcmeAS@N?(olHy`uVBq!ia0vp^DIm_*Z1E)2cG}@ZrO^~MPgl128YzTqBOD= zu3%NpSu{k1j{g3hz18}JQTc?_cM7NPI8NKytW(S$`HXMV8QGMXK#BYB6l%hUjCbf5 z@>(+IW%|o_YA=nTHk63T%ok=2_BESn~aE`Pr+P_hqe@Y6hlb22WQ%mvv4F FO#n8jN}B)x literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Rgba8888.expected.png b/tests/TestFiles/Skia/Media/Bitmap/FramebufferRenderResultsShouldBeUsableAsBitmap_Rgba8888.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..19686464c546d3f56a55e15fc4df8bc574ecf13e GIT binary patch literal 800 zcmeAS@N?(olHy`uVBq!ia0vp^DIm0?E|u$lp4Sznk+pCI zt8&hw6|IZJx}ppYsSSFePk-;<{yg#k=k4>?e|`Nut9(N0JB8DC9H;GU)+uI> ze8#uwjBLtG>k~#GiPBBIAg^g;9psn|@-5J#JsUblxX|hXn_`Q3mNMsM`qKH18@E56 ndHCa*hZWCgD4b?9|371-;u7va=|XQ{s%G$X^>bP0l+XkKg^yP@ literal 0 HcmV?d00001 From 90a491554990b8c0a2c26f4a2fffdc6605223682 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 23 Feb 2017 06:18:00 +0300 Subject: [PATCH 25/95] Implemented WritableBitmap --- .../Avalonia.Controls.csproj | 1 - .../Surfaces/IFramebufferPlatformSurface.cs | 1 + src/Avalonia.Visuals/Avalonia.Visuals.csproj | 3 ++ .../Media/Imaging/WritableBitmap.cs | 22 ++++++++ .../Platform}/ILockedFramebuffer.cs | 3 +- .../Platform/IPlatformRenderInterface.cs | 9 ++++ .../Platform/IWritableBitmapImpl.cs | 16 ++++++ src/Gtk/Avalonia.Cairo/CairoPlatform.cs | 5 ++ src/Gtk/Avalonia.Gtk/FramebufferManager.cs | 1 + src/Gtk/Avalonia.Gtk3/FramebufferManager.cs | 1 + src/Skia/Avalonia.Skia/BitmapImpl.cs | 45 +++++++++++++++-- .../Avalonia.Skia/PlatformRenderInterface.cs | 5 ++ src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs | 11 ++++ .../Avalonia.Direct2D1.csproj | 1 + .../Avalonia.Direct2D1/Direct2D1Platform.cs | 6 +++ .../Media/Imaging/WicBitmapImpl.cs | 25 +++++----- .../Media/Imaging/WritableWicBitmapImpl.cs | 47 ++++++++++++++++++ .../Avalonia.Direct2D1/PrimitiveExtensions.cs | 11 ++++ .../Avalonia.Win32/FramebufferManager.cs | 1 + .../Avalonia.Win32/WindowFramebuffer.cs | 1 + .../InputElement_HitTesting.cs | 5 ++ .../Avalonia.RenderTests/Media/BitmapTests.cs | 33 +++++++++++- .../VisualTree/MockRenderInterface.cs | 5 ++ ...BitmapShouldBeUsable_Bgra8888.expected.png | Bin 0 -> 147998 bytes ...BitmapShouldBeUsable_Rgba8888.expected.png | Bin 0 -> 90938 bytes ...BitmapShouldBeUsable_Bgra8888.expected.png | Bin 0 -> 147998 bytes ...BitmapShouldBeUsable_Rgba8888.expected.png | Bin 0 -> 90938 bytes 27 files changed, 237 insertions(+), 21 deletions(-) create mode 100644 src/Avalonia.Visuals/Media/Imaging/WritableBitmap.cs rename src/{Avalonia.Controls/Platform/Surfaces => Avalonia.Visuals/Platform}/ILockedFramebuffer.cs (91%) create mode 100644 src/Avalonia.Visuals/Platform/IWritableBitmapImpl.cs create mode 100644 src/Windows/Avalonia.Direct2D1/Media/Imaging/WritableWicBitmapImpl.cs create mode 100644 tests/TestFiles/Direct2D1/Media/Bitmap/WritableBitmapShouldBeUsable_Bgra8888.expected.png create mode 100644 tests/TestFiles/Direct2D1/Media/Bitmap/WritableBitmapShouldBeUsable_Rgba8888.expected.png create mode 100644 tests/TestFiles/Skia/Media/Bitmap/WritableBitmapShouldBeUsable_Bgra8888.expected.png create mode 100644 tests/TestFiles/Skia/Media/Bitmap/WritableBitmapShouldBeUsable_Rgba8888.expected.png diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index cb1e421470..f12f07070e 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -59,7 +59,6 @@ - diff --git a/src/Avalonia.Controls/Platform/Surfaces/IFramebufferPlatformSurface.cs b/src/Avalonia.Controls/Platform/Surfaces/IFramebufferPlatformSurface.cs index 84988e912f..4dc96a074d 100644 --- a/src/Avalonia.Controls/Platform/Surfaces/IFramebufferPlatformSurface.cs +++ b/src/Avalonia.Controls/Platform/Surfaces/IFramebufferPlatformSurface.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Avalonia.Platform; namespace Avalonia.Controls.Platform.Surfaces { diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index 1ba4e730d9..812e9d48ad 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -69,6 +69,7 @@ + @@ -102,7 +103,9 @@ + + diff --git a/src/Avalonia.Visuals/Media/Imaging/WritableBitmap.cs b/src/Avalonia.Visuals/Media/Imaging/WritableBitmap.cs new file mode 100644 index 0000000000..5c5b516ddd --- /dev/null +++ b/src/Avalonia.Visuals/Media/Imaging/WritableBitmap.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Platform; + +namespace Avalonia.Media.Imaging +{ + /// + /// Holds a writable bitmap image. + /// + public class WritableBitmap : Bitmap + { + public WritableBitmap(int width, int height, PixelFormat? format = null) + : base(AvaloniaLocator.Current.GetService().CreateWritableBitmap(width, height, format)) + { + } + + public ILockedFramebuffer Lock() => ((IWritableBitmapImpl) PlatformImpl).Lock(); + } +} diff --git a/src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs b/src/Avalonia.Visuals/Platform/ILockedFramebuffer.cs similarity index 91% rename from src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs rename to src/Avalonia.Visuals/Platform/ILockedFramebuffer.cs index b62060b029..92ec2877ab 100644 --- a/src/Avalonia.Controls/Platform/Surfaces/ILockedFramebuffer.cs +++ b/src/Avalonia.Visuals/Platform/ILockedFramebuffer.cs @@ -1,7 +1,6 @@ using System; -using Avalonia.Platform; -namespace Avalonia.Controls.Platform.Surfaces +namespace Avalonia.Platform { public interface ILockedFramebuffer : IDisposable { diff --git a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs index 7dc97b022e..ef58d52b4f 100644 --- a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs +++ b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs @@ -56,6 +56,15 @@ namespace Avalonia.Platform /// An . IRenderTargetBitmapImpl CreateRenderTargetBitmap(int width, int height); + /// + /// Creates a writable bitmap implementation. + /// + /// The width of the bitmap. + /// The height of the bitmap. + /// Pixel format (optional). + /// An . + IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? format = null); + /// /// Loads a bitmap implementation from a file.. /// diff --git a/src/Avalonia.Visuals/Platform/IWritableBitmapImpl.cs b/src/Avalonia.Visuals/Platform/IWritableBitmapImpl.cs new file mode 100644 index 0000000000..b736c11dab --- /dev/null +++ b/src/Avalonia.Visuals/Platform/IWritableBitmapImpl.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Platform +{ + /// + /// Defines the platform-specific interface for a . + /// + public interface IWritableBitmapImpl : IBitmapImpl + { + ILockedFramebuffer Lock(); + } +} diff --git a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs index b47827cb02..9cf16312e9 100644 --- a/src/Gtk/Avalonia.Cairo/CairoPlatform.cs +++ b/src/Gtk/Avalonia.Cairo/CairoPlatform.cs @@ -96,5 +96,10 @@ namespace Avalonia.Cairo { throw new NotSupportedException("No proper control over pixel format with Cairo, use Skia backend instead"); } + + public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? fmt) + { + throw new NotSupportedException("No proper support with Cairo, use Skia backend instead"); + } } } diff --git a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs index 0c9ed44274..5ec49fb91f 100644 --- a/src/Gtk/Avalonia.Gtk/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk/FramebufferManager.cs @@ -1,5 +1,6 @@ using System; using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; namespace Avalonia.Gtk { diff --git a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs index e52f0efb81..41e174bce4 100644 --- a/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs +++ b/src/Gtk/Avalonia.Gtk3/FramebufferManager.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; namespace Avalonia.Gtk3 { diff --git a/src/Skia/Avalonia.Skia/BitmapImpl.cs b/src/Skia/Avalonia.Skia/BitmapImpl.cs index 7d99156a1d..b564734a47 100644 --- a/src/Skia/Avalonia.Skia/BitmapImpl.cs +++ b/src/Skia/Avalonia.Skia/BitmapImpl.cs @@ -9,7 +9,7 @@ using SkiaSharp; namespace Avalonia.Skia { - class BitmapImpl : IRenderTargetBitmapImpl + class BitmapImpl : IRenderTargetBitmapImpl, IWritableBitmapImpl { public SKBitmap Bitmap { get; private set; } @@ -20,11 +20,11 @@ namespace Avalonia.Skia PixelWidth = bm.Width; } - public BitmapImpl(int width, int height) + public BitmapImpl(int width, int height, PixelFormat? fmt = null) { PixelHeight = height; PixelWidth = width; - var colorType = SKImageInfo.PlatformColorType; + var colorType = fmt?.ToSkColorType() ?? SKImageInfo.PlatformColorType; var runtime = AvaloniaLocator.Current?.GetService()?.GetRuntimeInfo(); if (runtime?.IsDesktop == true && runtime?.OperatingSystem == OperatingSystemType.Linux) colorType = SKColorType.Bgra8888; @@ -38,10 +38,21 @@ namespace Avalonia.Skia public void Save(string fileName) { + #if DESKTOP + if(Bitmap.ColorType != SKColorType.Bgra8888) + { + using (var tmp = new BitmapImpl(Bitmap.Copy(SKColorType.Bgra8888))) + tmp.Save(fileName); + return; + } + IntPtr length; using (var sdb = new System.Drawing.Bitmap(PixelWidth, PixelHeight, Bitmap.RowBytes, - System.Drawing.Imaging.PixelFormat.Format32bppArgb, Bitmap.GetPixels(out length))) + + System.Drawing.Imaging.PixelFormat.Format32bppArgb, + + Bitmap.GetPixels(out length))) sdb.Save(fileName); #else //SkiaSharp doesn't expose image encoders yet @@ -96,5 +107,31 @@ namespace Avalonia.Skia data.SaveTo(stream); } } + + class BitmapFramebuffer : ILockedFramebuffer + { + private SKBitmap _bmp; + + public BitmapFramebuffer(SKBitmap bmp) + { + _bmp = bmp; + _bmp.LockPixels(); + } + + public void Dispose() + { + _bmp.UnlockPixels(); + _bmp = null; + } + + public IntPtr Address => _bmp.GetPixels(); + public int Width => _bmp.Width; + public int Height => _bmp.Height; + public int RowBytes => _bmp.RowBytes; + public Size Dpi { get; } = new Size(96, 96); + public PixelFormat Format => _bmp.ColorType.ToPixelFormat(); + } + + public ILockedFramebuffer Lock() => new BitmapFramebuffer(Bitmap); } } diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index 1b898f0f48..72f8d08d44 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -84,5 +84,10 @@ namespace Avalonia.Skia throw new Exception("Skia backend currently only supports framebuffer render target"); return new FramebufferRenderTarget(fb); } + + public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? format = null) + { + return new BitmapImpl(width, height, format); + } } } diff --git a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs index 7540caacfe..8591f9218a 100644 --- a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs +++ b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs @@ -57,6 +57,17 @@ namespace Avalonia.Skia throw new ArgumentException("Unknown pixel format: " + fmt); } + public static PixelFormat ToPixelFormat(this SKColorType fmt) + { + if (fmt == SKColorType.Rgb565) + return PixelFormat.Rgb565; + if (fmt == SKColorType.Bgra8888) + return PixelFormat.Bgra8888; + if (fmt == SKColorType.Rgba8888) + return PixelFormat.Rgba8888; + throw new ArgumentException("Unknown pixel format: " + fmt); + } + public static SKShaderTileMode ToSKShaderTileMode(this Media.GradientSpreadMethod m) { switch (m) diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index a055a337eb..ba117d72e9 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -70,6 +70,7 @@ + diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index 913e76f48e..d5b0f22090 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -10,6 +10,7 @@ using Avalonia.Media; using Avalonia.Platform; using Avalonia.Controls; using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Direct2D1.Media.Imaging; using Avalonia.Rendering; namespace Avalonia @@ -119,6 +120,11 @@ namespace Avalonia.Direct2D1 return new RenderTargetBitmapImpl(s_imagingFactory, s_d2D1Device.Factory, width, height); } + public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? format = null) + { + return new WritableWicBitmapImpl(s_imagingFactory, width, height, format); + } + public IStreamGeometryImpl CreateStreamGeometry() { return new StreamGeometryImpl(); diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs index 4082bf6850..2dd7acd9f9 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs @@ -56,29 +56,26 @@ namespace Avalonia.Direct2D1.Media /// The WIC imaging factory to use. /// The width of the bitmap. /// The height of the bitmap. - public WicBitmapImpl(ImagingFactory factory, int width, int height) + /// Pixel format + public WicBitmapImpl(ImagingFactory factory, int width, int height, APixelFormat? pixelFormat = null) { + if (!pixelFormat.HasValue) + pixelFormat = APixelFormat.Rgba8888; + _factory = factory; + PixelFormat = pixelFormat; WicImpl = new Bitmap( factory, width, height, - PixelFormat.Format32bppPBGRA, + pixelFormat.Value.ToWic(), BitmapCreateCacheOption.CacheOnLoad); } public WicBitmapImpl(ImagingFactory factory, Platform.PixelFormat format, IntPtr data, int width, int height, int stride) { - Guid fmt; - if (format == APixelFormat.Rgb565) - fmt = PixelFormat.Format16bppBGR565; - else if (format == APixelFormat.Bgra8888) - fmt = PixelFormat.Format32bppPBGRA; - else if (format == APixelFormat.Rgba8888) - fmt = PixelFormat.Format32bppPRGBA; - else throw new ArgumentException("Unknown pixel format"); - - WicImpl = new Bitmap(factory, width, height, fmt, BitmapCreateCacheOption.CacheOnDemand); + WicImpl = new Bitmap(factory, width, height, format.ToWic(), BitmapCreateCacheOption.CacheOnDemand); + PixelFormat = format; using (var l = WicImpl.Lock(BitmapLockFlags.Write)) { for (var row = 0; row < height; row++) @@ -89,6 +86,8 @@ namespace Avalonia.Direct2D1.Media } } + protected APixelFormat? PixelFormat { get; } + /// /// Gets the width of the bitmap, in pixels. /// @@ -120,7 +119,7 @@ namespace Avalonia.Direct2D1.Media if (_direct2D == null) { FormatConverter converter = new FormatConverter(_factory); - converter.Initialize(WicImpl, PixelFormat.Format32bppPBGRA); + converter.Initialize(WicImpl, SharpDX.WIC.PixelFormat.Format32bppPBGRA); _direct2D = SharpDX.Direct2D1.Bitmap.FromWicBitmap(renderTarget, converter); } diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WritableWicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WritableWicBitmapImpl.cs new file mode 100644 index 0000000000..06eb26b407 --- /dev/null +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WritableWicBitmapImpl.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Platform; +using SharpDX.WIC; +using PixelFormat = Avalonia.Platform.PixelFormat; + +namespace Avalonia.Direct2D1.Media.Imaging +{ + class WritableWicBitmapImpl : WicBitmapImpl, IWritableBitmapImpl + { + public WritableWicBitmapImpl(ImagingFactory factory, int width, int height, PixelFormat? pixelFormat) + : base(factory, width, height, pixelFormat) + { + } + + class LockedBitmap : ILockedFramebuffer + { + private readonly BitmapLock _lock; + private readonly PixelFormat _format; + + public LockedBitmap(BitmapLock l, PixelFormat format) + { + _lock = l; + _format = format; + } + + + public void Dispose() + { + _lock.Dispose(); + } + + public IntPtr Address => _lock.Data.DataPointer; + public int Width => _lock.Size.Width; + public int Height => _lock.Size.Height; + public int RowBytes => _lock.Stride; + public Size Dpi { get; } = new Size(96, 96); + public PixelFormat Format => _format; + + } + + public ILockedFramebuffer Lock() => new LockedBitmap(WicImpl.Lock(BitmapLockFlags.Write), PixelFormat.Value); + } +} diff --git a/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs b/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs index 87be89d10c..118b6deb97 100644 --- a/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs +++ b/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs @@ -88,6 +88,17 @@ namespace Avalonia.Direct2D1 return CapStyle.Triangle; } + public static Guid ToWic(this Platform.PixelFormat format) + { + if (format == Platform.PixelFormat.Rgb565) + return SharpDX.WIC.PixelFormat.Format16bppBGR565; + if (format == Platform.PixelFormat.Bgra8888) + return SharpDX.WIC.PixelFormat.Format32bppPBGRA; + if (format == Platform.PixelFormat.Rgba8888) + return SharpDX.WIC.PixelFormat.Format32bppPRGBA; + throw new ArgumentException("Unknown pixel format"); + } + /// /// Converts a pen to a Direct2D stroke style. /// diff --git a/src/Windows/Avalonia.Win32/FramebufferManager.cs b/src/Windows/Avalonia.Win32/FramebufferManager.cs index ecd05f41b4..f0a6430918 100644 --- a/src/Windows/Avalonia.Win32/FramebufferManager.cs +++ b/src/Windows/Avalonia.Win32/FramebufferManager.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; using Avalonia.Win32.Interop; namespace Avalonia.Win32 diff --git a/src/Windows/Avalonia.Win32/WindowFramebuffer.cs b/src/Windows/Avalonia.Win32/WindowFramebuffer.cs index 4cae5af237..fe4fe5c668 100644 --- a/src/Windows/Avalonia.Win32/WindowFramebuffer.cs +++ b/src/Windows/Avalonia.Win32/WindowFramebuffer.cs @@ -1,6 +1,7 @@ using System; using System.Runtime.InteropServices; using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; using Avalonia.Win32.Interop; using PixelFormat = Avalonia.Platform.PixelFormat; diff --git a/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs b/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs index b0a57f6f4a..a70130990a 100644 --- a/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs +++ b/tests/Avalonia.Input.UnitTests/InputElement_HitTesting.cs @@ -370,6 +370,11 @@ namespace Avalonia.Input.UnitTests throw new NotImplementedException(); } + public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? fmt) + { + throw new NotImplementedException(); + } + class MockStreamGeometry : Avalonia.Platform.IStreamGeometryImpl { private MockStreamGeometryContext _impl = new MockStreamGeometryContext(); diff --git a/tests/Avalonia.RenderTests/Media/BitmapTests.cs b/tests/Avalonia.RenderTests/Media/BitmapTests.cs index e7bd1054d4..1fd5d1eda6 100644 --- a/tests/Avalonia.RenderTests/Media/BitmapTests.cs +++ b/tests/Avalonia.RenderTests/Media/BitmapTests.cs @@ -102,7 +102,38 @@ namespace Avalonia.Direct2D1.RenderTests.Media rtb.Save(System.IO.Path.Combine(OutputPath, testName + ".out.png")); } CompareImages(testName); - + } + +#if AVALONIA_CAIRO + //wontfix +#else + [Theory] +#endif + [InlineData(PixelFormat.Bgra8888), InlineData(PixelFormat.Rgba8888)] + public void WritableBitmapShouldBeUsable(PixelFormat fmt) + { + var writableBitmap = new WritableBitmap(256, 256, fmt); + + var data = new int[256 * 256]; + for (int y = 0; y < 256; y++) + for (int x = 0; x < 256; x++) + data[y * 256 + x] =(int)((uint)(x + (y << 8)) | 0xFF000000u); + + + using (var l = writableBitmap.Lock()) + { + for(var r = 0; r<256; r++) + { + Marshal.Copy(data, r * 256, new IntPtr(l.Address.ToInt64() + r * l.RowBytes), 256); + } + } + + + var name = nameof(WritableBitmapShouldBeUsable) + "_" + fmt; + + writableBitmap.Save(System.IO.Path.Combine(OutputPath, name + ".out.png")); + CompareImages(name); + } } } diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs b/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs index 7345826829..303736be9c 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs @@ -50,6 +50,11 @@ namespace Avalonia.Visuals.UnitTests.VisualTree throw new NotImplementedException(); } + public IWritableBitmapImpl CreateWritableBitmap(int width, int height, PixelFormat? fmt) + { + throw new NotImplementedException(); + } + class MockStreamGeometry : IStreamGeometryImpl { private MockStreamGeometryContext _impl = new MockStreamGeometryContext(); diff --git a/tests/TestFiles/Direct2D1/Media/Bitmap/WritableBitmapShouldBeUsable_Bgra8888.expected.png b/tests/TestFiles/Direct2D1/Media/Bitmap/WritableBitmapShouldBeUsable_Bgra8888.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..ef77cbe0f2f6e30364fe5c47b901de0fd76961a4 GIT binary patch literal 147998 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

abLWPX=qYNVfNwr2-fI4s#FMl37KibUq4 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 PesP+$lT{tXC+>d$Igp>~ literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/Bitmap/WritableBitmapShouldBeUsable_Bgra8888.expected.png b/tests/TestFiles/Skia/Media/Bitmap/WritableBitmapShouldBeUsable_Bgra8888.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..ef77cbe0f2f6e30364fe5c47b901de0fd76961a4 GIT binary patch literal 147998 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

abLWPX=qYNVfNwr2-fI4s#FMl37KibUq4 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 PesP+$lT{tXC+>d$Igp>~ literal 0 HcmV?d00001 From 67a82d04624d6b67e3f34251ebe8f6ba3237b4c6 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 23 Feb 2017 06:21:53 +0300 Subject: [PATCH 26/95] Reverted WIC default pixel format --- src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs index 2dd7acd9f9..1554296c0f 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs @@ -60,7 +60,7 @@ namespace Avalonia.Direct2D1.Media public WicBitmapImpl(ImagingFactory factory, int width, int height, APixelFormat? pixelFormat = null) { if (!pixelFormat.HasValue) - pixelFormat = APixelFormat.Rgba8888; + pixelFormat = APixelFormat.Bgra8888; _factory = factory; PixelFormat = pixelFormat; From 131fa44fa139d2590011d9e94bc5696287be59bb Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 23 Feb 2017 15:04:59 +0300 Subject: [PATCH 27/95] Fixed namespaces --- .../Platform/SkiaPlatform/AndroidFramebuffer.cs | 2 +- src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs index 55e729f5a2..64dbeb89cc 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs @@ -2,7 +2,7 @@ using System; using System.Runtime.InteropServices; using Android.Runtime; using Android.Views; -using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; namespace Avalonia.Android.Platform.SkiaPlatform { diff --git a/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs b/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs index 1baed80ed7..f3fc90a2ab 100644 --- a/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs +++ b/src/iOS/Avalonia.iOS/EmulatedFramebuffer.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; -using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; using CoreGraphics; using UIKit; From 4ca0bb72b29a0b3d8e5d686c84604ac251c927a2 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 1 Mar 2017 08:46:21 +0100 Subject: [PATCH 28/95] Added GetObservable for routed events. Fixes #905. --- .../InteractiveExtensions.cs | 30 +++++++++++++++++-- .../Avalonia.Interactivity.UnitTests.csproj | 21 +++++++++++++ .../InteractiveTests.cs | 18 +++++++++++ .../packages.config | 6 ++++ 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Interactivity/InteractiveExtensions.cs b/src/Avalonia.Interactivity/InteractiveExtensions.cs index 2507fc6866..b03590951b 100644 --- a/src/Avalonia.Interactivity/InteractiveExtensions.cs +++ b/src/Avalonia.Interactivity/InteractiveExtensions.cs @@ -1,8 +1,10 @@ // 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; using System.Linq; +using System.Reactive.Linq; namespace Avalonia.Interactivity { @@ -11,12 +13,36 @@ namespace Avalonia.Interactivity /// public static class InteractiveExtensions { + ///

+ /// Gets an observable for a . + /// + /// The object to listen for events on. + /// The routed event. + /// The routing strategies to listen to. + /// Whether handled events should also be listened for. + /// + /// An observable which fires each time the event is raised. + /// + public static IObservable GetObservable( + this IInteractive o, + RoutedEvent routedEvent, + RoutingStrategies routes = RoutingStrategies.Direct | RoutingStrategies.Bubble, + bool handledEventsToo = false) + where TEventArgs : RoutedEventArgs + { + return Observable.Create(x => o.AddHandler( + routedEvent, + (_, e) => x.OnNext(e), + routes, + handledEventsToo)); + } + /// /// Gets the route for bubbling events from the specified interactive. /// /// The interactive. /// The event route. - public static IEnumerable GetBubbleEventRoute(this IInteractive interactive) + internal static IEnumerable GetBubbleEventRoute(this IInteractive interactive) { while (interactive != null) { @@ -30,7 +56,7 @@ namespace Avalonia.Interactivity /// /// The interactive. /// The event route. - public static IEnumerable GetTunnelEventRoute(this IInteractive interactive) + internal static IEnumerable GetTunnelEventRoute(this IInteractive interactive) { return interactive.GetBubbleEventRoute().Reverse(); } diff --git a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj index 6dfefe1a63..d8a6ee2506 100644 --- a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj +++ b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj @@ -37,11 +37,32 @@ + + ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll + True + + + ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll + True + + + ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll + True + + + ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll + True + + + ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll + True + + ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll diff --git a/tests/Avalonia.Interactivity.UnitTests/InteractiveTests.cs b/tests/Avalonia.Interactivity.UnitTests/InteractiveTests.cs index f107490ced..dd0974fad0 100644 --- a/tests/Avalonia.Interactivity.UnitTests/InteractiveTests.cs +++ b/tests/Avalonia.Interactivity.UnitTests/InteractiveTests.cs @@ -340,6 +340,24 @@ namespace Avalonia.Interactivity.UnitTests Assert.True(target.GetVisualParent().ClassHandlerInvoked); } + [Fact] + public void GetObservable_Should_Listen_To_Event() + { + var ev = new RoutedEvent("test", RoutingStrategies.Direct, typeof(TestInteractive)); + var target = new TestInteractive(); + var called = 0; + var subscription = target.GetObservable(ev).Subscribe(_ => ++called); + + var args = new RoutedEventArgs(ev, target); + target.RaiseEvent(args); + + subscription.Dispose(); + + target.RaiseEvent(args); + + Assert.Equal(1, called); + } + private TestInteractive CreateTree( RoutedEvent ev, EventHandler handler, diff --git a/tests/Avalonia.Interactivity.UnitTests/packages.config b/tests/Avalonia.Interactivity.UnitTests/packages.config index dcbf45edf0..953a4a666d 100644 --- a/tests/Avalonia.Interactivity.UnitTests/packages.config +++ b/tests/Avalonia.Interactivity.UnitTests/packages.config @@ -1,5 +1,11 @@  + + + + + + From 71c6c572acfa971d34f5ecc99f9ef34d6af2adcf Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 4 Mar 2017 01:58:52 +0100 Subject: [PATCH 29/95] Moved ncrunch files to their own dir. Also deleted v2 ncrunch files and update .gitignore. --- .gitignore | 5 ++++ .ncrunch/Avalonia.Android.v3.ncrunchproject | 6 ++++ ...a.AndroidTestApplication.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Animation.v3.ncrunchproject | 5 ++++ .../Avalonia.Base.UnitTests.v3.ncrunchproject | 8 ++++++ .ncrunch/Avalonia.Base.v3.ncrunchproject | 5 ++++ .../Avalonia.Benchmarks.v3.ncrunchproject | 5 ++++ ...alonia.Cairo.RenderTests.v3.ncrunchproject | 8 ++++++ .ncrunch/Avalonia.Cairo.v3.ncrunchproject | 5 ++++ ...lonia.Controls.UnitTests.v3.ncrunchproject | 8 ++++++ .ncrunch/Avalonia.Controls.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Designer.v3.ncrunchproject | 5 ++++ ....DesignerSupport.TestApp.v3.ncrunchproject | 6 ++++ ...ia.DesignerSupport.Tests.v3.ncrunchproject | 6 ++++ ...Avalonia.DesignerSupport.v3.ncrunchproject | 5 ++++ .../Avalonia.Diagnostics.v3.ncrunchproject | 5 ++++ ...ia.Direct2D1.RenderTests.v3.ncrunchproject | 6 ++++ ...onia.Direct2D1.UnitTests.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Direct2D1.v3.ncrunchproject | 5 ++++ ...alonia.DotNetCoreRuntime.v3.ncrunchproject | 5 ++++ ...a.DotNetFrameworkRuntime.v3.ncrunchproject | 6 ++++ .ncrunch/Avalonia.Gtk.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Gtk3.v3.ncrunchproject | 5 ++++ .../Avalonia.HtmlRenderer.v3.ncrunchproject | 5 ++++ ...Avalonia.Input.UnitTests.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Input.v3.ncrunchproject | 5 ++++ ....Interactivity.UnitTests.v3.ncrunchproject | 5 ++++ .../Avalonia.Interactivity.v3.ncrunchproject | 5 ++++ ...valonia.Layout.UnitTests.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Layout.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.LeakTests.v3.ncrunchproject | 5 ++++ ...Avalonia.Logging.Serilog.v3.ncrunchproject | 5 ++++ ...valonia.Markup.UnitTests.v3.ncrunchproject | 5 ++++ ...ia.Markup.Xaml.UnitTests.v3.ncrunchproject | 5 ++++ .../Avalonia.Markup.Xaml.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Markup.v3.ncrunchproject | 5 ++++ .../Avalonia.ReactiveUI.v3.ncrunchproject | 5 ++++ .../Avalonia.RenderTests.v3.ncrunchproject | 3 ++ .../Avalonia.Skia.Android.v3.ncrunchproject | 6 ++++ ...Skia.Desktop.NetStandard.v3.ncrunchproject | 5 ++++ .../Avalonia.Skia.Desktop.v3.ncrunchproject | 8 ++++++ ...valonia.Skia.RenderTests.v3.ncrunchproject | 6 ++++ .ncrunch/Avalonia.Skia.iOS.v3.ncrunchproject | 6 ++++ .ncrunch/Avalonia.Skia.v3.ncrunchproject | 3 ++ ...alonia.Styling.UnitTests.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.Styling.v3.ncrunchproject | 5 ++++ .../Avalonia.Themes.Default.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.UnitTests.v3.ncrunchproject | 5 ++++ ...alonia.Visuals.UnitTests.v3.ncrunchproject | 9 ++++++ .ncrunch/Avalonia.Visuals.v3.ncrunchproject | 5 ++++ ...alonia.Win32.NetStandard.v3.ncrunchproject | 5 ++++ .../Avalonia.Win32.Shared.v3.ncrunchproject | 3 ++ .ncrunch/Avalonia.Win32.v3.ncrunchproject | 5 ++++ .ncrunch/Avalonia.iOS.v3.ncrunchproject | 5 ++++ ...lonia.iOSTestApplication.v3.ncrunchproject | 5 ++++ .ncrunch/BindingTest.v3.ncrunchproject | 6 ++++ .../ControlCatalog.Android.v3.ncrunchproject | 5 ++++ .../ControlCatalog.Desktop.v3.ncrunchproject | 5 ++++ .ncrunch/ControlCatalog.iOS.v3.ncrunchproject | 5 ++++ .ncrunch/ControlCatalog.v3.ncrunchproject | 6 ++++ .ncrunch/GtkInteropDemo.v3.ncrunchproject | 5 ++++ .ncrunch/PlatformSupport.v3.ncrunchproject | 3 ++ .ncrunch/RenderHelpers.v3.ncrunchproject | 3 ++ .ncrunch/RenderTest.v3.ncrunchproject | 8 ++++++ .ncrunch/VirtualizationTest.v3.ncrunchproject | 6 ++++ .ncrunch/WindowsInteropTest.v3.ncrunchproject | 5 ++++ Avalonia.v2.ncrunchsolution | Bin 1836 -> 0 bytes Avalonia.v3.ncrunchsolution | 10 +++++++ .../BindingTest/BindingTest.v2.ncrunchproject | 26 ----------------- .../ControlCatalog.Android.v2.ncrunchproject | 26 ----------------- .../ControlCatalog.Desktop.v2.ncrunchproject | 26 ----------------- .../ControlCatalog.iOS.v2.ncrunchproject | 26 ----------------- .../ControlCatalog.v2.ncrunchproject | 26 ----------------- .../VirtualizationTest.v2.ncrunchproject | 26 ----------------- .../GtkInteropDemo.v2.ncrunchproject | 26 ----------------- .../WindowsInteropTest.v2.ncrunchproject | 26 ----------------- .../Avalonia.Android.v2.ncrunchproject | 26 ----------------- ...a.AndroidTestApplication.v2.ncrunchproject | 26 ----------------- .../Avalonia.Animation.v2.ncrunchproject | 26 ----------------- .../Avalonia.Base.v2.ncrunchproject | 26 ----------------- .../Avalonia.Controls.v2.ncrunchproject | 26 ----------------- ...Avalonia.DesignerSupport.v2.ncrunchproject | 26 ----------------- .../Avalonia.Diagnostics.v2.ncrunchproject | 26 ----------------- ...a.DotNetFrameworkRuntime.v2.ncrunchproject | 26 ----------------- .../Avalonia.HtmlRenderer.v2.ncrunchproject | 26 ----------------- .../Avalonia.Input.v2.ncrunchproject | 26 ----------------- .../Avalonia.Interactivity.v2.ncrunchproject | 26 ----------------- .../Avalonia.Layout.v2.ncrunchproject | 26 ----------------- ...Avalonia.Logging.Serilog.v2.ncrunchproject | 26 ----------------- .../Avalonia.ReactiveUI.v2.ncrunchproject | 26 ----------------- .../Avalonia.Styling.v2.ncrunchproject | 26 ----------------- .../Avalonia.Themes.Default.v2.ncrunchproject | 26 ----------------- .../Avalonia.Visuals.v2.ncrunchproject | 26 ----------------- .../Avalonia.Gtk.v2.ncrunchproject | 26 ----------------- .../Avalonia.Markup.Xaml.v2.ncrunchproject | 26 ----------------- .../Avalonia.Markup.v2.ncrunchproject | 26 ----------------- .../Avalonia.Skia.iOS.v2.ncrunchproject | 26 ----------------- .../Avalonia.Designer.v2.ncrunchproject | 26 ----------------- .../Avalonia.Direct2D1.v2.ncrunchproject | 26 ----------------- .../Avalonia.Win32.v2.ncrunchproject | 26 ----------------- .../Avalonia.iOS.v2.ncrunchproject | 26 ----------------- ...lonia.iOSTestApplication.v2.ncrunchproject | 26 ----------------- .../Avalonia.Base.UnitTests.v2.ncrunchproject | 27 ------------------ .../Avalonia.Benchmarks.v2.ncrunchproject | 26 ----------------- ...lonia.Controls.UnitTests.v2.ncrunchproject | 27 ------------------ ....DesignerSupport.TestApp.v2.ncrunchproject | 26 ----------------- ...ia.DesignerSupport.Tests.v2.ncrunchproject | 26 ----------------- ...onia.Direct2D1.UnitTests.v2.ncrunchproject | 26 ----------------- ...Avalonia.Input.UnitTests.v2.ncrunchproject | 26 ----------------- ....Interactivity.UnitTests.v2.ncrunchproject | 26 ----------------- ...valonia.Layout.UnitTests.v2.ncrunchproject | 26 ----------------- .../Avalonia.LeakTests.v2.ncrunchproject | 26 ----------------- ...valonia.Markup.UnitTests.v2.ncrunchproject | 26 ----------------- ...ia.Markup.Xaml.UnitTests.v2.ncrunchproject | 26 ----------------- .../Avalonia.Skia.RenderTests.csproj | 4 +-- ...alonia.Styling.UnitTests.v2.ncrunchproject | 26 ----------------- .../Avalonia.UnitTests.v2.ncrunchproject | 26 ----------------- 117 files changed, 362 insertions(+), 1252 deletions(-) create mode 100644 .ncrunch/Avalonia.Android.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.AndroidTestApplication.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Animation.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Base.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Base.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Benchmarks.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Cairo.RenderTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Cairo.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Controls.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Controls.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Designer.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.DesignerSupport.TestApp.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.DesignerSupport.Tests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Diagnostics.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Direct2D1.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.DotNetCoreRuntime.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.DotNetFrameworkRuntime.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Gtk.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Gtk3.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.HtmlRenderer.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Input.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Input.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Interactivity.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Layout.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.LeakTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Markup.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Markup.Xaml.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Markup.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.RenderTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Skia.Android.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Skia.Desktop.NetStandard.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Skia.Desktop.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Skia.iOS.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Skia.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Styling.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Styling.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Themes.Default.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Visuals.UnitTests.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Visuals.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Win32.NetStandard.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Win32.Shared.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Win32.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.iOS.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.iOSTestApplication.v3.ncrunchproject create mode 100644 .ncrunch/BindingTest.v3.ncrunchproject create mode 100644 .ncrunch/ControlCatalog.Android.v3.ncrunchproject create mode 100644 .ncrunch/ControlCatalog.Desktop.v3.ncrunchproject create mode 100644 .ncrunch/ControlCatalog.iOS.v3.ncrunchproject create mode 100644 .ncrunch/ControlCatalog.v3.ncrunchproject create mode 100644 .ncrunch/GtkInteropDemo.v3.ncrunchproject create mode 100644 .ncrunch/PlatformSupport.v3.ncrunchproject create mode 100644 .ncrunch/RenderHelpers.v3.ncrunchproject create mode 100644 .ncrunch/RenderTest.v3.ncrunchproject create mode 100644 .ncrunch/VirtualizationTest.v3.ncrunchproject create mode 100644 .ncrunch/WindowsInteropTest.v3.ncrunchproject delete mode 100644 Avalonia.v2.ncrunchsolution create mode 100644 Avalonia.v3.ncrunchsolution delete mode 100644 samples/BindingTest/BindingTest.v2.ncrunchproject delete mode 100644 samples/ControlCatalog.Android/ControlCatalog.Android.v2.ncrunchproject delete mode 100644 samples/ControlCatalog.Desktop/ControlCatalog.Desktop.v2.ncrunchproject delete mode 100644 samples/ControlCatalog.iOS/ControlCatalog.iOS.v2.ncrunchproject delete mode 100644 samples/ControlCatalog/ControlCatalog.v2.ncrunchproject delete mode 100644 samples/VirtualizationTest/VirtualizationTest.v2.ncrunchproject delete mode 100644 samples/interop/GtkInteropDemo/GtkInteropDemo.v2.ncrunchproject delete mode 100644 samples/interop/WindowsInteropTest/WindowsInteropTest.v2.ncrunchproject delete mode 100644 src/Android/Avalonia.Android/Avalonia.Android.v2.ncrunchproject delete mode 100644 src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.v2.ncrunchproject delete mode 100644 src/Avalonia.Animation/Avalonia.Animation.v2.ncrunchproject delete mode 100644 src/Avalonia.Base/Avalonia.Base.v2.ncrunchproject delete mode 100644 src/Avalonia.Controls/Avalonia.Controls.v2.ncrunchproject delete mode 100644 src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.v2.ncrunchproject delete mode 100644 src/Avalonia.Diagnostics/Avalonia.Diagnostics.v2.ncrunchproject delete mode 100644 src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.v2.ncrunchproject delete mode 100644 src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.v2.ncrunchproject delete mode 100644 src/Avalonia.Input/Avalonia.Input.v2.ncrunchproject delete mode 100644 src/Avalonia.Interactivity/Avalonia.Interactivity.v2.ncrunchproject delete mode 100644 src/Avalonia.Layout/Avalonia.Layout.v2.ncrunchproject delete mode 100644 src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.v2.ncrunchproject delete mode 100644 src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.v2.ncrunchproject delete mode 100644 src/Avalonia.Styling/Avalonia.Styling.v2.ncrunchproject delete mode 100644 src/Avalonia.Themes.Default/Avalonia.Themes.Default.v2.ncrunchproject delete mode 100644 src/Avalonia.Visuals/Avalonia.Visuals.v2.ncrunchproject delete mode 100644 src/Gtk/Avalonia.Gtk/Avalonia.Gtk.v2.ncrunchproject delete mode 100644 src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.v2.ncrunchproject delete mode 100644 src/Markup/Avalonia.Markup/Avalonia.Markup.v2.ncrunchproject delete mode 100644 src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.v2.ncrunchproject delete mode 100644 src/Windows/Avalonia.Designer/Avalonia.Designer.v2.ncrunchproject delete mode 100644 src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.v2.ncrunchproject delete mode 100644 src/Windows/Avalonia.Win32/Avalonia.Win32.v2.ncrunchproject delete mode 100644 src/iOS/Avalonia.iOS/Avalonia.iOS.v2.ncrunchproject delete mode 100644 src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.v2.ncrunchproject delete mode 100644 tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Benchmarks/Avalonia.Benchmarks.v2.ncrunchproject delete mode 100644 tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.v2.ncrunchproject delete mode 100644 tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.LeakTests/Avalonia.LeakTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.v2.ncrunchproject delete mode 100644 tests/Avalonia.UnitTests/Avalonia.UnitTests.v2.ncrunchproject diff --git a/.gitignore b/.gitignore index d965a09574..c36f64e5de 100644 --- a/.gitignore +++ b/.gitignore @@ -105,6 +105,11 @@ csx # Windows Store app package directory AppPackages/ +# NCrunch +_NCrunch_*/ +*.ncrunchsolution.user +nCrunchTemp_*/ + # Others sql/ *.Cache diff --git a/.ncrunch/Avalonia.Android.v3.ncrunchproject b/.ncrunch/Avalonia.Android.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/Avalonia.Android.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.AndroidTestApplication.v3.ncrunchproject b/.ncrunch/Avalonia.AndroidTestApplication.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.AndroidTestApplication.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Animation.v3.ncrunchproject b/.ncrunch/Avalonia.Animation.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Animation.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Base.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Base.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..13f78c1d4c --- /dev/null +++ b/.ncrunch/Avalonia.Base.UnitTests.v3.ncrunchproject @@ -0,0 +1,8 @@ + + + + LongTestTimesWithoutParallelExecution + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Base.v3.ncrunchproject b/.ncrunch/Avalonia.Base.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Base.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject b/.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Cairo.RenderTests.v3.ncrunchproject b/.ncrunch/Avalonia.Cairo.RenderTests.v3.ncrunchproject new file mode 100644 index 0000000000..101c806e63 --- /dev/null +++ b/.ncrunch/Avalonia.Cairo.RenderTests.v3.ncrunchproject @@ -0,0 +1,8 @@ + + + + AbnormalReferenceResolution + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Cairo.v3.ncrunchproject b/.ncrunch/Avalonia.Cairo.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Cairo.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Controls.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Controls.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..13f78c1d4c --- /dev/null +++ b/.ncrunch/Avalonia.Controls.UnitTests.v3.ncrunchproject @@ -0,0 +1,8 @@ + + + + LongTestTimesWithoutParallelExecution + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Controls.v3.ncrunchproject b/.ncrunch/Avalonia.Controls.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Controls.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Designer.v3.ncrunchproject b/.ncrunch/Avalonia.Designer.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Designer.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.DesignerSupport.TestApp.v3.ncrunchproject b/.ncrunch/Avalonia.DesignerSupport.TestApp.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/Avalonia.DesignerSupport.TestApp.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.DesignerSupport.Tests.v3.ncrunchproject b/.ncrunch/Avalonia.DesignerSupport.Tests.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/Avalonia.DesignerSupport.Tests.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject b/.ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.DesignerSupport.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Diagnostics.v3.ncrunchproject b/.ncrunch/Avalonia.Diagnostics.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Diagnostics.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject b/.ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject new file mode 100644 index 0000000000..235da29767 --- /dev/null +++ b/.ncrunch/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + 1000 + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Direct2D1.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Direct2D1.v3.ncrunchproject b/.ncrunch/Avalonia.Direct2D1.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Direct2D1.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.DotNetCoreRuntime.v3.ncrunchproject b/.ncrunch/Avalonia.DotNetCoreRuntime.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.DotNetCoreRuntime.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.DotNetFrameworkRuntime.v3.ncrunchproject b/.ncrunch/Avalonia.DotNetFrameworkRuntime.v3.ncrunchproject new file mode 100644 index 0000000000..3cd9a982c9 --- /dev/null +++ b/.ncrunch/Avalonia.DotNetFrameworkRuntime.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + False + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Gtk.v3.ncrunchproject b/.ncrunch/Avalonia.Gtk.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Gtk.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Gtk3.v3.ncrunchproject b/.ncrunch/Avalonia.Gtk3.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Gtk3.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.HtmlRenderer.v3.ncrunchproject b/.ncrunch/Avalonia.HtmlRenderer.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.HtmlRenderer.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Input.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Input.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Input.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Input.v3.ncrunchproject b/.ncrunch/Avalonia.Input.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Input.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Interactivity.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Interactivity.v3.ncrunchproject b/.ncrunch/Avalonia.Interactivity.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Interactivity.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Layout.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Layout.v3.ncrunchproject b/.ncrunch/Avalonia.Layout.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Layout.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.LeakTests.v3.ncrunchproject b/.ncrunch/Avalonia.LeakTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.LeakTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject b/.ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Logging.Serilog.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Markup.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Markup.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Markup.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Markup.Xaml.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Markup.Xaml.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Markup.Xaml.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject b/.ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Markup.Xaml.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Markup.v3.ncrunchproject b/.ncrunch/Avalonia.Markup.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Markup.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject b/.ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.ReactiveUI.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.RenderTests.v3.ncrunchproject b/.ncrunch/Avalonia.RenderTests.v3.ncrunchproject new file mode 100644 index 0000000000..95a483b433 --- /dev/null +++ b/.ncrunch/Avalonia.RenderTests.v3.ncrunchproject @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Skia.Android.v3.ncrunchproject b/.ncrunch/Avalonia.Skia.Android.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/Avalonia.Skia.Android.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Skia.Desktop.NetStandard.v3.ncrunchproject b/.ncrunch/Avalonia.Skia.Desktop.NetStandard.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Skia.Desktop.NetStandard.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Skia.Desktop.v3.ncrunchproject b/.ncrunch/Avalonia.Skia.Desktop.v3.ncrunchproject new file mode 100644 index 0000000000..ae3801f32b --- /dev/null +++ b/.ncrunch/Avalonia.Skia.Desktop.v3.ncrunchproject @@ -0,0 +1,8 @@ + + + True + False + True + x86 + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject b/.ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject new file mode 100644 index 0000000000..235da29767 --- /dev/null +++ b/.ncrunch/Avalonia.Skia.RenderTests.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + 1000 + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Skia.iOS.v3.ncrunchproject b/.ncrunch/Avalonia.Skia.iOS.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/Avalonia.Skia.iOS.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Skia.v3.ncrunchproject b/.ncrunch/Avalonia.Skia.v3.ncrunchproject new file mode 100644 index 0000000000..95a483b433 --- /dev/null +++ b/.ncrunch/Avalonia.Skia.v3.ncrunchproject @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Styling.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Styling.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Styling.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Styling.v3.ncrunchproject b/.ncrunch/Avalonia.Styling.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Styling.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Themes.Default.v3.ncrunchproject b/.ncrunch/Avalonia.Themes.Default.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Themes.Default.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.UnitTests.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Visuals.UnitTests.v3.ncrunchproject b/.ncrunch/Avalonia.Visuals.UnitTests.v3.ncrunchproject new file mode 100644 index 0000000000..ee655751a0 --- /dev/null +++ b/.ncrunch/Avalonia.Visuals.UnitTests.v3.ncrunchproject @@ -0,0 +1,9 @@ + + + + AbnormalReferenceResolution + LongTestTimesWithoutParallelExecution + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Visuals.v3.ncrunchproject b/.ncrunch/Avalonia.Visuals.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Visuals.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Win32.NetStandard.v3.ncrunchproject b/.ncrunch/Avalonia.Win32.NetStandard.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Win32.NetStandard.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Win32.Shared.v3.ncrunchproject b/.ncrunch/Avalonia.Win32.Shared.v3.ncrunchproject new file mode 100644 index 0000000000..95a483b433 --- /dev/null +++ b/.ncrunch/Avalonia.Win32.Shared.v3.ncrunchproject @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Win32.v3.ncrunchproject b/.ncrunch/Avalonia.Win32.v3.ncrunchproject new file mode 100644 index 0000000000..6800b4a3fe --- /dev/null +++ b/.ncrunch/Avalonia.Win32.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.iOS.v3.ncrunchproject b/.ncrunch/Avalonia.iOS.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.iOS.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.iOSTestApplication.v3.ncrunchproject b/.ncrunch/Avalonia.iOSTestApplication.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.iOSTestApplication.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/BindingTest.v3.ncrunchproject b/.ncrunch/BindingTest.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/BindingTest.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/ControlCatalog.Android.v3.ncrunchproject b/.ncrunch/ControlCatalog.Android.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/ControlCatalog.Android.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/ControlCatalog.Desktop.v3.ncrunchproject b/.ncrunch/ControlCatalog.Desktop.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/ControlCatalog.Desktop.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/ControlCatalog.iOS.v3.ncrunchproject b/.ncrunch/ControlCatalog.iOS.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/ControlCatalog.iOS.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/ControlCatalog.v3.ncrunchproject b/.ncrunch/ControlCatalog.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/ControlCatalog.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/GtkInteropDemo.v3.ncrunchproject b/.ncrunch/GtkInteropDemo.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/GtkInteropDemo.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/PlatformSupport.v3.ncrunchproject b/.ncrunch/PlatformSupport.v3.ncrunchproject new file mode 100644 index 0000000000..95a483b433 --- /dev/null +++ b/.ncrunch/PlatformSupport.v3.ncrunchproject @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.ncrunch/RenderHelpers.v3.ncrunchproject b/.ncrunch/RenderHelpers.v3.ncrunchproject new file mode 100644 index 0000000000..95a483b433 --- /dev/null +++ b/.ncrunch/RenderHelpers.v3.ncrunchproject @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.ncrunch/RenderTest.v3.ncrunchproject b/.ncrunch/RenderTest.v3.ncrunchproject new file mode 100644 index 0000000000..e12537d535 --- /dev/null +++ b/.ncrunch/RenderTest.v3.ncrunchproject @@ -0,0 +1,8 @@ + + + + MissingOrIgnoredProjectReference + + True + + \ No newline at end of file diff --git a/.ncrunch/VirtualizationTest.v3.ncrunchproject b/.ncrunch/VirtualizationTest.v3.ncrunchproject new file mode 100644 index 0000000000..a4953e14f9 --- /dev/null +++ b/.ncrunch/VirtualizationTest.v3.ncrunchproject @@ -0,0 +1,6 @@ + + + True + True + + \ No newline at end of file diff --git a/.ncrunch/WindowsInteropTest.v3.ncrunchproject b/.ncrunch/WindowsInteropTest.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/WindowsInteropTest.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/Avalonia.v2.ncrunchsolution b/Avalonia.v2.ncrunchsolution deleted file mode 100644 index fe4feb2cb68b687b4720bc1a47cbec77763ab35f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1836 zcmcJQO;5r=5Qg8giT}Z~2aTRd6QW{Fgb=}x0~f7D)P9&Qi2ix?nJuMYGxMdJ!OhD(OA#)Ql0qskkJ#fx$fsHfp)c{J)VYItjCIUL(Ao6zJZQdJ6yS1 z`Cp(k^uAsEGriCcQM%%{n2)ds89811{Zn|F^c-`E9#H>O2fD=D1bE#uXRAg~|Na$w z6P+05sk&%dglrtq`krO1Gkwqt7or+)ww!T6_rD$fA}AFd+8NQC5H&mdZ?ao%Xsi)d zBN!4Nr&#ZvcNJSbdsoygA1k}BDXh6(xmnA)nC6ILnSp(7_6@6+x9VV(diua;LZnmH zQ|uFFLvq6UmJODLZkB&`E1M{7N`3B`>|~ir?j9#BPFW}QveKs9ZR&x=KHM_(qD~#m zWv*^F)<#_^ZOVN&&+OxQw6~Sp%UTtAQ;$4W8;a_0|D>|E7d6GINyzL3y9mxPZ^zqd wFpov$G0;BG0nMuL`ny+TZFH<=+JD^nids;V-wNou0Jkex*#H0l diff --git a/Avalonia.v3.ncrunchsolution b/Avalonia.v3.ncrunchsolution new file mode 100644 index 0000000000..c2c454eae1 --- /dev/null +++ b/Avalonia.v3.ncrunchsolution @@ -0,0 +1,10 @@ + + + + tests\TestFiles\**.* + + False + .ncrunch + True + + \ No newline at end of file diff --git a/samples/BindingTest/BindingTest.v2.ncrunchproject b/samples/BindingTest/BindingTest.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/samples/BindingTest/BindingTest.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.v2.ncrunchproject b/samples/ControlCatalog.Android/ControlCatalog.Android.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/samples/ControlCatalog.Android/ControlCatalog.Android.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.v2.ncrunchproject b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.v2.ncrunchproject b/samples/ControlCatalog.iOS/ControlCatalog.iOS.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/ControlCatalog/ControlCatalog.v2.ncrunchproject b/samples/ControlCatalog/ControlCatalog.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/samples/ControlCatalog/ControlCatalog.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/VirtualizationTest/VirtualizationTest.v2.ncrunchproject b/samples/VirtualizationTest/VirtualizationTest.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/samples/VirtualizationTest/VirtualizationTest.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/interop/GtkInteropDemo/GtkInteropDemo.v2.ncrunchproject b/samples/interop/GtkInteropDemo/GtkInteropDemo.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/samples/interop/GtkInteropDemo/GtkInteropDemo.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/samples/interop/WindowsInteropTest/WindowsInteropTest.v2.ncrunchproject b/samples/interop/WindowsInteropTest/WindowsInteropTest.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/samples/interop/WindowsInteropTest/WindowsInteropTest.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Avalonia.Android.v2.ncrunchproject b/src/Android/Avalonia.Android/Avalonia.Android.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/src/Android/Avalonia.Android/Avalonia.Android.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.v2.ncrunchproject b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Animation/Avalonia.Animation.v2.ncrunchproject b/src/Avalonia.Animation/Avalonia.Animation.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Animation/Avalonia.Animation.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Base/Avalonia.Base.v2.ncrunchproject b/src/Avalonia.Base/Avalonia.Base.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Base/Avalonia.Base.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Controls/Avalonia.Controls.v2.ncrunchproject b/src/Avalonia.Controls/Avalonia.Controls.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Controls/Avalonia.Controls.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.v2.ncrunchproject b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.v2.ncrunchproject b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.v2.ncrunchproject b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.v2.ncrunchproject b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Input/Avalonia.Input.v2.ncrunchproject b/src/Avalonia.Input/Avalonia.Input.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Input/Avalonia.Input.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Interactivity/Avalonia.Interactivity.v2.ncrunchproject b/src/Avalonia.Interactivity/Avalonia.Interactivity.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Interactivity/Avalonia.Interactivity.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Layout/Avalonia.Layout.v2.ncrunchproject b/src/Avalonia.Layout/Avalonia.Layout.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Layout/Avalonia.Layout.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.v2.ncrunchproject b/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.v2.ncrunchproject b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Styling/Avalonia.Styling.v2.ncrunchproject b/src/Avalonia.Styling/Avalonia.Styling.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Styling/Avalonia.Styling.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.v2.ncrunchproject b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.v2.ncrunchproject b/src/Avalonia.Visuals/Avalonia.Visuals.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Avalonia.Visuals/Avalonia.Visuals.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.v2.ncrunchproject b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.v2.ncrunchproject b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup/Avalonia.Markup.v2.ncrunchproject b/src/Markup/Avalonia.Markup/Avalonia.Markup.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Markup/Avalonia.Markup/Avalonia.Markup.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.v2.ncrunchproject b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Windows/Avalonia.Designer/Avalonia.Designer.v2.ncrunchproject b/src/Windows/Avalonia.Designer/Avalonia.Designer.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Windows/Avalonia.Designer/Avalonia.Designer.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.v2.ncrunchproject b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.v2.ncrunchproject b/src/Windows/Avalonia.Win32/Avalonia.Win32.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.v2.ncrunchproject b/src/iOS/Avalonia.iOS/Avalonia.iOS.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.v2.ncrunchproject b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.v2.ncrunchproject deleted file mode 100644 index e1b4d7cf28..0000000000 --- a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - false - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.v2.ncrunchproject b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.v2.ncrunchproject deleted file mode 100644 index b5cd70b13f..0000000000 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,27 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - LongTestTimesWithoutParallelExecution - \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.v2.ncrunchproject b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.v2.ncrunchproject b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.v2.ncrunchproject deleted file mode 100644 index b5cd70b13f..0000000000 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,27 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - LongTestTimesWithoutParallelExecution - \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.v2.ncrunchproject b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.v2.ncrunchproject b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.v2.ncrunchproject deleted file mode 100644 index f744eecae0..0000000000 --- a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - true - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.v2.ncrunchproject b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.v2.ncrunchproject b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.v2.ncrunchproject b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.v2.ncrunchproject b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.v2.ncrunchproject b/tests/Avalonia.LeakTests/Avalonia.LeakTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.v2.ncrunchproject b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.v2.ncrunchproject b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj index 9a8fa82d8b..1ba80837f0 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj @@ -19,7 +19,7 @@ true full false - bin\Debug\ + ..\..\artifacts\tests\ TRACE;DEBUG;AVALONIA_SKIA;AVALONIA_SKIA_SKIP_FAIL prompt 4 @@ -27,7 +27,7 @@ pdbonly true - bin\Release\ + ..\..\artifacts\tests\ TRACE;AVALONIA_SKIA;AVALONIA_SKIA_SKIP_FAIL prompt 4 diff --git a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.v2.ncrunchproject b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.v2.ncrunchproject b/tests/Avalonia.UnitTests/Avalonia.UnitTests.v2.ncrunchproject deleted file mode 100644 index 30815b1937..0000000000 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - \ No newline at end of file From 8099317f88e2aa6e35c599cd3da3ad7f8cfaaa4e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 4 Mar 2017 02:21:44 +0100 Subject: [PATCH 30/95] Ported RenderTest from scenegraph branch. --- samples/RenderTest/App.config | 8 ++ samples/RenderTest/App.xaml | 1 + samples/RenderTest/MainWindow.xaml | 31 ++++++- samples/RenderTest/MainWindow.xaml.cs | 63 ++----------- samples/RenderTest/Pages/AnimationsPage.xaml | 2 + .../RenderTest/Pages/AnimationsPage.xaml.cs | 90 +++++++++++++++++++ samples/RenderTest/Pages/ClippingPage.xaml | 15 ++++ samples/RenderTest/Pages/ClippingPage.xaml.cs | 48 ++++++++++ samples/RenderTest/Program.cs | 1 + samples/RenderTest/RenderTest.csproj | 30 +++++++ .../RenderTest/RenderTest.v2.ncrunchproject | 26 ------ samples/RenderTest/SideBar.xaml | 40 +++++++++ .../ViewModels/MainWindowViewModel.cs | 34 +++++++ samples/RenderTest/packages.config | 1 + 14 files changed, 306 insertions(+), 84 deletions(-) create mode 100644 samples/RenderTest/Pages/AnimationsPage.xaml create mode 100644 samples/RenderTest/Pages/AnimationsPage.xaml.cs create mode 100644 samples/RenderTest/Pages/ClippingPage.xaml create mode 100644 samples/RenderTest/Pages/ClippingPage.xaml.cs delete mode 100644 samples/RenderTest/RenderTest.v2.ncrunchproject create mode 100644 samples/RenderTest/SideBar.xaml create mode 100644 samples/RenderTest/ViewModels/MainWindowViewModel.cs diff --git a/samples/RenderTest/App.config b/samples/RenderTest/App.config index 2231c71e63..10a06d8258 100644 --- a/samples/RenderTest/App.config +++ b/samples/RenderTest/App.config @@ -9,6 +9,14 @@ + + + + + + + + diff --git a/samples/RenderTest/App.xaml b/samples/RenderTest/App.xaml index d9630eef58..c119f54915 100644 --- a/samples/RenderTest/App.xaml +++ b/samples/RenderTest/App.xaml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/samples/RenderTest/MainWindow.xaml b/samples/RenderTest/MainWindow.xaml index ab233fd90b..1d3001f1b1 100644 --- a/samples/RenderTest/MainWindow.xaml +++ b/samples/RenderTest/MainWindow.xaml @@ -1,3 +1,32 @@ + Title="Avalonia Render Test" + xmlns:pages="clr-namespace:RenderTest.Pages;assembly=RenderTest"> + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/RenderTest/MainWindow.xaml.cs b/samples/RenderTest/MainWindow.xaml.cs index feb121186f..c6c0eafd25 100644 --- a/samples/RenderTest/MainWindow.xaml.cs +++ b/samples/RenderTest/MainWindow.xaml.cs @@ -2,15 +2,11 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; -using System.Reactive.Linq; using Avalonia; -using Avalonia.Animation; using Avalonia.Controls; -using Avalonia.Controls.Shapes; -using Avalonia.Data; -using Avalonia.Layout; using Avalonia.Markup.Xaml; -using Avalonia.Media; +using RenderTest.ViewModels; +using ReactiveUI; using Avalonia.Rendering; namespace RenderTest @@ -20,63 +16,16 @@ namespace RenderTest public MainWindow() { this.InitializeComponent(); - this.CreateAnimations(); this.AttachDevTools(); - RendererMixin.DrawFpsCounter = true; + + var vm = new MainWindowViewModel(); + vm.WhenAnyValue(x => x.DrawFps).Subscribe(x => RendererMixin.DrawFpsCounter = x); + this.DataContext = vm; } private void InitializeComponent() { AvaloniaXamlLoader.Load(this); } - - private void CreateAnimations() - { - const int Count = 100; - var panel = new WrapPanel(); - - for (var i = 0; i < Count; ++i) - { - var element = new Panel - { - Children = - { - new Ellipse - { - Width = 100, - Height = 100, - Fill = Brushes.Blue, - }, - new Path - { - Data = StreamGeometry.Parse( - "F1 M 16.6309,18.6563C 17.1309,8.15625 29.8809,14.1563 29.8809,14.1563C 30.8809,11.1563 34.1308,11.4063 34.1308,11.4063C 33.5,12 34.6309,13.1563 34.6309,13.1563C 32.1309,13.1562 31.1309,14.9062 31.1309,14.9062C 41.1309,23.9062 32.6309,27.9063 32.6309,27.9062C 24.6309,24.9063 21.1309,22.1562 16.6309,18.6563 Z M 16.6309,19.9063C 21.6309,24.1563 25.1309,26.1562 31.6309,28.6562C 31.6309,28.6562 26.3809,39.1562 18.3809,36.1563C 18.3809,36.1563 18,38 16.3809,36.9063C 15,36 16.3809,34.9063 16.3809,34.9063C 16.3809,34.9063 10.1309,30.9062 16.6309,19.9063 Z"), - Fill = Brushes.Green, - HorizontalAlignment = HorizontalAlignment.Center, - VerticalAlignment = VerticalAlignment.Center, - RenderTransform = new ScaleTransform(2, 2), - } - }, - Margin = new Thickness(4), - RenderTransform = new ScaleTransform(), - }; - - var start = Animate.Stopwatch.Elapsed; - var index = i; - var degrees = Animate.Timer - .Select(x => (x - start).TotalSeconds) - .Where(x => (x % Count) >= index && (x % Count) < index + 1) - .Select(x => (x % 1) / 1); - - element.RenderTransform.Bind( - ScaleTransform.ScaleXProperty, - degrees, - BindingPriority.Animation); - - panel.Children.Add(element); - } - - Content = panel; - } } } diff --git a/samples/RenderTest/Pages/AnimationsPage.xaml b/samples/RenderTest/Pages/AnimationsPage.xaml new file mode 100644 index 0000000000..6eb7067245 --- /dev/null +++ b/samples/RenderTest/Pages/AnimationsPage.xaml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/samples/RenderTest/Pages/AnimationsPage.xaml.cs b/samples/RenderTest/Pages/AnimationsPage.xaml.cs new file mode 100644 index 0000000000..991896c3b5 --- /dev/null +++ b/samples/RenderTest/Pages/AnimationsPage.xaml.cs @@ -0,0 +1,90 @@ +using System.Reactive.Linq; +using Avalonia; +using Avalonia.Animation; +using Avalonia.Controls; +using Avalonia.Controls.Shapes; +using Avalonia.Data; +using Avalonia.Input; +using Avalonia.Markup.Xaml; +using Avalonia.Media; + +namespace RenderTest.Pages +{ + public class AnimationsPage : UserControl + { + public AnimationsPage() + { + this.InitializeComponent(); + this.CreateAnimations(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + private void CreateAnimations() + { + const int Count = 100; + var panel = new WrapPanel(); + + for (var i = 0; i < Count; ++i) + { + Ellipse ellipse; + var element = new Panel + { + Children = + { + (ellipse = new Ellipse + { + Name = $"ellipse{i}", + Width = 100, + Height = 100, + Fill = Brushes.Blue, + }), + new Path + { + Data = StreamGeometry.Parse( + "F1 M 16.6309,18.6563C 17.1309,8.15625 29.8809,14.1563 29.8809,14.1563C 30.8809,11.1563 34.1308,11.4063 34.1308,11.4063C 33.5,12 34.6309,13.1563 34.6309,13.1563C 32.1309,13.1562 31.1309,14.9062 31.1309,14.9062C 41.1309,23.9062 32.6309,27.9063 32.6309,27.9062C 24.6309,24.9063 21.1309,22.1562 16.6309,18.6563 Z M 16.6309,19.9063C 21.6309,24.1563 25.1309,26.1562 31.6309,28.6562C 31.6309,28.6562 26.3809,39.1562 18.3809,36.1563C 18.3809,36.1563 18,38 16.3809,36.9063C 15,36 16.3809,34.9063 16.3809,34.9063C 16.3809,34.9063 10.1309,30.9062 16.6309,19.9063 Z"), + Fill = Brushes.Green, + HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center, + VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center, + RenderTransform = new ScaleTransform(2, 2), + } + }, + Margin = new Thickness(4), + RenderTransform = new ScaleTransform(), + }; + + var start = Animate.Stopwatch.Elapsed; + var index = i % (Count / 2); + var degrees = Animate.Timer + .Select(x => (x - start).TotalSeconds) + .Where(x => (x % Count) >= index && (x % Count) < index + 1) + .Select(x => (x % 1) / 1); + + element.RenderTransform.Bind( + ScaleTransform.ScaleXProperty, + degrees, + BindingPriority.Animation); + + ellipse.PointerEnter += Ellipse_PointerEnter; + ellipse.PointerLeave += Ellipse_PointerLeave; + + panel.Children.Add(element); + } + + Content = panel; + } + + private void Ellipse_PointerEnter(object sender, PointerEventArgs e) + { + ((Ellipse)sender).Fill = Brushes.Red; + } + + private void Ellipse_PointerLeave(object sender, PointerEventArgs e) + { + ((Ellipse)sender).Fill = Brushes.Blue; + } + } +} diff --git a/samples/RenderTest/Pages/ClippingPage.xaml b/samples/RenderTest/Pages/ClippingPage.xaml new file mode 100644 index 0000000000..47e9d51e3c --- /dev/null +++ b/samples/RenderTest/Pages/ClippingPage.xaml @@ -0,0 +1,15 @@ + + + + + + + + + Apply Geometry Clip + + \ No newline at end of file diff --git a/samples/RenderTest/Pages/ClippingPage.xaml.cs b/samples/RenderTest/Pages/ClippingPage.xaml.cs new file mode 100644 index 0000000000..b416f12943 --- /dev/null +++ b/samples/RenderTest/Pages/ClippingPage.xaml.cs @@ -0,0 +1,48 @@ +using System; +using System.Reactive.Linq; +using Avalonia; +using Avalonia.Animation; +using Avalonia.Controls; +using Avalonia.Data; +using Avalonia.Markup.Xaml; +using Avalonia.Media; + +namespace RenderTest.Pages +{ + public class ClippingPage : UserControl + { + private Geometry _clip; + + public ClippingPage() + { + InitializeComponent(); + CreateAnimations(); + WireUpCheckbox(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + private void CreateAnimations() + { + var clipped = this.FindControl("clipChild"); + var degrees = Animate.Timer.Select(x => x.TotalMilliseconds / 5); + clipped.RenderTransform = new RotateTransform(); + clipped.RenderTransform.Bind(RotateTransform.AngleProperty, degrees, BindingPriority.Animation); + clipped.Bind( + Border.BackgroundProperty, + clipped.GetObservable(Control.IsPointerOverProperty) + .Select(x => x ? Brushes.Crimson : AvaloniaProperty.UnsetValue)); + } + + private void WireUpCheckbox() + { + var useMask = this.FindControl("useMask"); + var clipped = this.FindControl("clipped"); + _clip = clipped.Clip; + useMask.Click += (s, e) => clipped.Clip = clipped.Clip == null ? _clip : null; + } + } +} diff --git a/samples/RenderTest/Program.cs b/samples/RenderTest/Program.cs index 7a23e09dd4..4b477a5a72 100644 --- a/samples/RenderTest/Program.cs +++ b/samples/RenderTest/Program.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using Avalonia; using Avalonia.Controls; +using Avalonia.Direct2D1; using Avalonia.Logging.Serilog; using Avalonia.Platform; using Serilog; diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index f117c76342..a14114ddc8 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -45,6 +45,10 @@ ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.FullNetFx.dll True + + ..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll + True + @@ -79,11 +83,18 @@ App.xaml + + ClippingPage.xaml + + + AnimationsPage.xaml + MainWindow.xaml + @@ -167,6 +178,10 @@ {6417e941-21bc-467b-a771-0de389353ce6} Avalonia.Markup + + {925dd807-b651-475f-9f7c-cbeb974ce43d} + Avalonia.Skia.Desktop + {3e908f67-5543-4879-a1dc-08eace79b3cd} Avalonia.Direct2D1 @@ -181,6 +196,21 @@ Designer + + + Designer + + + + + Designer + + + + + Designer + + + + + + + + \ No newline at end of file diff --git a/samples/BindingTest/packages.config b/samples/BindingTest/packages.config deleted file mode 100644 index 3c5f85de81..0000000000 --- a/samples/BindingTest/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj index ca5743dd5c..31b3360a15 100644 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj +++ b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj @@ -1,5 +1,5 @@  - + Debug @@ -37,14 +37,6 @@ - - ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.dll - True - - - ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.FullNetFx.dll - True - @@ -156,4 +148,7 @@ --> + + + \ No newline at end of file diff --git a/samples/ControlCatalog.Desktop/packages.config b/samples/ControlCatalog.Desktop/packages.config deleted file mode 100644 index b3abe6f487..0000000000 --- a/samples/ControlCatalog.Desktop/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index f4a0915dd1..877c686a8b 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -1,5 +1,5 @@  - + 10.0 @@ -233,4 +233,7 @@ --> + + + \ No newline at end of file diff --git a/samples/ControlCatalog/packages.config b/samples/ControlCatalog/packages.config deleted file mode 100644 index 44ff0f0628..0000000000 --- a/samples/ControlCatalog/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index a14114ddc8..c8887f1a5d 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -1,5 +1,5 @@  - + Debug @@ -37,40 +37,8 @@ - - ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.dll - True - - - ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.FullNetFx.dll - True - - - ..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll - True - @@ -219,4 +187,14 @@ --> + + + + + + + + + + \ No newline at end of file diff --git a/samples/RenderTest/packages.config b/samples/RenderTest/packages.config deleted file mode 100644 index 7ba5166073..0000000000 --- a/samples/RenderTest/packages.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationTest/VirtualizationTest.csproj index 9e80dfdc8f..0c109d4544 100644 --- a/samples/VirtualizationTest/VirtualizationTest.csproj +++ b/samples/VirtualizationTest/VirtualizationTest.csproj @@ -1,5 +1,5 @@  - + Debug @@ -37,28 +37,8 @@ - - ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.dll - True - - - ..\..\packages\Serilog.1.5.14\lib\net45\Serilog.FullNetFx.dll - True - - - ..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - @@ -182,4 +162,10 @@ --> + + + + + + \ No newline at end of file diff --git a/samples/VirtualizationTest/packages.config b/samples/VirtualizationTest/packages.config deleted file mode 100644 index f2da2367fa..0000000000 --- a/samples/VirtualizationTest/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 3ee2f5af64..a9ff8e6924 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -41,18 +41,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.3\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.3\System.Reactive.PlatformServices.dll - True - @@ -152,4 +140,22 @@ --> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Android/Avalonia.Android/packages.config b/src/Android/Avalonia.Android/packages.config deleted file mode 100644 index 057d0855b8..0000000000 --- a/src/Android/Avalonia.Android/packages.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj index d09f162150..3bdf123a02 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj +++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -64,35 +64,8 @@ - - ..\..\..\packages\Serilog.1.5.14\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll - True - - - ..\..\..\packages\Splat.1.6.2\lib\monoandroid\Splat.dll - True - - - ..\..\..\packages\Sprache.2.1.0\lib\netstandard1.0\Sprache.dll - - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.3\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.3\System.Reactive.Linq.dll - True - - - ..\..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.3\System.Reactive.PlatformServices.dll - True - @@ -188,4 +161,28 @@ --> + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Android/Avalonia.AndroidTestApplication/packages.config b/src/Android/Avalonia.AndroidTestApplication/packages.config deleted file mode 100644 index d353146747..0000000000 --- a/src/Android/Avalonia.AndroidTestApplication/packages.config +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Animation/Avalonia.Animation.csproj b/src/Avalonia.Animation/Avalonia.Animation.csproj index 46aac81b5a..8fd6eb1896 100644 --- a/src/Avalonia.Animation/Avalonia.Animation.csproj +++ b/src/Avalonia.Animation/Avalonia.Animation.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -63,22 +63,6 @@
- - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -91,4 +75,11 @@ --> + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Animation/packages.config b/src/Avalonia.Animation/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Animation/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Base/Avalonia.Base.csproj b/src/Avalonia.Base/Avalonia.Base.csproj index 90550a12f2..ce7a2b3aa8 100644 --- a/src/Avalonia.Base/Avalonia.Base.csproj +++ b/src/Avalonia.Base/Avalonia.Base.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -126,26 +126,6 @@ - - ..\..\packages\JetBrains.Annotations.10.0.0\lib\portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\JetBrains.Annotations.PCL328.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -158,4 +138,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Base/packages.config b/src/Avalonia.Base/packages.config deleted file mode 100644 index c372c92f3f..0000000000 --- a/src/Avalonia.Base/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index f12f07070e..7ee49bb0da 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -214,26 +214,6 @@ - - ..\..\packages\JetBrains.Annotations.10.0.0\lib\portable-net4+sl5+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\JetBrains.Annotations.PCL328.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -277,4 +257,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Controls/packages.config b/src/Avalonia.Controls/packages.config deleted file mode 100644 index c372c92f3f..0000000000 --- a/src/Avalonia.Controls/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj index d9174d6f36..58a328d405 100644 --- a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj +++ b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -98,22 +98,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.DesignerSupport/packages.config b/src/Avalonia.DesignerSupport/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.DesignerSupport/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj index a56575dab7..8eee79892b 100644 --- a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj +++ b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -117,25 +117,6 @@ - - ..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -154,4 +135,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Diagnostics/packages.config b/src/Avalonia.Diagnostics/packages.config deleted file mode 100644 index df107dc625..0000000000 --- a/src/Avalonia.Diagnostics/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index e87ec0b5a7..4a8ce05013 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -1,5 +1,5 @@  - + Debug @@ -36,14 +36,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - @@ -86,4 +78,8 @@ --> + + + + \ No newline at end of file diff --git a/src/Avalonia.DotNetFrameworkRuntime/packages.config b/src/Avalonia.DotNetFrameworkRuntime/packages.config deleted file mode 100644 index 1e93a8c9e7..0000000000 --- a/src/Avalonia.DotNetFrameworkRuntime/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj index 8f16bad64a..cda64c2bce 100644 --- a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj +++ b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj @@ -1,5 +1,5 @@  - + 10.0 @@ -174,14 +174,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - @@ -198,4 +190,10 @@ --> + + + + + + \ No newline at end of file diff --git a/src/Avalonia.HtmlRenderer/packages.config b/src/Avalonia.HtmlRenderer/packages.config deleted file mode 100644 index b6a9c7823c..0000000000 --- a/src/Avalonia.HtmlRenderer/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Input/Avalonia.Input.csproj b/src/Avalonia.Input/Avalonia.Input.csproj index c1ed34c1c7..161897fcad 100644 --- a/src/Avalonia.Input/Avalonia.Input.csproj +++ b/src/Avalonia.Input/Avalonia.Input.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -121,22 +121,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Input/packages.config b/src/Avalonia.Input/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Input/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj b/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj index 0d81690de0..32890f590f 100644 --- a/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj +++ b/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -75,22 +75,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Interactivity/packages.config b/src/Avalonia.Interactivity/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Interactivity/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Layout/Avalonia.Layout.csproj b/src/Avalonia.Layout/Avalonia.Layout.csproj index 41b545b5cb..c7938b2859 100644 --- a/src/Avalonia.Layout/Avalonia.Layout.csproj +++ b/src/Avalonia.Layout/Avalonia.Layout.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -71,22 +71,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Layout/packages.config b/src/Avalonia.Layout/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Layout/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj b/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj index 0fb85db795..2e703758ef 100644 --- a/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj +++ b/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj @@ -1,5 +1,5 @@  - + 10.0 @@ -41,10 +41,6 @@ - - ..\..\packages\Serilog.1.5.14\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll - True - @@ -63,4 +59,7 @@ --> + + + \ No newline at end of file diff --git a/src/Avalonia.Logging.Serilog/packages.config b/src/Avalonia.Logging.Serilog/packages.config deleted file mode 100644 index dbc72b5331..0000000000 --- a/src/Avalonia.Logging.Serilog/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj index 98cf115eaf..7e65460e40 100644 --- a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj +++ b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj @@ -1,5 +1,5 @@  - + 10.0 @@ -87,25 +87,6 @@ - - ..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.0\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.0\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -118,4 +99,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.ReactiveUI/packages.config b/src/Avalonia.ReactiveUI/packages.config deleted file mode 100644 index f10d6d8873..0000000000 --- a/src/Avalonia.ReactiveUI/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Styling/Avalonia.Styling.csproj b/src/Avalonia.Styling/Avalonia.Styling.csproj index d38406caa7..e6642cbf69 100644 --- a/src/Avalonia.Styling/Avalonia.Styling.csproj +++ b/src/Avalonia.Styling/Avalonia.Styling.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -80,22 +80,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -124,4 +108,11 @@ --> + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Styling/packages.config b/src/Avalonia.Styling/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Styling/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj index 26d168cb2a..6d770ed90e 100644 --- a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj +++ b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -192,22 +192,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -222,4 +206,11 @@ --> + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Themes.Default/packages.config b/src/Avalonia.Themes.Default/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Themes.Default/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index 514fa6f481..64fbab2307 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -172,22 +172,6 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Visuals/packages.config b/src/Avalonia.Visuals/packages.config deleted file mode 100644 index 9f732f1bcb..0000000000 --- a/src/Avalonia.Visuals/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj index 3ecd91eee2..da3c8c9952 100644 --- a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj +++ b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj @@ -1,5 +1,5 @@  - + Debug @@ -38,14 +38,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - @@ -120,4 +112,8 @@ --> + + + + \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/packages.config b/src/Gtk/Avalonia.Cairo/packages.config deleted file mode 100644 index 1e93a8c9e7..0000000000 --- a/src/Gtk/Avalonia.Cairo/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index d7e4400a99..257736aaf1 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -37,14 +37,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - @@ -108,4 +100,8 @@ + + + + \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/packages.config b/src/Gtk/Avalonia.Gtk/packages.config deleted file mode 100644 index 1e93a8c9e7..0000000000 --- a/src/Gtk/Avalonia.Gtk/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 4ed20629cf..c7be3a0d90 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -322,25 +322,6 @@ - - ..\..\..\packages\Sprache.2.1.0\lib\netstandard1.0\Sprache.dll - - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -353,4 +334,16 @@ --> + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/packages.config b/src/Markup/Avalonia.Markup.Xaml/packages.config deleted file mode 100644 index 7a9353bb05..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/packages.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj index 5826346fc9..155779fa1f 100644 --- a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj +++ b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj @@ -1,5 +1,5 @@  - + 11.0 @@ -114,22 +114,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.1\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.1\System.Reactive.Linq.dll - True - - - ..\..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.0\System.Reactive.PlatformServices.dll - True - @@ -142,4 +126,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup/packages.config b/src/Markup/Avalonia.Markup/packages.config deleted file mode 100644 index bcef21429a..0000000000 --- a/src/Markup/Avalonia.Markup/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index c644bd84b3..4c20239e64 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -40,9 +40,6 @@ - - ..\..\..\packages\SkiaSharp.1.56.1-beta\lib\MonoAndroid\SkiaSharp.dll - @@ -98,4 +95,7 @@ --> + + + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/packages.config b/src/Skia/Avalonia.Skia.Android/packages.config deleted file mode 100644 index 0b3bfb071f..0000000000 --- a/src/Skia/Avalonia.Skia.Android/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj index 74d592f9bf..fd9d380cd4 100644 --- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj +++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj @@ -1,5 +1,5 @@  - + Debug @@ -57,9 +57,6 @@ MinimumRecommendedRules.ruleset - - ..\..\..\packages\SkiaSharp.1.56.1-beta\lib\net45\SkiaSharp.dll - @@ -127,4 +124,7 @@ --> + + + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Desktop/packages.config b/src/Skia/Avalonia.Skia.Desktop/packages.config deleted file mode 100644 index 2213dede69..0000000000 --- a/src/Skia/Avalonia.Skia.Desktop/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index 08fcd61471..a6479eb1a7 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -43,9 +43,6 @@ - - ..\..\..\packages\SkiaSharp.1.56.1-beta\lib\XamariniOS\SkiaSharp.dll - @@ -95,4 +92,7 @@ + + + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS/packages.config b/src/Skia/Avalonia.Skia.iOS/packages.config deleted file mode 100644 index a48c7f04d5..0000000000 --- a/src/Skia/Avalonia.Skia.iOS/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj index a84cec6e5a..767ea06c60 100644 --- a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj +++ b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj @@ -1,5 +1,5 @@  - + Debug @@ -46,10 +46,6 @@ - - ..\..\..\packages\JetBrains.Annotations.10.0.0\lib\net20\JetBrains.Annotations.dll - True - @@ -135,4 +131,7 @@ --> + + + \ No newline at end of file diff --git a/src/Windows/Avalonia.Designer/packages.config b/src/Windows/Avalonia.Designer/packages.config deleted file mode 100644 index b0ac21bcd8..0000000000 --- a/src/Windows/Avalonia.Designer/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index 8292ab46ed..0773300656 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -1,5 +1,5 @@  - + Debug @@ -37,18 +37,6 @@ true - - ..\..\..\packages\SharpDX.3.1.1\lib\net45\SharpDX.dll - - - ..\..\..\packages\SharpDX.Direct2D1.3.1.1\lib\net45\SharpDX.Direct2D1.dll - - - ..\..\..\packages\SharpDX.Direct3D11.3.1.1\lib\net45\SharpDX.Direct3D11.dll - - - ..\..\..\packages\SharpDX.DXGI.3.1.1\lib\net45\SharpDX.DXGI.dll - @@ -133,4 +121,10 @@ --> + + + + + + \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/packages.config b/src/Windows/Avalonia.Direct2D1/packages.config deleted file mode 100644 index 780e6014e5..0000000000 --- a/src/Windows/Avalonia.Direct2D1/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj index c05d2bf8cd..be86e3c4d3 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj @@ -1,5 +1,5 @@  - + Debug @@ -44,14 +44,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - @@ -121,4 +113,8 @@ --> + + + + \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32/packages.config b/src/Windows/Avalonia.Win32/packages.config deleted file mode 100644 index 1e93a8c9e7..0000000000 --- a/src/Windows/Avalonia.Win32/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index d7cba35d29..7ef7108785 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -1,5 +1,5 @@  - + Debug iPhoneSimulator @@ -98,22 +98,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.3\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.3\System.Reactive.Linq.dll - True - - - ..\..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.3\System.Reactive.PlatformServices.dll - True - @@ -123,4 +107,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/packages.config b/src/iOS/Avalonia.iOS/packages.config deleted file mode 100644 index 57fa6a12d6..0000000000 --- a/src/iOS/Avalonia.iOS/packages.config +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj index ff7aa94502..089b8afb73 100644 --- a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj +++ b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj @@ -1,5 +1,5 @@  - + Debug iPhoneSimulator @@ -109,22 +109,6 @@ - - ..\..\..\packages\System.Reactive.Core.3.0.0\lib\netstandard1.3\System.Reactive.Core.dll - True - - - ..\..\..\packages\System.Reactive.Interfaces.3.0.0\lib\netstandard1.0\System.Reactive.Interfaces.dll - True - - - ..\..\..\packages\System.Reactive.Linq.3.0.0\lib\netstandard1.3\System.Reactive.Linq.dll - True - - - ..\..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\netstandard1.3\System.Reactive.PlatformServices.dll - True - @@ -203,4 +187,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/packages.config b/src/iOS/Avalonia.iOSTestApplication/packages.config deleted file mode 100644 index 57fa6a12d6..0000000000 --- a/src/iOS/Avalonia.iOSTestApplication/packages.config +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index 07ed7f14ca..c44445a709 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -39,47 +39,8 @@ 4 - - ..\..\packages\Microsoft.Reactive.Testing.3.0.0\lib\net45\Microsoft.Reactive.Testing.dll - True - - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -162,4 +123,19 @@ --> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Base.UnitTests/packages.config b/tests/Avalonia.Base.UnitTests/packages.config deleted file mode 100644 index f2128ddba6..0000000000 --- a/tests/Avalonia.Base.UnitTests/packages.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index cb8b32c2cc..004c838336 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -1,5 +1,5 @@  - + Debug @@ -35,25 +35,9 @@ 4 - - ..\..\packages\BenchmarkDotNet.0.9.2\lib\net45\BenchmarkDotNet.dll - True - - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\AutoFixture.3.40.0\lib\net40\Ploeh.AutoFixture.dll - True - - - ..\..\packages\AutoFixture.AutoMoq.3.40.0\lib\net40\Ploeh.AutoFixture.AutoMoq.dll - True - @@ -123,4 +107,10 @@ --> + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/packages.config b/tests/Avalonia.Benchmarks/packages.config deleted file mode 100644 index b1d27d4562..0000000000 --- a/tests/Avalonia.Benchmarks/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index c581cccf2f..f7b65d612b 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -39,51 +39,8 @@ 4 - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\AutoFixture.3.40.0\lib\net40\Ploeh.AutoFixture.dll - True - - - ..\..\packages\AutoFixture.AutoMoq.3.40.0\lib\net40\Ploeh.AutoFixture.AutoMoq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -244,4 +201,20 @@ --> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/packages.config b/tests/Avalonia.Controls.UnitTests/packages.config deleted file mode 100644 index 8dd3ac4427..0000000000 --- a/tests/Avalonia.Controls.UnitTests/packages.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj index 97dfda5967..be65465491 100644 --- a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj +++ b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -38,22 +38,6 @@ - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - True - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -83,4 +67,12 @@ --> + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.Tests/packages.config b/tests/Avalonia.DesignerSupport.Tests/packages.config deleted file mode 100644 index 24039f1451..0000000000 --- a/tests/Avalonia.DesignerSupport.Tests/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj index 3db0bfa876..5eb48b8502 100644 --- a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj +++ b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj @@ -1,5 +1,5 @@  - + @@ -43,21 +43,6 @@ - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -124,4 +109,13 @@ --> + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Direct2D1.UnitTests/packages.config b/tests/Avalonia.Direct2D1.UnitTests/packages.config deleted file mode 100644 index dcbf45edf0..0000000000 --- a/tests/Avalonia.Direct2D1.UnitTests/packages.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj index 5ed05e9e33..a1a917ed25 100644 --- a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj +++ b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj @@ -1,5 +1,5 @@  - + @@ -35,54 +35,14 @@ 4 - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - True - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -151,4 +111,20 @@ --> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Input.UnitTests/packages.config b/tests/Avalonia.Input.UnitTests/packages.config deleted file mode 100644 index 459b77b465..0000000000 --- a/tests/Avalonia.Input.UnitTests/packages.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj index d8a6ee2506..710dfc88a7 100644 --- a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj +++ b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj @@ -1,5 +1,5 @@  - + @@ -37,47 +37,12 @@ - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -138,4 +103,19 @@ --> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Interactivity.UnitTests/packages.config b/tests/Avalonia.Interactivity.UnitTests/packages.config deleted file mode 100644 index 953a4a666d..0000000000 --- a/tests/Avalonia.Interactivity.UnitTests/packages.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj index d7912d1828..7e0418f306 100644 --- a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj +++ b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -39,42 +39,7 @@ 4 - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\AutoFixture.3.40.0\lib\net40\Ploeh.AutoFixture.dll - True - - - ..\..\packages\AutoFixture.AutoMoq.3.40.0\lib\net40\Ploeh.AutoFixture.AutoMoq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -186,4 +151,18 @@ --> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Layout.UnitTests/packages.config b/tests/Avalonia.Layout.UnitTests/packages.config deleted file mode 100644 index 6dbff1e105..0000000000 --- a/tests/Avalonia.Layout.UnitTests/packages.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 31e7d5ebea..cef6a02225 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -33,44 +33,8 @@ 4 - - ..\..\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\lib\dotMemory.Unit.dll - True - - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\AutoFixture.3.40.0\lib\net40\Ploeh.AutoFixture.dll - True - - - ..\..\packages\AutoFixture.AutoMoq.3.40.0\lib\net40\Ploeh.AutoFixture.AutoMoq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll - True - @@ -78,22 +42,6 @@ - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - True - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -178,4 +126,22 @@ --> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.LeakTests/packages.config b/tests/Avalonia.LeakTests/packages.config deleted file mode 100644 index 302ccfb214..0000000000 --- a/tests/Avalonia.LeakTests/packages.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj index e2b11dc1f0..ea7c87da2e 100644 --- a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj +++ b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj @@ -1,5 +1,5 @@  - + @@ -34,41 +34,13 @@ 4 - - ..\..\packages\Microsoft.Reactive.Testing.3.0.0\lib\net45\Microsoft.Reactive.Testing.dll - True - - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile7\System.ComponentModel.Annotations.dll - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll - True - @@ -76,22 +48,6 @@ - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - True - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -179,4 +135,22 @@ --> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Markup.UnitTests/packages.config b/tests/Avalonia.Markup.UnitTests/packages.config deleted file mode 100644 index d264c076fd..0000000000 --- a/tests/Avalonia.Markup.UnitTests/packages.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index 6bb8fb0008..dc044cbe83 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -42,45 +42,7 @@ 4 - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll - True - - - ..\..\packages\Sprache.2.1.0\lib\net40\Sprache.dll - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -221,4 +183,19 @@ --> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/packages.config b/tests/Avalonia.Markup.Xaml.UnitTests/packages.config deleted file mode 100644 index cad6395387..0000000000 --- a/tests/Avalonia.Markup.Xaml.UnitTests/packages.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj index cf53b4ef9b..e80ab1cc8b 100644 --- a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj +++ b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -39,47 +39,8 @@ 4 - - ..\..\packages\Microsoft.Reactive.Testing.3.0.0\lib\net45\Microsoft.Reactive.Testing.dll - True - - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -191,4 +152,19 @@ --> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Styling.UnitTests/packages.config b/tests/Avalonia.Styling.UnitTests/packages.config deleted file mode 100644 index f2128ddba6..0000000000 --- a/tests/Avalonia.Styling.UnitTests/packages.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj index f7878ab91a..1133da9286 100644 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj +++ b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -32,20 +32,8 @@ 4 - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - @@ -127,4 +115,9 @@ --> + + + + + \ No newline at end of file diff --git a/tests/Avalonia.UnitTests/packages.config b/tests/Avalonia.UnitTests/packages.config deleted file mode 100644 index 8805596f60..0000000000 --- a/tests/Avalonia.UnitTests/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj index 97b3e38e32..0d0e9648e6 100644 --- a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj +++ b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -39,34 +39,7 @@ 4 - - ..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -173,4 +146,16 @@ --> + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Visuals.UnitTests/packages.config b/tests/Avalonia.Visuals.UnitTests/packages.config deleted file mode 100644 index 8eb9d05cfc..0000000000 --- a/tests/Avalonia.Visuals.UnitTests/packages.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file From e780c4201af14fa74c0ba2f63ebe5a1cd95eda3d Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Mar 2017 22:55:43 +0300 Subject: [PATCH 44/95] Switched to .NETStandard (mostly 1.1) --- Avalonia.sln | 4 +- samples/BindingTest/BindingTest.csproj | 7 ++- .../ControlCatalog.Desktop.csproj | 5 +- samples/ControlCatalog/ControlCatalog.csproj | 2 +- samples/RenderTest/RenderTest.csproj | 8 +-- .../VirtualizationTest.csproj | 7 ++- .../Resources/Resource.Designer.cs | 7 ++- .../Avalonia.AndroidTestApplication.csproj | 4 +- .../Resources/Resource.Designer.cs | 1 + .../Avalonia.Animation.csproj | 31 ++--------- src/Avalonia.Base/Avalonia.Base.csproj | 35 ++---------- .../Avalonia.Controls.csproj | 36 ++----------- src/Avalonia.Controls/Utils/UndoRedoHelper.cs | 1 - .../Avalonia.DesignerSupport.csproj | 32 ++--------- .../Avalonia.Diagnostics.csproj | 29 ++-------- .../Avalonia.DotNetCoreRuntime.csproj | 40 ++++---------- src/Avalonia.DotNetCoreRuntime/project.json | 11 ---- .../Avalonia.HtmlRenderer.csproj | 48 +++-------------- src/Avalonia.HtmlRenderer/Compat/Api.cs | 28 ++++++++++ src/Avalonia.Input/Avalonia.Input.csproj | 35 ++---------- src/Avalonia.Input/IInputElement.cs | 2 - .../Avalonia.Interactivity.csproj | 30 ++--------- src/Avalonia.Layout/Avalonia.Layout.csproj | 30 ++--------- .../Avalonia.Logging.Serilog.csproj | 33 ++---------- .../Avalonia.ReactiveUI.csproj | 53 ++++++++----------- src/Avalonia.ReactiveUI/Shims.cs | 34 ++++++++++++ src/Avalonia.Styling/Avalonia.Styling.csproj | 31 ++--------- .../Avalonia.Themes.Default.csproj | 31 ++--------- src/Avalonia.Visuals/Avalonia.Visuals.csproj | 35 ++---------- src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj | 29 ++-------- .../Avalonia.Markup.Xaml.csproj | 28 ++-------- .../Avalonia.Markup/Avalonia.Markup.csproj | 31 ++--------- .../StandardRuntimePlatform.cs | 2 +- .../Avalonia.Skia.Desktop.NetStandard.csproj | 34 +++--------- .../project.json | 11 ---- .../Avalonia.Skia.Desktop.csproj | 16 ------ .../Avalonia.Designer.csproj | 2 +- .../Avalonia.Win32.NetStandard.csproj | 32 ++--------- .../Avalonia.Win32.NetStandard/project.json | 11 ---- 39 files changed, 210 insertions(+), 636 deletions(-) delete mode 100644 src/Avalonia.DotNetCoreRuntime/project.json create mode 100644 src/Avalonia.HtmlRenderer/Compat/Api.cs create mode 100644 src/Avalonia.ReactiveUI/Shims.cs delete mode 100644 src/Skia/Avalonia.Skia.Desktop.NetStandard/project.json delete mode 100644 src/Windows/Avalonia.Win32.NetStandard/project.json diff --git a/Avalonia.sln b/Avalonia.sln index ad14483b40..c2ba081fc0 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject diff --git a/samples/BindingTest/BindingTest.csproj b/samples/BindingTest/BindingTest.csproj index 49cde9efdb..d8663f5031 100644 --- a/samples/BindingTest/BindingTest.csproj +++ b/samples/BindingTest/BindingTest.csproj @@ -166,8 +166,11 @@ --> - - + + + 2.1.0 + + diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj index 31b3360a15..bd0e56e3e6 100644 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj +++ b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj @@ -149,6 +149,9 @@ --> - + + + 2.1.0 + \ No newline at end of file diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 877c686a8b..80e1f591ea 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -234,6 +234,6 @@ --> - + \ No newline at end of file diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index c8887f1a5d..b60eb7ab36 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -66,7 +66,6 @@ - @@ -188,8 +187,11 @@ --> - - + + + 2.1.0 + + diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationTest/VirtualizationTest.csproj index 0c109d4544..0ed2b9d9bd 100644 --- a/samples/VirtualizationTest/VirtualizationTest.csproj +++ b/samples/VirtualizationTest/VirtualizationTest.csproj @@ -163,8 +163,11 @@ --> - - + + + 2.1.0 + + diff --git a/src/Android/Avalonia.Android/Resources/Resource.Designer.cs b/src/Android/Avalonia.Android/Resources/Resource.Designer.cs index 80cbbc51ec..e66c2800d3 100644 --- a/src/Android/Avalonia.Android/Resources/Resource.Designer.cs +++ b/src/Android/Avalonia.Android/Resources/Resource.Designer.cs @@ -40,11 +40,14 @@ namespace Avalonia.Android public partial class String { + // aapt resource value: 0x7f020002 + public static int ApplicationName = 2130837506; + // aapt resource value: 0x7f020001 - public static int ApplicationName = 2130837505; + public static int Hello = 2130837505; // aapt resource value: 0x7f020000 - public static int Hello = 2130837504; + public static int library_name = 2130837504; static String() { diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj index 3bdf123a02..7ce8879304 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj +++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj @@ -162,8 +162,8 @@ --> - - + + diff --git a/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs b/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs index 3fa0707176..91327cf941 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs +++ b/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs @@ -28,6 +28,7 @@ namespace Avalonia.AndroidTestApplication { global::Avalonia.Android.Resource.String.ApplicationName = global::Avalonia.AndroidTestApplication.Resource.String.ApplicationName; global::Avalonia.Android.Resource.String.Hello = global::Avalonia.AndroidTestApplication.Resource.String.Hello; + global::Avalonia.Android.Resource.String.library_name = global::Avalonia.AndroidTestApplication.Resource.String.library_name; global::Splat.Resource.String.library_name = global::Avalonia.AndroidTestApplication.Resource.String.library_name; } diff --git a/src/Avalonia.Animation/Avalonia.Animation.csproj b/src/Avalonia.Animation/Avalonia.Animation.csproj index 8fd6eb1896..0ede370efc 100644 --- a/src/Avalonia.Animation/Avalonia.Animation.csproj +++ b/src/Avalonia.Animation/Avalonia.Animation.csproj @@ -1,20 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {D211E587-D8BC-45B9-95A4-F297C8FA5200} - Library - Properties - Avalonia.Animation - Avalonia.Animation - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 + netstandard1.1 + False + false true @@ -64,17 +52,6 @@ - - - - - diff --git a/src/Avalonia.Base/Avalonia.Base.csproj b/src/Avalonia.Base/Avalonia.Base.csproj index ce7a2b3aa8..f5c5815124 100644 --- a/src/Avalonia.Base/Avalonia.Base.csproj +++ b/src/Avalonia.Base/Avalonia.Base.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {B09B78D8-9B26-48B0-9149-D64A2F120F3F} - Library - Properties - Avalonia - Avalonia.Base - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -128,18 +114,7 @@ - - - - - - + diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index 7ee49bb0da..21b29c53f9 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {D2221C82-4A25-4583-9B43-D791E3F6820C} - Library - Properties - Avalonia.Controls - Avalonia.Controls - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -215,9 +201,6 @@ - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} @@ -248,17 +231,8 @@ Avalonia.Styling - - - - + diff --git a/src/Avalonia.Controls/Utils/UndoRedoHelper.cs b/src/Avalonia.Controls/Utils/UndoRedoHelper.cs index 71ba3793d1..be4c1aa6c4 100644 --- a/src/Avalonia.Controls/Utils/UndoRedoHelper.cs +++ b/src/Avalonia.Controls/Utils/UndoRedoHelper.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using JetBrains.Annotations; using Avalonia.Utilities; namespace Avalonia.Controls.Utils diff --git a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj index 58a328d405..455c149e30 100644 --- a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj +++ b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {799A7BB5-3C2C-48B6-85A7-406A12C420DA} - Library - Properties - Avalonia - Avalonia.DesignerSupport - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -94,20 +80,12 @@ - - - - - - - + diff --git a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj index 8eee79892b..3321afcc88 100644 --- a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj +++ b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {7062AE20-5DCC-4442-9645-8195BDECE63E} - Library - Properties - Avalonia.Diagnostics - Avalonia.Diagnostics - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -119,7 +105,6 @@ - Designer @@ -127,16 +112,12 @@ Designer - - - + diff --git a/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj b/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj index 8a60d5d9c7..434420e376 100644 --- a/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj +++ b/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj @@ -1,22 +1,9 @@ - - - - - 14.0 - Debug - AnyCPU - {7863EA94-F0FB-4386-BF8C-E5BFA761560A} - Library - Properties - Avalonia.DotNetCoreRuntime - Avalonia.DotNetCoreRuntime - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - v5.0 - + + + netstandard1.6 + False + false + true full @@ -36,10 +23,6 @@ 4 bin\Release\Avalonia.DotNetCoreRuntime.XML - - - - SharedAssemblyInfo.cs @@ -77,13 +60,8 @@ + + + - - \ No newline at end of file diff --git a/src/Avalonia.DotNetCoreRuntime/project.json b/src/Avalonia.DotNetCoreRuntime/project.json deleted file mode 100644 index d6ae90b33b..0000000000 --- a/src/Avalonia.DotNetCoreRuntime/project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "supports": {}, - "dependencies": { - "Microsoft.NETCore.Portable.Compatibility": "1.0.1", - "NETStandard.Library": "1.6.0", - "System.Threading.ThreadPool": "4.3.0" - }, - "frameworks": { - "netstandard1.5": {} - } -} \ No newline at end of file diff --git a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj index cda64c2bce..e759210820 100644 --- a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj +++ b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj @@ -1,22 +1,8 @@ - - - + - 10.0 - Debug - AnyCPU - {5FB2B005-0A7F-4DAD-ADD4-3ED01444E63D} - Library - Properties - Avalonia.HtmlRenderer - Avalonia.HtmlRenderer - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -35,6 +21,9 @@ prompt 4 + + + @@ -51,6 +40,7 @@ + @@ -171,28 +161,6 @@ - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - diff --git a/src/Avalonia.HtmlRenderer/Compat/Api.cs b/src/Avalonia.HtmlRenderer/Compat/Api.cs new file mode 100644 index 0000000000..798b697277 --- /dev/null +++ b/src/Avalonia.HtmlRenderer/Compat/Api.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace System.Net +{ + internal class AsyncCompletedEventArgs + { + public object UserState { get; set; } + public Exception Error { get; set; } + public bool Cancelled { get; set; } + + public AsyncCompletedEventArgs(Exception error, bool cancelled, object userState) + { + + } + } + + class WebException : Exception + { + public object Response { get; set; } + } + + class HttpWebResponse + { + public HttpStatusCode StatusCode { get; set; } + } +} diff --git a/src/Avalonia.Input/Avalonia.Input.csproj b/src/Avalonia.Input/Avalonia.Input.csproj index 161897fcad..3a2c069217 100644 --- a/src/Avalonia.Input/Avalonia.Input.csproj +++ b/src/Avalonia.Input/Avalonia.Input.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {62024B2D-53EB-4638-B26B-85EEAA54866E} - Library - Properties - Avalonia.Input - Avalonia.Input - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -117,19 +103,6 @@ - - - - - - - diff --git a/src/Avalonia.Input/IInputElement.cs b/src/Avalonia.Input/IInputElement.cs index 72f03d3ae5..786353f05c 100644 --- a/src/Avalonia.Input/IInputElement.cs +++ b/src/Avalonia.Input/IInputElement.cs @@ -1,7 +1,5 @@ // 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.Diagnostics.Contracts; using System; using System.Collections.Generic; using Avalonia.Interactivity; diff --git a/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj b/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj index 32890f590f..68755fa2b8 100644 --- a/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj +++ b/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {6B0ED19D-A08B-461C-A9D9-A9EE40B0C06B} - Library - Properties - Avalonia.Interactivity - Avalonia.Interactivity - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -76,14 +62,6 @@ - - diff --git a/src/Avalonia.Layout/Avalonia.Layout.csproj b/src/Avalonia.Layout/Avalonia.Layout.csproj index c7938b2859..a3423cb60d 100644 --- a/src/Avalonia.Layout/Avalonia.Layout.csproj +++ b/src/Avalonia.Layout/Avalonia.Layout.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {42472427-4774-4C81-8AFF-9F27B8E31721} - Library - Properties - Avalonia - Avalonia.Layout - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -72,14 +58,6 @@ - - diff --git a/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj b/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj index 2e703758ef..c5781c9a1a 100644 --- a/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj +++ b/src/Avalonia.Logging.Serilog/Avalonia.Logging.Serilog.csproj @@ -1,20 +1,8 @@ - - - + - 10.0 - Debug - AnyCPU - {B61B66A3-B82D-4875-8001-89D3394FE0C9} - Library - Properties - Avalonia.Logging.Serilog - Avalonia.Logging.Serilog - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 + netstandard1.1 + False + false true @@ -42,24 +30,13 @@ - - - {b09b78d8-9b26-48b0-9149-d64a2f120f3f} Avalonia.Base - - - + \ No newline at end of file diff --git a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj index 7e65460e40..c5789eddac 100644 --- a/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj +++ b/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj @@ -1,27 +1,15 @@ - - - + - 10.0 - Debug - AnyCPU - {6417B24E-49C2-4985-8DB2-3AB9D898EC91} - Library - Properties - Avalonia.ReactiveUI - Avalonia.ReactiveUI - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile259 - v4.5 + netstandard1.1 + False + false true full false bin\Debug\ - TRACE;DEBUG;MONO PORTABLE + TRACE;DEBUG;MONO PORTABLE;NETSTANDARD1_1 prompt 4 @@ -29,15 +17,19 @@ pdbonly true bin\Release\ - TRACE;MONO PORTABLE + TRACE;MONO PORTABLE;RELEASE;NETSTANDARD1_1 prompt 4 + + + + @@ -65,9 +57,7 @@ - - Code - + @@ -86,25 +76,26 @@ - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/src/Avalonia.ReactiveUI/Shims.cs b/src/Avalonia.ReactiveUI/Shims.cs new file mode 100644 index 0000000000..2729a68d6f --- /dev/null +++ b/src/Avalonia.ReactiveUI/Shims.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace System.Runtime.Serialization +{ + class IgnoreDataMemberAttribute : Attribute + { + } + + class DataMemberAttribute : Attribute + { + } + class OnDeserializedAttribute : Attribute + { + } + + class DataContractAttribute : Attribute + { + } + + class StreamingContext { } +} + +namespace System.Diagnostics.Contracts +{ + static class Contract + { + public static void Requires(bool condition) + { + + } + } +} diff --git a/src/Avalonia.Styling/Avalonia.Styling.csproj b/src/Avalonia.Styling/Avalonia.Styling.csproj index e6642cbf69..ea35845030 100644 --- a/src/Avalonia.Styling/Avalonia.Styling.csproj +++ b/src/Avalonia.Styling/Avalonia.Styling.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} - Library - Properties - Avalonia - Avalonia.Styling - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -81,11 +67,6 @@ - - - - - {d211e587-d8bc-45b9-95a4-f297c8fa5200} @@ -100,14 +81,10 @@ Avalonia.Visuals - - diff --git a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj index 6d770ed90e..f599e007d5 100644 --- a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj +++ b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {3E10A5FA-E8DA-48B1-AD44-6A5B6CB7750F} - Library - Properties - Avalonia.Themes.Default - Avalonia.Themes.Default - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -184,7 +170,6 @@ Designer - @@ -198,14 +183,6 @@ Designer - - diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index 64fbab2307..0834384f90 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -1,22 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {EB582467-6ABB-43A1-B052-E981BA910E3A} - Library - Properties - Avalonia - Avalonia.Visuals - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 - - + netstandard1.1 + False + false true @@ -168,19 +154,6 @@ - - - - - - - diff --git a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj index 958af437a6..ac20833787 100644 --- a/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj +++ b/src/Gtk/Avalonia.Gtk3/Avalonia.Gtk3.csproj @@ -1,21 +1,8 @@ - - - + - 14.0 - Debug - AnyCPU - {BB1F7BB5-6AD4-4776-94D9-C09D0A972658} - Library - Properties - Avalonia.Gtk3 - Avalonia.Gtk3 - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - v5.0 + netstandard1.1 + False + false true @@ -92,12 +79,4 @@ Avalonia.SceneGraph - - \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index c7be3a0d90..7786272834 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -1,20 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {3E53A01A-B331-47F3-B828-4A5717E77A24} - Library - Properties - Avalonia.Markup.Xaml - Avalonia.Markup.Xaml - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 + netstandard1.1 + False + false true @@ -279,10 +267,6 @@ - - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} @@ -326,14 +310,10 @@ - - diff --git a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj index 155779fa1f..9240561ba4 100644 --- a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj +++ b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj @@ -1,20 +1,8 @@ - - - + - 11.0 - Debug - AnyCPU - {6417E941-21BC-467B-A771-0DE389353CE6} - Library - Properties - Avalonia.Markup - Avalonia.Markup - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Profile7 - v4.5 + netstandard1.1 + False + false true @@ -113,21 +101,12 @@ Avalonia.Styling - - - - - - - - + diff --git a/src/Shared/PlatformSupport/StandardRuntimePlatform.cs b/src/Shared/PlatformSupport/StandardRuntimePlatform.cs index e2aafd562b..1f42aec16e 100644 --- a/src/Shared/PlatformSupport/StandardRuntimePlatform.cs +++ b/src/Shared/PlatformSupport/StandardRuntimePlatform.cs @@ -13,7 +13,7 @@ namespace Avalonia.Shared.PlatformSupport { #if NETSTANDARD - public void PostThreadPoolItem(Action cb) => ThreadPool.QueueUserWorkItem(_ => cb(), null); + public void PostThreadPoolItem(Action cb) => ThreadPool.QueueUserWorkItem(_ => cb(), null); #else public Assembly[] GetLoadedAssemblies() => AppDomain.CurrentDomain.GetAssemblies(); public void PostThreadPoolItem(Action cb) => ThreadPool.UnsafeQueueUserWorkItem(_ => cb(), null); diff --git a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj index f421ed04f4..4e8bb06e13 100644 --- a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj +++ b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj @@ -1,21 +1,10 @@ - - - + - 14.0 - Debug - AnyCPU - {7D2D3083-71DD-4CC9-8907-39A0D86FB322} - Library - Properties + netstandard1.3 + False + false Avalonia.Skia.Desktop Avalonia.Skia.Desktop - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - v5.0 true @@ -36,15 +25,14 @@ 4 true - - - - Properties\SharedAssemblyInfo.cs + + + {b09b78d8-9b26-48b0-9149-d64a2f120f3f} @@ -77,12 +65,4 @@ - - \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Desktop.NetStandard/project.json b/src/Skia/Avalonia.Skia.Desktop.NetStandard/project.json deleted file mode 100644 index 8615e024b7..0000000000 --- a/src/Skia/Avalonia.Skia.Desktop.NetStandard/project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "supports": {}, - "dependencies": { - "Microsoft.NETCore.Portable.Compatibility": "1.0.1", - "NETStandard.Library": "1.6.0", - "SkiaSharp": "1.56.1-beta" - }, - "frameworks": { - "netstandard1.3": {} - } -} \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj index fd9d380cd4..164bccc933 100644 --- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj +++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj @@ -104,27 +104,11 @@ Avalonia.Styling - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - \ No newline at end of file diff --git a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj index 767ea06c60..b59892f4a4 100644 --- a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj +++ b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj @@ -132,6 +132,6 @@ --> - + \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj b/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj index 95d1b8a345..0642bc7754 100644 --- a/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj +++ b/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj @@ -1,21 +1,8 @@ - - - + - 14.0 - Debug - AnyCPU - {40759A76-D0F2-464E-8000-6FF0F5C4BD7C} - Library - Properties - Avalonia.Win32 - Avalonia.Win32 - en-US - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - v5.0 + netstandard1.1 + False + false true @@ -81,16 +68,5 @@ - - - - - \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32.NetStandard/project.json b/src/Windows/Avalonia.Win32.NetStandard/project.json deleted file mode 100644 index 74e316ac12..0000000000 --- a/src/Windows/Avalonia.Win32.NetStandard/project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "supports": {}, - "dependencies": { - "Microsoft.NETCore.Portable.Compatibility": "1.0.1", - "NETStandard.Library": "1.6.0", - "System.Reactive.Core": "3.0.0" - }, - "frameworks": { - "netstandard1.1": {} - } -} \ No newline at end of file From 363898e658c3663405586b086c7ba144fe3638dc Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Mar 2017 23:20:52 +0300 Subject: [PATCH 45/95] Migrated render tests to PackageReference --- .../Avalonia.Cairo.RenderTests.csproj | 83 ++++++++++--------- .../Avalonia.Direct2D1.RenderTests.csproj | 48 +++++------ .../Avalonia.Skia.RenderTests.csproj | 47 ++++++----- ...packages.Avalonia.Cairo.RenderTests.config | 16 ---- ...ages.Avalonia.Direct2D1.RenderTests.config | 10 --- .../packages.Avalonia.Skia.RenderTests.config | 10 --- 6 files changed, 90 insertions(+), 124 deletions(-) delete mode 100644 tests/Avalonia.RenderTests/packages.Avalonia.Cairo.RenderTests.config delete mode 100644 tests/Avalonia.RenderTests/packages.Avalonia.Direct2D1.RenderTests.config delete mode 100644 tests/Avalonia.RenderTests/packages.Avalonia.Skia.RenderTests.config diff --git a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj index 7392fd76cd..3bf901298b 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj @@ -1,5 +1,5 @@  - + Debug @@ -37,49 +37,9 @@ 4 - - ..\..\packages\Magick.NET-Q16-AnyCPU.7.0.0.0101\lib\net40-client\Magick.NET-Q16-AnyCPU.dll - True - - - ..\..\packages\System.Reactive.Core.3.0.0\lib\net45\System.Reactive.Core.dll - True - - - ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll - True - - - ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll - True - - - ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll - True - - - ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll - True - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - True - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -168,4 +128,45 @@ --> + + + 7.0.0.0101 + + + 3.0.0 + + + 3.0.0 + + + 3.0.0 + + + 3.0.0 + + + 3.0.0 + + + 3.0.0 + + + 2.1.0 + + + 2.0.0 + + + 2.1.0 + + + 2.1.0 + + + 2.1.0 + + + 2.1.0 + + \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj index 68d25a73c8..a4d1324fbb 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -40,31 +40,8 @@ - - ..\..\packages\Magick.NET-Q16-AnyCPU.7.0.0.0101\lib\net40-client\Magick.NET-Q16-AnyCPU.dll - True - - - ..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - True - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -152,4 +129,27 @@ --> + + + 7.0.0.0101 + + + 2.1.0 + + + 2.0.0 + + + 2.1.0 + + + 2.1.0 + + + 2.1.0 + + + 2.1.0 + + \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj index 1ba80837f0..16fd908fcf 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj @@ -1,5 +1,5 @@  - + @@ -51,10 +51,6 @@ MinimumRecommendedRules.ruleset - - ..\..\packages\Magick.NET-Q16-AnyCPU.7.0.0.0101\lib\net40-client\Magick.NET-Q16-AnyCPU.dll - True - @@ -64,24 +60,6 @@ - - ..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll - - - ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - True - - - ..\..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - True - - - ..\..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - True - @@ -145,4 +123,27 @@ --> + + + 7.0.0.0101 + + + 2.1.0 + + + 2.0.0 + + + 2.1.0 + + + 2.1.0 + + + 2.1.0 + + + 2.1.0 + + \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/packages.Avalonia.Cairo.RenderTests.config b/tests/Avalonia.RenderTests/packages.Avalonia.Cairo.RenderTests.config deleted file mode 100644 index fa1e626283..0000000000 --- a/tests/Avalonia.RenderTests/packages.Avalonia.Cairo.RenderTests.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/packages.Avalonia.Direct2D1.RenderTests.config b/tests/Avalonia.RenderTests/packages.Avalonia.Direct2D1.RenderTests.config deleted file mode 100644 index 07a670d200..0000000000 --- a/tests/Avalonia.RenderTests/packages.Avalonia.Direct2D1.RenderTests.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/packages.Avalonia.Skia.RenderTests.config b/tests/Avalonia.RenderTests/packages.Avalonia.Skia.RenderTests.config deleted file mode 100644 index 07a670d200..0000000000 --- a/tests/Avalonia.RenderTests/packages.Avalonia.Skia.RenderTests.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file From b6b5b9de88ce03fbceb3ab51f57c3ba6560cb006 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 01:48:42 +0300 Subject: [PATCH 46/95] Test now compile and can be run from visual studio --- .../Avalonia.Base.UnitTests.csproj | 26 ++++-------- .../Avalonia.Benchmarks.csproj | 2 +- .../Avalonia.Controls.UnitTests.csproj | 23 ++++------- .../Avalonia.DesignerSupport.TestApp.csproj | 2 +- .../Avalonia.DesignerSupport.Tests.csproj | 14 +++---- .../Avalonia.Direct2D1.UnitTests.csproj | 23 ++++------- .../Avalonia.Input.UnitTests.csproj | 23 ++++------- .../Avalonia.Interactivity.UnitTests.csproj | 23 ++++------- .../Avalonia.Layout.UnitTests.csproj | 23 ++++------- .../Avalonia.LeakTests.csproj | 14 +++---- .../Avalonia.Markup.UnitTests.csproj | 40 ++++--------------- .../Avalonia.Markup.Xaml.UnitTests.csproj | 23 ++++------- .../Avalonia.Cairo.RenderTests.csproj | 33 ++++----------- .../Avalonia.Direct2D1.RenderTests.csproj | 31 ++++---------- .../Avalonia.Skia.RenderTests.csproj | 36 ++++------------- .../Avalonia.Styling.UnitTests.csproj | 23 ++++------- .../Avalonia.UnitTests.csproj | 2 +- .../Avalonia.Visuals.UnitTests.csproj | 23 ++++------- 18 files changed, 118 insertions(+), 266 deletions(-) diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index c44445a709..c44bb23f3c 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -1,6 +1,5 @@  - Debug AnyCPU @@ -9,7 +8,7 @@ Properties Avalonia.Base.UnitTests Avalonia.Base.UnitTests - v4.5 + v4.6.1 512 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) @@ -74,9 +73,6 @@ - - - @@ -110,12 +106,6 @@ - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj index 5eb48b8502..f0e3bb9471 100644 --- a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj +++ b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj @@ -1,6 +1,5 @@  - Debug @@ -10,7 +9,7 @@ Properties Avalonia.Direct2D1.UnitTests Avalonia.Direct2D1.UnitTests - v4.5 + v4.6.1 512 @@ -96,12 +95,6 @@ - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj index a1a917ed25..b76d63f563 100644 --- a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj +++ b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj @@ -1,6 +1,5 @@  - Debug @@ -10,7 +9,7 @@ Properties Avalonia.Input.UnitTests Avalonia.Input.UnitTests - v4.5 + v4.6.1 512 @@ -98,12 +97,6 @@ - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - From 485fe1364eb4833edab133700d1eb0ce541af584 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 08:41:41 +0300 Subject: [PATCH 50/95] Everything is buildable via MSBuild --- Avalonia.sln | 9 --- samples/BindingTest/BindingTest.csproj | 3 +- .../ControlCatalog.Android.csproj | 1 + .../Resources/Resource.Designer.cs | 9 ++- .../ControlCatalog.Desktop.csproj | 3 +- .../ControlCatalog.iOS.csproj | 1 + samples/RenderTest/RenderTest.csproj | 1 + .../VirtualizationTest.csproj | 1 + .../GtkInteropDemo/GtkInteropDemo.csproj | 1 + .../WindowsInteropTest.csproj | 1 + .../Avalonia.Android/Avalonia.Android.csproj | 1 + .../Avalonia.AndroidTestApplication.csproj | 1 + .../Avalonia.DotNetFrameworkRuntime.csproj | 1 + src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj | 1 + src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj | 1 + .../Microsoft.NuGet.Build.Tasks.Patched.dll | Bin 0 -> 35328 bytes src/Shared/nuget.workaround.targets | 63 ++++++++++++++++++ .../Avalonia.Skia.Android.csproj | 1 + .../Avalonia.Skia.Desktop.csproj | 8 ++- .../Avalonia.Skia.iOS.csproj | 1 + .../Avalonia.Designer.csproj | 8 ++- .../Avalonia.Direct2D1.csproj | 1 + .../Avalonia.Win32/Avalonia.Win32.csproj | 1 + src/iOS/Avalonia.iOS/Avalonia.iOS.csproj | 1 + .../Avalonia.iOSTestApplication.csproj | 1 + .../Avalonia.Base.UnitTests.csproj | 23 +------ .../Avalonia.Benchmarks.csproj | 1 + .../Avalonia.Controls.UnitTests.csproj | 41 +----------- .../Avalonia.DesignerSupport.TestApp.csproj | 1 + .../Avalonia.DesignerSupport.Tests.csproj | 1 + .../Avalonia.Direct2D1.UnitTests.csproj | 6 +- .../Avalonia.Input.UnitTests.csproj | 1 + .../Avalonia.Interactivity.UnitTests.csproj | 1 + .../Avalonia.Layout.UnitTests.csproj | 22 +----- .../Avalonia.LeakTests.csproj | 1 + .../Avalonia.Markup.UnitTests.csproj | 1 + .../Avalonia.Markup.Xaml.UnitTests.csproj | 21 +----- .../Avalonia.Cairo.RenderTests.csproj | 17 +---- .../Avalonia.Direct2D1.RenderTests.csproj | 20 +----- .../Avalonia.Skia.RenderTests.csproj | 9 +-- .../Avalonia.Styling.UnitTests.csproj | 9 +-- .../Avalonia.UnitTests.csproj | 2 +- .../Avalonia.Visuals.UnitTests.csproj | 19 +----- 43 files changed, 129 insertions(+), 187 deletions(-) create mode 100644 src/Shared/Microsoft.NuGet.Build.Tasks.Patched.dll create mode 100644 src/Shared/nuget.workaround.targets diff --git a/Avalonia.sln b/Avalonia.sln index c2ba081fc0..e0b6972065 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -15,9 +15,6 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Direct2D1", "src\Windows\Avalonia.Direct2D1\Avalonia.Direct2D1.csproj", "{3E908F67-5543-4879-A1DC-08EACE79B3CD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Designer", "src\Windows\Avalonia.Designer\Avalonia.Designer.csproj", "{EC42600F-049B-43FF-AED1-8314D61B2749}" - ProjectSection(ProjectDependencies) = postProject - {2B888490-D14A-4BCA-AB4B-48676FA93C9B} = {2B888490-D14A-4BCA-AB4B-48676FA93C9B} - EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Input", "src\Avalonia.Input\Avalonia.Input.csproj", "{62024B2D-53EB-4638-B26B-85EEAA54866E}" EndProject @@ -85,9 +82,6 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Markup.UnitTests", "tests\Avalonia.Markup.UnitTests\Avalonia.Markup.UnitTests.csproj", "{8EF392D5-1416-45AA-9956-7CBBC3229E8A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BindingTest", "samples\BindingTest\BindingTest.csproj", "{08B3E6B9-1CD5-443C-9F61-6D49D1C5F162}" - ProjectSection(ProjectDependencies) = postProject - {B61B66A3-B82D-4875-8001-89D3394FE0C9} = {B61B66A3-B82D-4875-8001-89D3394FE0C9} - EndProjectSection EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "RenderHelpers", "src\Shared\RenderHelpers\RenderHelpers.shproj", "{3C4C0CB4-0C0F-4450-A37B-148C84FF905F}" EndProject @@ -126,9 +120,6 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog", "samples\ControlCatalog\ControlCatalog.csproj", "{D0A739B9-3C68-4BA6-A328-41606954B6BD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.Desktop", "samples\ControlCatalog.Desktop\ControlCatalog.Desktop.csproj", "{2B888490-D14A-4BCA-AB4B-48676FA93C9B}" - ProjectSection(ProjectDependencies) = postProject - {BB1F7BB5-6AD4-4776-94D9-C09D0A972658} = {BB1F7BB5-6AD4-4776-94D9-C09D0A972658} - EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.iOS", "samples\ControlCatalog.iOS\ControlCatalog.iOS.csproj", "{57E0455D-D565-44BB-B069-EE1AA20F8337}" EndProject diff --git a/samples/BindingTest/BindingTest.csproj b/samples/BindingTest/BindingTest.csproj index d8663f5031..fe5bd3aa1d 100644 --- a/samples/BindingTest/BindingTest.csproj +++ b/samples/BindingTest/BindingTest.csproj @@ -13,6 +13,7 @@ 512 true + PackageReference AnyCPU @@ -72,7 +73,6 @@ Designer - @@ -174,4 +174,5 @@ + \ No newline at end of file diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj index 9092238aa7..c9b12305dc 100644 --- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj +++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj @@ -170,4 +170,5 @@ --> + \ No newline at end of file diff --git a/samples/ControlCatalog.Android/Resources/Resource.Designer.cs b/samples/ControlCatalog.Android/Resources/Resource.Designer.cs index 96f0e76fd8..cee3331ba8 100644 --- a/samples/ControlCatalog.Android/Resources/Resource.Designer.cs +++ b/samples/ControlCatalog.Android/Resources/Resource.Designer.cs @@ -28,6 +28,8 @@ namespace ControlCatalog.Android { global::Avalonia.Android.Resource.String.ApplicationName = global::ControlCatalog.Android.Resource.String.ApplicationName; global::Avalonia.Android.Resource.String.Hello = global::ControlCatalog.Android.Resource.String.Hello; + global::Avalonia.Android.Resource.String.library_name = global::ControlCatalog.Android.Resource.String.library_name; + global::Splat.Resource.String.library_name = global::ControlCatalog.Android.Resource.String.library_name; } public partial class Attribute @@ -94,11 +96,14 @@ namespace ControlCatalog.Android public partial class String { + // aapt resource value: 0x7f040002 + public const int ApplicationName = 2130968578; + // aapt resource value: 0x7f040001 - public const int ApplicationName = 2130968577; + public const int Hello = 2130968577; // aapt resource value: 0x7f040000 - public const int Hello = 2130968576; + public const int library_name = 2130968576; static String() { diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj index bd0e56e3e6..73f50a18d6 100644 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj +++ b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj @@ -13,6 +13,7 @@ 512 true + PackageReference AnyCPU @@ -49,7 +50,6 @@ - @@ -154,4 +154,5 @@ 2.1.0 + \ No newline at end of file diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj index d0c73b2553..01d287ea83 100644 --- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj +++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj @@ -181,4 +181,5 @@ + \ No newline at end of file diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index b60eb7ab36..fdebadb444 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -199,4 +199,5 @@ + \ No newline at end of file diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationTest/VirtualizationTest.csproj index 0ed2b9d9bd..99f99cfe85 100644 --- a/samples/VirtualizationTest/VirtualizationTest.csproj +++ b/samples/VirtualizationTest/VirtualizationTest.csproj @@ -171,4 +171,5 @@ + \ No newline at end of file diff --git a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj index 738a1e776c..9ae6063876 100644 --- a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj +++ b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj @@ -157,4 +157,5 @@ --> + \ No newline at end of file diff --git a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj index 671ebd0020..9ebe588fd1 100644 --- a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj +++ b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj @@ -187,4 +187,5 @@ --> + \ No newline at end of file diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index a9ff8e6924..cef2a2cdd6 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -158,4 +158,5 @@ + \ No newline at end of file diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj index 7ce8879304..0b6dee0d7d 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj +++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj @@ -185,4 +185,5 @@ + \ No newline at end of file diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index 4a8ce05013..350b4c4fbc 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -82,4 +82,5 @@ + \ No newline at end of file diff --git a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj index da3c8c9952..f0b4d4eb7d 100644 --- a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj +++ b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj @@ -116,4 +116,5 @@ + \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index 257736aaf1..1681936e38 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -104,4 +104,5 @@ + \ No newline at end of file diff --git a/src/Shared/Microsoft.NuGet.Build.Tasks.Patched.dll b/src/Shared/Microsoft.NuGet.Build.Tasks.Patched.dll new file mode 100644 index 0000000000000000000000000000000000000000..33ab0a4af72449d52371baa77daaaf60586fba1a GIT binary patch literal 35328 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 + + + + + + + + + + + + + + + + + + + + + + <_ReferencesFromNuGetPackages Remove="%(ReferencePath.FileName)" Condition="'%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandTargetFramework'" /> + + + + <_ResolvedProjectReferencePaths Include="@(_ReferencesFromNuGetPackages)" Condition="'%(_ReferencesFromNuGetPackages.NuGetSourceType)' == 'Project'" /> + + + + + + + + + true + + + + + + + + + $(MSBuildToolsPath)\..\Roslyn + + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index 4c20239e64..252896dcc1 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -98,4 +98,5 @@ + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj index 164bccc933..ad2c35f922 100644 --- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj +++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj @@ -12,9 +12,7 @@ v4.5 512 - - - True + false true @@ -111,4 +109,8 @@ + + + + \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index fc8d8f3053..17f01f377d 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -92,4 +92,5 @@ + \ No newline at end of file diff --git a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj index b59892f4a4..105c2f2547 100644 --- a/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj +++ b/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj @@ -12,8 +12,7 @@ v4.5 512 true - - + PackageReference @@ -132,6 +131,9 @@ --> - + + 10.3.0 + + \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index 0773300656..e19404ddbe 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -127,4 +127,5 @@ + \ No newline at end of file diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj index be86e3c4d3..6f270b148c 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj @@ -117,4 +117,5 @@ + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index 7ef7108785..a095668129 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -128,4 +128,5 @@ + \ No newline at end of file diff --git a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj index 089b8afb73..ba2e3ada87 100644 --- a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj +++ b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj @@ -208,4 +208,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index c44bb23f3c..5d17349179 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -10,13 +10,7 @@ Avalonia.Base.UnitTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -26,8 +20,6 @@ DEBUG;TRACE prompt 4 - bin\Debug\Avalonia.Base.UnitTests.XML - CS1591 pdbonly @@ -37,18 +29,6 @@ prompt 4 - - - - - - - - - - - - @@ -128,4 +108,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index c102b39744..8df2deabee 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -113,4 +113,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index 71ddbefebe..e59916e31f 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -5,18 +5,9 @@ AnyCPU {5CCB5571-7C30-4E7D-967D-0E2158EBD91F} Library - Properties - Avalonia.Controls.UnitTests - Avalonia.Controls.UnitTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -26,8 +17,6 @@ DEBUG;TRACE prompt 4 - bin\Debug\Avalonia.Controls.UnitTests.XML - CS1591 pdbonly @@ -41,14 +30,6 @@ - - - - - - - - @@ -167,25 +148,6 @@ - - - - - False - - - False - - - False - - - False - - - - - + \ No newline at end of file diff --git a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj index 5cb7ba0e75..16de37d968 100644 --- a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj +++ b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj @@ -75,4 +75,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj index f0e3bb9471..4d14649b8b 100644 --- a/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj +++ b/tests/Avalonia.Direct2D1.UnitTests/Avalonia.Direct2D1.UnitTests.csproj @@ -11,8 +11,7 @@ Avalonia.Direct2D1.UnitTests v4.6.1 512 - - + true @@ -22,8 +21,6 @@ DEBUG;TRACE prompt 4 - bin\Debug\Avalonia.Direct2D1.UnitTests.XML - CS1591 pdbonly @@ -111,4 +108,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj index b76d63f563..fc4deba5dc 100644 --- a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj +++ b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj @@ -120,4 +120,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj index 0e47302b77..c7c13e3c5e 100644 --- a/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj +++ b/tests/Avalonia.Interactivity.UnitTests/Avalonia.Interactivity.UnitTests.csproj @@ -111,4 +111,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj index 2ba4e827e8..07e6c2ecaf 100644 --- a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj +++ b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj @@ -10,13 +10,7 @@ Avalonia.Layout.UnitTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -26,8 +20,6 @@ DEBUG;TRACE prompt 4 - bin\Debug\Avalonia.Layout.UnitTests.XML - CS1591 pdbonly @@ -37,17 +29,6 @@ prompt 4 - - - - - - - - - - - @@ -158,4 +139,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 8aa5b2ede1..251e9e9297 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -144,4 +144,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj index 12991766e2..534bd919e1 100644 --- a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj +++ b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj @@ -129,4 +129,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index 63ac4db742..b6d4407192 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU @@ -10,18 +11,7 @@ Avalonia.Markup.Xaml.UnitTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - SAK - SAK - SAK - SAK - - true @@ -43,14 +33,6 @@ - - - - - - - - @@ -191,4 +173,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj index 1908367d93..fed9e121e5 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Cairo.RenderTests.csproj @@ -10,13 +10,7 @@ Avalonia.Cairo.RenderTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -40,14 +34,6 @@ - - - - - - - - {FB05AC90-89BA-4F2F-A924-F37875FB547C} @@ -150,4 +136,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj index c86db3c42b..32a27e1f23 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.csproj @@ -10,13 +10,7 @@ Avalonia.Direct2D1.RenderTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -26,7 +20,6 @@ DEBUG;TRACE prompt 4 - ..\..\artifacts\tests\Avalonia.Direct2D1.RenderTests.XML CS1591 @@ -36,21 +29,11 @@ TRACE prompt 4 - - - - - - - - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} @@ -135,4 +118,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj index a42e434f0b..5b0aa4bd11 100644 --- a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj +++ b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.csproj @@ -11,8 +11,7 @@ Avalonia.Skia.RenderTests v4.6.1 512 - - + true @@ -37,17 +36,12 @@ TRACE;DEBUG;AVALONIA_SKIA;AVALONIA_SKIA_SKIP_FAIL full x86 - prompt - MinimumRecommendedRules.ruleset ..\..\artifacts\tests\ TRACE;AVALONIA_SKIA;AVALONIA_SKIA_SKIP_FAIL; true - pdbonly x86 - prompt - MinimumRecommendedRules.ruleset @@ -124,4 +118,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj index 6873c50347..7b85c3fe4d 100644 --- a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj +++ b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj @@ -10,13 +10,7 @@ Avalonia.Styling.UnitTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -160,4 +154,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj index b9d6e4681d..1c07e547ec 100644 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj +++ b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj @@ -5,7 +5,6 @@ Debug AnyCPU {88060192-33D5-4932-B0F9-8BD2763E857D} - {88060192-33D5-4932-B0F9-8BD2763E857D} Library Properties Avalonia.UnitTests @@ -120,4 +119,5 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj index a43c84ab9a..c731be7418 100644 --- a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj +++ b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj @@ -10,13 +10,7 @@ Avalonia.Visuals.UnitTests v4.6.1 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - + true @@ -26,8 +20,6 @@ DEBUG;TRACE prompt 4 - bin\Debug\Avalonia.Visuals.UnitTests.xml - CS1591 pdbonly @@ -40,14 +32,6 @@ - - - - - - - - @@ -151,4 +135,5 @@ + \ No newline at end of file From 8b8a9b99d9eaad234d159ecc7464a48c1490c3e0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 16:41:06 +0300 Subject: [PATCH 51/95] Fixed vs build --- src/Shared/nuget.workaround.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Shared/nuget.workaround.targets b/src/Shared/nuget.workaround.targets index 32d86c21ff..4490fd8375 100644 --- a/src/Shared/nuget.workaround.targets +++ b/src/Shared/nuget.workaround.targets @@ -58,6 +58,6 @@ - $(MSBuildToolsPath)\..\Roslyn + $(MSBuildToolsPath)\..\Roslyn \ No newline at end of file From fef8d3448a2ed64241b2d1972246f55063349cbb Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 16:41:35 +0300 Subject: [PATCH 52/95] Added .NET Core version of control catalog --- Avalonia.sln | 43 +++++++++++++++++++ .../ControlCatalog.NetCore.csproj | 13 ++++++ samples/ControlCatalog.NetCore/Program.cs | 15 +++++++ 3 files changed, 71 insertions(+) create mode 100644 samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj create mode 100644 samples/ControlCatalog.NetCore/Program.cs diff --git a/Avalonia.sln b/Avalonia.sln index e0b6972065..8e06247b1a 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -155,6 +155,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Skia.Desktop.NetSt EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Gtk3", "src\Gtk\Avalonia.Gtk3\Avalonia.Gtk3.csproj", "{BB1F7BB5-6AD4-4776-94D9-C09D0A972658}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.NetCore", "samples\ControlCatalog.NetCore\ControlCatalog.NetCore.csproj", "{39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{2f59f3d0-748d-4652-b01e-e0d954756308}*SharedItemsImports = 13 @@ -2433,6 +2435,46 @@ Global {BB1F7BB5-6AD4-4776-94D9-C09D0A972658}.Release|Mono.Build.0 = Release|Any CPU {BB1F7BB5-6AD4-4776-94D9-C09D0A972658}.Release|x86.ActiveCfg = Release|Any CPU {BB1F7BB5-6AD4-4776-94D9-C09D0A972658}.Release|x86.Build.0 = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|Mono.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|iPhone.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|Mono.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|Mono.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|x86.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.AppStore|x86.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|iPhone.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|Mono.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|Mono.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|x86.ActiveCfg = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Debug|x86.Build.0 = Debug|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|Any CPU.Build.0 = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|iPhone.ActiveCfg = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|iPhone.Build.0 = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|Mono.ActiveCfg = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|Mono.Build.0 = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|x86.ActiveCfg = Release|Any CPU + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2488,5 +2530,6 @@ Global {40759A76-D0F2-464E-8000-6FF0F5C4BD7C} = {B39A8919-9F95-48FE-AD7B-76E08B509888} {7D2D3083-71DD-4CC9-8907-39A0D86FB322} = {3743B0F2-CC41-4F14-A8C8-267F579BF91E} {BB1F7BB5-6AD4-4776-94D9-C09D0A972658} = {B9894058-278A-46B5-B6ED-AD613FCC03B3} + {39D7B147-1A5B-47C2-9D01-21FB7C47C4B3} = {9B9E3891-2366-4253-A952-D08BCEB71098} EndGlobalSection EndGlobal diff --git a/samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj b/samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj new file mode 100644 index 0000000000..d43c3a060e --- /dev/null +++ b/samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj @@ -0,0 +1,13 @@ + + + + Exe + netcoreapp1.1 + + + + + + + + \ No newline at end of file diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs new file mode 100644 index 0000000000..57a508f923 --- /dev/null +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -0,0 +1,15 @@ +using System; +using Avalonia; + +namespace ControlCatalog.NetCore +{ + class Program + { + static void Main(string[] args) + { + AppBuilder.Configure() + .UsePlatformDetect() + .Start(); + } + } +} \ No newline at end of file From d7c48e17f462d2619471c10e30c513e0ca4464b9 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 17:01:24 +0300 Subject: [PATCH 53/95] Exclude resources from submodules --- src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj | 10 ++++++---- .../Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj index e800a64a17..b51bc65607 100644 --- a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj +++ b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj @@ -21,9 +21,6 @@ prompt 4 - - - @@ -164,4 +161,9 @@ - \ No newline at end of file + + + + + + diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index eba7395340..3f7343a1ec 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -326,4 +326,10 @@ - \ No newline at end of file + + + + + + + From 88ef461d5335871156a7c2b4f0de3e8f4e7a2242 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 17:14:56 +0300 Subject: [PATCH 54/95] Reference native linux binaries --- .../Avalonia.Skia.Desktop.NetStandard.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj index ddad89fd10..49d9403875 100644 --- a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj +++ b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj @@ -32,6 +32,7 @@ + From 4bb5ebf070a5bfbb0aec6179ed225d5395b24ad5 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 19:28:55 +0300 Subject: [PATCH 55/95] Fixed build script for windows --- appveyor.yml | 2 +- build.cake | 73 ++++++++----------- packages.cake | 52 ++++++++----- .../Avalonia.DotNetCoreRuntime.csproj | 2 +- .../Avalonia.Win32.NetStandard.csproj | 2 + 5 files changed, 66 insertions(+), 65 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index db7d129dd1..d11b4074f8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -os: Visual Studio 2015 +os: Visual Studio 2017 platform: - Any CPU configuration: diff --git a/build.cake b/build.cake index ee68c74bb3..8191774dc5 100644 --- a/build.cake +++ b/build.cake @@ -96,46 +96,10 @@ Task("Clean") CleanDirectory(parameters.TestsRoot); }); -Task("Prepare-XBuild-Solution") - .Does(() => -{ - var blacklistedProjects = new[] - { - "Avalonia.Win32.NetStandard", - "Avalonia.DotNetCoreRuntime", - "Avalonia.Skia.Desktop.NetStandard", - "Avalonia.Gtk3" - }; - var blacklistedGuids = System.IO.File.ReadAllLines(parameters.MSBuildSolution) - .Where(l=>l.StartsWith("Project") && blacklistedProjects.Any(p=>l.Contains(p))) - .Select(l => l.Split(',').Select(part => part.Trim()).FirstOrDefault(part => part.StartsWith("\"{"))) - .Where(g=>g!=null) - .Select(l=>l.Trim(new[]{'"', '}', '{'}).ToLower()).ToArray(); - - Console.WriteLine("Blacklisted guids are: " + string.Join(",", blacklistedGuids)); - var removeUntilEndProject = false; - - System.IO.File.WriteAllLines(parameters.XBuildSolution, System.IO.File.ReadAllLines(parameters.MSBuildSolution) - .Where(l => - { - if(removeUntilEndProject) - { - if(l.StartsWith("EndProject")) - removeUntilEndProject = false; - return false; - } - - var blacklist = blacklistedGuids.Any(g => l.ToLower().Contains(g)); - if(blacklist && l.StartsWith("Project")) - removeUntilEndProject = true; - - return !blacklist; - })); -}); Task("Restore-NuGet-Packages") .IsDependentOn("Clean") - .IsDependentOn("Prepare-XBuild-Solution") + .WithCriteria(parameters.IsRunningOnWindows) .Does(() => { var maxRetryCount = 5; @@ -168,6 +132,14 @@ Task("Restore-NuGet-Packages") }); }); +void DotNetCoreBuild() +{ +} + +Task("DotNetCoreBuild") + .IsDependentOn("Clean") + .Does(() => DotNetCoreBuild()); + Task("Build") .IsDependentOn("Restore-NuGet-Packages") .Does(() => @@ -179,25 +151,34 @@ Task("Build") settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); settings.SetVerbosity(Verbosity.Minimal); settings.WithProperty("Windows", "True"); - settings.UseToolVersion(MSBuildToolVersion.VS2015); + settings.UseToolVersion(MSBuildToolVersion.VS2017); settings.SetNodeReuse(false); }); } else { - XBuild(parameters.XBuildSolution, settings => { - settings.SetConfiguration(parameters.Configuration); - settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); - settings.SetVerbosity(Verbosity.Minimal); - }); + DotNetCoreBuild(); } }); +void RunDotNetCoreTest() +{ +} + +Task("Run-Net-Core-Unit-Tests") + .IsDependentOn("Clean") + .Does(() => RunDotNetCoreTest()); + Task("Run-Unit-Tests") .IsDependentOn("Build") .WithCriteria(() => !parameters.SkipTests) .Does(() => { + if(parameters.IsRunningOnWindows) + { + RunDotNetCoreTest(); + } + var unitTests = GetDirectories("./tests/Avalonia.*.UnitTests") .Select(dir => System.IO.Path.GetFileName(dir.FullPath)) .Where(name => parameters.IsRunningOnWindows ? true : !(name.IndexOf("Direct2D", StringComparison.OrdinalIgnoreCase) >= 0)) @@ -236,7 +217,11 @@ Task("Run-Unit-Tests") { CopyDirectory(test.GetDirectory(), parameters.TestsRoot); } - + + CopyFile(System.IO.Path.Combine(packages.NugetPackagesDir, "SkiaSharp", packages.SkiaSharpVersion, + "runtimes", "win7-x86", "native", "libSkiaSharp.dll"), + System.IO.Path.Combine(parameters.TestsRoot.ToString(), "libSkiaSharp.dll")); + var testsInDirectoryToRun = new List(); if(parameters.IsRunningOnWindows) { diff --git a/packages.cake b/packages.cake index 67483c4579..7f9c5bdb65 100644 --- a/packages.cake +++ b/packages.cake @@ -1,9 +1,12 @@ +using System.Xml.Linq; + public class Packages { public List NuspecNuGetSettings { get; private set; } public FilePath[] NugetPackages { get; private set; } public FilePath[] BinFiles { get; private set; } - + public string NugetPackagesDir {get; private set;} + public string SkiaSharpVersion {get; private set; } public Packages(ICakeContext context, Parameters parameters) { // NUGET NUSPECS @@ -23,21 +26,27 @@ public class Packages // Value is Tuple where Item1: Package Version, Item2: The packages.config file path. var packageVersions = new Dictionary>>(); - System.IO.Directory.EnumerateFiles(((DirectoryPath)context.Directory("./src")).FullPath, "packages.config", SearchOption.AllDirectories).ToList().ForEach(fileName => + System.IO.Directory.EnumerateFiles(((DirectoryPath)context.Directory("./src")).FullPath, + "*.csproj", SearchOption.AllDirectories).ToList().ForEach(fileName => { if (!ignoredSubModulesPaths.Any(i => normalizePath(fileName).Contains(normalizePath(i)))) { - var file = new PackageReferenceFile(fileName); - foreach (PackageReference packageReference in file.GetPackageReferences()) + var xdoc = XDocument.Load(fileName); + foreach (var reference in xdoc.Descendants().Where(x => x.Name.LocalName == "PackageReference")) { + var name = reference.Attribute("Include").Value; + var versionAttribute = reference.Attribute("Version"); + var version = versionAttribute != null + ? versionAttribute.Value + : reference.Elements().First(x=>x.Name.LocalName == "Version").Value; IList> versions; - packageVersions.TryGetValue(packageReference.Id, out versions); + packageVersions.TryGetValue(name, out versions); if (versions == null) { versions = new List>(); - packageVersions[packageReference.Id] = versions; + packageVersions[name] = versions; } - versions.Add(Tuple.Create(packageReference.Version.ToString(), fileName)); + versions.Add(Tuple.Create(version, fileName)); } } }); @@ -65,7 +74,7 @@ public class Packages var SplatVersion = packageVersions["Splat"].FirstOrDefault().Item1; var SpracheVersion = packageVersions["Sprache"].FirstOrDefault().Item1; var SystemReactiveVersion = packageVersions["System.Reactive"].FirstOrDefault().Item1; - var SkiaSharpVersion = packageVersions["SkiaSharp"].FirstOrDefault().Item1; + SkiaSharpVersion = packageVersions["SkiaSharp"].FirstOrDefault().Item1; var SharpDXVersion = packageVersions["SharpDX"].FirstOrDefault().Item1; var SharpDXDirect2D1Version = packageVersions["SharpDX.Direct2D1"].FirstOrDefault().Item1; var SharpDXDirect3D11Version = packageVersions["SharpDX.Direct3D11"].FirstOrDefault().Item1; @@ -81,6 +90,11 @@ public class Packages context.Information("Package: SharpDX.Direct3D11, version: {0}", SharpDXDirect3D11Version); context.Information("Package: SharpDX.DXGI, version: {0}", SharpDXDXGIVersion); + var nugetPackagesDir = System.Environment.GetEnvironmentVariable("NUGET_HOME") + ?? System.IO.Path.Combine(System.Environment.GetEnvironmentVariable("USERPROFILE"), ".nuget"); + + NugetPackagesDir = System.IO.Path.Combine(nugetPackagesDir, "packages"); + var SetNuGetNuspecCommonProperties = new Action ((nuspec) => { nuspec.Version = parameters.Version; nuspec.Authors = new [] { "Avalonia Team" }; @@ -129,12 +143,12 @@ public class Packages }; var coreLibrariesFiles = coreLibraries.Select((lib) => { - return (FilePath)context.File(lib[0] + lib[1] + "/bin/" + parameters.DirSuffix + "/" + lib[1] + lib[2]); + return (FilePath)context.File(lib[0] + lib[1] + "/bin/" + parameters.DirSuffix + "/netstandard1.1/" + lib[1] + lib[2]); }).ToList(); var coreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => { return new NuSpecContent { - Source = file.FullPath, Target = "lib/portable-windows8+net45" + Source = file.FullPath, Target = "lib/netstandard1.1" }; }); @@ -161,7 +175,7 @@ public class Packages var netCoreRuntimePlatformExtensions = new [] {".xml", ".dll"}; var netCoreRuntimePlatform = netCoreRuntimePlatformExtensions.Select(libSuffix => { return new NuSpecContent { - Source = ((FilePath)context.File("./src/Avalonia.DotNetCoreRuntime/bin/" + parameters.DirSuffix + "/Avalonia.DotNetCoreRuntime" + libSuffix)).FullPath, + Source = ((FilePath)context.File("./src/Avalonia.DotNetCoreRuntime/bin/" + parameters.DirSuffix + "/netcoreapp1.0/Avalonia.DotNetCoreRuntime" + libSuffix)).FullPath, Target = "lib/netcoreapp1.0" }; }); @@ -180,12 +194,12 @@ public class Packages new NuSpecDependency() { Id = "Splat", Version = SplatVersion }, new NuSpecDependency() { Id = "Sprache", Version = SpracheVersion }, new NuSpecDependency() { Id = "System.Reactive", Version = SystemReactiveVersion }, - new NuSpecDependency() { Id = "System.Threading.ThreadPool", TargetFramework = "netcoreapp1.0", Version = "4.3.0" }, //.NET Core + new NuSpecDependency() { Id = "System.Threading.ThreadPool", TargetFramework = "netcoreapp1.0", Version = "4.3.0" }, new NuSpecDependency() { Id = "NETStandard.Library", TargetFramework = "netcoreapp1.0", Version = "1.6.0" }, new NuSpecDependency() { Id = "Microsoft.NETCore.Portable.Compatibility", TargetFramework = "netcoreapp1.0", Version = "1.0.1" }, - new NuSpecDependency() { Id = "Splat", TargetFramework = "netcoreapp1.0", Version = "2.0.0" }, - new NuSpecDependency() { Id = "Serilog", TargetFramework = "netcoreapp1.0", Version = "2.3.0" }, + new NuSpecDependency() { Id = "Splat", TargetFramework = "netcoreapp1.0", Version = SplatVersion }, + new NuSpecDependency() { Id = "Serilog", TargetFramework = "netcoreapp1.0", Version = SerilogVersion }, new NuSpecDependency() { Id = "Sprache", TargetFramework = "netcoreapp1.0", Version = SpracheVersion }, new NuSpecDependency() { Id = "System.Reactive", TargetFramework = "netcoreapp1.0", Version = SystemReactiveVersion } }, @@ -208,9 +222,9 @@ public class Packages }, Files = new [] { - new NuSpecContent { Source = "Avalonia.HtmlRenderer.dll", Target = "lib/portable-windows8+net45" } + new NuSpecContent { Source = "Avalonia.HtmlRenderer.dll", Target = "lib/netstandard1.1" } }, - BasePath = context.Directory("./src/Avalonia.HtmlRenderer/bin/" + parameters.DirSuffix), + BasePath = context.Directory("./src/Avalonia.HtmlRenderer/bin/" + parameters.DirSuffix + "/netstandard1.1"), OutputDirectory = parameters.NugetRoot } }; @@ -324,7 +338,7 @@ public class Packages Files = new [] { new NuSpecContent { Source = "Avalonia.Win32/bin/" + parameters.DirSuffix + "/Avalonia.Win32.dll", Target = "lib/net45" }, - new NuSpecContent { Source = "Avalonia.Win32.NetStandard/bin/" + parameters.DirSuffix + "/Avalonia.Win32.dll", Target = "lib/netstandard1.1" } + new NuSpecContent { Source = "Avalonia.Win32.NetStandard/bin/" + parameters.DirSuffix + "/netstandard1.1/Avalonia.Win32.dll", Target = "lib/netstandard1.1" } }, BasePath = context.Directory("./src/Windows"), OutputDirectory = parameters.NugetRoot @@ -381,7 +395,7 @@ public class Packages { new NuSpecContent { Source = "Avalonia.Gtk3.dll", Target = "lib/netstandard1.1" } }, - BasePath = context.Directory("./src/Gtk/Avalonia.Gtk3/bin/" + parameters.DirSuffix), + BasePath = context.Directory("./src/Gtk/Avalonia.Gtk3/bin/" + parameters.DirSuffix + "/netstandard1.1"), OutputDirectory = parameters.NugetRoot }, /////////////////////////////////////////////////////////////////////////////// @@ -420,7 +434,7 @@ public class Packages Files = new [] { new NuSpecContent { Source = "Avalonia.Skia.Desktop/bin/" + parameters.DirSuffixSkia + "/Avalonia.Skia.Desktop.dll", Target = "lib/net45" }, - new NuSpecContent { Source = "Avalonia.Skia.Desktop.NetStandard/bin/" + parameters.DirSuffix + "/Avalonia.Skia.Desktop.dll", Target = "lib/netcoreapp1.0" } + new NuSpecContent { Source = "Avalonia.Skia.Desktop.NetStandard/bin/" + parameters.DirSuffix + "/netstandard1.3/Avalonia.Skia.Desktop.dll", Target = "lib/netcoreapp1.0" } }, BasePath = context.Directory("./src/Skia/"), OutputDirectory = parameters.NugetRoot diff --git a/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj b/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj index ab5080c78d..1004201ec4 100644 --- a/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj +++ b/src/Avalonia.DotNetCoreRuntime/Avalonia.DotNetCoreRuntime.csproj @@ -1,6 +1,6 @@  - netstandard1.6 + netcoreapp1.0 False false diff --git a/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj b/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj index a1d490b1c4..5059131371 100644 --- a/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj +++ b/src/Windows/Avalonia.Win32.NetStandard/Avalonia.Win32.NetStandard.csproj @@ -3,6 +3,8 @@ netstandard1.1 False false + Avalonia.Win32 + Avalonia.Win32 true From 6827132a59ea0fa09f8b4ebd7c55063bd48f51bc Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 19:34:37 +0300 Subject: [PATCH 56/95] use rc appveyor image --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d11b4074f8..bf817e7b22 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -os: Visual Studio 2017 +os: Visual Studio 2017 RC platform: - Any CPU configuration: From f6cad5f10cde8b73a212f2a0c4f972b21c4574ae Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 20:03:49 +0300 Subject: [PATCH 57/95] use msbuild for package restore --- build.cake | 21 ++++++++----------- .../Avalonia.Skia.Desktop.NetStandard.csproj | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/build.cake b/build.cake index 8191774dc5..3556a573a3 100644 --- a/build.cake +++ b/build.cake @@ -117,18 +117,15 @@ Task("Restore-NuGet-Packages") toolTimeout+=0.5; }}) .Execute(()=> { - if(parameters.IsRunningOnWindows) - { - NuGetRestore(parameters.MSBuildSolution, new NuGetRestoreSettings { - ToolTimeout = TimeSpan.FromMinutes(toolTimeout) - }); - } - else - { - NuGetRestore(parameters.XBuildSolution, new NuGetRestoreSettings { - ToolTimeout = TimeSpan.FromMinutes(toolTimeout) - }); - } + MSBuild(parameters.MSBuildSolution, settings => { + settings.SetConfiguration(parameters.Configuration); + settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); + settings.SetVerbosity(Verbosity.Minimal); + settings.WithProperty("Windows", "True"); + settings.UseToolVersion(MSBuildToolVersion.VS2017); + settings.WithTarget("restore"); + settings.SetNodeReuse(false); + }); }); }); diff --git a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj index 49d9403875..f1df5d36ea 100644 --- a/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj +++ b/src/Skia/Avalonia.Skia.Desktop.NetStandard/Avalonia.Skia.Desktop.NetStandard.csproj @@ -32,7 +32,7 @@ - + From a6fb94afde3577ad17a46f0516dbdeecbf380b10 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 20:14:48 +0300 Subject: [PATCH 58/95] use nuget 4.3 --- build.cake | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/build.cake b/build.cake index 3556a573a3..e75950326d 100644 --- a/build.cake +++ b/build.cake @@ -4,6 +4,7 @@ #addin "nuget:?package=Polly&version=4.2.0" #addin "nuget:?package=NuGet.Core&version=2.12.0" +#tool "nuget:https://dotnet.myget.org/F/nuget-build/?package=NuGet.CommandLine&version=4.3.0-beta1-2361&prerelease" /////////////////////////////////////////////////////////////////////////////// // TOOLS @@ -117,15 +118,10 @@ Task("Restore-NuGet-Packages") toolTimeout+=0.5; }}) .Execute(()=> { - MSBuild(parameters.MSBuildSolution, settings => { - settings.SetConfiguration(parameters.Configuration); - settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); - settings.SetVerbosity(Verbosity.Minimal); - settings.WithProperty("Windows", "True"); - settings.UseToolVersion(MSBuildToolVersion.VS2017); - settings.WithTarget("restore"); - settings.SetNodeReuse(false); - }); + NuGetRestore(parameters.MSBuildSolution, new NuGetRestoreSettings { + ToolPath = "./tools/NuGet.CommandLine/tools/NuGet.exe", + ToolTimeout = TimeSpan.FromMinutes(toolTimeout) + }); }); }); From fa12a9ee282951581704140db7dd8db87e38343c Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 20:29:12 +0300 Subject: [PATCH 59/95] Get dotmemoryunit from %USERPFORILE%/.nuget/packages --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index bf817e7b22..b18330bc12 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ before_build: build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: -- .\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" +- %USERPROFILE%\.nuget\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - pip install codecov From a9f867c1276e8a1225aa3f4dcdffd9f7e59e3ed1 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 20:33:50 +0300 Subject: [PATCH 60/95] set path --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index b18330bc12..c609d69fb1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,8 +19,8 @@ before_build: build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: -- %USERPROFILE%\.nuget\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - +- cmd set PATH=%USERPROFILE%\.nuget\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools;%PATH% +- dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - pip install codecov - codecov -f "./artifacts/coverage.xml" From c427ed5bdc857b818fc628ff6ad0b8c5bd517f63 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 20:50:41 +0300 Subject: [PATCH 61/95] whoops --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index c609d69fb1..aeb5d4eef2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ before_build: build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: -- cmd set PATH=%USERPROFILE%\.nuget\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools;%PATH% +- cmd: set PATH=%USERPROFILE%\.nuget\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools;%PATH% - dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - pip install codecov From beda69a2e6a4739dc70f30ac6a2185b6f19c8f3c Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 20:55:45 +0300 Subject: [PATCH 62/95] Special hack to keep VS happy --- build.cake | 1 + src/Android/Avalonia.Android/Avalonia.Android.csproj | 3 +++ src/Shared/nuget.workaround.targets | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build.cake b/build.cake index e75950326d..4ca75e1bb1 100644 --- a/build.cake +++ b/build.cake @@ -142,6 +142,7 @@ Task("Build") MSBuild(parameters.MSBuildSolution, settings => { settings.SetConfiguration(parameters.Configuration); settings.WithProperty("Platform", "\"" + parameters.Platform + "\""); + settings.WithProperty("UseRoslynPathHack", "true"); settings.SetVerbosity(Verbosity.Minimal); settings.WithProperty("Windows", "True"); settings.UseToolVersion(MSBuildToolVersion.VS2017); diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index cef2a2cdd6..b763aad8f3 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -159,4 +159,7 @@ + + $(MSBuildToolsPath)\Roslyn + \ No newline at end of file diff --git a/src/Shared/nuget.workaround.targets b/src/Shared/nuget.workaround.targets index 4490fd8375..bf6b71ddba 100644 --- a/src/Shared/nuget.workaround.targets +++ b/src/Shared/nuget.workaround.targets @@ -57,7 +57,7 @@ - - $(MSBuildToolsPath)\..\Roslyn + + $(MSBuildToolsPath)\..\Roslyn \ No newline at end of file From a06a6d10bd646eaa349db9c1311fbcd662cb0df1 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 21:04:40 +0300 Subject: [PATCH 63/95] Install dotMemoryUnit from cake script --- appveyor.yml | 3 +-- build.cake | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index aeb5d4eef2..0701d5f65c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,8 +19,7 @@ before_build: build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: -- cmd: set PATH=%USERPROFILE%\.nuget\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools;%PATH% -- dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" +- tools\JetBrains.dotMemoryUnit\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - pip install codecov - codecov -f "./artifacts/coverage.xml" diff --git a/build.cake b/build.cake index 4ca75e1bb1..5e004afc1a 100644 --- a/build.cake +++ b/build.cake @@ -5,7 +5,7 @@ #addin "nuget:?package=Polly&version=4.2.0" #addin "nuget:?package=NuGet.Core&version=2.12.0" #tool "nuget:https://dotnet.myget.org/F/nuget-build/?package=NuGet.CommandLine&version=4.3.0-beta1-2361&prerelease" - +#tool "nuget:?package=JetBrains.dotMemoryUnit&version=2.1.20150828.125449" /////////////////////////////////////////////////////////////////////////////// // TOOLS /////////////////////////////////////////////////////////////////////////////// From dc8a32d1b14628df9ba5a77007594fa829d33a44 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 23:26:07 +0300 Subject: [PATCH 64/95] Run Avalonia.Base.UnitTests using `dotnet test` --- .travis.yml | 2 + Avalonia.sln | 11 +--- build.cake | 34 +++++++++--- .../Avalonia.Base.UnitTests.csproj | 55 ++----------------- .../Avalonia.Benchmarks.csproj | 2 +- .../Avalonia.Controls.UnitTests.csproj | 2 +- .../Avalonia.Input.UnitTests.csproj | 2 +- .../Avalonia.Layout.UnitTests.csproj | 2 +- .../Avalonia.LeakTests.csproj | 2 +- .../Avalonia.Markup.UnitTests.csproj | 2 +- .../Avalonia.Markup.Xaml.UnitTests.csproj | 2 +- .../Avalonia.Styling.UnitTests.csproj | 2 +- .../Avalonia.UnitTests.csproj | 39 +++++++------ .../InvariantCultureFixture.cs | 7 +-- .../Avalonia.Visuals.UnitTests.csproj | 2 +- tests/coretests.props | 25 +++++++++ 16 files changed, 95 insertions(+), 96 deletions(-) create mode 100644 tests/coretests.props diff --git a/.travis.yml b/.travis.yml index af7d5dbebf..5740a5ecfd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,10 @@ language: csharp os: - linux - osx +dist: trusty mono: - latest +dotnet: 1.0.1 script: - ./build.sh --target "Travis" --platform "Mono" --configuration "Release" notifications: diff --git a/Avalonia.sln b/Avalonia.sln index 8e06247b1a..d563d4548b 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -31,6 +31,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Animation", "src\Avalonia.Animation\Avalonia.Animation.csproj", "{D211E587-D8BC-45B9-95A4-F297C8FA5200}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}" + ProjectSection(SolutionItems) = preProject + tests\coretests.props = tests\coretests.props + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Styling.UnitTests", "tests\Avalonia.Styling.UnitTests\Avalonia.Styling.UnitTests.csproj", "{47ECDF59-DEF8-4C53-87B1-2098A3429059}" EndProject @@ -163,9 +166,6 @@ Global src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 src\Shared\RenderHelpers\RenderHelpers.projitems*{3e908f67-5543-4879-a1dc-08eace79b3cd}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{40759a76-d0f2-464e-8000-6ff0f5c4bd7c}*SharedItemsImports = 4 - src\Shared\PlatformSupport\PlatformSupport.projitems*{4488ad85-1495-4809-9aa4-ddfe0a48527e}*SharedItemsImports = 4 - src\Shared\RenderHelpers\RenderHelpers.projitems*{47be08a7-5985-410b-9ffc-2264b8ea595f}*SharedItemsImports = 4 - src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{47be08a7-5985-410b-9ffc-2264b8ea595f}*SharedItemsImports = 4 tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13 src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4 @@ -176,11 +176,6 @@ Global src\Shared\RenderHelpers\RenderHelpers.projitems*{925dd807-b651-475f-9f7c-cbeb974ce43d}*SharedItemsImports = 4 src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{925dd807-b651-475f-9f7c-cbeb974ce43d}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 - src\Shared\RenderHelpers\RenderHelpers.projitems*{bd43f7c0-396b-4aa1-bad9-dfde54d51298}*SharedItemsImports = 4 - src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{bd43f7c0-396b-4aa1-bad9-dfde54d51298}*SharedItemsImports = 4 - tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{d35a9f3d-8bb0-496e-bf72-444038a7debb}*SharedItemsImports = 4 - tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{dabfd304-d6a4-4752-8123-c2ccf7ac7831}*SharedItemsImports = 4 - tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{e106cf37-4066-4615-b684-172a6d30b058}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{e4d9629c-f168-4224-3f51-a5e482ffbc42}*SharedItemsImports = 13 src\Shared\RenderHelpers\RenderHelpers.projitems*{fb05ac90-89ba-4f2f-a924-f37875fb547c}*SharedItemsImports = 4 EndGlobalSection diff --git a/build.cake b/build.cake index 5e004afc1a..2bb4671e62 100644 --- a/build.cake +++ b/build.cake @@ -127,6 +127,8 @@ Task("Restore-NuGet-Packages") void DotNetCoreBuild() { + DotNetCoreRestore("samples\\ControlCatalog.NetCore"); + DotNetBuild("samples\\ControlCatalog.NetCore"); } Task("DotNetCoreBuild") @@ -155,8 +157,23 @@ Task("Build") } }); +void RunCoreTest(string dir) +{ + DotNetCoreRestore(dir); + var frameworks = new List{"netcoreapp1.1"}; + if(parameters.IsRunningOnWindows) + frameworks.Add("net461"); + foreach(var fw in frameworks) + { + Information("Running for " + fw); + DotNetCoreTest(System.IO.Path.Combine(dir, System.IO.Path.GetFileName(dir)+".csproj"), + new DotNetCoreTestSettings{Framework = fw}); + } +} + void RunDotNetCoreTest() { + RunCoreTest("./tests/Avalonia.Base.UnitTests"); } Task("Run-Net-Core-Unit-Tests") @@ -164,14 +181,13 @@ Task("Run-Net-Core-Unit-Tests") .Does(() => RunDotNetCoreTest()); Task("Run-Unit-Tests") + .IsDependentOn("Run-Net-Core-Unit-Tests") .IsDependentOn("Build") .WithCriteria(() => !parameters.SkipTests) .Does(() => { - if(parameters.IsRunningOnWindows) - { - RunDotNetCoreTest(); - } + if(!parameters.IsRunningOnWindows) + return; var unitTests = GetDirectories("./tests/Avalonia.*.UnitTests") .Select(dir => System.IO.Path.GetFileName(dir.FullPath)) @@ -342,9 +358,13 @@ Task("Publish-NuGet") Task("Package") .IsDependentOn("Create-NuGet-Packages"); -Task("Default") - .IsDependentOn("Package"); - +Task("Default").Does(() => +{ + if(parameters.IsRunningOnWindows) + RunTarget("Package"); + else + RunTarget("Run-Net-Core-Unit-Tests"); +}); Task("AppVeyor") .IsDependentOn("Zip-Files") .IsDependentOn("Publish-MyGet") diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index 5d17349179..31aed15ae8 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -1,17 +1,9 @@ - - + - Debug - AnyCPU + net461;netcoreapp1.1 {2905FF23-53FB-45E6-AA49-6AF47A172056} - Library - Properties - Avalonia.Base.UnitTests - Avalonia.Base.UnitTests - v4.6.1 - 512 - + true full @@ -20,6 +12,7 @@ DEBUG;TRACE prompt 4 + MinimumRecommendedRules.ruleset pdbonly @@ -28,6 +21,7 @@ TRACE prompt 4 + MinimumRecommendedRules.ruleset @@ -53,9 +47,6 @@ - - - {B09B78D8-9B26-48B0-9149-D64A2F120F3F} @@ -66,26 +57,6 @@ Avalonia.UnitTests - - - - - False - - - False - - - False - - - False - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index 8df2deabee..ed7af3b0ca 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -111,7 +111,7 @@ - + \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index e59916e31f..734d7a3d35 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -159,7 +159,7 @@ - + diff --git a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj index fc4deba5dc..31ceadb6ca 100644 --- a/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj +++ b/tests/Avalonia.Input.UnitTests/Avalonia.Input.UnitTests.csproj @@ -105,7 +105,7 @@ --> - + diff --git a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj index 07e6c2ecaf..01732a85d7 100644 --- a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj +++ b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj @@ -128,7 +128,7 @@ - + diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 251e9e9297..2c550bb97c 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -130,7 +130,7 @@ - + diff --git a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj index 534bd919e1..8778f6752d 100644 --- a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj +++ b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj @@ -113,7 +113,7 @@ --> - + diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index b6d4407192..31f5495a18 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -159,7 +159,7 @@ --> - + diff --git a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj index 7b85c3fe4d..c00036f6dc 100644 --- a/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj +++ b/tests/Avalonia.Styling.UnitTests/Avalonia.Styling.UnitTests.csproj @@ -141,7 +141,7 @@ --> - + diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj index 1c07e547ec..e84fa4c89c 100644 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj +++ b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj @@ -1,17 +1,8 @@ - - - + - Debug - AnyCPU - {88060192-33D5-4932-B0F9-8BD2763E857D} - Library - Properties - Avalonia.UnitTests - Avalonia.UnitTests - v4.6.1 - 512 - + net461;netcoreapp1.1 + False + false true @@ -53,9 +44,13 @@ - + {4a1abb09-9047-4bd5-a4ad-a055e52c5ee0} Avalonia.DotNetFrameworkRuntime + + + {fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Avalonia.DotNetCoreRuntime {3e53a01a-b331-47f3-b828-4a5717e77a24} @@ -104,9 +99,7 @@ - - - + + + + + + + + - + + + + \ No newline at end of file diff --git a/tests/Avalonia.UnitTests/InvariantCultureFixture.cs b/tests/Avalonia.UnitTests/InvariantCultureFixture.cs index f82afa5397..f27df8f599 100644 --- a/tests/Avalonia.UnitTests/InvariantCultureFixture.cs +++ b/tests/Avalonia.UnitTests/InvariantCultureFixture.cs @@ -20,14 +20,13 @@ namespace Avalonia.UnitTests public InvariantCultureFixture() { - _restore = Thread.CurrentThread.CurrentUICulture; - Thread.CurrentThread.CurrentUICulture = - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + _restore = CultureInfo.CurrentUICulture; + CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; } public void Dispose() { - Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture = _restore; + CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = _restore; } } } diff --git a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj index c731be7418..c9d8a02575 100644 --- a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj +++ b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj @@ -124,7 +124,7 @@ --> - + diff --git a/tests/coretests.props b/tests/coretests.props new file mode 100644 index 0000000000..4253d70cdd --- /dev/null +++ b/tests/coretests.props @@ -0,0 +1,25 @@ + + + + + False + false + true + + + + + + + + + + + + + + + + + + \ No newline at end of file From f3394b881f759cd61f84f855e5f5b1539df6ac15 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 23:55:19 +0300 Subject: [PATCH 65/95] Fixed linux build --- build.cake | 12 +++++------- packages.cake | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build.cake b/build.cake index 2bb4671e62..b5450017d0 100644 --- a/build.cake +++ b/build.cake @@ -157,7 +157,7 @@ Task("Build") } }); -void RunCoreTest(string dir) +void RunCoreTest(string dir, Parameters parameters) { DotNetCoreRestore(dir); var frameworks = new List{"netcoreapp1.1"}; @@ -171,14 +171,12 @@ void RunCoreTest(string dir) } } -void RunDotNetCoreTest() -{ - RunCoreTest("./tests/Avalonia.Base.UnitTests"); -} Task("Run-Net-Core-Unit-Tests") .IsDependentOn("Clean") - .Does(() => RunDotNetCoreTest()); + .Does(() => { + RunCoreTest("./tests/Avalonia.Base.UnitTests", parameters); + }); Task("Run-Unit-Tests") .IsDependentOn("Run-Net-Core-Unit-Tests") @@ -371,7 +369,7 @@ Task("AppVeyor") .IsDependentOn("Publish-NuGet"); Task("Travis") - .IsDependentOn("Run-Unit-Tests"); + .IsDependentOn("Run-Net-Core-Unit-Tests"); /////////////////////////////////////////////////////////////////////////////// // EXECUTE diff --git a/packages.cake b/packages.cake index 7f9c5bdb65..ac65c26727 100644 --- a/packages.cake +++ b/packages.cake @@ -91,7 +91,7 @@ public class Packages context.Information("Package: SharpDX.DXGI, version: {0}", SharpDXDXGIVersion); var nugetPackagesDir = System.Environment.GetEnvironmentVariable("NUGET_HOME") - ?? System.IO.Path.Combine(System.Environment.GetEnvironmentVariable("USERPROFILE"), ".nuget"); + ?? System.IO.Path.Combine(System.Environment.GetEnvironmentVariable("USERPROFILE") ?? System.Environment.GetEnvironmentVariable("HOME"), ".nuget"); NugetPackagesDir = System.IO.Path.Combine(nugetPackagesDir, "packages"); From 635561af56fead8ac12dcc844a5e3c04611f65ca Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 8 Mar 2017 23:56:07 +0300 Subject: [PATCH 66/95] Install dotnet 1.0.1 on appveyor --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 0701d5f65c..418b48a439 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,8 +11,10 @@ environment: secure: OtVfyN3ErqQrDTnWH2HDfJDlCiu/i4/X4wFmK3ZXXP7HmCiXYPSbTjMPwwdOxRaK MYGET_API_URL: https://www.myget.org/F/avalonia-ci/api/v2/package install: + - if not exist dotnet-1.0.1.exe appveyor DownloadFile https://go.microsoft.com/fwlink/?linkid=843448 -FileName "dotnet-1.0.1.exe" - if not exist gtk-sharp-2.12.26.msi appveyor DownloadFile http://download.xamarin.com/GTKforWindows/Windows/gtk-sharp-2.12.26.msi - msiexec /i gtk-sharp-2.12.26.msi /qn /norestart + - cmd: call c:\dotnet.exe /quiet - cmd: set PATH=%programfiles(x86)%\GtkSharp\2.12\bin\;%PATH% before_build: - git submodule update --init @@ -30,3 +32,4 @@ artifacts: - path: artifacts\zip\*.zip cache: - gtk-sharp-2.12.26.msi + - dotnet-1.0.1.exe From e26141a64d9568cd05cdb28772a4d97c2e8ca8dd Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 9 Mar 2017 00:01:02 +0300 Subject: [PATCH 67/95] typo --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 418b48a439..4bf04efa12 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ install: - if not exist dotnet-1.0.1.exe appveyor DownloadFile https://go.microsoft.com/fwlink/?linkid=843448 -FileName "dotnet-1.0.1.exe" - if not exist gtk-sharp-2.12.26.msi appveyor DownloadFile http://download.xamarin.com/GTKforWindows/Windows/gtk-sharp-2.12.26.msi - msiexec /i gtk-sharp-2.12.26.msi /qn /norestart - - cmd: call c:\dotnet.exe /quiet + - cmd: call dotnet.exe /quiet - cmd: set PATH=%programfiles(x86)%\GtkSharp\2.12\bin\;%PATH% before_build: - git submodule update --init From 357bacc3ab2ccb0011eff504e7e8229904a25b77 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 9 Mar 2017 00:30:43 +0300 Subject: [PATCH 68/95] Update appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 4bf04efa12..76f991d38e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ install: - if not exist dotnet-1.0.1.exe appveyor DownloadFile https://go.microsoft.com/fwlink/?linkid=843448 -FileName "dotnet-1.0.1.exe" - if not exist gtk-sharp-2.12.26.msi appveyor DownloadFile http://download.xamarin.com/GTKforWindows/Windows/gtk-sharp-2.12.26.msi - msiexec /i gtk-sharp-2.12.26.msi /qn /norestart - - cmd: call dotnet.exe /quiet + - cmd: call dotnet-1.0.1.exe /quiet - cmd: set PATH=%programfiles(x86)%\GtkSharp\2.12\bin\;%PATH% before_build: - git submodule update --init From bcbfbbb906943a8f3c05f7d4342e2093f866d115 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 9 Mar 2017 00:17:16 +0300 Subject: [PATCH 69/95] skip net core tests on windows --- build.cake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index b5450017d0..32da451a49 100644 --- a/build.cake +++ b/build.cake @@ -160,9 +160,11 @@ Task("Build") void RunCoreTest(string dir, Parameters parameters) { DotNetCoreRestore(dir); - var frameworks = new List{"netcoreapp1.1"}; + var frameworks = new List();; if(parameters.IsRunningOnWindows) frameworks.Add("net461"); + else + frameworks.Add("netcoreapp1.1"); foreach(var fw in frameworks) { Information("Running for " + fw); From 42c68debf97fbd3b7c019e7382695642f291d845 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 9 Mar 2017 01:19:18 +0300 Subject: [PATCH 70/95] Disable default items --- src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj | 6 +----- .../Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj | 7 +------ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj index b51bc65607..7c10c0f65e 100644 --- a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj +++ b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj @@ -2,6 +2,7 @@ netstandard1.1 False + False false @@ -161,9 +162,4 @@ - - - - - diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 3f7343a1ec..478dd67a3c 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -2,6 +2,7 @@ netstandard1.1 False + false false @@ -326,10 +327,4 @@ - - - - - - From 886a65beaa0580ab915d84b5fde49b368450b9b8 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 9 Mar 2017 01:54:48 +0300 Subject: [PATCH 71/95] Use dotnet test for layout and controls tests --- build.cake | 7 +- .../Avalonia.Base.UnitTests.csproj | 27 +-- .../Avalonia.Benchmarks.csproj | 2 - .../Avalonia.Controls.UnitTests.csproj | 62 +---- .../TopLevelTests.cs | 2 - .../WindowBaseTests.cs | 2 - .../Avalonia.Layout.UnitTests.csproj | 213 ++++++------------ .../FullLayoutTests.cs | 50 +++- .../Avalonia.LeakTests.csproj | 2 - tests/coretests.props | 26 ++- 10 files changed, 147 insertions(+), 246 deletions(-) diff --git a/build.cake b/build.cake index 32da451a49..49fccd454b 100644 --- a/build.cake +++ b/build.cake @@ -159,12 +159,11 @@ Task("Build") void RunCoreTest(string dir, Parameters parameters) { + Information("Running tests from " + dir); DotNetCoreRestore(dir); - var frameworks = new List();; + var frameworks = new List(){"netcoreapp1.1"}; if(parameters.IsRunningOnWindows) frameworks.Add("net461"); - else - frameworks.Add("netcoreapp1.1"); foreach(var fw in frameworks) { Information("Running for " + fw); @@ -178,6 +177,8 @@ Task("Run-Net-Core-Unit-Tests") .IsDependentOn("Clean") .Does(() => { RunCoreTest("./tests/Avalonia.Base.UnitTests", parameters); + RunCoreTest("./tests/Avalonia.Controls.UnitTests", parameters); + RunCoreTest("./tests/Avalonia.Layout.UnitTests", parameters); }); Task("Run-Unit-Tests") diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index 31aed15ae8..b4d35dd439 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -4,25 +4,6 @@ {2905FF23-53FB-45E6-AA49-6AF47A172056} - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - MinimumRecommendedRules.ruleset - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - MinimumRecommendedRules.ruleset - @@ -57,11 +38,5 @@ Avalonia.UnitTests - + \ No newline at end of file diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index ed7af3b0ca..98188e91ad 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -108,8 +108,6 @@ --> - - diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index 734d7a3d35..641f5ca499 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -1,35 +1,9 @@ - - - - Debug - AnyCPU - {5CCB5571-7C30-4E7D-967D-0E2158EBD91F} - Library - v4.6.1 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - + + + net461;netcoreapp1.1 + {5CCB5571-7C30-4E7D-967D-0E2158EBD91F} + + @@ -92,10 +66,6 @@ - - {4a1abb09-9047-4bd5-a4ad-a055e52c5ee0} - Avalonia.DotNetFrameworkRuntime - {3e53a01a-b331-47f3-b828-4a5717e77a24} Avalonia.Markup.Xaml @@ -142,23 +112,6 @@ - - - - - - - - - - - @@ -172,5 +125,8 @@ + + + \ No newline at end of file diff --git a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs index e19729706d..8ca4ca0fbc 100644 --- a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs @@ -14,8 +14,6 @@ using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Styling; using Avalonia.UnitTests; -using Ploeh.AutoFixture; -using Ploeh.AutoFixture.AutoMoq; using Xunit; namespace Avalonia.Controls.UnitTests diff --git a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs index d4b850d66e..43dbcdc610 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs @@ -14,8 +14,6 @@ using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Styling; using Avalonia.UnitTests; -using Ploeh.AutoFixture; -using Ploeh.AutoFixture.AutoMoq; using Xunit; namespace Avalonia.Controls.UnitTests diff --git a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj index 01732a85d7..ff4de46b1b 100644 --- a/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj +++ b/tests/Avalonia.Layout.UnitTests/Avalonia.Layout.UnitTests.csproj @@ -1,143 +1,72 @@ - - - - Debug - AnyCPU - {DB070A10-BF39-4752-8456-86E9D5928478} - Library - Properties - Avalonia.Layout.UnitTests - Avalonia.Layout.UnitTests - v4.6.1 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - {D211E587-D8BC-45B9-95A4-F297C8FA5200} - Avalonia.Animation - - - {B09B78D8-9B26-48B0-9149-D64A2F120F3F} - Avalonia.Base - - - {D2221C82-4A25-4583-9B43-D791E3F6820C} - Avalonia.Controls - - - {7062AE20-5DCC-4442-9645-8195BDECE63E} - Avalonia.Diagnostics - - - {4a1abb09-9047-4bd5-a4ad-a055e52c5ee0} - Avalonia.DotNetFrameworkRuntime - - - {62024B2D-53EB-4638-B26B-85EEAA54866E} - Avalonia.Input - - - {6B0ED19D-A08B-461C-A9D9-A9EE40B0C06B} - Avalonia.Interactivity - - - {42472427-4774-4C81-8AFF-9F27B8E31721} - Avalonia.Layout - - - {6417b24e-49c2-4985-8db2-3ab9d898ec91} - Avalonia.ReactiveUI - - - {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.Visuals - - - {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} - Avalonia.Styling - - - {3E10A5FA-E8DA-48B1-AD44-6A5B6CB7750F} - Avalonia.Themes.Default - - - {5ccb5571-7c30-4e7d-967d-0e2158ebd91f} - Avalonia.Controls.UnitTests - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - - - - - - - - - - - - - + + + net461;netcoreapp1.1 + {DB070A10-BF39-4752-8456-86E9D5928478} + + + + + + + + + + + + + {D211E587-D8BC-45B9-95A4-F297C8FA5200} + Avalonia.Animation + + + {B09B78D8-9B26-48B0-9149-D64A2F120F3F} + Avalonia.Base + + + {D2221C82-4A25-4583-9B43-D791E3F6820C} + Avalonia.Controls + + + {7062AE20-5DCC-4442-9645-8195BDECE63E} + Avalonia.Diagnostics + + + {62024B2D-53EB-4638-B26B-85EEAA54866E} + Avalonia.Input + + + {6B0ED19D-A08B-461C-A9D9-A9EE40B0C06B} + Avalonia.Interactivity + + + {42472427-4774-4C81-8AFF-9F27B8E31721} + Avalonia.Layout + + + {6417b24e-49c2-4985-8db2-3ab9d898ec91} + Avalonia.ReactiveUI + + + {EB582467-6ABB-43A1-B052-E981BA910E3A} + Avalonia.Visuals + + + {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} + Avalonia.Styling + + + {3E10A5FA-E8DA-48B1-AD44-6A5B6CB7750F} + Avalonia.Themes.Default + + + {88060192-33d5-4932-b0f9-8bd2763e857d} + Avalonia.UnitTests + + + {5CCB5571-7C30-4E7D-967D-0E2158EBD91F} + Avalonia.UnitTests + + + + + \ No newline at end of file diff --git a/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs b/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs index 9922b624e5..74a1fbc735 100644 --- a/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs +++ b/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs @@ -9,8 +9,6 @@ using Avalonia.Controls; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; -using Avalonia.Controls.UnitTests; -using Avalonia.Controls.UnitTests.Primitives; using Avalonia.Diagnostics; using Avalonia.Input; using Avalonia.Platform; @@ -19,9 +17,10 @@ using Avalonia.Shared.PlatformSupport; using Avalonia.Styling; using Avalonia.Themes.Default; using Avalonia.VisualTree; -using Ploeh.AutoFixture; -using Ploeh.AutoFixture.AutoMoq; using Xunit; +using Avalonia.Media; +using System; +using System.Collections.Generic; namespace Avalonia.Layout.UnitTests { @@ -130,13 +129,44 @@ namespace Avalonia.Layout.UnitTests return v.Bounds.Position; } - private void RegisterServices() + class FormattedTextMock : IFormattedTextImpl { - var fixture = new Fixture().Customize(new AutoMoqCustomization()); + public FormattedTextMock(string text) + { + Text = text; + } + + public Size Constraint { get; set; } + + public string Text { get; } + + public void Dispose() + { + } + + public IEnumerable GetLines() => new FormattedTextLine[0]; + + public TextHitTestResult HitTestPoint(Point point) => new TextHitTestResult(); - var formattedText = fixture.Create(); + public Rect HitTestTextPosition(int index) => new Rect(); + + public IEnumerable HitTestTextRange(int index, int length) => new Rect[0]; + + public Size Measure() => Constraint; + + public void SetForegroundBrush(IBrush brush, int startIndex, int length) + { + } + } + + private void RegisterServices() + { var globalStyles = new Mock(); - var renderInterface = fixture.Create(); + var renderInterface = new Mock(); + renderInterface.Setup(x => x.CreateFormattedText(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(new FormattedTextMock("TEST")); + var windowImpl = new Mock(); Size clientSize = default(Size); @@ -152,9 +182,9 @@ namespace Avalonia.Layout.UnitTests .Bind().ToConstant(globalStyles.Object) .Bind().ToConstant(new LayoutManager()) .Bind().ToConstant(new AppBuilder().RuntimePlatform) - .Bind().ToConstant(renderInterface) + .Bind().ToConstant(renderInterface.Object) .Bind().ToConstant(new Styler()) - .Bind().ToConstant(new WindowingPlatformMock(() => windowImpl.Object)); + .Bind().ToConstant(new Avalonia.Controls.UnitTests.WindowingPlatformMock(() => windowImpl.Object)); var theme = new DefaultTheme(); globalStyles.Setup(x => x.Styles).Returns(theme); diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 2c550bb97c..dfc759efd9 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -127,8 +127,6 @@ --> - - diff --git a/tests/coretests.props b/tests/coretests.props index 4253d70cdd..57b235dd60 100644 --- a/tests/coretests.props +++ b/tests/coretests.props @@ -1,10 +1,28 @@ - - False - false - true + False + false + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + MinimumRecommendedRules.ruleset + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + MinimumRecommendedRules.ruleset From f129262238fa4d6d9b5e954c258e43bc814284c1 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 9 Mar 2017 02:58:53 +0300 Subject: [PATCH 72/95] Skip netcoreapp1.1 for layout and controls for now --- build.cake | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build.cake b/build.cake index 49fccd454b..d803e89c9a 100644 --- a/build.cake +++ b/build.cake @@ -157,7 +157,7 @@ Task("Build") } }); -void RunCoreTest(string dir, Parameters parameters) +void RunCoreTest(string dir, Parameters parameters, bool net461Only) { Information("Running tests from " + dir); DotNetCoreRestore(dir); @@ -166,6 +166,8 @@ void RunCoreTest(string dir, Parameters parameters) frameworks.Add("net461"); foreach(var fw in frameworks) { + if(fw != "net461" && net461Only) + continue; Information("Running for " + fw); DotNetCoreTest(System.IO.Path.Combine(dir, System.IO.Path.GetFileName(dir)+".csproj"), new DotNetCoreTestSettings{Framework = fw}); @@ -176,9 +178,9 @@ void RunCoreTest(string dir, Parameters parameters) Task("Run-Net-Core-Unit-Tests") .IsDependentOn("Clean") .Does(() => { - RunCoreTest("./tests/Avalonia.Base.UnitTests", parameters); - RunCoreTest("./tests/Avalonia.Controls.UnitTests", parameters); - RunCoreTest("./tests/Avalonia.Layout.UnitTests", parameters); + RunCoreTest("./tests/Avalonia.Base.UnitTests", parameters, false); + RunCoreTest("./tests/Avalonia.Controls.UnitTests", parameters, true); + RunCoreTest("./tests/Avalonia.Layout.UnitTests", parameters, true); }); Task("Run-Unit-Tests") From 65f9fe67f7ce6d0f075ef3ef60d0389c623636ed Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 10 Mar 2017 00:24:44 +0100 Subject: [PATCH 73/95] Added a set of immutable brushes. Make `SolidColorBrush` immutable, but make the static `Brushes` properties return immutable brushes. The immutable brushes will be needed by the deferred renderer. --- .../Accents/BaseLight.xaml | 1 - src/Avalonia.Visuals/Avalonia.Visuals.csproj | 9 +- src/Avalonia.Visuals/Media/Brush.cs | 3 +- src/Avalonia.Visuals/Media/Brushes.cs | 566 +++++++++--------- src/Avalonia.Visuals/Media/IMutableBrush.cs | 16 + .../Media/Immutable/ImmutableGradientBrush.cs | 47 ++ .../Media/Immutable/ImmutableImageBrush.cs | 58 ++ .../Immutable/ImmutableLinearGradientBrush.cs | 51 ++ .../Immutable/ImmutableRadialGradientBrush.cs | 59 ++ .../Immutable/ImmutableSolidColorBrush.cs | 59 ++ .../Media/Immutable/ImmutableTileBrush.cs | 77 +++ .../Media/Immutable/ImmutableVisualBrush.cs | 58 ++ .../Media/Mutable/SolidColorBrush.cs | 35 -- src/Avalonia.Visuals/Media/SolidColorBrush.cs | 36 +- .../Properties/AssemblyInfo.cs | 3 +- .../Avalonia.Cairo/Media/DrawingContext.cs | 2 +- .../Media/SolidColorBrushImpl.cs | 2 +- .../Xaml/Style2.xaml | 9 +- .../Xaml/StyleTests.cs | 20 +- 19 files changed, 762 insertions(+), 349 deletions(-) create mode 100644 src/Avalonia.Visuals/Media/IMutableBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableImageBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableRadialGradientBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableSolidColorBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableTileBrush.cs create mode 100644 src/Avalonia.Visuals/Media/Immutable/ImmutableVisualBrush.cs delete mode 100644 src/Avalonia.Visuals/Media/Mutable/SolidColorBrush.cs diff --git a/src/Avalonia.Themes.Default/Accents/BaseLight.xaml b/src/Avalonia.Themes.Default/Accents/BaseLight.xaml index 38786f54d3..cb86598a42 100644 --- a/src/Avalonia.Themes.Default/Accents/BaseLight.xaml +++ b/src/Avalonia.Themes.Default/Accents/BaseLight.xaml @@ -1,6 +1,5 @@ \ No newline at end of file diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs index 308a65dcd4..dc15074445 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs @@ -124,13 +124,12 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml { var xaml = @" @@ -139,12 +138,12 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml var loader = new AvaloniaXamlLoader(); var window = (Window)loader.Load(xaml); - var brush = (Avalonia.Media.Mutable.SolidColorBrush)window.FindStyleResource("brush"); + var brush = (ISolidColorBrush)window.FindStyleResource("brush"); var button = window.FindControl