Fixed broken Dialog scenario and other issues

This commit is contained in:
Tig Kindel
2023-02-22 17:56:50 +13:00
parent 674dc9304c
commit 57cd5ff73a
5 changed files with 161 additions and 81 deletions

View File

@@ -103,6 +103,59 @@ namespace Terminal.Gui {
return new Rect (new Point (rect.X + Left, rect.Y + Top), size);
}
/// <summary>
/// Draws the thickness rectangle with an optional diagnostics label.
/// </summary>
/// <param name="rect">The location and size of the rectangle that bounds the thickness rectangle, in
/// screen coordinates.</param>
/// <param name="label">The diagnostics label to draw on the bottom of the <see cref="Bottom"/>.</param>
/// <returns>The inner rectangle remaining to be drawn.</returns>
public Rect Draw (Rect rect, string label = null)
{
// Draw the Top side
for (var r = rect.Y; r < Math.Min (rect.Y + rect.Height, rect.Y + Top); r++) {
for (var c = rect.X; c < rect.X + rect.Width; c++) {
Application.Driver.Move (c, r);
Application.Driver.AddRune (' ');
}
}
// Draw the Left side
for (var r = rect.Y; r < rect.Y + rect.Height; r++) {
for (var c = rect.X; c < Math.Min (rect.X + rect.Width, rect.X + Left); c++) {
Application.Driver.Move (c, r);
Application.Driver.AddRune (' ');
}
}
// Draw the Right side
for (var r = rect.Y; r < rect.Y + rect.Height; r++) {
for (var c = rect.X + Math.Max (0, rect.Width - Right); c < rect.X + rect.Width; c++) {
Application.Driver.Move (c, r);
Application.Driver.AddRune (' ');
}
}
// Draw the Bottom side
for (var r = rect.Y + Math.Max (0, rect.Height - Bottom); r < rect.Y + rect.Height; r++) {
for (var c = rect.X; c < rect.X + rect.Width; c++) {
Application.Driver.Move (c, r);
Application.Driver.AddRune (' ');
}
}
// Draw the diagnostics label on the bottom
var tf = new TextFormatter () {
Text = label == null ? string.Empty : $"{label} {this}",
Alignment = TextAlignment.Centered,
VerticalAlignment = VerticalTextAlignment.Bottom
};
tf.Draw (rect, Application.Driver.CurrentAttribute, Application.Driver.CurrentAttribute);
return GetInnerRect (rect);
}
// TODO: add operator overloads
/// <summary>
/// Gets an empty thickness.

View File

