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 () { 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, Application.QuitKey) }) }); Application.Top.Add (menu, _scrollViewTestWindow); Application.Run (); } private void ChangeWindowSize () { _smallerWindow = (bool)(_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; // BUGBUG: v2 This uses internal knowledge of FrameView an breaks in v2 where FrameView does not have a ContentView //border.Subviews [0].MouseClick += This_MouseClick; fill.MouseClick += This_MouseClick; title.MouseClick += This_MouseClick; Add (border, fill, title); } private void This_MouseClick (object sender, MouseEventEventArgs 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