123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- using System.Collections.Generic;
- using System.Globalization;
- using System.Threading;
- using Terminal.Gui;
- namespace UICatalog.Scenarios {
- [ScenarioMetadata (Name: "ContextMenus", Description: "Context Menu Sample")]
- [ScenarioCategory ("Menu"), ScenarioCategory ("ContextMenu")]
- public class ContextMenus : Scenario {
- private ContextMenu contextMenu = new ContextMenu ();
- private readonly List<CultureInfo> cultureInfos = Application.SupportedCultures;
- private MenuItem miForceMinimumPosToZero;
- private bool forceMinimumPosToZero = true;
- private TextField tfTopLeft, tfTopRight, tfMiddle, tfBottomLeft, tfBottomRight;
- private MenuItem miUseSubMenusSingleFrame;
- private bool useSubMenusSingleFrame;
- public override void Setup ()
- {
- var text = "Context Menu";
- var width = 20;
- Win.Add (new Label ("Press 'Ctrl + Space' to open the Window context menu.") {
- X = Pos.Center (),
- Y = 1
- });
- tfTopLeft = new TextField (text) {
- Width = width
- };
- Win.Add (tfTopLeft);
- tfTopRight = new TextField (text) {
- X = Pos.AnchorEnd (width),
- Width = width
- };
- Win.Add (tfTopRight);
- tfMiddle = new TextField (text) {
- X = Pos.Center (),
- Y = Pos.Center (),
- Width = width
- };
- Win.Add (tfMiddle);
- tfBottomLeft = new TextField (text) {
- Y = Pos.AnchorEnd (1),
- Width = width
- };
- Win.Add (tfBottomLeft);
- tfBottomRight = new TextField (text) {
- X = Pos.AnchorEnd (width),
- Y = Pos.AnchorEnd (1),
- Width = width
- };
- Win.Add (tfBottomRight);
- Point mousePos = default;
- Win.KeyPress += (e) => {
- if (e.KeyEvent.Key == (Key.Space | Key.CtrlMask)) {
- ShowContextMenu (mousePos.X, mousePos.Y);
- e.Handled = true;
- }
- };
- Win.MouseClick += (e) => {
- if (e.MouseEvent.Flags == contextMenu.MouseFlags) {
- ShowContextMenu (e.MouseEvent.X, e.MouseEvent.Y);
- e.Handled = true;
- }
- };
- Application.RootMouseEvent += Application_RootMouseEvent;
- void Application_RootMouseEvent (MouseEvent me)
- {
- mousePos = new Point (me.X, me.Y);
- }
- Win.WantMousePositionReports = true;
- Top.Closed += (_) => {
- Thread.CurrentThread.CurrentUICulture = new CultureInfo ("en-US");
- Application.RootMouseEvent -= Application_RootMouseEvent;
- };
- }
- private void ShowContextMenu (int x, int y)
- {
- contextMenu = new ContextMenu (x, y,
- new MenuBarItem (new MenuItem [] {
- new MenuItem ("_Configuration", "Show configuration", () => MessageBox.Query (50, 5, "Info", "This would open settings dialog", "Ok")),
- new MenuBarItem ("More options", new MenuItem [] {
- new MenuItem ("_Setup", "Change settings", () => MessageBox.Query (50, 5, "Info", "This would open setup dialog", "Ok")),
- new MenuItem ("_Maintenance", "Maintenance mode", () => MessageBox.Query (50, 5, "Info", "This would open maintenance dialog", "Ok")),
- }),
- new MenuBarItem ("_Languages", GetSupportedCultures ()),
- miForceMinimumPosToZero = new MenuItem ("ForceMinimumPosToZero", "", () => {
- miForceMinimumPosToZero.Checked = forceMinimumPosToZero = !forceMinimumPosToZero;
- tfTopLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfTopRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfMiddle.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfBottomLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfBottomRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- }) { CheckType = MenuItemCheckStyle.Checked, Checked = forceMinimumPosToZero },
- miUseSubMenusSingleFrame = new MenuItem ("Use_SubMenusSingleFrame", "",
- () => contextMenu.UseSubMenusSingleFrame = miUseSubMenusSingleFrame.Checked = useSubMenusSingleFrame = !useSubMenusSingleFrame) {
- CheckType = MenuItemCheckStyle.Checked, Checked = useSubMenusSingleFrame
- },
- null,
- new MenuItem ("_Quit", "", () => Application.RequestStop ())
- })
- ) { ForceMinimumPosToZero = forceMinimumPosToZero, UseSubMenusSingleFrame = useSubMenusSingleFrame };
- tfTopLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfTopRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfMiddle.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfBottomLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- tfBottomRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
- contextMenu.Show ();
- }
- private MenuItem [] GetSupportedCultures ()
- {
- List<MenuItem> supportedCultures = new List<MenuItem> ();
- var index = -1;
- foreach (var c in cultureInfos) {
- var culture = new MenuItem {
- CheckType = MenuItemCheckStyle.Checked
- };
- if (index == -1) {
- culture.Title = "_English";
- culture.Help = "en-US";
- culture.Checked = Thread.CurrentThread.CurrentUICulture.Name == "en-US";
- CreateAction (supportedCultures, culture);
- supportedCultures.Add (culture);
- index++;
- culture = new MenuItem {
- CheckType = MenuItemCheckStyle.Checked
- };
- }
- culture.Title = $"_{c.Parent.EnglishName}";
- culture.Help = c.Name;
- culture.Checked = Thread.CurrentThread.CurrentUICulture.Name == c.Name;
- CreateAction (supportedCultures, culture);
- supportedCultures.Add (culture);
- }
- return supportedCultures.ToArray ();
- void CreateAction (List<MenuItem> supportedCultures, MenuItem culture)
- {
- culture.Action += () => {
- Thread.CurrentThread.CurrentUICulture = new CultureInfo (culture.Help.ToString ());
- culture.Checked = true;
- foreach (var item in supportedCultures) {
- item.Checked = item.Help.ToString () == Thread.CurrentThread.CurrentUICulture.Name;
- }
- };
- }
- }
- }
- }
|