mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
100 lines
2.1 KiB
C#
100 lines
2.1 KiB
C#
using Avalonia.Controls;
|
|
using Avalonia.Controls.Primitives;
|
|
using Avalonia.Input;
|
|
using Avalonia.LogicalTree;
|
|
using Avalonia.VisualTree;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Mesen.Utilities
|
|
{
|
|
internal class MenuHelper
|
|
{
|
|
private static bool IsPointerInItem(MenuItem item)
|
|
{
|
|
if(item.IsSubMenuOpen) {
|
|
bool checkPopup = true;
|
|
foreach(var child in item.GetLogicalChildren()) {
|
|
if(child is MenuItem subItem) {
|
|
if(IsPointerInItem(subItem)) {
|
|
return true;
|
|
} else if(checkPopup) {
|
|
if(subItem.GetVisualRoot() is PopupRoot root) {
|
|
if(root.IsPointerOver) {
|
|
return true;
|
|
}
|
|
}
|
|
checkPopup = false;
|
|
}
|
|
} else if(child is InputElement inputElem && inputElem.IsPointerOver) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return item.IsPointerOver;
|
|
}
|
|
|
|
public static bool IsPointerInMenu(Menu menu)
|
|
{
|
|
if(menu.IsPointerOver) {
|
|
return true;
|
|
}
|
|
|
|
if(menu.Items != null) {
|
|
foreach(MenuItem? item in menu.Items) {
|
|
if(item != null && IsPointerInItem(item)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private static bool IsFocusInItem(MenuItem item)
|
|
{
|
|
if(item.IsSubMenuOpen) {
|
|
bool checkPopup = true;
|
|
foreach(var child in item.GetLogicalChildren()) {
|
|
if(child is MenuItem subItem) {
|
|
if(IsFocusInItem(subItem)) {
|
|
return true;
|
|
} else if(checkPopup) {
|
|
if(subItem.GetVisualRoot() is PopupRoot root) {
|
|
if(root.IsKeyboardFocusWithin) {
|
|
return true;
|
|
}
|
|
}
|
|
checkPopup = false;
|
|
}
|
|
} else if(child is InputElement inputElem && inputElem.IsKeyboardFocusWithin) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return item.IsKeyboardFocusWithin;
|
|
}
|
|
|
|
public static bool IsFocusInMenu(Menu menu)
|
|
{
|
|
if(menu.IsKeyboardFocusWithin) {
|
|
return true;
|
|
}
|
|
|
|
if(menu.Items != null) {
|
|
foreach(MenuItem? item in menu.Items) {
|
|
if(item != null && IsFocusInItem(item)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|