TreeUseCases.cs 4.3 KB

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