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

39
src/Avalonia.Native/WindowImplBase.cs

@ -170,6 +170,25 @@ namespace Avalonia.Native
set => _native.SetPosition(value.ToAvnPoint()); 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 #region Stubs
public double Scaling => 1; 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 void BeginResizeDrag(WindowEdge edge)
{ {
} }
public Point PointToClient(Point point)
{
return point;
}
public Point PointToScreen(Point point)
{
return point;
}
#endregion #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 HRESULT Resize(double width, double height) = 0;
virtual void Invalidate (AvnRect rect) = 0; virtual void Invalidate (AvnRect rect) = 0;
virtual void BeginMoveDrag () = 0; virtual void BeginMoveDrag () = 0;
virtual AvnPoint GetPosition () = 0; virtual HRESULT GetPosition (AvnPoint*ret) = 0;
virtual void SetPosition (AvnPoint point) = 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 AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase

Loading…
Cancel
Save