Change VerbMenu categories to only execute solitary verbs (#6100)
Co-authored-by: ElectroJr <leonsfriedrich@gmail.com>
This commit is contained in:
@@ -58,6 +58,14 @@ namespace Content.Client.ContextMenu.UI
|
|||||||
DebugTools.Assert(ParentElement.SubMenu == null);
|
DebugTools.Assert(ParentElement.SubMenu == null);
|
||||||
ParentElement.SubMenu = this;
|
ParentElement.SubMenu = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ensure the menu-stack is properly updated when a pop-up looses focus or otherwise closes without going
|
||||||
|
// through the menu presenter.
|
||||||
|
OnPopupHide += () =>
|
||||||
|
{
|
||||||
|
if (ParentElement != null)
|
||||||
|
_presenter.CloseSubMenus(ParentElement.ParentMenu);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool disposing)
|
protected override void Dispose(bool disposing)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
|
using Robust.Shared.Log;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
using Timer = Robust.Shared.Timing.Timer;
|
using Timer = Robust.Shared.Timing.Timer;
|
||||||
namespace Content.Client.ContextMenu.UI
|
namespace Content.Client.ContextMenu.UI
|
||||||
@@ -71,6 +72,10 @@ namespace Content.Client.ContextMenu.UI
|
|||||||
{
|
{
|
||||||
Menus.Pop().Close();
|
Menus.Pop().Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ensure no accidental double-closing happens.
|
||||||
|
CancelClose?.Cancel();
|
||||||
|
CancelClose = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -78,7 +83,11 @@ namespace Content.Client.ContextMenu.UI
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void OnMouseEntered(ContextMenuElement element)
|
public virtual void OnMouseEntered(ContextMenuElement element)
|
||||||
{
|
{
|
||||||
var topMenu = Menus.Peek();
|
if (!Menus.TryPeek(out var topMenu))
|
||||||
|
{
|
||||||
|
Logger.Error("Context Menu: Mouse entered menu without any open menus?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (element.ParentMenu == topMenu || element.SubMenu == topMenu)
|
if (element.ParentMenu == topMenu || element.SubMenu == topMenu)
|
||||||
CancelClose?.Cancel();
|
CancelClose?.Cancel();
|
||||||
@@ -120,8 +129,14 @@ namespace Content.Client.ContextMenu.UI
|
|||||||
/// </remarks>
|
/// </remarks>
|
||||||
public virtual void OpenSubMenu(ContextMenuElement element)
|
public virtual void OpenSubMenu(ContextMenuElement element)
|
||||||
{
|
{
|
||||||
|
if (!Menus.TryPeek(out var topMenu))
|
||||||
|
{
|
||||||
|
Logger.Error("Context Menu: Attempting to open sub menu without any open menus?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If This is already the top most menu, do nothing.
|
// If This is already the top most menu, do nothing.
|
||||||
if (element.SubMenu == Menus.Peek())
|
if (element.SubMenu == topMenu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Was the parent menu closed or disposed before an open timer completed?
|
// Was the parent menu closed or disposed before an open timer completed?
|
||||||
@@ -131,6 +146,10 @@ namespace Content.Client.ContextMenu.UI
|
|||||||
// Close any currently open sub-menus up to this element's parent menu.
|
// Close any currently open sub-menus up to this element's parent menu.
|
||||||
CloseSubMenus(element.ParentMenu);
|
CloseSubMenus(element.ParentMenu);
|
||||||
|
|
||||||
|
// cancel any queued openings to prevent weird double-open scenarios.
|
||||||
|
CancelOpen?.Cancel();
|
||||||
|
CancelOpen = null;
|
||||||
|
|
||||||
if (element.SubMenu == null)
|
if (element.SubMenu == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -139,8 +158,6 @@ namespace Content.Client.ContextMenu.UI
|
|||||||
var altPos = element.GlobalPosition;
|
var altPos = element.GlobalPosition;
|
||||||
var pos = altPos + (element.Width + 2*ContextMenuElement.ElementMargin, - 2*ContextMenuElement.ElementMargin);
|
var pos = altPos + (element.Width + 2*ContextMenuElement.ElementMargin, - 2*ContextMenuElement.ElementMargin);
|
||||||
element.SubMenu.Open(UIBox2.FromDimensions(pos, (1, 1)), altPos);
|
element.SubMenu.Open(UIBox2.FromDimensions(pos, (1, 1)), altPos);
|
||||||
element.SubMenu.Close();
|
|
||||||
element.SubMenu.Open(UIBox2.FromDimensions(pos, (1, 1)), altPos);
|
|
||||||
|
|
||||||
// draw on top of other menus
|
// draw on top of other menus
|
||||||
element.SubMenu.SetPositionLast();
|
element.SubMenu.SetPositionLast();
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ namespace Content.Client.Verbs.UI
|
|||||||
if (element is not VerbMenuElement verbElement)
|
if (element is not VerbMenuElement verbElement)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
args.Handle();
|
||||||
var verb = verbElement.Verb;
|
var verb = verbElement.Verb;
|
||||||
|
|
||||||
if (verb == null)
|
if (verb == null)
|
||||||
@@ -182,8 +183,12 @@ namespace Content.Client.Verbs.UI
|
|||||||
if (verbElement.SubMenu == null || verbElement.SubMenu.ChildCount == 0)
|
if (verbElement.SubMenu == null || verbElement.SubMenu.ChildCount == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (verbElement.SubMenu.MenuBody.Children.First() is not VerbMenuElement verbCategoryElement)
|
if (verbElement.SubMenu.MenuBody.ChildCount != 1
|
||||||
|
|| verbElement.SubMenu.MenuBody.Children.First() is not VerbMenuElement verbCategoryElement)
|
||||||
|
{
|
||||||
|
OpenSubMenu(verbElement);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
verb = verbCategoryElement.Verb;
|
verb = verbCategoryElement.Verb;
|
||||||
|
|
||||||
@@ -194,8 +199,6 @@ namespace Content.Client.Verbs.UI
|
|||||||
_verbSystem.ExecuteVerb(CurrentTarget, verb, verbElement.Type);
|
_verbSystem.ExecuteVerb(CurrentTarget, verb, verbElement.Type);
|
||||||
if (verb.CloseMenu)
|
if (verb.CloseMenu)
|
||||||
_verbSystem.CloseAllMenus();
|
_verbSystem.CloseAllMenus();
|
||||||
|
|
||||||
args.Handle();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user