TreeUseCases.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using Terminal.Gui;
  6. using Terminal.Gui.Trees;
  7. namespace UICatalog.Scenarios {
  8. [ScenarioMetadata (Name: "Tree View", Description: "Simple tree view examples.")]
  9. [ScenarioCategory ("Controls"), ScenarioCategory ("TreeView")]
  10. public class TreeUseCases : Scenario {
  11. View currentTree;
  12. public override void Setup ()
  13. {
  14. Win.Title = this.GetName ();
  15. Win.Y = 1; // menu
  16. Win.Height = Dim.Fill (1); // status bar
  17. Top.LayoutSubviews ();
  18. var menu = new MenuBar (new MenuBarItem [] {
  19. new MenuBarItem ("_File", new MenuItem [] {
  20. new MenuItem ("_Quit", "", () => Quit()),
  21. }),
  22. new MenuBarItem ("_Scenarios", new MenuItem [] {
  23. new MenuItem ("_Simple Nodes", "", () => LoadSimpleNodes()),
  24. new MenuItem ("_Rooms", "", () => LoadRooms()),
  25. new MenuItem ("_Armies With Builder", "", () => LoadArmies(false)),
  26. new MenuItem ("_Armies With Delegate", "", () => LoadArmies(true)),
  27. }),
  28. });
  29. Top.Add (menu);
  30. var statusBar = new StatusBar (new StatusItem [] {
  31. new StatusItem(Key.CtrlMask | Key.Q, "~^Q~ Quit", () => Quit()),
  32. });
  33. Top.Add (statusBar);
  34. // Start with the most basic use case
  35. LoadSimpleNodes ();
  36. }
  37. // Your data class
  38. private class House : TreeNode {
  39. // Your properties
  40. public string Address { get; set; }
  41. public List<Room> Rooms { get; set; }
  42. // ITreeNode member:
  43. public override IList<ITreeNode> Children => Rooms.Cast<ITreeNode> ().ToList ();
  44. public override string Text { get => Address; set => Address = value; }
  45. }
  46. private class Room : TreeNode {
  47. public string Name { get; set; }
  48. public override string Text { get => Name; set { Name = value; } }
  49. }
  50. private void LoadRooms ()
  51. {
  52. var myHouse = new House () {
  53. Address = "23 Nowhere Street",
  54. Rooms = new List<Room>{
  55. new Room(){Name = "Ballroom"},
  56. new Room(){Name = "Bedroom 1"},
  57. new Room(){Name = "Bedroom 2"}
  58. }
  59. };
  60. if (currentTree != null) {
  61. Win.Remove (currentTree);
  62. currentTree.Dispose ();
  63. }
  64. var tree = new TreeView () {
  65. X = 0,
  66. Y = 0,
  67. Width = 40,
  68. Height = 20
  69. };
  70. Win.Add (tree);
  71. tree.AddObject (myHouse);
  72. currentTree = tree;
  73. }
  74. private abstract class GameObject {
  75. }
  76. private class Army : GameObject {
  77. public string Designation { get; set; }
  78. public List<Unit> Units { get; set; }
  79. public override string ToString ()
  80. {
  81. return Designation;
  82. }
  83. }
  84. private class Unit : GameObject {
  85. public string Name { get; set; }
  86. public override string ToString ()
  87. {
  88. return Name;
  89. }
  90. }
  91. private class GameObjectTreeBuilder : ITreeBuilder<GameObject> {
  92. public bool SupportsCanExpand => true;
  93. public bool CanExpand (GameObject model)
  94. {
  95. return model is Army;
  96. }
  97. public IEnumerable<GameObject> GetChildren (GameObject model)
  98. {
  99. if (model is Army a) {
  100. return a.Units;
  101. }
  102. return Enumerable.Empty<GameObject> ();
  103. }
  104. }
  105. private void LoadArmies (bool useDelegate)
  106. {
  107. var army1 = new Army () {
  108. Designation = "3rd Infantry",
  109. Units = new List<Unit>{
  110. new Unit(){Name = "Orc"},
  111. new Unit(){Name = "Troll"},
  112. new Unit(){Name = "Goblin"},
  113. }
  114. };
  115. if (currentTree != null) {
  116. Win.Remove (currentTree);
  117. currentTree.Dispose ();
  118. }
  119. var tree = new TreeView<GameObject> () {
  120. X = 0,
  121. Y = 0,
  122. Width = 40,
  123. Height = 20
  124. };
  125. if (useDelegate) {
  126. tree.TreeBuilder = new DelegateTreeBuilder<GameObject> ((o) => o is Army a ? a.Units : Enumerable.Empty<GameObject> ());
  127. } else {
  128. tree.TreeBuilder = new GameObjectTreeBuilder ();
  129. }
  130. Win.Add (tree);
  131. tree.AddObject (army1);
  132. currentTree = tree;
  133. }
  134. private void Quit ()
  135. {
  136. Application.RequestStop ();
  137. }
  138. private void LoadSimpleNodes ()
  139. {
  140. if (currentTree != null) {
  141. Win.Remove (currentTree);
  142. currentTree.Dispose ();
  143. }
  144. var tree = new TreeView () {
  145. X = 0,
  146. Y = 0,
  147. Width = 40,
  148. Height = 20
  149. };
  150. Win.Add (tree);
  151. var root1 = new TreeNode ("Root1");
  152. root1.Children.Add (new TreeNode ("Child1.1"));
  153. root1.Children.Add (new TreeNode ("Child1.2"));
  154. var root2 = new TreeNode ("Root2");
  155. root2.Children.Add (new TreeNode ("Child2.1"));
  156. root2.Children.Add (new TreeNode ("Child2.2"));
  157. tree.AddObject (root1);
  158. tree.AddObject (root2);
  159. currentTree = tree;
  160. }
  161. }
  162. }