Browse Source

working popup positioning

pull/1977/head
Dan Walmsley 8 years ago
parent
commit
dc0f1b9db3
  1. 53
      src/Avalonia.Native.OSX/window.mm
  2. 39
      src/Avalonia.Native/WindowImplBase.cs
  3. 4
      src/headers/avalonia-native.h

53
src/Avalonia.Native.OSX/window.mm

@ -5,6 +5,7 @@ class WindowBaseImpl;
@interface AvnView : NSView
-(AvnView*) initWithParent: (WindowBaseImpl*) parent;
-(NSEvent*) lastMouseDownEvent;
-(AvnPoint)translateLocalPoint:(AvnPoint)pt;
@end
@interface AvnWindow : NSWindow <NSWindowDelegate>
@ -84,35 +85,56 @@ public:
}
virtual AvnPoint GetPosition ()
virtual HRESULT GetPosition (AvnPoint* ret)
{
if(ret == nullptr)
{
return E_POINTER;
}
auto frame = [Window frame];
AvnPoint bottomLeft;
bottomLeft.X = frame.origin.x;
bottomLeft.Y = frame.origin.y + frame.size.width;
NSRect screen = [NSScreen.screens objectAtIndex:0].frame;
auto t = MAX(screen.origin.y, screen.origin.y + screen.size.height);
bottomLeft.Y = frame.origin.y + frame.size.height;
bottomLeft.Y = t - bottomLeft.Y;
*ret = ConvertPointY(bottomLeft);
return bottomLeft;
return S_OK;
}
virtual void SetPosition (AvnPoint point)
{
NSPoint nspoint;
nspoint.x = point.X;
nspoint.y = point.Y;
[Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(point))];
}
virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret)
{
if(ret == nullptr)
{
return E_POINTER;
}
NSRect screen = [NSScreen.screens objectAtIndex:0].frame;
auto t = MAX(screen.origin.y, screen.origin.y + screen.size.height);
point = ConvertPointY(point);
auto viewPoint = [Window convertScreenToBase:ToNSPoint(point)];
nspoint.y = t - nspoint.y;
*ret = [View translateLocalPoint:ToAvnPoint(viewPoint)];
[Window setFrameTopLeftPoint:nspoint];
return S_OK;
}
virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret)
{
if(ret == nullptr)
{
return E_POINTER;
}
auto cocoaViewPoint = ToNSPoint([View translateLocalPoint:point]);
auto cocoaScreenPoint = [Window convertBaseToScreen:cocoaViewPoint];
*ret = ConvertPointY(ToAvnPoint(cocoaScreenPoint));
return S_OK;
}
protected:
@ -235,7 +257,6 @@ protected:
}
}
auto timestamp = [event timestamp] * 1000;
auto modifiers = [self getModifiers:[event modifierFlags]];

39
src/Avalonia.Native/WindowImplBase.cs

@ -170,6 +170,25 @@ namespace Avalonia.Native
set => _native.SetPosition(value.ToAvnPoint());
}
public Point PointToClient(Point point)
{
return _native.PointToClient(point.ToAvnPoint()).ToAvaloniaPoint();
}
public Point PointToScreen(Point point)
{
return _native.PointToScreen(point.ToAvnPoint()).ToAvaloniaPoint();
}
public void Hide()
{
_native.Hide();
}
public void BeginMoveDrag()
{
_native.BeginMoveDrag();
}
#region Stubs
public double Scaling => 1;
@ -201,30 +220,10 @@ namespace Avalonia.Native
{
}
public void Hide()
{
_native.Hide();
}
public void BeginMoveDrag()
{
_native.BeginMoveDrag();
}
public void BeginResizeDrag(WindowEdge edge)
{
}
public Point PointToClient(Point point)
{
return point;
}
public Point PointToScreen(Point point)
{
return point;
}
#endregion
}
}

4
src/headers/avalonia-native.h

@ -73,8 +73,10 @@ AVNCOM(IAvnWindowBase, 02) : virtual IUnknown
virtual HRESULT Resize(double width, double height) = 0;
virtual void Invalidate (AvnRect rect) = 0;
virtual void BeginMoveDrag () = 0;
virtual AvnPoint GetPosition () = 0;
virtual HRESULT GetPosition (AvnPoint*ret) = 0;
virtual void SetPosition (AvnPoint point) = 0;
virtual HRESULT PointToClient (AvnPoint point, AvnPoint*ret) = 0;
virtual HRESULT PointToScreen (AvnPoint point, AvnPoint*ret) = 0;
};
AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase

Loading…
Cancel
Save