mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-31 02:08:03 +01:00
Fixes #808. Added an automated CanFocus.
This commit is contained in:
@@ -276,6 +276,9 @@ namespace Terminal.Gui {
|
||||
}
|
||||
}
|
||||
|
||||
bool oldCanFocus;
|
||||
int oldTabIndex;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool CanFocus {
|
||||
get => base.CanFocus;
|
||||
@@ -284,11 +287,30 @@ namespace Terminal.Gui {
|
||||
base.CanFocus = value;
|
||||
if (!value && tabIndex > -1) {
|
||||
TabIndex = -1;
|
||||
} else if (value && tabIndex == -1) {
|
||||
}
|
||||
if (value && SuperView != null && !SuperView.CanFocus) {
|
||||
SuperView.CanFocus = value;
|
||||
}
|
||||
if (value && tabIndex == -1) {
|
||||
TabIndex = SuperView != null ? SuperView.tabIndexes.IndexOf (this) : -1;
|
||||
}
|
||||
TabStop = value;
|
||||
}
|
||||
if (subviews != null && IsInitialized) {
|
||||
foreach (var view in subviews) {
|
||||
if (view.CanFocus != value) {
|
||||
if (!value) {
|
||||
view.oldCanFocus = view.CanFocus;
|
||||
view.oldTabIndex = view.tabIndex;
|
||||
view.CanFocus = value;
|
||||
view.tabIndex = -1;
|
||||
} else {
|
||||
view.CanFocus = view.oldCanFocus;
|
||||
view.tabIndex = view.oldTabIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -661,13 +683,13 @@ namespace Terminal.Gui {
|
||||
subviews.Add (view);
|
||||
tabIndexes.Add (view);
|
||||
view.container = this;
|
||||
OnAdded (view);
|
||||
if (view.CanFocus) {
|
||||
CanFocus = true;
|
||||
view.tabIndex = tabIndexes.IndexOf (view);
|
||||
}
|
||||
SetNeedsLayout ();
|
||||
SetNeedsDisplay ();
|
||||
OnAdded (view);
|
||||
if (IsInitialized) {
|
||||
view.BeginInit ();
|
||||
}
|
||||
@@ -717,15 +739,15 @@ namespace Terminal.Gui {
|
||||
subviews.Remove (view);
|
||||
tabIndexes.Remove (view);
|
||||
view.container = null;
|
||||
OnRemoved (view);
|
||||
view.tabIndex = -1;
|
||||
if (subviews.Count < 1)
|
||||
this.CanFocus = false;
|
||||
|
||||
if (subviews.Count < 1) {
|
||||
CanFocus = false;
|
||||
}
|
||||
foreach (var v in subviews) {
|
||||
if (v.Frame.IntersectsWith (touched))
|
||||
view.SetNeedsDisplay ();
|
||||
}
|
||||
OnRemoved (view);
|
||||
}
|
||||
|
||||
void PerformActionForSubview (View subview, Action<View> action)
|
||||
@@ -1869,7 +1891,9 @@ namespace Terminal.Gui {
|
||||
public void BeginInit ()
|
||||
{
|
||||
if (!IsInitialized) {
|
||||
Initialized?.Invoke (this, new EventArgs ());
|
||||
oldCanFocus = CanFocus;
|
||||
oldTabIndex = tabIndex;
|
||||
Initialized?.Invoke (this, EventArgs.Empty);
|
||||
}
|
||||
if (subviews?.Count > 0) {
|
||||
foreach (var view in subviews) {
|
||||
|
||||
@@ -747,5 +747,157 @@ namespace Terminal.Gui {
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.True (v.CanFocus);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanFocus_Faced_With_Container_Before_Run ()
|
||||
{
|
||||
Application.Init (new FakeDriver (), new NetMainLoop (() => FakeConsole.ReadKey (true)));
|
||||
|
||||
var t = Application.Top;
|
||||
|
||||
var w = new Window ("w");
|
||||
var f = new FrameView ("f");
|
||||
var v = new View ("v") { CanFocus = true };
|
||||
f.Add (v);
|
||||
w.Add (f);
|
||||
t.Add (w);
|
||||
|
||||
Assert.True (t.CanFocus);
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.True (f.CanFocus);
|
||||
Assert.True (v.CanFocus);
|
||||
|
||||
f.CanFocus = false;
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.True (v.CanFocus);
|
||||
|
||||
v.CanFocus = false;
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.False (v.CanFocus);
|
||||
|
||||
v.CanFocus = true;
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.True (v.CanFocus);
|
||||
|
||||
Application.Iteration += () => Application.RequestStop ();
|
||||
|
||||
Application.Run ();
|
||||
Application.Shutdown ();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanFocus_Faced_With_Container_After_Run ()
|
||||
{
|
||||
Application.Init (new FakeDriver (), new NetMainLoop (() => FakeConsole.ReadKey (true)));
|
||||
|
||||
var t = Application.Top;
|
||||
|
||||
var w = new Window ("w");
|
||||
var f = new FrameView ("f");
|
||||
var v = new View ("v") { CanFocus = true };
|
||||
f.Add (v);
|
||||
w.Add (f);
|
||||
t.Add (w);
|
||||
|
||||
t.Ready += () => {
|
||||
Assert.True (t.CanFocus);
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.True (f.CanFocus);
|
||||
Assert.True (v.CanFocus);
|
||||
|
||||
f.CanFocus = false;
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.False (v.CanFocus);
|
||||
|
||||
v.CanFocus = false;
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.False (v.CanFocus);
|
||||
|
||||
v.CanFocus = true;
|
||||
Assert.True (f.CanFocus);
|
||||
Assert.True (v.CanFocus);
|
||||
};
|
||||
|
||||
Application.Iteration += () => Application.RequestStop ();
|
||||
|
||||
Application.Run ();
|
||||
Application.Shutdown ();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanFocus_Container_ToFalse_Turns_All_Subviews_ToFalse_Too ()
|
||||
{
|
||||
Application.Init (new FakeDriver (), new NetMainLoop (() => FakeConsole.ReadKey (true)));
|
||||
|
||||
var t = Application.Top;
|
||||
|
||||
var w = new Window ("w");
|
||||
var f = new FrameView ("f");
|
||||
var v1 = new View ("v1") { CanFocus = true };
|
||||
var v2 = new View ("v2") { CanFocus = true };
|
||||
f.Add (v1, v2);
|
||||
w.Add (f);
|
||||
t.Add (w);
|
||||
|
||||
t.Ready += () => {
|
||||
Assert.True (t.CanFocus);
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.True (f.CanFocus);
|
||||
Assert.True (v1.CanFocus);
|
||||
Assert.True (v2.CanFocus);
|
||||
|
||||
w.CanFocus = false;
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.False (v1.CanFocus);
|
||||
Assert.False (v2.CanFocus);
|
||||
};
|
||||
|
||||
Application.Iteration += () => Application.RequestStop ();
|
||||
|
||||
Application.Run ();
|
||||
Application.Shutdown ();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanFocus_Container_Toggling_All_Subviews_To_Old_Value_When_Is_True ()
|
||||
{
|
||||
Application.Init (new FakeDriver (), new NetMainLoop (() => FakeConsole.ReadKey (true)));
|
||||
|
||||
var t = Application.Top;
|
||||
|
||||
var w = new Window ("w");
|
||||
var f = new FrameView ("f");
|
||||
var v1 = new View ("v1");
|
||||
var v2 = new View ("v2") { CanFocus = true };
|
||||
f.Add (v1, v2);
|
||||
w.Add (f);
|
||||
t.Add (w);
|
||||
|
||||
t.Ready += () => {
|
||||
Assert.True (t.CanFocus);
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.True (f.CanFocus);
|
||||
Assert.False (v1.CanFocus);
|
||||
Assert.True (v2.CanFocus);
|
||||
|
||||
w.CanFocus = false;
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.False (f.CanFocus);
|
||||
Assert.False (v1.CanFocus);
|
||||
Assert.False (v2.CanFocus);
|
||||
|
||||
w.CanFocus = true;
|
||||
Assert.True (w.CanFocus);
|
||||
Assert.True (f.CanFocus);
|
||||
Assert.False (v1.CanFocus);
|
||||
Assert.True (v2.CanFocus);
|
||||
};
|
||||
|
||||
Application.Iteration += () => Application.RequestStop ();
|
||||
|
||||
Application.Run ();
|
||||
Application.Shutdown ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user