ContextMenus.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using System.Collections.Generic;
  2. using System.Globalization;
  3. using System.Threading;
  4. using Terminal.Gui;
  5. namespace UICatalog.Scenarios {
  6. [ScenarioMetadata (Name: "ContextMenus", Description: "Context Menu Sample")]
  7. [ScenarioCategory ("Menu"), ScenarioCategory ("ContextMenu")]
  8. public class ContextMenus : Scenario {
  9. private ContextMenu contextMenu = new ContextMenu ();
  10. private readonly List<CultureInfo> cultureInfos = Application.SupportedCultures;
  11. private MenuItem miForceMinimumPosToZero;
  12. private bool forceMinimumPosToZero = true;
  13. private TextField tfTopLeft, tfTopRight, tfMiddle, tfBottomLeft, tfBottomRight;
  14. private MenuItem miUseSubMenusSingleFrame;
  15. private bool useSubMenusSingleFrame;
  16. public override void Setup ()
  17. {
  18. var text = "Context Menu";
  19. var width = 20;
  20. Win.Add (new Label ("Press 'Ctrl + Space' to open the Window context menu.") {
  21. X = Pos.Center (),
  22. Y = 1
  23. });
  24. tfTopLeft = new TextField (text) {
  25. Width = width
  26. };
  27. Win.Add (tfTopLeft);
  28. tfTopRight = new TextField (text) {
  29. X = Pos.AnchorEnd (width),
  30. Width = width
  31. };
  32. Win.Add (tfTopRight);
  33. tfMiddle = new TextField (text) {
  34. X = Pos.Center (),
  35. Y = Pos.Center (),
  36. Width = width
  37. };
  38. Win.Add (tfMiddle);
  39. tfBottomLeft = new TextField (text) {
  40. Y = Pos.AnchorEnd (1),
  41. Width = width
  42. };
  43. Win.Add (tfBottomLeft);
  44. tfBottomRight = new TextField (text) {
  45. X = Pos.AnchorEnd (width),
  46. Y = Pos.AnchorEnd (1),
  47. Width = width
  48. };
  49. Win.Add (tfBottomRight);
  50. Point mousePos = default;
  51. Win.KeyPress += (e) => {
  52. if (e.KeyEvent.Key == (Key.Space | Key.CtrlMask)) {
  53. ShowContextMenu (mousePos.X, mousePos.Y);
  54. e.Handled = true;
  55. }
  56. };
  57. Win.MouseClick += (e) => {
  58. if (e.MouseEvent.Flags == contextMenu.MouseFlags) {
  59. ShowContextMenu (e.MouseEvent.X, e.MouseEvent.Y);
  60. e.Handled = true;
  61. }
  62. };
  63. Application.RootMouseEvent += Application_RootMouseEvent;
  64. void Application_RootMouseEvent (MouseEvent me)
  65. {
  66. mousePos = new Point (me.X, me.Y);
  67. }
  68. Win.WantMousePositionReports = true;
  69. Top.Closed += (_) => {
  70. Thread.CurrentThread.CurrentUICulture = new CultureInfo ("en-US");
  71. Application.RootMouseEvent -= Application_RootMouseEvent;
  72. };
  73. }
  74. private void ShowContextMenu (int x, int y)
  75. {
  76. contextMenu = new ContextMenu (x, y,
  77. new MenuBarItem (new MenuItem [] {
  78. new MenuItem ("_Configuration", "Show configuration", () => MessageBox.Query (50, 5, "Info", "This would open settings dialog", "Ok")),
  79. new MenuBarItem ("More options", new MenuItem [] {
  80. new MenuItem ("_Setup", "Change settings", () => MessageBox.Query (50, 5, "Info", "This would open setup dialog", "Ok")),
  81. new MenuItem ("_Maintenance", "Maintenance mode", () => MessageBox.Query (50, 5, "Info", "This would open maintenance dialog", "Ok")),
  82. }),
  83. new MenuBarItem ("_Languages", GetSupportedCultures ()),
  84. miForceMinimumPosToZero = new MenuItem ("ForceMinimumPosToZero", "", () => {
  85. miForceMinimumPosToZero.Checked = forceMinimumPosToZero = !forceMinimumPosToZero;
  86. tfTopLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  87. tfTopRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  88. tfMiddle.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  89. tfBottomLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  90. tfBottomRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  91. }) { CheckType = MenuItemCheckStyle.Checked, Checked = forceMinimumPosToZero },
  92. miUseSubMenusSingleFrame = new MenuItem ("Use_SubMenusSingleFrame", "",
  93. () => contextMenu.UseSubMenusSingleFrame = miUseSubMenusSingleFrame.Checked = useSubMenusSingleFrame = !useSubMenusSingleFrame) {
  94. CheckType = MenuItemCheckStyle.Checked, Checked = useSubMenusSingleFrame
  95. },
  96. null,
  97. new MenuItem ("_Quit", "", () => Application.RequestStop ())
  98. })
  99. ) { ForceMinimumPosToZero = forceMinimumPosToZero, UseSubMenusSingleFrame = useSubMenusSingleFrame };
  100. tfTopLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  101. tfTopRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  102. tfMiddle.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  103. tfBottomLeft.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  104. tfBottomRight.ContextMenu.ForceMinimumPosToZero = forceMinimumPosToZero;
  105. contextMenu.Show ();
  106. }
  107. private MenuItem [] GetSupportedCultures ()
  108. {
  109. List<MenuItem> supportedCultures = new List<MenuItem> ();
  110. var index = -1;
  111. foreach (var c in cultureInfos) {
  112. var culture = new MenuItem {
  113. CheckType = MenuItemCheckStyle.Checked
  114. };
  115. if (index == -1) {
  116. culture.Title = "_English";
  117. culture.Help = "en-US";
  118. culture.Checked = Thread.CurrentThread.CurrentUICulture.Name == "en-US";
  119. CreateAction (supportedCultures, culture);
  120. supportedCultures.Add (culture);
  121. index++;
  122. culture = new MenuItem {
  123. CheckType = MenuItemCheckStyle.Checked
  124. };
  125. }
  126. culture.Title = $"_{c.Parent.EnglishName}";
  127. culture.Help = c.Name;
  128. culture.Checked = Thread.CurrentThread.CurrentUICulture.Name == c.Name;
  129. CreateAction (supportedCultures, culture);
  130. supportedCultures.Add (culture);
  131. }
  132. return supportedCultures.ToArray ();
  133. void CreateAction (List<MenuItem> supportedCultures, MenuItem culture)
  134. {
  135. culture.Action += () => {
  136. Thread.CurrentThread.CurrentUICulture = new CultureInfo (culture.Help.ToString ());
  137. culture.Checked = true;
  138. foreach (var item in supportedCultures) {
  139. item.Checked = item.Help.ToString () == Thread.CurrentThread.CurrentUICulture.Name;
  140. }
  141. };
  142. }
  143. }
  144. }
  145. }