|
|
|
@ -16,6 +16,8 @@ using Avalonia.VisualTree; |
|
|
|
using Xunit; |
|
|
|
using Avalonia.Input; |
|
|
|
using Avalonia.Rendering; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Avalonia.Threading; |
|
|
|
|
|
|
|
namespace Avalonia.Controls.UnitTests.Primitives |
|
|
|
{ |
|
|
|
@ -597,27 +599,44 @@ namespace Avalonia.Controls.UnitTests.Primitives |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Popup_Should_Follow_Placement_Target_On_Window_Move() |
|
|
|
public void Popup_Should_Not_Follow_Placement_Target_On_Window_Move_If_Pointer() |
|
|
|
{ |
|
|
|
using (CreateServices()) |
|
|
|
{ |
|
|
|
var popup = new Popup { Width = 400, Height = 200 }; |
|
|
|
var popup = new Popup |
|
|
|
{ |
|
|
|
Width = 400, |
|
|
|
Height = 200, |
|
|
|
PlacementMode = PlacementMode.Pointer |
|
|
|
}; |
|
|
|
var window = PreparedWindow(popup); |
|
|
|
window.Show(); |
|
|
|
popup.Open(); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
|
|
|
|
var raised = false; |
|
|
|
if (popup.Host is PopupRoot popupRoot) |
|
|
|
{ |
|
|
|
// Moving the window must move the popup (screen coordinates have changed)
|
|
|
|
var raised = false; |
|
|
|
popupRoot.PositionChanged += (_, args) => |
|
|
|
{ |
|
|
|
Assert.Equal(new PixelPoint(10, 10), args.Point); |
|
|
|
raised = true; |
|
|
|
}; |
|
|
|
|
|
|
|
window.Position = new PixelPoint(10, 10); |
|
|
|
Assert.True(raised); |
|
|
|
} |
|
|
|
else if (popup.Host is OverlayPopupHost overlayPopupHost) |
|
|
|
{ |
|
|
|
overlayPopupHost.PropertyChanged += (_, args) => |
|
|
|
{ |
|
|
|
if (args.Property == Canvas.TopProperty |
|
|
|
|| args.Property == Canvas.LeftProperty) |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
window.Position = new PixelPoint(10, 10); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
Assert.False(raised); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -634,30 +653,222 @@ namespace Avalonia.Controls.UnitTests.Primitives |
|
|
|
HorizontalAlignment = HorizontalAlignment.Center, |
|
|
|
VerticalAlignment = VerticalAlignment.Center |
|
|
|
}; |
|
|
|
var popup = new Popup() { PlacementTarget = placementTarget, Width = 10, Height = 10 }; |
|
|
|
var popup = new Popup() |
|
|
|
{ |
|
|
|
PlacementTarget = placementTarget, |
|
|
|
PlacementMode = PlacementMode.Bottom, |
|
|
|
Width = 10, |
|
|
|
Height = 10 |
|
|
|
}; |
|
|
|
((ISetLogicalParent)popup).SetParent(popup.PlacementTarget); |
|
|
|
|
|
|
|
var window = PreparedWindow(placementTarget); |
|
|
|
window.Show(); |
|
|
|
popup.Open(); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
|
|
|
|
// The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window
|
|
|
|
Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); |
|
|
|
|
|
|
|
var raised = false; |
|
|
|
// Resizing the window to 700x500 must move the popup to (345,255) as this is the new
|
|
|
|
// location of the placement target
|
|
|
|
if (popup.Host is PopupRoot popupRoot) |
|
|
|
{ |
|
|
|
// Resizing the window to 700x500 must move the popup to (345,255) as this is the new
|
|
|
|
// location of the placement target
|
|
|
|
var raised = false; |
|
|
|
popupRoot.PositionChanged += (_, args) => |
|
|
|
{ |
|
|
|
Assert.Equal(new PixelPoint(345, 255), args.Point); |
|
|
|
raised = true; |
|
|
|
}; |
|
|
|
|
|
|
|
window.PlatformImpl?.Resize(new Size(700D, 500D), PlatformResizeReason.Unspecified); |
|
|
|
Assert.True(raised); |
|
|
|
} |
|
|
|
else if (popup.Host is OverlayPopupHost overlayPopupHost) |
|
|
|
{ |
|
|
|
overlayPopupHost.PropertyChanged += (_, args) => |
|
|
|
{ |
|
|
|
if ((args.Property == Canvas.TopProperty |
|
|
|
|| args.Property == Canvas.LeftProperty) |
|
|
|
&& Canvas.GetLeft(overlayPopupHost) == 345 |
|
|
|
&& Canvas.GetTop(overlayPopupHost) == 255) |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
window.PlatformImpl?.Resize(new Size(700D, 500D), PlatformResizeReason.Unspecified); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
Assert.True(raised); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Popup_Should_Not_Follow_Placement_Target_On_Window_Resize_If_Pointer_If_Pointer() |
|
|
|
{ |
|
|
|
using (CreateServices()) |
|
|
|
{ |
|
|
|
|
|
|
|
var placementTarget = new Panel() |
|
|
|
{ |
|
|
|
Width = 10, |
|
|
|
Height = 10, |
|
|
|
HorizontalAlignment = HorizontalAlignment.Center, |
|
|
|
VerticalAlignment = VerticalAlignment.Center |
|
|
|
}; |
|
|
|
var popup = new Popup() |
|
|
|
{ |
|
|
|
PlacementTarget = placementTarget, |
|
|
|
PlacementMode = PlacementMode.Pointer, |
|
|
|
Width = 10, |
|
|
|
Height = 10 |
|
|
|
}; |
|
|
|
((ISetLogicalParent)popup).SetParent(popup.PlacementTarget); |
|
|
|
|
|
|
|
var window = PreparedWindow(placementTarget); |
|
|
|
window.Show(); |
|
|
|
popup.Open(); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
|
|
|
|
// The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window
|
|
|
|
Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); |
|
|
|
|
|
|
|
var raised = false; |
|
|
|
if (popup.Host is PopupRoot popupRoot) |
|
|
|
{ |
|
|
|
popupRoot.PositionChanged += (_, args) => |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
else if (popup.Host is OverlayPopupHost overlayPopupHost) |
|
|
|
{ |
|
|
|
overlayPopupHost.PropertyChanged += (_, args) => |
|
|
|
{ |
|
|
|
if (args.Property == Canvas.TopProperty |
|
|
|
|| args.Property == Canvas.LeftProperty) |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
window.PlatformImpl?.Resize(new Size(700D, 500D), PlatformResizeReason.Unspecified); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
Assert.False(raised); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Popup_Should_Follow_Placement_Target_On_Target_Moved() |
|
|
|
{ |
|
|
|
using (CreateServices()) |
|
|
|
{ |
|
|
|
var placementTarget = new Panel() |
|
|
|
{ |
|
|
|
Width = 10, |
|
|
|
Height = 10, |
|
|
|
HorizontalAlignment = HorizontalAlignment.Center, |
|
|
|
VerticalAlignment = VerticalAlignment.Center |
|
|
|
}; |
|
|
|
var popup = new Popup() |
|
|
|
{ |
|
|
|
PlacementTarget = placementTarget, |
|
|
|
PlacementMode = PlacementMode.Bottom, |
|
|
|
Width = 10, |
|
|
|
Height = 10 |
|
|
|
}; |
|
|
|
((ISetLogicalParent)popup).SetParent(popup.PlacementTarget); |
|
|
|
|
|
|
|
var window = PreparedWindow(placementTarget); |
|
|
|
window.Show(); |
|
|
|
popup.Open(); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
|
|
|
|
// The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window
|
|
|
|
Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); |
|
|
|
|
|
|
|
var raised = false; |
|
|
|
// Margin will move placement target
|
|
|
|
if (popup.Host is PopupRoot popupRoot) |
|
|
|
{ |
|
|
|
popupRoot.PositionChanged += (_, args) => |
|
|
|
{ |
|
|
|
Assert.Equal(new PixelPoint(400, 305), args.Point); |
|
|
|
raised = true; |
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
else if (popup.Host is OverlayPopupHost overlayPopupHost) |
|
|
|
{ |
|
|
|
overlayPopupHost.PropertyChanged += (_, args) => |
|
|
|
{ |
|
|
|
if ((args.Property == Canvas.TopProperty |
|
|
|
|| args.Property == Canvas.LeftProperty) |
|
|
|
&& Canvas.GetLeft(overlayPopupHost) == 400 |
|
|
|
&& Canvas.GetTop(overlayPopupHost) == 305) |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
placementTarget.Margin = new Thickness(10, 0, 0, 0); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
Assert.True(raised); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Popup_Should_Not_Follow_Placement_Target_On_Target_Moved_If_Pointer() |
|
|
|
{ |
|
|
|
using (CreateServices()) |
|
|
|
{ |
|
|
|
|
|
|
|
var placementTarget = new Panel() |
|
|
|
{ |
|
|
|
Width = 10, |
|
|
|
Height = 10, |
|
|
|
HorizontalAlignment = HorizontalAlignment.Center, |
|
|
|
VerticalAlignment = VerticalAlignment.Center |
|
|
|
}; |
|
|
|
var popup = new Popup() |
|
|
|
{ |
|
|
|
PlacementTarget = placementTarget, |
|
|
|
PlacementMode = PlacementMode.Pointer, |
|
|
|
Width = 10, |
|
|
|
Height = 10 |
|
|
|
}; |
|
|
|
((ISetLogicalParent)popup).SetParent(popup.PlacementTarget); |
|
|
|
|
|
|
|
var window = PreparedWindow(placementTarget); |
|
|
|
window.Show(); |
|
|
|
popup.Open(); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
|
|
|
|
// The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window
|
|
|
|
Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); |
|
|
|
|
|
|
|
var raised = false; |
|
|
|
if (popup.Host is PopupRoot popupRoot) |
|
|
|
{ |
|
|
|
popupRoot.PositionChanged += (_, args) => |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
else if (popup.Host is OverlayPopupHost overlayPopupHost) |
|
|
|
{ |
|
|
|
overlayPopupHost.PropertyChanged += (_, args) => |
|
|
|
{ |
|
|
|
if (args.Property == Canvas.TopProperty |
|
|
|
|| args.Property == Canvas.LeftProperty) |
|
|
|
{ |
|
|
|
raised = true; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
placementTarget.Margin = new Thickness(10, 0, 0, 0); |
|
|
|
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout); |
|
|
|
Assert.False(raised); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|