123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Text;
- using Terminal.Gui;
- namespace UICatalog.Scenarios;
- [ScenarioMetadata ("ASCIICustomButtonTest", "ASCIICustomButton sample")]
- [ScenarioCategory ("Controls")]
- public class ASCIICustomButtonTest : Scenario
- {
- private static bool _smallerWindow;
- private MenuItem _miSmallerWindow;
- private ScrollViewTestWindow _scrollViewTestWindow;
- public override void Init ()
- {
- Application.Init ();
- _scrollViewTestWindow = new ScrollViewTestWindow ();
- var menu = new MenuBar
- {
- Menus =
- [
- new MenuBarItem (
- "Window Size",
- new []
- {
- _miSmallerWindow =
- new MenuItem (
- "Smaller Window",
- "",
- ChangeWindowSize
- )
- {
- CheckType = MenuItemCheckStyle
- .Checked
- },
- null,
- new MenuItem (
- "Quit",
- "",
- () => Application.RequestStop (),
- null,
- null,
- (KeyCode)Application.QuitKey
- )
- }
- )
- ]
- };
- Application.Top.Add (menu, _scrollViewTestWindow);
- Application.Run ();
- }
- public override void Run () { }
- private void ChangeWindowSize ()
- {
- _smallerWindow = (bool)(_miSmallerWindow.Checked = !_miSmallerWindow.Checked);
- _scrollViewTestWindow.Dispose ();
- Application.Top.Remove (_scrollViewTestWindow);
- _scrollViewTestWindow = new ScrollViewTestWindow ();
- Application.Top.Add (_scrollViewTestWindow);
- }
- public class ASCIICustomButton : Button
- {
- private FrameView _border;
- private Label _fill;
- public string Description => $"Description of: {Id}";
- public void CustomInitialize ()
- {
- _border = new FrameView { Width = Width, Height = Height };
- AutoSize = false;
- var fillText = new StringBuilder ();
- for (var i = 0; i < Bounds.Height; i++)
- {
- if (i > 0)
- {
- fillText.AppendLine ("");
- }
- for (var j = 0; j < Bounds.Width; j++)
- {
- fillText.Append ("█");
- }
- }
- _fill = new Label { Visible = false, CanFocus = false, Text = fillText.ToString () };
- var title = new Label { X = Pos.Center (), Y = Pos.Center (), Text = Text };
- _border.MouseClick += This_MouseClick;
- _fill.MouseClick += This_MouseClick;
- title.MouseClick += This_MouseClick;
- Add (_border, _fill, title);
- }
- 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 event Action<ASCIICustomButton> PointerEnter;
- private void This_MouseClick (object sender, MouseEventEventArgs obj) { OnMouseEvent (obj.MouseEvent); }
- }
- public class ScrollViewTestWindow : Window
- {
- private const int BUTTON_HEIGHT = 3;
- private const int BUTTON_WIDTH = 25;
- private const int BUTTONS_ON_PAGE = 7;
- private readonly List<Button> _buttons;
- private readonly 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 { X = 0, Y = 0, Text = "DOCUMENTS" };
- _scrollView = new ScrollView
- {
- X = 0,
- Y = 1,
- Width = 27,
- Height = BUTTONS_ON_PAGE * BUTTON_HEIGHT,
- ShowVerticalScrollIndicator = true,
- ShowHorizontalScrollIndicator = false
- };
- }
- _scrollView.KeyBindings.Clear ();
- _buttons = new List<Button> ();
- Button prevButton = null;
- var count = 20;
- for (var j = 0; j < count; j++)
- {
- Pos yPos = prevButton == null ? 0 : Pos.Bottom (prevButton);
- var button = new ASCIICustomButton
- {
- AutoSize = false,
- Id = j.ToString (),
- Text = $"section {j}",
- Y = yPos,
- Width = BUTTON_WIDTH,
- Height = BUTTON_HEIGHT
- };
- button.CustomInitialize ();
- button.Accept += Button_Clicked;
- button.PointerEnter += Button_PointerEnter;
- button.MouseClick += Button_MouseClick;
- button.KeyDown += Button_KeyPress;
- _scrollView.Add (button);
- _buttons.Add (button);
- prevButton = button;
- }
- var closeButton = new ASCIICustomButton
- {
- AutoSize = false,
- Id = "close",
- Text = "Close",
- Y = Pos.Bottom (prevButton),
- Width = BUTTON_WIDTH,
- Height = BUTTON_HEIGHT
- };
- closeButton.CustomInitialize ();
- closeButton.Accept += Button_Clicked;
- closeButton.PointerEnter += Button_PointerEnter;
- closeButton.MouseClick += Button_MouseClick;
- closeButton.KeyDown += Button_KeyPress;
- _scrollView.Add (closeButton);
- _buttons.Add (closeButton);
- int pages = _buttons.Count / BUTTONS_ON_PAGE;
- if (_buttons.Count % BUTTONS_ON_PAGE > 0)
- {
- pages++;
- }
- _scrollView.ContentSize = new (25, pages * BUTTONS_ON_PAGE * BUTTON_HEIGHT);
- if (_smallerWindow)
- {
- Add (_scrollView);
- }
- else
- {
- Add (titleLabel, _scrollView);
- }
- }
- private void Button_Clicked (object sender, EventArgs e)
- {
- MessageBox.Query ("Button clicked.", $"'{_selected.Text}' clicked!", "Ok");
- if (_selected.Text == "Close")
- {
- Application.RequestStop ();
- }
- }
- private void Button_KeyPress (object sender, Key obj)
- {
- switch (obj.KeyCode)
- {
- case KeyCode.End:
- _scrollView.ContentOffset = new Point (
- _scrollView.ContentOffset.X,
- -(_scrollView.ContentSize.Height
- - _scrollView.Frame.Height
- + (_scrollView.ShowHorizontalScrollIndicator ? 1 : 0))
- );
- obj.Handled = true;
- return;
- case KeyCode.Home:
- _scrollView.ContentOffset = new Point (_scrollView.ContentOffset.X, 0);
- obj.Handled = true;
- return;
- case KeyCode.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 KeyCode.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 (object sender, MouseEventEventArgs 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_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;
- }
- int 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)
- );
- }
- }
- }
- }
|