InteractiveTree.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System.Linq;
  2. using Terminal.Gui;
  3. namespace UICatalog.Scenarios;
  4. [ScenarioMetadata ("Interactive Tree", "Create nodes and child nodes in TreeView.")]
  5. [ScenarioCategory ("Controls")]
  6. [ScenarioCategory ("TreeView")]
  7. public class InteractiveTree : Scenario
  8. {
  9. private TreeView _treeView;
  10. public override void Setup ()
  11. {
  12. Win.Title = GetName ();
  13. Win.Y = 1; // menu
  14. Win.Height = Dim.Fill (1); // status bar
  15. var menu = new MenuBar
  16. {
  17. Menus =
  18. [
  19. new MenuBarItem ("_File", new MenuItem [] { new ("_Quit", "", Quit) })
  20. ]
  21. };
  22. Top.Add (menu);
  23. _treeView = new TreeView { X = 0, Y = 0, Width = Dim.Fill (), Height = Dim.Fill (1) };
  24. _treeView.KeyDown += TreeView_KeyPress;
  25. Win.Add (_treeView);
  26. var statusBar = new StatusBar (
  27. new StatusItem []
  28. {
  29. new (
  30. Application.QuitKey,
  31. $"{Application.QuitKey} to Quit",
  32. Quit
  33. ),
  34. new (
  35. KeyCode.CtrlMask | KeyCode.C,
  36. "~^C~ Add Child",
  37. AddChildNode
  38. ),
  39. new (
  40. KeyCode.CtrlMask | KeyCode.T,
  41. "~^T~ Add Root",
  42. AddRootNode
  43. ),
  44. new (
  45. KeyCode.CtrlMask | KeyCode.R,
  46. "~^R~ Rename Node",
  47. RenameNode
  48. )
  49. }
  50. );
  51. Top.Add (statusBar);
  52. }
  53. private void AddChildNode ()
  54. {
  55. ITreeNode node = _treeView.SelectedObject;
  56. if (node != null)
  57. {
  58. if (GetText ("Text", "Enter text for node:", "", out string entered))
  59. {
  60. node.Children.Add (new TreeNode (entered));
  61. _treeView.RefreshObject (node);
  62. }
  63. }
  64. }
  65. private void AddRootNode ()
  66. {
  67. if (GetText ("Text", "Enter text for node:", "", out string entered))
  68. {
  69. _treeView.AddObject (new TreeNode (entered));
  70. }
  71. }
  72. private bool GetText (string title, string label, string initialText, out string enteredText)
  73. {
  74. var okPressed = false;
  75. var ok = new Button { Text = "Ok", IsDefault = true };
  76. ok.Accept += (s, e) =>
  77. {
  78. okPressed = true;
  79. Application.RequestStop ();
  80. };
  81. var cancel = new Button { Text = "Cancel" };
  82. cancel.Accept += (s, e) => Application.RequestStop ();
  83. var d = new Dialog { Title = title, Buttons = [ok, cancel] };
  84. var lbl = new Label { X = 0, Y = 1, Text = label };
  85. var tf = new TextField { Text = initialText, X = 0, Y = 2, Width = Dim.Fill () };
  86. d.Add (lbl, tf);
  87. tf.SetFocus ();
  88. Application.Run (d);
  89. d.Dispose ();
  90. enteredText = okPressed ? tf.Text : null;
  91. return okPressed;
  92. }
  93. private void Quit () { Application.RequestStop (); }
  94. private void RenameNode ()
  95. {
  96. ITreeNode node = _treeView.SelectedObject;
  97. if (node != null)
  98. {
  99. if (GetText ("Text", "Enter text for node:", node.Text, out string entered))
  100. {
  101. node.Text = entered;
  102. _treeView.RefreshObject (node);
  103. }
  104. }
  105. }
  106. private void TreeView_KeyPress (object sender, Key obj)
  107. {
  108. if (obj.KeyCode == KeyCode.Delete)
  109. {
  110. ITreeNode toDelete = _treeView.SelectedObject;
  111. if (toDelete == null)
  112. {
  113. return;
  114. }
  115. obj.Handled = true;
  116. // if it is a root object remove it
  117. if (_treeView.Objects.Contains (toDelete))
  118. {
  119. _treeView.Remove (toDelete);
  120. }
  121. else
  122. {
  123. ITreeNode parent = _treeView.GetParent (toDelete);
  124. if (parent == null)
  125. {
  126. MessageBox.ErrorQuery (
  127. "Could not delete",
  128. $"Parent of '{toDelete}' was unexpectedly null",
  129. "Ok"
  130. );
  131. }
  132. else
  133. {
  134. //update the model
  135. parent.Children.Remove (toDelete);
  136. //refresh the tree
  137. _treeView.RefreshObject (parent);
  138. }
  139. }
  140. }
  141. }
  142. }