diff --git a/Terminal.Gui/Core/TextFormatter.cs b/Terminal.Gui/Core/TextFormatter.cs index 50fc9f5ae..2e5c84ebe 100644 --- a/Terminal.Gui/Core/TextFormatter.cs +++ b/Terminal.Gui/Core/TextFormatter.cs @@ -1190,7 +1190,9 @@ namespace Terminal.Gui { for (int line = 0; line < linesFormated.Count; line++) { if ((isVertical && line > bounds.Width) || (!isVertical && line > bounds.Height)) continue; - if ((isVertical && line > maxBounds.Left + maxBounds.Width - bounds.X) || (!isVertical && line > maxBounds.Top + maxBounds.Height - bounds.Y)) + if ((isVertical && line >= maxBounds.Left + maxBounds.Width - 1) + || (!isVertical && line >= maxBounds.Top + maxBounds.Height - 1)) + break; var runes = lines [line].ToRunes (); diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index 96f58b217..adf368c81 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -1105,15 +1105,8 @@ namespace Terminal.Gui { /// public void Clear () { - Rect containerBounds = GetContainerBounds (); - Rect viewBounds = Bounds; - if (!containerBounds.IsEmpty) { - viewBounds.Width = Math.Min (viewBounds.Width, containerBounds.Width); - viewBounds.Height = Math.Min (viewBounds.Height, containerBounds.Height); - } - - var h = viewBounds.Height; - var w = viewBounds.Width; + var h = Frame.Height; + var w = Frame.Width; for (var line = 0; line < h; line++) { Move (0, line); for (var col = 0; col < w; col++) @@ -1525,13 +1518,13 @@ namespace Terminal.Gui { } if (!ustring.IsNullOrEmpty (TextFormatter.Text)) { - Clear (); + Rect containerBounds = GetContainerBounds (); + Clear (ViewToScreen (GetNeedDisplay (containerBounds))); SetChildNeedsDisplay (); // Draw any Text if (TextFormatter != null) { TextFormatter.NeedsFormat = true; } - Rect containerBounds = GetContainerBounds (); TextFormatter?.Draw (ViewToScreen (Bounds), HasFocus ? ColorScheme.Focus : GetNormalColor (), HasFocus ? ColorScheme.HotFocus : Enabled ? ColorScheme.HotNormal : ColorScheme.Disabled, containerBounds); @@ -1569,6 +1562,17 @@ namespace Terminal.Gui { ClearNeedsDisplay (); } + Rect GetNeedDisplay (Rect containerBounds) + { + Rect rect = NeedDisplay; + if (!containerBounds.IsEmpty) { + rect.Width = Math.Min (NeedDisplay.Width, containerBounds.Width); + rect.Height = Math.Min (NeedDisplay.Height, containerBounds.Height); + } + + return rect; + } + Rect GetContainerBounds () { var containerBounds = SuperView == null ? default : SuperView.ViewToScreen (SuperView.Bounds); diff --git a/UICatalog/Scenarios/ASCIICustomButton.cs b/UICatalog/Scenarios/ASCIICustomButton.cs new file mode 100644 index 000000000..77cacf8b9 --- /dev/null +++ b/UICatalog/Scenarios/ASCIICustomButton.cs @@ -0,0 +1,313 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Terminal.Gui; + +namespace UICatalog.Scenarios { + [ScenarioMetadata (Name: "ASCIICustomButtonTest", Description: "ASCIICustomButton sample")] + [ScenarioCategory ("Controls")] + public class ASCIICustomButtonTest : Scenario { + private static bool smallerWindow; + private ScrollViewTestWindow scrollViewTestWindow; + private MenuItem miSmallerWindow; + + public override void Init (ColorScheme colorScheme) + { + Application.Init (); + scrollViewTestWindow = new ScrollViewTestWindow (); + var menu = new MenuBar (new MenuBarItem [] { + new MenuBarItem("Window Size", new MenuItem [] { + miSmallerWindow = new MenuItem ("Smaller Window", "", ChangeWindowSize) { + CheckType = MenuItemCheckStyle.Checked + }, + null, + new MenuItem("Quit", "",() => Application.RequestStop(),null,null, Key.Q | Key.CtrlMask) + }) + }); + Application.Top.Add (menu, scrollViewTestWindow); + Application.Run (); + } + + private void ChangeWindowSize () + { + smallerWindow = miSmallerWindow.Checked = !miSmallerWindow.Checked; + scrollViewTestWindow.Dispose (); + Application.Top.Remove (scrollViewTestWindow); + scrollViewTestWindow = new ScrollViewTestWindow (); + Application.Top.Add (scrollViewTestWindow); + } + + public override void Run () + { + } + + public class ASCIICustomButton : Button { + public string Description => $"Description of: {id}"; + + public event Action PointerEnter; + + private Label fill; + private FrameView border; + private string id; + + public ASCIICustomButton (string text, Pos x, Pos y, int width, int height) : base (text) + { + CustomInitialize ("", text, x, y, width, height); + } + + public ASCIICustomButton (string id, string text, Pos x, Pos y, int width, int height) : base (text) + { + CustomInitialize (id, text, x, y, width, height); + } + + private void CustomInitialize (string id, string text, Pos x, Pos y, int width, int height) + { + this.id = id; + X = x; + Y = y; + + Frame = new Rect { + Width = width, + Height = height + }; + + border = new FrameView () { + Width = width, + Height = height + }; + + AutoSize = false; + + var fillText = new System.Text.StringBuilder (); + for (int i = 0; i < Bounds.Height; i++) { + if (i > 0) { + fillText.AppendLine (""); + } + for (int j = 0; j < Bounds.Width; j++) { + fillText.Append ("█"); + } + } + + fill = new Label (fillText.ToString ()) { + Visible = false, + CanFocus = false + }; + + var title = new Label (text) { + X = Pos.Center (), + Y = Pos.Center (), + }; + + border.MouseClick += This_MouseClick; + border.Subviews [0].MouseClick += This_MouseClick; + fill.MouseClick += This_MouseClick; + title.MouseClick += This_MouseClick; + + Add (border, fill, title); + } + + private void This_MouseClick (MouseEventArgs obj) + { + OnMouseEvent (obj.MouseEvent); + } + + public override bool OnMouseEvent (MouseEvent mouseEvent) + { + Debug.WriteLine ($"{mouseEvent.Flags}"); + if (mouseEvent.Flags == MouseFlags.Button1Clicked) { + if (!HasFocus && SuperView != null) { + if (!SuperView.HasFocus) { + SuperView.SetFocus (); + } + SetFocus (); + SetNeedsDisplay (); + } + + OnClicked (); + return true; + } + return base.OnMouseEvent (mouseEvent); + } + + public override bool OnEnter (View view) + { + border.Visible = false; + fill.Visible = true; + PointerEnter.Invoke (this); + view = this; + return base.OnEnter (view); + } + + public override bool OnLeave (View view) + { + border.Visible = true; + fill.Visible = false; + if (view == null) + view = this; + return base.OnLeave (view); + } + } + + public class ScrollViewTestWindow : Window { + private List