mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
Controls now lose focus when hidden or deleted.
This commit is contained in:
@@ -106,6 +106,10 @@ namespace SS14.Client.Interfaces.UserInterface
|
||||
|
||||
void GDPreKeyUp(KeyEventArgs args);
|
||||
|
||||
void ControlHidden(Control control);
|
||||
|
||||
void ControlRemovedFromTree(Control control);
|
||||
|
||||
void Render(IRenderHandle renderHandle);
|
||||
|
||||
Dictionary<(GodotAsset asset, int resourceId), object> GodotResourceInstanceCache { get; }
|
||||
|
||||
@@ -318,11 +318,74 @@ namespace SS14.Client.UserInterface
|
||||
return;
|
||||
}
|
||||
_visible = value;
|
||||
OnVisibilityChanged?.Invoke(this);
|
||||
|
||||
_propagateVisibilityChanged(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void _propagateVisibilityChanged(bool newVisible)
|
||||
{
|
||||
OnVisibilityChanged?.Invoke(this);
|
||||
if (!VisibleInTree)
|
||||
{
|
||||
UserInterfaceManagerInternal.ControlHidden(this);
|
||||
}
|
||||
|
||||
foreach (var child in _orderedChildren)
|
||||
{
|
||||
if (newVisible || child._visible)
|
||||
{
|
||||
child._propagateVisibilityChanged(newVisible);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsInsideTree { get; internal set; }
|
||||
|
||||
private void _propagateExitTree()
|
||||
{
|
||||
IsInsideTree = false;
|
||||
_exitedTree();
|
||||
|
||||
foreach (var child in _orderedChildren)
|
||||
{
|
||||
child._propagateExitTree();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void ExitedTree()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void _exitedTree()
|
||||
{
|
||||
ExitedTree();
|
||||
UserInterfaceManagerInternal.ControlRemovedFromTree(this);
|
||||
}
|
||||
|
||||
private void _propagateEnterTree()
|
||||
{
|
||||
IsInsideTree = true;
|
||||
_enteredTree();
|
||||
|
||||
foreach (var child in _orderedChildren)
|
||||
{
|
||||
child._propagateEnterTree();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void EnteredTree()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void _enteredTree()
|
||||
{
|
||||
EnteredTree();
|
||||
}
|
||||
|
||||
// _marginSetSize is the size calculated by the margins,
|
||||
// but it's different from _size if min size is higher.
|
||||
private Vector2 _sizeByMargins;
|
||||
@@ -1304,6 +1367,10 @@ namespace SS14.Client.UserInterface
|
||||
_orderedChildren.Add(child);
|
||||
|
||||
child.Parented(this);
|
||||
if (IsInsideTree)
|
||||
{
|
||||
child._propagateEnterTree();
|
||||
}
|
||||
ChildAdded(child);
|
||||
}
|
||||
|
||||
@@ -1347,6 +1414,11 @@ namespace SS14.Client.UserInterface
|
||||
}
|
||||
|
||||
child.Deparented();
|
||||
if (IsInsideTree)
|
||||
{
|
||||
child._propagateExitTree();
|
||||
}
|
||||
|
||||
ChildRemoved(child);
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,8 @@ namespace SS14.Client.UserInterface
|
||||
|
||||
RootControl = new Control("UIRoot")
|
||||
{
|
||||
MouseFilter = Control.MouseFilterMode.Ignore
|
||||
MouseFilter = Control.MouseFilterMode.Ignore,
|
||||
IsInsideTree = true
|
||||
};
|
||||
RootControl.SetAnchorPreset(Control.LayoutPreset.Wide);
|
||||
if (!GameController.OnGodot)
|
||||
@@ -352,6 +353,27 @@ namespace SS14.Client.UserInterface
|
||||
{
|
||||
}
|
||||
|
||||
public void ControlHidden(Control control)
|
||||
{
|
||||
// Does the same thing but it could later be changed so..
|
||||
ControlRemovedFromTree(control);
|
||||
}
|
||||
|
||||
public void ControlRemovedFromTree(Control control)
|
||||
{
|
||||
ReleaseKeyboardFocus(control);
|
||||
if (control == CurrentlyHovered)
|
||||
{
|
||||
control.MouseExited();
|
||||
CurrentlyHovered = null;
|
||||
}
|
||||
|
||||
if (control == _mouseFocused)
|
||||
{
|
||||
_mouseFocused = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void Render(IRenderHandle renderHandle)
|
||||
{
|
||||
var drawHandle = renderHandle.CreateHandleScreen();
|
||||
|
||||
Reference in New Issue
Block a user