Browse Source

Platform toplevel cleanup

pull/899/head
Nikita Tsukanov 9 years ago
parent
commit
03ae54cb25
  1. 23
      src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs
  2. 41
      src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
  3. 2
      src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj
  4. 37
      src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs
  5. 4
      src/Gtk/Avalonia.Gtk/FramebufferManager.cs
  6. 4
      src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs
  7. 82
      src/Gtk/Avalonia.Gtk/TopLevelImpl.cs
  8. 23
      src/Gtk/Avalonia.Gtk/WindowImpl.cs
  9. 66
      src/iOS/Avalonia.iOS/TopLevelImpl.cs

23
src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs

@ -10,6 +10,7 @@ using Android.OS;
using Android.Runtime; using Android.Runtime;
using Android.Views; using Android.Views;
using Android.Widget; using Android.Widget;
using Avalonia.Controls;
using Avalonia.Platform; using Avalonia.Platform;
namespace Avalonia.Android.Platform.SkiaPlatform namespace Avalonia.Android.Platform.SkiaPlatform
@ -19,6 +20,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform
private Point _position; private Point _position;
private bool _isAdded; private bool _isAdded;
Action IWindowBaseImpl.Activated { get; set; } Action IWindowBaseImpl.Activated { get; set; }
public Action<Point> PositionChanged { get; set; }
public Action Deactivated { get; set; }
public PopupImpl() : base(ActivityTracker.Current, true) public PopupImpl() : base(ActivityTracker.Current, true)
{ {
} }
@ -33,7 +37,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform
UpdateParams(); UpdateParams();
} }
public override Point Position public Point Position
{ {
get { return _position; } get { return _position; }
set set
@ -85,5 +89,22 @@ namespace Avalonia.Android.Platform.SkiaPlatform
Hide(); Hide();
base.Dispose(); base.Dispose();
} }
public void Activate()
{
}
public void BeginMoveDrag()
{
//Not supported
}
public void BeginResizeDrag(WindowEdge edge)
{
//Not supported
}
} }
} }

41
src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs

