Fixes 2342. Border: can't change border color in window by Border.BorderBrush. (#2345)

* Fixes 2342. Border: can't change border color in window by Border.BorderBrush.

* Fixes border initialization.

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
This commit is contained in:
BDisp
2023-02-25 22:26:04 +00:00
parent f294adf4cc
commit 379d7a8492
6 changed files with 86 additions and 35 deletions

View File

@@ -331,6 +331,7 @@ namespace Terminal.Gui {
private Point effect3DOffset = new Point (1, 1);
private Attribute? effect3DBrush;
private ustring title = ustring.Empty;
private View child;
/// <summary>
/// Specifies the <see cref="Gui.BorderStyle"/> for a view.
@@ -447,8 +448,47 @@ namespace Terminal.Gui {
/// <summary>
/// Gets or sets the single child element of a <see cref="View"/>.
/// </summary>
[JsonIgnore]
public View Child { get; set; }
public View Child {
get => child;
set {
child = value;
if (child != null && Parent != null) {
Parent.Initialized += Parent_Initialized;
Parent.Removed += Parent_Removed;
}
}
}
private void Parent_Removed (View obj)
{
BorderBrush = default;
Background = default;
child.Removed -= Parent_Removed;
}
private void Parent_Initialized (object s, EventArgs e)
{
SetMarginFrameTitleBrush ();
child.Initialized -= Parent_Initialized;
}
private void SetMarginFrameTitleBrush ()
{
if (child != null) {
var view = Parent?.Border != null ? Parent : child;
if (view.ColorScheme != null) {
if (borderBrush == default) {
BorderBrush = view.GetNormalColor ().Foreground;
}
if (background == default) {
Background = view.GetNormalColor ().Background;
}
return;
}
}
BorderBrush = default;
Background = default;
}
/// <summary>
/// Gets the parent <see cref="Child"/> parent if any.
@@ -611,7 +651,7 @@ namespace Terminal.Gui {
Child.Clear (borderRect);
}
driver.SetAttribute (savedAttribute);
driver.SetAttribute (new Attribute (BorderBrush, Background));
// Draw margin frame
if (DrawMarginFrame) {
@@ -635,6 +675,7 @@ namespace Terminal.Gui {
driver.DrawWindowFrame (borderRect, 1, 1, 1, 1, BorderStyle != BorderStyle.None, fill: true, this);
}
}
driver.SetAttribute (savedAttribute);
}
private void DrawChildBorder (Rect frame, bool fill = true)
@@ -747,7 +788,7 @@ namespace Terminal.Gui {
}
}
driver.SetAttribute (savedAttribute);
driver.SetAttribute (new Attribute (BorderBrush, Background));
// Draw the MarginFrame
if (DrawMarginFrame) {
@@ -944,7 +985,7 @@ namespace Terminal.Gui {
}
}
driver.SetAttribute (savedAttribute);
driver.SetAttribute (new Attribute (BorderBrush, Background));
// Draw the MarginFrame
if (DrawMarginFrame) {
@@ -1026,9 +1067,9 @@ namespace Terminal.Gui {
{
var driver = Application.Driver;
if (DrawMarginFrame) {
driver.SetAttribute (Child.GetNormalColor ());
if (Child.HasFocus)
driver.SetAttribute (Child.ColorScheme.HotNormal);
driver.SetAttribute (new Attribute (BorderBrush, Background));
if (view.HasFocus)
driver.SetAttribute (new Attribute (Child.ColorScheme.HotNormal.Foreground, Background));
var padding = view.Border.GetSumThickness ();
Rect scrRect;
if (view == Child) {
@@ -1037,7 +1078,7 @@ namespace Terminal.Gui {
driver.DrawWindowTitle (scrRect, Title, 0, 0, 0, 0);
} else {
scrRect = view.ViewToScreen (new Rect (0, 0, view.Frame.Width, view.Frame.Height));
driver.DrawWindowTitle (scrRect, Title,
driver.DrawWindowTitle (scrRect, Parent.Border.Title,
padding.Left, padding.Top, padding.Right, padding.Bottom);
}
}
@@ -1053,9 +1094,9 @@ namespace Terminal.Gui {
{
var driver = Application.Driver;
if (DrawMarginFrame) {
driver.SetAttribute (view.GetNormalColor ());
driver.SetAttribute (new Attribute (BorderBrush, Background));
if (view.HasFocus) {
driver.SetAttribute (view.ColorScheme.HotNormal);
driver.SetAttribute (new Attribute (view.ColorScheme.HotNormal.Foreground, Background));
}
var padding = Parent.Border.GetSumThickness ();
var scrRect = Parent.ViewToScreen (new Rect (0, 0, rect.Width, rect.Height));

View File

@@ -89,7 +89,7 @@ namespace Terminal.Gui {
}
/// <summary>
///
/// Indicates the RGB for true colors.
/// </summary>
public class TrueColor {
/// <summary>
@@ -119,7 +119,7 @@ namespace Terminal.Gui {
}
/// <summary>
///
/// Converts true color to console color.
/// </summary>
/// <returns></returns>
public Color ToConsoleColor ()
@@ -504,7 +504,7 @@ namespace Terminal.Gui {
public bool Equals (string x, string y)
{
if (x != null && y != null) {
return x.ToLowerInvariant () == y.ToLowerInvariant ();
return string.Equals (x, y, StringComparison.InvariantCultureIgnoreCase);
}
return false;
}

View File

@@ -38,6 +38,9 @@ namespace Terminal.Gui {
if (!OnTitleChanging (title, value)) {
var old = title;
title = value;
if (Border != null) {
Border.Title = title;
}
OnTitleChanged (old, title);
}
SetNeedsDisplay ();
@@ -192,10 +195,13 @@ namespace Terminal.Gui {
Border = new Border () {
BorderStyle = DefaultBorderStyle,
Padding = new Thickness (padding),
BorderBrush = ColorScheme.Normal.Background
Title = title
};
} else {
Border = border;
if (ustring.IsNullOrEmpty (border.Title)) {
border.Title = title;
}
}
AdjustContentView (frame);
}
@@ -287,9 +293,6 @@ namespace Terminal.Gui {
///<inheritdoc/>
public override void Redraw (Rect bounds)
{
var padding = Border.GetSumThickness ();
var scrRect = ViewToScreen (new Rect (0, 0, Frame.Width, Frame.Height));
if (!NeedDisplay.IsEmpty || ChildNeedsDisplay || LayoutNeeded) {
Driver.SetAttribute (GetNormalColor ());
Clear ();
@@ -298,7 +301,6 @@ namespace Terminal.Gui {
var savedClip = contentView.ClipToBounds ();
// Redraw our contentView
// DONE: smartly constrict contentView.Bounds to just be what intersects with the 'bounds' we were passed
contentView.Redraw (!NeedDisplay.IsEmpty || ChildNeedsDisplay || LayoutNeeded ? contentView.Bounds : bounds);
Driver.Clip = savedClip;
@@ -306,14 +308,7 @@ namespace Terminal.Gui {
ClearNeedsDisplay ();
Driver.SetAttribute (GetNormalColor ());
//Driver.DrawWindowFrame (scrRect, padding.Left + borderLength, padding.Top + borderLength, padding.Right + borderLength, padding.Bottom + borderLength,
// Border.BorderStyle != BorderStyle.None, fill: true, Border.BorderStyle);
Border.DrawContent (this, false);
if (HasFocus)
Driver.SetAttribute (ColorScheme.HotNormal);
if (Border.DrawMarginFrame)
Driver.DrawWindowTitle (scrRect, Title, padding.Left, padding.Top, padding.Right, padding.Bottom);
Driver.SetAttribute (GetNormalColor ());
}
/// <inheritdoc/>

View File

@@ -67,6 +67,9 @@ namespace Terminal.Gui {
get => title;
set {
title = value;
if (Border != null) {
Border.Title = title;
}
SetNeedsDisplay ();
}
}
@@ -160,9 +163,13 @@ namespace Terminal.Gui {
if (border == null) {
Border = new Border () {
BorderStyle = DefaultBorderStyle
};
Title = title
};
} else {
Border = border;
if (ustring.IsNullOrEmpty (border.Title)) {
border.Title = title;
}
}
AdjustContentView (frame, views);
}
@@ -261,12 +268,8 @@ namespace Terminal.Gui {
///<inheritdoc/>
public override void Redraw (Rect bounds)
{
var padding = Border.GetSumThickness ();
var scrRect = ViewToScreen (new Rect (0, 0, Frame.Width, Frame.Height));
if (!NeedDisplay.IsEmpty) {
Driver.SetAttribute (GetNormalColor ());
//Driver.DrawWindowFrame (scrRect, padding + 1, padding + 1, padding + 1, padding + 1, border: true, fill: true);
Clear ();
}
@@ -274,6 +277,7 @@ namespace Terminal.Gui {
contentView.Redraw (!NeedDisplay.IsEmpty ? contentView.Bounds : bounds);
Driver.Clip = savedClip;
ClearLayoutNeeded ();
ClearNeedsDisplay ();
if (!IgnoreBorderPropertyOnRedraw) {

View File

@@ -12,9 +12,10 @@ namespace UICatalog.Scenarios {
var borderStyle = BorderStyle.Double;
var drawMarginFrame = false;
var borderThickness = new Thickness (1, 2, 3, 4);
var borderBrush = Colors.Base.HotFocus.Foreground;
var borderBrush = Color.BrightMagenta;
;
var padding = new Thickness (1, 2, 3, 4);
var background = Colors.Base.HotNormal.Foreground;
var background = Color.Cyan;
var effect3D = true;
var win = new Window (new Rect (5, 5, 40, 20), "Test", 8,

View File

@@ -228,7 +228,12 @@ namespace Terminal.Gui.CoreTests {
var color = (Attribute)driver.Contents [r, c, 1];
var rune = (Rune)driver.Contents [r, c, 0];
Assert.Equal (Color.Black, color.Background);
if (r == frame.Y - drawMarginFrame || r == frame.Bottom + drawMarginFrame - 1
|| c == frame.X - drawMarginFrame || c == frame.Right + drawMarginFrame - 1) {
Assert.Equal (Color.BrightGreen, color.Background);
} else {
Assert.Equal (Color.Black, color.Background);
}
if (c == frame.X - drawMarginFrame && r == frame.Y - drawMarginFrame) {
Assert.Equal (uLCorner, rune);
} else if (c == frame.Right && r == frame.Y - drawMarginFrame) {
@@ -457,7 +462,12 @@ namespace Terminal.Gui.CoreTests {
var color = (Attribute)driver.Contents [r, c, 1];
var rune = (Rune)driver.Contents [r, c, 0];
Assert.Equal (Color.Black, color.Background);
if (r == frame.Y + sumThickness.Top || r == frame.Bottom - sumThickness.Bottom - 1
|| c == frame.X + sumThickness.Left || c == frame.Right - sumThickness.Right - 1) {
Assert.Equal (Color.BrightGreen, color.Background);
} else {
Assert.Equal (Color.Black, color.Background);
}
if (c == frame.X + sumThickness.Left && r == frame.Y + sumThickness.Top) {
Assert.Equal (uLCorner, rune);
} else if (c == frame.Right - drawMarginFrame - sumThickness.Right