InteractiveTree.cs 5.2 KB

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