123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- 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<ASCIICustomButton> 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<Button> buttons;
- private const int BUTTONS_ON_PAGE = 7;
- private const int BUTTON_HEIGHT = 3;
- private ScrollView scrollView;
- private ASCIICustomButton selected;
- public ScrollViewTestWindow ()
- {
- Title = "ScrollViewTestWindow";
- Label titleLabel = null;
- if (smallerWindow) {
- Width = 80;
- Height = 25;
- scrollView = new ScrollView () {
- X = 3,
- Y = 1,
- Width = 24,
- Height = BUTTONS_ON_PAGE * BUTTON_HEIGHT,
- ShowVerticalScrollIndicator = true,
- ShowHorizontalScrollIndicator = false
- };
- } else {
- Width = Dim.Fill ();
- Height = Dim.Fill ();
- titleLabel = new Label ("DOCUMENTS") {
- X = 0,
- Y = 0
- };
- scrollView = new ScrollView () {
- X = 0,
- Y = 1,
- Width = 27,
- Height = BUTTONS_ON_PAGE * BUTTON_HEIGHT,
- ShowVerticalScrollIndicator = true,
- ShowHorizontalScrollIndicator = false
- };
- }
- scrollView.ClearKeybindings ();
- buttons = new List<Button> ();
- Button prevButton = null;
- int count = 20;
- for (int j = 0; j < count; j++) {
- Pos yPos = prevButton == null ? 0 : Pos.Bottom (prevButton);
- var button = new ASCIICustomButton (j.ToString (), $"section {j}", 0, yPos, 25, BUTTON_HEIGHT);
- button.Id = $"button{j}";
- button.Clicked += Button_Clicked;
- button.PointerEnter += Button_PointerEnter;
- button.MouseClick += Button_MouseClick;
- button.KeyPress += Button_KeyPress;
- scrollView.Add (button);
- buttons.Add (button);
- prevButton = button;
- }
- var closeButton = new ASCIICustomButton ("close", "Close", 0, Pos.Bottom (prevButton), 25, BUTTON_HEIGHT);
- closeButton.Clicked += Button_Clicked;
- closeButton.PointerEnter += Button_PointerEnter;
- closeButton.MouseClick += Button_MouseClick;
- closeButton.KeyPress += Button_KeyPress;
- scrollView.Add (closeButton);
- buttons.Add (closeButton);
- var pages = buttons.Count / BUTTONS_ON_PAGE;
- if (buttons.Count % BUTTONS_ON_PAGE > 0)
- pages++;
- scrollView.ContentSize = new Size (25, pages * BUTTONS_ON_PAGE * BUTTON_HEIGHT);
- if (smallerWindow) {
- Add (scrollView);
- } else {
- Add (titleLabel, scrollView);
- }
- }
- private void Button_KeyPress (KeyEventEventArgs obj)
- {
- switch (obj.KeyEvent.Key) {
- case Key.End:
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- -(scrollView.ContentSize.Height - scrollView.Frame.Height
- + (scrollView.ShowHorizontalScrollIndicator ? 1 : 0)));
- obj.Handled = true;
- return;
- case Key.Home:
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X, 0);
- obj.Handled = true;
- return;
- case Key.PageDown:
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- Math.Max (scrollView.ContentOffset.Y - scrollView.Frame.Height,
- -(scrollView.ContentSize.Height - scrollView.Frame.Height
- + (scrollView.ShowHorizontalScrollIndicator ? 1 : 0))));
- obj.Handled = true;
- return;
- case Key.PageUp:
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- Math.Min (scrollView.ContentOffset.Y + scrollView.Frame.Height, 0));
- obj.Handled = true;
- return;
- }
- }
- private void Button_MouseClick (MouseEventArgs obj)
- {
- if (obj.MouseEvent.Flags == MouseFlags.WheeledDown) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- scrollView.ContentOffset.Y - BUTTON_HEIGHT);
- obj.Handled = true;
- } else if (obj.MouseEvent.Flags == MouseFlags.WheeledUp) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- Math.Min (scrollView.ContentOffset.Y + BUTTON_HEIGHT, 0));
- obj.Handled = true;
- }
- }
- private void Button_Clicked ()
- {
- MessageBox.Query ("Button clicked.", $"'{selected.Text}' clicked!", "Ok");
- if (selected.Text == "Close") {
- Application.RequestStop ();
- }
- }
- private void Button_PointerEnter (ASCIICustomButton obj)
- {
- bool? moveDown;
- if (obj.Frame.Y > selected?.Frame.Y) {
- moveDown = true;
- } else if (obj.Frame.Y < selected?.Frame.Y) {
- moveDown = false;
- } else {
- moveDown = null;
- }
- var offSet = selected != null ? obj.Frame.Y - selected.Frame.Y + (-scrollView.ContentOffset.Y % BUTTON_HEIGHT) : 0;
- selected = obj;
- if (moveDown == true && selected.Frame.Y + scrollView.ContentOffset.Y + BUTTON_HEIGHT >= scrollView.Frame.Height && offSet != BUTTON_HEIGHT) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- Math.Min (scrollView.ContentOffset.Y - BUTTON_HEIGHT, -(selected.Frame.Y - scrollView.Frame.Height + BUTTON_HEIGHT)));
- } else if (moveDown == true && selected.Frame.Y + scrollView.ContentOffset.Y >= scrollView.Frame.Height) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- scrollView.ContentOffset.Y - BUTTON_HEIGHT);
- } else if (moveDown == true && selected.Frame.Y + scrollView.ContentOffset.Y < 0) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- -selected.Frame.Y);
- } else if (moveDown == false && selected.Frame.Y < -scrollView.ContentOffset.Y) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- Math.Max (scrollView.ContentOffset.Y + BUTTON_HEIGHT, selected.Frame.Y));
- } else if (moveDown == false && selected.Frame.Y + scrollView.ContentOffset.Y > scrollView.Frame.Height) {
- scrollView.ContentOffset = new Point (scrollView.ContentOffset.X,
- -(selected.Frame.Y - scrollView.Frame.Height + BUTTON_HEIGHT));
- }
- }
- }
- }
- }
|