@ -67,8 +67,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform
public Action Closed { get; set; } public Action Closed { get; set; }
public Action Deactivated { get; set; }
public Action<RawInputEventArgs> Input { get; set; } public Action<RawInputEventArgs> Input { get; set; }
public Size MaxClientSize { get; protected set; } public Size MaxClientSize { get; protected set; }
@ -79,27 +77,17 @@ namespace Avalonia.Android.Platform.SkiaPlatform
public Action<double> ScalingChanged { get; set; } public Action<double> ScalingChanged { get; set; }
public Action<Point> PositionChanged { get; set; }
public View View => _view; public View View => _view;
public IPlatformHandle Handle => _view; public IPlatformHandle Handle => _view;
public IEnumerable<object> Surfaces => new object[] {this}; public IEnumerable<object> Surfaces => new object[] {this};
public void Activate()
{
}
public virtual void Hide() public virtual void Hide()
{ {
_view.Visibility = ViewStates.Invisible; _view.Visibility = ViewStates.Invisible;
} }
public void SetSystemDecorations(bool enabled)
{
}
public void Invalidate(Rect rect) public void Invalidate(Rect rect)
{ {
if (_view.Holder?.Surface?.IsValid == true) _view.Invalidate(); if (_view.Holder?.Surface?.IsValid == true) _view.Invalidate();
@ -124,40 +112,19 @@ namespace Avalonia.Android.Platform.SkiaPlatform
{ {
InputRoot = inputRoot; InputRoot = inputRoot;
} }
public void SetTitle(string title)
{
}
public virtual void Show() public virtual void Show()
{ {
_view.Visibility = ViewStates.Visible; _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; public double Scaling => 1;
void Draw() void Draw()
{ {
Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); Paint?.Invoke(new Rect(new Point(0, 0), ClientSize));
} }
public void SetIcon(IWindowIconImpl icon)
{
// No window icons for mobile platforms
}
public virtual void Dispose() public virtual void Dispose()
{ {
_view.Dispose(); _view.Dispose();

2
src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj

@ -61,7 +61,7 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="GtkPlatform.cs" /> <Compile Include="GtkPlatform.cs" />
<Compile Include="WindowImpl.cs" /> <Compile Include="WindowImpl.cs" />
<Compile Include="WindowImplBase.cs" /> <Compile Include="TopLevelImpl.cs" />
<Compile Include="Input\GtkKeyboardDevice.cs" /> <Compile Include="Input\GtkKeyboardDevice.cs" />
<Compile Include="Input\GtkMouseDevice.cs" /> <Compile Include="Input\GtkMouseDevice.cs" />
<Compile Include="Windows.cs" /> <Compile Include="Windows.cs" />

37
src/Gtk/Avalonia.Gtk/EmbeddableImpl.cs

@ -12,7 +12,7 @@ using WindowEdge = Avalonia.Controls.WindowEdge;
namespace Avalonia.Gtk namespace Avalonia.Gtk
{ {
class EmbeddableImpl : WindowImplBase, IEmbeddableWindowImpl class EmbeddableImpl : TopLevelImpl, IEmbeddableWindowImpl
{ {
#pragma warning disable CS0067 // Method not used #pragma warning disable CS0067 // Method not used
public event Action LostFocus; public event Action LostFocus;
@ -37,39 +37,6 @@ namespace Avalonia.Gtk
{ {
get { return new Size(Widget.Allocation.Width, Widget.Allocation.Height); } 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 {}
}
} }
} }

4
src/Gtk/Avalonia.Gtk/FramebufferManager.cs

@ -5,10 +5,10 @@ namespace Avalonia.Gtk
{ {
class FramebufferManager : IFramebufferPlatformSurface, IDisposable class FramebufferManager : IFramebufferPlatformSurface, IDisposable
{ {
private readonly WindowImplBase _window; private readonly TopLevelImpl _window;
private SurfaceFramebuffer _fb; private SurfaceFramebuffer _fb;
public FramebufferManager(WindowImplBase window) public FramebufferManager(TopLevelImpl window)
{ {
_window = window; _window = window;
} }

4
src/Gtk/Avalonia.Gtk/SystemDialogImpl.cs

@ -15,7 +15,7 @@ namespace Avalonia.Gtk
public Task<string[]> ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) public Task<string[]> ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent)
{ {
var tcs = new TaskCompletionSource<string[]>(); var tcs = new TaskCompletionSource<string[]>();
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 dialog is OpenFileDialog
? FileChooserAction.Open ? FileChooserAction.Open
: FileChooserAction.Save, : FileChooserAction.Save,
@ -57,7 +57,7 @@ namespace Avalonia.Gtk
public Task<string> ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) public Task<string> ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent)
{ {
var tcs = new TaskCompletionSource<string>(); var tcs = new TaskCompletionSource<string>();
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, FileChooserAction.SelectFolder,
"Cancel", ResponseType.Cancel, "Cancel", ResponseType.Cancel,
"Select Folder", ResponseType.Accept) "Select Folder", ResponseType.Accept)

82
src/Gtk/Avalonia.Gtk/WindowImplBase.cs → src/Gtk/Avalonia.Gtk/TopLevelImpl.cs

@ -15,10 +15,10 @@ namespace Avalonia.Gtk
{ {
using Gtk = global::Gtk; using Gtk = global::Gtk;
public abstract class WindowImplBase : IWindowImpl public abstract class TopLevelImpl : ITopLevelImpl
{ {
private IInputRoot _inputRoot; private IInputRoot _inputRoot;
protected Gtk.Widget _window; private Gtk.Widget _widget;
private FramebufferManager _framebuffer; private FramebufferManager _framebuffer;
private Gtk.IMContext _imContext; private Gtk.IMContext _imContext;
@ -27,44 +27,43 @@ namespace Avalonia.Gtk
private static readonly Gdk.Cursor DefaultCursor = new Gdk.Cursor(CursorType.LeftPtr); 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); _framebuffer = new FramebufferManager(this);
Init(); Init();
} }
void Init() void Init()
{ {
Handle = _window as IPlatformHandle; Handle = _widget as IPlatformHandle;
_window.Events = EventMask.AllEventsMask; _widget.Events = EventMask.AllEventsMask;
_imContext = new Gtk.IMMulticontext(); _imContext = new Gtk.IMMulticontext();
_imContext.Commit += ImContext_Commit; _imContext.Commit += ImContext_Commit;
_window.Realized += OnRealized; _widget.Realized += OnRealized;
_window.Realize(); _widget.Realize();
_window.ButtonPressEvent += OnButtonPressEvent; _widget.ButtonPressEvent += OnButtonPressEvent;
_window.ButtonReleaseEvent += OnButtonReleaseEvent; _widget.ButtonReleaseEvent += OnButtonReleaseEvent;
_window.ScrollEvent += OnScrollEvent; _widget.ScrollEvent += OnScrollEvent;
_window.Destroyed += OnDestroyed; _widget.Destroyed += OnDestroyed;
_window.KeyPressEvent += OnKeyPressEvent; _widget.KeyPressEvent += OnKeyPressEvent;
_window.KeyReleaseEvent += OnKeyReleaseEvent; _widget.KeyReleaseEvent += OnKeyReleaseEvent;
_window.ExposeEvent += OnExposeEvent; _widget.ExposeEvent += OnExposeEvent;
_window.MotionNotifyEvent += OnMotionNotifyEvent; _widget.MotionNotifyEvent += OnMotionNotifyEvent;
} }
public IPlatformHandle Handle { get; private set; } public IPlatformHandle Handle { get; private set; }
public Gtk.Widget Widget => _window; public Gtk.Widget Widget => _widget;
public Gdk.Drawable CurrentDrawable { get; private set; } public Gdk.Drawable CurrentDrawable { get; private set; }
void OnRealized (object sender, EventArgs eventArgs) void OnRealized (object sender, EventArgs eventArgs)
{ {
_imContext.ClientWindow = _window.GdkWindow; _imContext.ClientWindow = _widget.GdkWindow;
} }
public abstract Size ClientSize { get; } public abstract Size ClientSize { get; }
public abstract void Resize(Size value);
public Size MaxClientSize public Size MaxClientSize
{ {
@ -72,7 +71,7 @@ namespace Avalonia.Gtk
{ {
// TODO: This should take into account things such as taskbar and window border // TODO: This should take into account things such as taskbar and window border
// thickness etc. // 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 get
{ {
switch (_window.GdkWindow.State) switch (_widget.GdkWindow.State)
{ {
case Gdk.WindowState.Iconified: case Gdk.WindowState.Iconified:
return Controls.WindowState.Minimized; return Controls.WindowState.Minimized;
@ -96,14 +95,14 @@ namespace Avalonia.Gtk
switch (value) switch (value)
{ {
case Controls.WindowState.Minimized: case Controls.WindowState.Minimized:
_window.GdkWindow.Iconify(); _widget.GdkWindow.Iconify();
break; break;
case Controls.WindowState.Maximized: case Controls.WindowState.Maximized:
_window.GdkWindow.Maximize(); _widget.GdkWindow.Maximize();
break; break;
case Controls.WindowState.Normal: case Controls.WindowState.Normal:
_window.GdkWindow.Deiconify(); _widget.GdkWindow.Deiconify();
_window.GdkWindow.Unmaximize(); _widget.GdkWindow.Unmaximize();
break; break;
} }
} }
@ -141,15 +140,15 @@ namespace Avalonia.Gtk
public void Invalidate(Rect rect) public void Invalidate(Rect rect)
{ {
if (_window?.GdkWindow != null) if (_widget?.GdkWindow != null)
_window.GdkWindow.InvalidateRect( _widget.GdkWindow.InvalidateRect(
new Rectangle((int) rect.X, (int) rect.Y, (int) rect.Width, (int) rect.Height), true); new Rectangle((int) rect.X, (int) rect.Y, (int) rect.Width, (int) rect.Height), true);
} }
public Point PointToClient(Point point) public Point PointToClient(Point point)
{ {
int x, y; 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); return new Point(point.X - x, point.Y - y);
} }
@ -157,7 +156,7 @@ namespace Avalonia.Gtk
public Point PointToScreen(Point point) public Point PointToScreen(Point point)
{ {
int x, y; 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); return new Point(point.X + x, point.Y + y);
} }
@ -166,28 +165,15 @@ namespace Avalonia.Gtk
_inputRoot = inputRoot; _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) 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 Show() => _widget.Show();
public void Hide() => _window.Hide();
public abstract void BeginMoveDrag();
public abstract void BeginResizeDrag(WindowEdge edge);
public abstract Point Position { get; set; }
void IWindowBaseImpl.Activate() public void Hide() => _widget.Hide();
{
_window.Activate();
}
private static InputModifiers GetModifierKeys(ModifierType state) private static InputModifiers GetModifierKeys(ModifierType state)
{ {
@ -317,9 +303,9 @@ namespace Avalonia.Gtk
public void Dispose() public void Dispose()
{ {
_framebuffer.Dispose(); _framebuffer.Dispose();
_window.Hide(); _widget.Hide();
_window.Dispose(); _widget.Dispose();
_window = null; _widget = null;
} }
} }
} }

23
src/Gtk/Avalonia.Gtk/WindowImpl.cs

@ -6,7 +6,7 @@ using Gdk;
namespace Avalonia.Gtk namespace Avalonia.Gtk
{ {
using Gtk = global::Gtk; using Gtk = global::Gtk;
public class WindowImpl : WindowImplBase public class WindowImpl : TopLevelImpl, IWindowImpl
{ {
private Gtk.Window _window; private Gtk.Window _window;
private Gtk.Window Window => _window ?? (_window = (Gtk.Window) Widget); 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); Window.Resize((int)value.Width, (int)value.Height);
} }
public override void SetTitle(string title) public void SetTitle(string title)
{ {
Window.Title = title; Window.Title = title;
} }
void IWindowBaseImpl.Activate()
{
_window.Activate();
}
void OnFocusActivated(object sender, EventArgs eventArgs) void OnFocusActivated(object sender, EventArgs eventArgs)
{ {
Activated(); Activated();
} }
public override void BeginMoveDrag() public void BeginMoveDrag()
{ {
int x, y; int x, y;
ModifierType mod; ModifierType mod;
@ -86,7 +91,7 @@ namespace Avalonia.Gtk
Window.BeginMoveDrag(1, x, y, 0); Window.BeginMoveDrag(1, x, y, 0);
} }
public override void BeginResizeDrag(Controls.WindowEdge edge) public void BeginResizeDrag(Controls.WindowEdge edge)
{ {
int x, y; int x, y;
ModifierType mod; ModifierType mod;
@ -94,7 +99,7 @@ namespace Avalonia.Gtk
Window.BeginResizeDrag((Gdk.WindowEdge)(int)edge, 1, x, y, 0); Window.BeginResizeDrag((Gdk.WindowEdge)(int)edge, 1, x, y, 0);
} }
public override Point Position public Point Position
{ {
get get
{ {
@ -108,7 +113,7 @@ namespace Avalonia.Gtk
} }
} }
public override IDisposable ShowDialog() public IDisposable ShowDialog()
{ {
Window.Modal = true; Window.Modal = true;
Window.Show(); Window.Show();
@ -116,9 +121,9 @@ namespace Avalonia.Gtk
return Disposable.Empty; 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; Window.Icon = ((IconImpl)icon).Pixbuf;
} }

66
src/iOS/Avalonia.iOS/TopLevelImpl.cs

@ -32,6 +32,7 @@ namespace Avalonia.iOS
{ {
_keyboardHelper = new KeyboardEventsHelper<TopLevelImpl>(this); _keyboardHelper = new KeyboardEventsHelper<TopLevelImpl>(this);
AutoresizingMask = UIViewAutoresizing.All; AutoresizingMask = UIViewAutoresizing.All;
_keyboardHelper.ActivateAutoShowKeybord();
} }
[Export("hasText")] [Export("hasText")]
@ -44,37 +45,21 @@ namespace Avalonia.iOS
public void DeleteBackward() => _keyboardHelper.DeleteBackward(); public void DeleteBackward() => _keyboardHelper.DeleteBackward();
public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder(); public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder();
public Action Activated { get; set; }
public Action Closed { get; set; } public Action Closed { get; set; }
public Action Deactivated { get; set; }
public Action<RawInputEventArgs> Input { get; set; } public Action<RawInputEventArgs> Input { get; set; }
public Action<Rect> Paint { get; set; } public Action<Rect> Paint { get; set; }
public Action<Size> Resized { get; set; } public Action<Size> Resized { get; set; }
public Action<double> ScalingChanged { get; set; } public Action<double> ScalingChanged { get; set; }
public Action<Point> PositionChanged { get; set; }
public IPlatformHandle Handle => null; public IPlatformHandle Handle => null;
public double Scaling => UIScreen.MainScreen.Scale; public double Scaling => UIScreen.MainScreen.Scale;
public WindowState WindowState
{
get { return WindowState.Normal; }
set { }
}
public override void LayoutSubviews() => Resized?.Invoke(ClientSize); public override void LayoutSubviews() => Resized?.Invoke(ClientSize);
public Size ClientSize public Size ClientSize => Bounds.Size.ToAvalonia();
{
get { return Bounds.Size.ToAvalonia(); }
set { InvokeOnMainThread(() => Resized?.Invoke(ClientSize)); }
}
public void Activate()
{
}
public override void Draw(CGRect rect) public override void Draw(CGRect rect)
{ {
@ -93,42 +78,9 @@ namespace Avalonia.iOS
{ {
//Not supported //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<object> Surfaces => new object[] { this }; public IEnumerable<object> Surfaces => new object[] { this };
public void Hide()
{
//Not supported
}
public override void TouchesEnded(NSSet touches, UIEvent evt) public override void TouchesEnded(NSSet touches, UIEvent evt)
{ {
var touch = touches.AnyObject as UITouch; var touch = touches.AnyObject as UITouch;
@ -182,11 +134,7 @@ namespace Avalonia.iOS
_touchLastPoint = location; _touchLastPoint = location;
} }
} }
public void SetIcon(IWindowIconImpl icon)
{
}
public ILockedFramebuffer Lock() => new EmulatedFramebuffer(this); public ILockedFramebuffer Lock() => new EmulatedFramebuffer(this);
} }
} }

Loading…
Cancel
Save