mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-19 23:30:44 +08:00
309 lines
10 KiB
C#
309 lines
10 KiB
C#
using System.Reflection;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Controls.Primitives;
|
|
using Avalonia.Threading;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using AtomUINavMenu = AtomUI.Desktop.Controls.NavMenu;
|
|
using AtomUIWindow = AtomUI.Desktop.Controls.Window;
|
|
|
|
namespace AtomUI.Desktop.Controls.Tests.NavMenu;
|
|
|
|
public class NavMenuPinnedOpenTests
|
|
{
|
|
static NavMenuPinnedOpenTests()
|
|
{
|
|
AvaloniaTestApp.EnsureInitialized();
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Opens_First_Expandable_Item_And_Rejects_Close_Requests()
|
|
{
|
|
var parent = new NavMenuNode { Header = "Components" };
|
|
parent.Children.Add(new NavMenuNode { Header = "Button" });
|
|
var menu = new AtomUINavMenu
|
|
{
|
|
Mode = NavMenuMode.Vertical,
|
|
IsMotionEnabled = false,
|
|
ShouldUseOverlayPopup = true
|
|
};
|
|
menu.Items.Add(parent);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
var parentContainer = menu.ContainerFromItem(parent).ShouldBeOfType<NavMenuItem>();
|
|
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsPopupPinnedOpen.ShouldBeTrue();
|
|
parentContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
parentContainer.Popup.ShouldNotBeNull();
|
|
parentContainer.Popup.IsPopupPinnedOpen.ShouldBeTrue();
|
|
parentContainer.Popup.IsOpen.ShouldBeTrue();
|
|
|
|
menu.Close();
|
|
parentContainer.Close();
|
|
parentContainer.SetCurrentValue(NavMenuItem.IsSubMenuOpenProperty, false);
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
parentContainer.Popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Closes_For_Detach_And_Reopens_After_Reattach()
|
|
{
|
|
var parent = new NavMenuNode { Header = "Components" };
|
|
parent.Children.Add(new NavMenuNode { Header = "Button" });
|
|
var menu = new AtomUINavMenu
|
|
{
|
|
Mode = NavMenuMode.Vertical,
|
|
IsMotionEnabled = false,
|
|
ShouldUseOverlayPopup = true
|
|
};
|
|
menu.Items.Add(parent);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
var parentContainer = menu.ContainerFromItem(parent).ShouldBeOfType<NavMenuItem>();
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = parentContainer.Popup.ShouldNotBeNull();
|
|
var windowContent = window.Content;
|
|
|
|
window.Content = null;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsPopupPinnedOpen.ShouldBeFalse();
|
|
parentContainer.IsSubMenuOpen.ShouldBeFalse();
|
|
popup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeFalse();
|
|
|
|
window.Content = windowContent;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsPopupPinnedOpen.ShouldBeTrue();
|
|
parentContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Releases_Removed_Container_And_Transfers_To_Next_Item()
|
|
{
|
|
var first = new NavMenuNode { Header = "Components" };
|
|
first.Children.Add(new NavMenuNode { Header = "Button" });
|
|
var second = new NavMenuNode { Header = "Resources" };
|
|
second.Children.Add(new NavMenuNode { Header = "Icons" });
|
|
var menu = new AtomUINavMenu
|
|
{
|
|
Mode = NavMenuMode.Vertical,
|
|
IsMotionEnabled = false,
|
|
ShouldUseOverlayPopup = true
|
|
};
|
|
menu.Items.Add(first);
|
|
menu.Items.Add(second);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
var firstContainer = menu.ContainerFromItem(first).ShouldBeOfType<NavMenuItem>();
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var firstPopup = firstContainer.Popup.ShouldNotBeNull();
|
|
|
|
menu.Items.Remove(first);
|
|
Dispatcher.UIThread.RunJobs();
|
|
window.UpdateLayout();
|
|
|
|
firstContainer.OwnerMenu.ShouldBeNull();
|
|
firstContainer.IsPopupPinnedOpen.ShouldBeFalse();
|
|
firstPopup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
firstPopup.IsOpen.ShouldBeFalse();
|
|
|
|
var secondContainer = menu.ContainerFromItem(second).ShouldBeOfType<NavMenuItem>();
|
|
secondContainer.IsPopupPinnedOpen.ShouldBeTrue();
|
|
secondContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
secondContainer.Popup.ShouldNotBeNull();
|
|
secondContainer.Popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Extends_To_The_Active_Nested_Submenu_Chain()
|
|
{
|
|
var child = new NavMenuNode { Header = "Inputs" };
|
|
child.Children.Add(new NavMenuNode { Header = "Button" });
|
|
var parent = new NavMenuNode { Header = "Components" };
|
|
parent.Children.Add(child);
|
|
var menu = new AtomUINavMenu
|
|
{
|
|
Mode = NavMenuMode.Vertical,
|
|
IsMotionEnabled = false,
|
|
ShouldUseOverlayPopup = true
|
|
};
|
|
menu.Items.Add(parent);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
window.UpdateLayout();
|
|
|
|
var parentContainer = menu.ContainerFromItem(parent).ShouldBeOfType<NavMenuItem>();
|
|
var childContainer = parentContainer.ContainerFromItem(child).ShouldBeOfType<NavMenuItem>();
|
|
childContainer.Open();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsPopupPinnedOpen.ShouldBeTrue();
|
|
childContainer.IsPopupPinnedOpen.ShouldBeTrue();
|
|
childContainer.Popup.ShouldNotBeNull();
|
|
childContainer.Popup.IsPopupPinnedOpen.ShouldBeTrue();
|
|
childContainer.Popup.IsOpen.ShouldBeTrue();
|
|
|
|
childContainer.Close();
|
|
childContainer.SetCurrentValue(NavMenuItem.IsSubMenuOpenProperty, false);
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
childContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
childContainer.Popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Closes_For_Mode_Replacement_And_Reopens_In_Popup_Mode()
|
|
{
|
|
var parent = new NavMenuNode { Header = "Components" };
|
|
parent.Children.Add(new NavMenuNode { Header = "Button" });
|
|
var menu = new AtomUINavMenu
|
|
{
|
|
Mode = NavMenuMode.Vertical,
|
|
IsMotionEnabled = false,
|
|
ShouldUseOverlayPopup = true
|
|
};
|
|
menu.Items.Add(parent);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
var parentContainer = menu.ContainerFromItem(parent).ShouldBeOfType<NavMenuItem>();
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = parentContainer.Popup.ShouldNotBeNull();
|
|
|
|
menu.Mode = NavMenuMode.Inline;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
menu.IsPopupPinnedOpen.ShouldBeTrue();
|
|
parentContainer.IsPopupPinnedOpen.ShouldBeFalse();
|
|
parentContainer.IsSubMenuOpen.ShouldBeFalse();
|
|
popup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeFalse();
|
|
|
|
menu.Mode = NavMenuMode.Vertical;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var reopenedContainer = menu.ContainerFromItem(parent).ShouldBeOfType<NavMenuItem>();
|
|
reopenedContainer.IsPopupPinnedOpen.ShouldBeTrue();
|
|
reopenedContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
reopenedContainer.Popup.ShouldNotBeNull();
|
|
reopenedContainer.Popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Unpin_Leaves_Submenu_Open_And_Restores_Normal_Close()
|
|
{
|
|
var parent = new NavMenuNode { Header = "Components" };
|
|
parent.Children.Add(new NavMenuNode { Header = "Button" });
|
|
var menu = new AtomUINavMenu
|
|
{
|
|
Mode = NavMenuMode.Vertical,
|
|
IsMotionEnabled = false,
|
|
ShouldUseOverlayPopup = true
|
|
};
|
|
menu.Items.Add(parent);
|
|
var window = ShowInWindow(menu);
|
|
|
|
try
|
|
{
|
|
var parentContainer = menu.ContainerFromItem(parent).ShouldBeOfType<NavMenuItem>();
|
|
menu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = parentContainer.Popup.ShouldNotBeNull();
|
|
|
|
menu.IsPopupPinnedOpen = false;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
parentContainer.IsSubMenuOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
|
|
menu.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
parentContainer.IsSubMenuOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeFalse();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
private static AtomUIWindow ShowInWindow(Control content)
|
|
{
|
|
var visualLayerManager = new VisualLayerManager
|
|
{
|
|
Child = content
|
|
};
|
|
var property = typeof(VisualLayerManager).GetProperty(
|
|
"EnablePopupOverlayLayer",
|
|
BindingFlags.Instance | BindingFlags.NonPublic);
|
|
property.ShouldNotBeNull();
|
|
property.SetValue(visualLayerManager, true);
|
|
|
|
var window = new AtomUIWindow
|
|
{
|
|
Width = 420,
|
|
Height = 300,
|
|
Content = visualLayerManager
|
|
};
|
|
window.Show();
|
|
Dispatcher.UIThread.RunJobs();
|
|
return window;
|
|
}
|
|
}
|