mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-19 06:58:57 +08:00
281 lines
8.1 KiB
C#
281 lines
8.1 KiB
C#
using AtomUI.Controls.Primitives;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Controls.Primitives;
|
|
using Avalonia.Threading;
|
|
using Avalonia.VisualTree;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using AtomUIMenu = AtomUI.Desktop.Controls.Menu;
|
|
using AtomUIMenuItem = AtomUI.Desktop.Controls.MenuItem;
|
|
using AtomUIPopup = AtomUI.Desktop.Controls.Popup;
|
|
using AtomUIWindow = AtomUI.Desktop.Controls.Window;
|
|
|
|
namespace AtomUI.Desktop.Controls.Tests.Menu;
|
|
|
|
public class MenuPinnedOpenTests
|
|
{
|
|
static MenuPinnedOpenTests()
|
|
{
|
|
AvaloniaTestApp.EnsureInitialized();
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Opens_Menu_Active_Submenu_And_Physical_Popup()
|
|
{
|
|
var parentItem = new AtomUIMenuItem { Header = "File" };
|
|
parentItem.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var menu = new AtomUIMenu
|
|
{
|
|
IsMotionEnabled = false,
|
|
Width = 320
|
|
};
|
|
menu.Items.Add(parentItem);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var popup = FindPopup(parentItem);
|
|
menu.IsOpen.ShouldBeTrue();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
popup.IsPopupPinnedOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Rejects_Menu_Close_Requests()
|
|
{
|
|
var parentItem = new AtomUIMenuItem { Header = "File" };
|
|
parentItem.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var menu = new AtomUIMenu
|
|
{
|
|
IsMotionEnabled = false,
|
|
Width = 320
|
|
};
|
|
menu.Items.Add(parentItem);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = FindPopup(parentItem);
|
|
|
|
menu.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsOpen.ShouldBeTrue();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
|
|
menu.CloseImmediately();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsOpen.ShouldBeTrue();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Rejects_Active_Submenu_Collapse()
|
|
{
|
|
var parentItem = new AtomUIMenuItem { Header = "File" };
|
|
parentItem.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var menu = new AtomUIMenu
|
|
{
|
|
IsMotionEnabled = false,
|
|
Width = 320
|
|
};
|
|
menu.Items.Add(parentItem);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentItem.SetCurrentValue(MenuItem.IsSubMenuOpenProperty, false);
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
FindPopup(parentItem).IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Closes_For_Detach_And_Reopens_After_Reattach()
|
|
{
|
|
var parentItem = new AtomUIMenuItem { Header = "File" };
|
|
parentItem.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var menu = new AtomUIMenu
|
|
{
|
|
IsMotionEnabled = false,
|
|
Width = 320
|
|
};
|
|
menu.Items.Add(parentItem);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = FindPopup(parentItem);
|
|
var windowContent = window.Content;
|
|
|
|
window.Content = null;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsOpen.ShouldBeFalse();
|
|
parentItem.IsSubMenuOpen.ShouldBeFalse();
|
|
parentItem.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeFalse();
|
|
|
|
window.Content = windowContent;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsOpen.ShouldBeTrue();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Unpin_Leaves_Menu_Open_And_Restores_Normal_Close()
|
|
{
|
|
var parentItem = new AtomUIMenuItem { Header = "File" };
|
|
parentItem.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var menu = new AtomUIMenu
|
|
{
|
|
IsMotionEnabled = false,
|
|
Width = 320
|
|
};
|
|
menu.Items.Add(parentItem);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = FindPopup(parentItem);
|
|
|
|
menu.IsPopupPinnedOpen = false;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsOpen.ShouldBeTrue();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
parentItem.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
|
|
menu.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsOpen.ShouldBeFalse();
|
|
parentItem.IsSubMenuOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeFalse();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Releases_Removed_Item_And_Transfers_To_The_Next_Submenu()
|
|
{
|
|
var firstItem = new AtomUIMenuItem { Header = "File" };
|
|
firstItem.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var secondItem = new AtomUIMenuItem { Header = "Edit" };
|
|
secondItem.Items.Add(new AtomUIMenuItem { Header = "Copy" });
|
|
var menu = new AtomUIMenu
|
|
{
|
|
IsMotionEnabled = false,
|
|
Width = 320
|
|
};
|
|
menu.Items.Add(firstItem);
|
|
menu.Items.Add(secondItem);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var firstPopup = FindPopup(firstItem);
|
|
firstPopup.IsOpen.ShouldBeTrue();
|
|
|
|
menu.Items.Remove(firstItem);
|
|
Dispatcher.UIThread.RunJobs();
|
|
window.UpdateLayout();
|
|
|
|
firstItem.IsPopupPinnedOpen.ShouldBeFalse();
|
|
firstItem.IsSubMenuOpen.ShouldBeFalse();
|
|
firstPopup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
firstPopup.IsOpen.ShouldBeFalse();
|
|
secondItem.IsPopupPinnedOpen.ShouldBeTrue();
|
|
secondItem.IsSubMenuOpen.ShouldBeTrue();
|
|
FindPopup(secondItem).IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
private static AtomUIPopup FindPopup(Control root)
|
|
{
|
|
return root.GetVisualDescendants()
|
|
.OfType<AtomUIPopup>()
|
|
.Single(item => item.Name == "PART_Popup");
|
|
}
|
|
|
|
private static AtomUIWindow ShowInWindow(Control content)
|
|
{
|
|
var overlayPanel = new ScopeAwareOverlayLayerPanel
|
|
{
|
|
Width = 420,
|
|
Height = 240
|
|
};
|
|
overlayPanel.Children.Add(content);
|
|
var visualLayerManager = new VisualLayerManager
|
|
{
|
|
Child = overlayPanel
|
|
};
|
|
var window = new AtomUIWindow
|
|
{
|
|
Width = 420,
|
|
Height = 240,
|
|
Content = visualLayerManager
|
|
};
|
|
window.Show();
|
|
Dispatcher.UIThread.RunJobs();
|
|
return window;
|
|
}
|
|
}
|