mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Fixes #2354. View.Redraw doesn't clear itself and PositionCursor doesn't ensure focus when a prior view was disabled. (#2355)
* Fixes #2354. View should have a IgnoreHasFocusPropertyOnRedraw property to prevent unnecessary derived class. * Removed IgnoreHasFocusPropertyOnRedraw property. --------- Co-authored-by: Tig <tig@users.noreply.github.com>
This commit is contained in:
@@ -908,6 +908,12 @@ namespace Terminal.Gui {
|
||||
{
|
||||
if (!IsMdiContainer) {
|
||||
base.PositionCursor ();
|
||||
if (Focused == null) {
|
||||
EnsureFocus ();
|
||||
if (Focused == null) {
|
||||
Driver.SetCursorVisibility (CursorVisibility.Invisible);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -920,6 +926,9 @@ namespace Terminal.Gui {
|
||||
}
|
||||
}
|
||||
base.PositionCursor ();
|
||||
if (Focused == null) {
|
||||
Driver.SetCursorVisibility (CursorVisibility.Invisible);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -951,6 +951,10 @@ namespace Terminal.Gui {
|
||||
view.tabIndex = tabIndexes.IndexOf (view);
|
||||
addingView = false;
|
||||
}
|
||||
if (view.Enabled && !Enabled) {
|
||||
view.oldEnabled = true;
|
||||
view.Enabled = false;
|
||||
}
|
||||
SetNeedsLayout ();
|
||||
SetNeedsDisplay ();
|
||||
OnAdded (view);
|
||||
@@ -1303,14 +1307,16 @@ namespace Terminal.Gui {
|
||||
return;
|
||||
}
|
||||
|
||||
if (focused?.Visible == true && focused?.Enabled == true && focused?.Frame.Width > 0 && focused.Frame.Height > 0) {
|
||||
if (focused == null && SuperView != null) {
|
||||
SuperView.EnsureFocus ();
|
||||
} else if (focused?.Visible == true && focused?.Enabled == true && focused?.Frame.Width > 0 && focused.Frame.Height > 0) {
|
||||
focused.PositionCursor ();
|
||||
} else if (focused?.Visible == true && focused?.Enabled == false) {
|
||||
focused = null;
|
||||
} else if (CanFocus && HasFocus && Visible && Frame.Width > 0 && Frame.Height > 0) {
|
||||
Move (TextFormatter.HotKeyPos == -1 ? 0 : TextFormatter.CursorPosition, 0);
|
||||
} else {
|
||||
if (CanFocus && HasFocus && Visible && Frame.Width > 0 && Frame.Height > 0) {
|
||||
Move (TextFormatter.HotKeyPos == -1 ? 0 : TextFormatter.CursorPosition, 0);
|
||||
} else {
|
||||
Move (frame.X, frame.Y);
|
||||
}
|
||||
Move (frame.X, frame.Y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1504,13 +1510,13 @@ namespace Terminal.Gui {
|
||||
var clipRect = new Rect (Point.Empty, frame.Size);
|
||||
|
||||
if (ColorScheme != null) {
|
||||
Driver.SetAttribute (HasFocus ? ColorScheme.Focus : ColorScheme.Normal);
|
||||
Driver.SetAttribute (HasFocus ? GetFocusColor () : GetNormalColor ());
|
||||
}
|
||||
|
||||
if (!IgnoreBorderPropertyOnRedraw && Border != null) {
|
||||
Border.DrawContent (this);
|
||||
} else if (ustring.IsNullOrEmpty (TextFormatter.Text) &&
|
||||
(GetType ().IsNestedPublic) && !IsOverridden (this, "Redraw") &&
|
||||
(GetType ().IsNestedPublic && !IsOverridden (this, "Redraw") || GetType ().Name == "View") &&
|
||||
(!NeedDisplay.IsEmpty || ChildNeedsDisplay || LayoutNeeded)) {
|
||||
|
||||
Clear ();
|
||||
@@ -1525,8 +1531,8 @@ namespace Terminal.Gui {
|
||||
if (TextFormatter != null) {
|
||||
TextFormatter.NeedsFormat = true;
|
||||
}
|
||||
TextFormatter?.Draw (ViewToScreen (Bounds), HasFocus ? ColorScheme.Focus : GetNormalColor (),
|
||||
HasFocus ? ColorScheme.HotFocus : Enabled ? ColorScheme.HotNormal : ColorScheme.Disabled,
|
||||
TextFormatter?.Draw (ViewToScreen (Bounds), HasFocus ? GetFocusColor () : GetNormalColor (),
|
||||
HasFocus ? ColorScheme.HotFocus : GetHotNormalColor (),
|
||||
containerBounds);
|
||||
}
|
||||
|
||||
@@ -2617,7 +2623,13 @@ namespace Terminal.Gui {
|
||||
get => base.Enabled;
|
||||
set {
|
||||
if (base.Enabled != value) {
|
||||
base.Enabled = value;
|
||||
if (value) {
|
||||
if (SuperView == null || SuperView?.Enabled == true) {
|
||||
base.Enabled = value;
|
||||
}
|
||||
} else {
|
||||
base.Enabled = value;
|
||||
}
|
||||
if (!value && HasFocus) {
|
||||
SetHasFocus (false, this);
|
||||
}
|
||||
@@ -2684,7 +2696,7 @@ namespace Terminal.Gui {
|
||||
/// to draw the view's border. If <see langword="true"/> no border is drawn (and the view is expected to draw the border
|
||||
/// itself).
|
||||
/// </summary>
|
||||
public virtual bool IgnoreBorderPropertyOnRedraw { get; set; } = false;
|
||||
public virtual bool IgnoreBorderPropertyOnRedraw { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Pretty prints the View
|
||||
@@ -3109,6 +3121,17 @@ namespace Terminal.Gui {
|
||||
return Enabled ? ColorScheme.Normal : ColorScheme.Disabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines the current <see cref="ColorScheme"/> based on the <see cref="Enabled"/> value.
|
||||
/// </summary>
|
||||
/// <returns><see cref="Terminal.Gui.ColorScheme.Focus"/> if <see cref="Enabled"/> is <see langword="true"/>
|
||||
/// or <see cref="Terminal.Gui.ColorScheme.Disabled"/> if <see cref="Enabled"/> is <see langword="false"/>.
|
||||
/// If it's overridden can return other values.</returns>
|
||||
public virtual Attribute GetFocusColor ()
|
||||
{
|
||||
return Enabled ? ColorScheme.Focus : ColorScheme.Disabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines the current <see cref="ColorScheme"/> based on the <see cref="Enabled"/> value.
|
||||
/// </summary>
|
||||
|
||||
@@ -1011,5 +1011,25 @@ namespace Terminal.Gui.TopLevelTests {
|
||||
Assert.True (isEnter);
|
||||
Assert.False (isLeave);
|
||||
}
|
||||
|
||||
[Fact, AutoInitShutdown]
|
||||
public void PositionCursor_SetCursorVisibility_To_Invisible_If_Focused_Is_Null ()
|
||||
{
|
||||
var tf = new TextField ("test") { Width = 5 };
|
||||
var view = new View () { Width = 10, Height = 10 };
|
||||
view.Add (tf);
|
||||
Application.Top.Add (view);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
Assert.True (tf.HasFocus);
|
||||
Application.Driver.GetCursorVisibility (out CursorVisibility cursor);
|
||||
Assert.Equal (CursorVisibility.Default, cursor);
|
||||
|
||||
view.Enabled = false;
|
||||
Assert.False (tf.HasFocus);
|
||||
Application.Refresh ();
|
||||
Application.Driver.GetCursorVisibility (out cursor);
|
||||
Assert.Equal (CursorVisibility.Invisible, cursor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using NStack;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Terminal.Gui.Graphs;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
@@ -4209,6 +4210,7 @@ cccccccccccccccccccc", output);
|
||||
v.CanFocus = true;
|
||||
Assert.False (v.HasFocus);
|
||||
v.SetFocus ();
|
||||
Assert.True (v.HasFocus);
|
||||
Application.Refresh ();
|
||||
TestHelpers.AssertDriverColorsAre (@"
|
||||
111111111111111111110", attributes);
|
||||
@@ -4491,6 +4493,7 @@ At 0,0
|
||||
A text witith two lines. ", output);
|
||||
}
|
||||
|
||||
|
||||
[Fact, AutoInitShutdown]
|
||||
public void Test_Nested_Views_With_Height_Equal_To_One ()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user