Controls now lose focus when hidden or deleted.

This commit is contained in:
Pieter-Jan Briers
2019-03-08 14:18:14 +01:00
parent 7919be26f1
commit d025065d40
3 changed files with 100 additions and 2 deletions

View File

@@ -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; }

View File

@@ -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);
}

View File

@@ -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();