@@ -7,32 +7,33 @@ using Terminal.Gui.Graphs;
namespace Terminal.Gui {
public class Container : View {
public Container ()
public class Frame : View {
public Frame ()
{
IgnoreBorderPropertyOnRedraw = true;
}
public virtual void OnDrawSubViews (Rect clipRect)
{
if (Subviews == null) {
return;
}
// if (Subviews == null) {
// return;
// }
foreach (var view in Subviews) {
// BUGBUG: v2 - shouldn't this be !view.LayoutNeeded? Why draw if layout is going to happen and we'll just draw again?
if (view.LayoutNeeded) {
view.LayoutSubviews ();
}
if ((view.Visible && !view.NeedDisplay.IsEmpty && view.Frame.Width > 0 && view.Frame.Height > 0) || view.ChildNeedsDisplay) {
view.Redraw (view.Bounds);
// foreach (var view in Subviews) {
// // BUGBUG: v2 - shouldn't this be !view.LayoutNeeded? Why draw if layout is going to happen and we'll just draw again?
// if (view.LayoutNeeded) {
// view.LayoutSubviews ();
// }
// if ((view.Visible && !view.NeedDisplay.IsEmpty && view.Frame.Width > 0 && view.Frame.Height > 0) || view.ChildNeedsDisplay) {
// view.Redraw (view.Bounds);
view.NeedDisplay = Rect.Empty;
// BUGBUG - v2 why does this need to be set to false?
// Shouldn't it be set when the subviews draw?
view.ChildNeedsDisplay = false;
}
}
// view.NeedDisplay = Rect.Empty;
// // BUGBUG - v2 why does this need to be set to false?
// // Shouldn't it be set when the subviews draw?
// view.ChildNeedsDisplay = false;
// }
// }
}
@@ -54,25 +55,40 @@ namespace Terminal.Gui {
public override void Redraw (Rect bounds)
{
if (!CanBeVisible (this)) {
return;
}
//OnDrawContent (bounds);
//OnDrawSubViews (bounds);
//OnDrawContentComplete (bounds);
if (ColorScheme != null) {
Driver.SetAttribute (HasFocus ? ColorScheme.Focus : ColorScheme.Normal);
Driver.SetAttribute (ColorScheme.Normal);
}
OnDrawContent (bounds);
OnDrawSubViews (bounds);
OnDrawContentComplete (bounds);
Thickness.Draw (Frame, (string)Data);
//OnDrawContent (bounds);
//if (Text != null) {
// Thickness?.Draw (Frame, $"{Text} {DiagnosticsLabel?.Text}");
//}
if (BorderStyle != BorderStyle.None) {
var lc = new LineCanvas ();
lc.AddLine (Frame.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle);
lc.AddLine (Frame.Location, Frame.Height - 1, Orientation.Vertical, BorderStyle);
lc.AddLine (new Point (Frame.X, Frame.Y + Frame.Height - 1), Frame.Width - 1, Orientation.Horizontal, BorderStyle);
lc.AddLine (new Point (Frame.X + Frame.Width - 1, Frame.Y), Frame.Height - 1, Orientation.Vertical, BorderStyle);
foreach (var p in lc.GenerateImage (Frame)) {
Driver.Move (p.Key.X, p.Key.Y);
Driver.AddRune (p.Value);
}
if (!ustring.IsNullOrEmpty (Title)) {
Driver.DrawWindowTitle (Frame, Title, 0, 0, 0, 0);
}
}
}
}
/// <summary>
/// A <see cref="Container"/> used for the rectangles that compose the outer frames of a <see cref="View"/>.
/// </summary>
public class Frame : Container {
//public Label DiagnosticsLabel { get; set; }
// TODO: v2 = This is teporary; need to also enable (or not) simple way of setting
// other border properties
@@ -100,39 +116,40 @@ namespace Terminal.Gui {
}
}
public override void OnDrawContent (Rect viewport)
{
// do nothing
}
//public override void OnDrawContent (Rect viewport)
//{
// // do nothing
//}
public override void Redraw (Rect bounds)
{
if (ColorScheme != null) {
Driver.SetAttribute (HasFocus ? ColorScheme.Focus : ColorScheme.Normal);
}
//public override void Redraw (Rect bounds)
//{
//if (Text != null) {
// Thickness?.Draw (Frame, $"{Text} {DiagnosticsLabel?.Text}");
//}
if (BorderStyle != BorderStyle.None) {
var lc = new LineCanvas ();
lc.AddLine (Frame.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle);
lc.AddLine (Frame.Location, Frame.Height - 1, Orientation.Vertical, BorderStyle);
// if (ColorScheme != null) {
// Driver.SetAttribute (HasFocus ? ColorScheme.Focus : ColorScheme.Normal);
// }
lc.AddLine (new Point (Frame.X, Frame.Y + Frame.Height - 1), Frame.Width - 1, Orientation.Horizontal, BorderStyle);
lc.AddLine (new Point (Frame.X + Frame.Width - 1, Frame.Y), Frame.Height - 1, Orientation.Vertical, BorderStyle);
foreach (var p in lc.GenerateImage (Frame)) {
Driver.Move (p.Key.X, p.Key.Y);
Driver.AddRune (p.Value);
}
// //if (Text != null) {
// // Thickness?.Draw (Frame, $"{Text} {DiagnosticsLabel?.Text}");
// //}
// if (BorderStyle != BorderStyle.None) {
// var lc = new LineCanvas ();
// lc.AddLine (Frame.Location, Frame.Width - 1, Orientation.Horizontal, BorderStyle);
// lc.AddLine (Frame.Location, Frame.Height - 1, Orientation.Vertical, BorderStyle);
if (!ustring.IsNullOrEmpty (Title)) {
Driver.DrawWindowTitle (Frame, Title, 0, 0, 0, 0);
}
}
// lc.AddLine (new Point (Frame.X, Frame.Y + Frame.Height - 1), Frame.Width - 1, Orientation.Horizontal, BorderStyle);
// lc.AddLine (new Point (Frame.X + Frame.Width - 1, Frame.Y), Frame.Height - 1, Orientation.Vertical, BorderStyle);
// foreach (var p in lc.GenerateImage (Frame)) {
// Driver.Move (p.Key.X, p.Key.Y);
// Driver.AddRune (p.Value);
// }
base.Redraw (bounds);
}
// if (!ustring.IsNullOrEmpty (Title)) {
// Driver.DrawWindowTitle (Frame, Title, 0, 0, 0, 0);
// }
// }
// base.Redraw (bounds);
//}
}
}

View File

@@ -467,15 +467,13 @@ namespace Terminal.Gui {
IgnoreBorderPropertyOnRedraw = true;
Margin?.Dispose ();
Margin = new Frame () {
Data = "Margin",
Thickness = new Thickness (0),
ColorScheme = Colors.ColorSchemes ["Error"]
ColorScheme = SuperView?.ColorScheme ?? ColorScheme
};
//Margin.DiagnosticsLabel.Text = "Margin";
BorderFrame?.Dispose ();
BorderFrame = new Frame () {
Data = "BorderFrame",
BorderStyle = BorderStyle.Single,
Thickness = new Thickness (0),
ColorScheme = ColorScheme
@@ -483,9 +481,8 @@ namespace Terminal.Gui {
Padding?.Dispose ();
Padding = new Frame () {
Data = "Padding",
Thickness = new Thickness (0),
ColorScheme = Colors.ColorSchemes ["Toplevel"]
ColorScheme = ColorScheme
};
}

View File

@@ -10,14 +10,21 @@ namespace UICatalog.Scenarios {
[ScenarioCategory ("Dialogs")]
public class Dialogs : Scenario {
static int CODE_POINT = '你'; // We know this is a wide char
public override void Init (ColorScheme colorScheme)
{
Application.Init ();
Application.Top.ColorScheme = colorScheme;
}
public override void Setup ()
{
var frame = new FrameView ("Dialog Options") {
X = Pos.Center (),
Y = 0,
Width = Dim.Percent (75)
Width = Dim.Percent (75),
Height = 12
};
Win.Add (frame);
Application.Top.Add (frame);
var label = new Label ("width:") {
X = 0,
@@ -27,7 +34,7 @@ namespace UICatalog.Scenarios {
TextAlignment = Terminal.Gui.TextAlignment.Right,
};
frame.Add (label);
var widthEdit = new TextField ("0") {
X = Pos.Right (label) + 1,
Y = Pos.Top (label),
@@ -44,7 +51,7 @@ namespace UICatalog.Scenarios {
TextAlignment = Terminal.Gui.TextAlignment.Right,
};
frame.Add (label);
var heightEdit = new TextField ("0") {
X = Pos.Right (label) + 1,
Y = Pos.Top (label),
@@ -70,7 +77,7 @@ namespace UICatalog.Scenarios {
TextAlignment = Terminal.Gui.TextAlignment.Right,
};
frame.Add (label);
var titleEdit = new TextField ("Title") {
X = Pos.Right (label) + 1,
Y = Pos.Top (label),
@@ -87,7 +94,7 @@ namespace UICatalog.Scenarios {
TextAlignment = Terminal.Gui.TextAlignment.Right,
};
frame.Add (label);
var numButtonsEdit = new TextField ("3") {
X = Pos.Right (label) + 1,
Y = Pos.Top (label),
@@ -109,7 +116,7 @@ namespace UICatalog.Scenarios {
TextAlignment = Terminal.Gui.TextAlignment.Right
};
frame.Add (label);
var styleRadioGroup = new RadioGroup (new ustring [] { "Center", "Justify", "Left", "Right" }) {
X = Pos.Right (label) + 1,
Y = Pos.Top (label),
@@ -118,8 +125,9 @@ namespace UICatalog.Scenarios {
void Top_Loaded ()
{
frame.Height = Dim.Height (widthEdit) + Dim.Height (heightEdit) + Dim.Height (titleEdit)
+ Dim.Height (numButtonsEdit) + Dim.Height (styleRadioGroup) + Dim.Height (glyphsNotWords) + 2;
// BUGBUG: This breaks with v2 ; causes TopologicalSort issue. Not sure why
//frame.Height = Dim.Height (widthEdit) + Dim.Height (heightEdit) + Dim.Height (titleEdit)
// + Dim.Height (numButtonsEdit) + Dim.Height (styleRadioGroup) + Dim.Height (glyphsNotWords) + 2;
Application.Top.Loaded -= Top_Loaded;
}
Application.Top.Loaded += Top_Loaded;
@@ -130,7 +138,7 @@ namespace UICatalog.Scenarios {
Height = 1,
TextAlignment = Terminal.Gui.TextAlignment.Right,
};
Win.Add (label);
Application.Top.Add (label);
var buttonPressedLabel = new Label (" ") {
X = Pos.Center (),
@@ -242,9 +250,9 @@ namespace UICatalog.Scenarios {
buttonPressedLabel.Text = "Invalid Options";
}
};
Win.Add (showDialogButton);
Application.Top.Add (showDialogButton);
Win.Add (buttonPressedLabel);
Application.Top.Add (buttonPressedLabel);
}
}
}

View File

@@ -7,8 +7,7 @@ namespace UICatalog.Scenarios {
public override void Init (ColorScheme colorScheme)
{
Application.Init ();
Application.Top.ColorScheme = Colors.Base;
Application.Top.ColorScheme = colorScheme;
}
public override void Setup ()
@@ -27,11 +26,20 @@ namespace UICatalog.Scenarios {
Width = Dim.Fill (2),
Title = "View2"
};
Application.Top.Add (view2);
view2.EnableFrames ();
view2.Margin.Thickness = new Thickness (2);
view2.Margin.ColorScheme = Colors.ColorSchemes ["Toplevel"];
view2.Margin.Data = "Margin";
view2.BorderFrame.Thickness = new Thickness (2);
view2.BorderFrame.BorderStyle = BorderStyle.Single;
//view2.BorderFrame.ColorScheme = view2.ColorScheme;
view2.BorderFrame.Data = "BorderFrame";
view2.Padding.Thickness = new Thickness (2);
view2.Padding.ColorScheme = Colors.ColorSchemes ["Error"];
view2.Padding.Data = "Padding";
containerLabel.LayoutComplete += (a) => {
containerLabel.Text = $"Container.Frame: {Application.Top.Frame} .Bounds: {Application.Top.Bounds}\nView2.Frame: {view2.Frame} .Bounds: {view2.Bounds}";
@@ -110,9 +118,6 @@ namespace UICatalog.Scenarios {
};
edit.X = 0;
view2.Add (edit);
Application.Top.Add (view2);
}
}
}