TreeUseCases.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. }
  63. var tree = new TreeView () {
  64. X = 0,
  65. Y = 0,
  66. Width = 40,
  67. Height = 20
  68. };
  69. Win.Add (tree);
  70. tree.AddObject (myHouse);
  71. currentTree = tree;
  72. }
  73. private abstract class GameObject {
  74. }
  75. private class Army : GameObject {
  76. public string Designation { get; set; }
  77. public List<Unit> Units { get; set; }
  78. public override string ToString ()
  79. {
  80. return Designation;
  81. }
  82. }
  83. private class Unit : GameObject {
  84. public string Name { get; set; }
  85. public override string ToString ()
  86. {
  87. return Name;
  88. }
  89. }
  90. private class GameObjectTreeBuilder : ITreeBuilder<GameObject> {
  91. public bool SupportsCanExpand => true;
  92. public bool CanExpand (GameObject model)
  93. {
  94. return model is Army;
  95. }
  96. public IEnumerable<GameObject> GetChildren (GameObject model)
  97. {
  98. if (model is Army a) {
  99. return a.Units;
  100. }
  101. return Enumerable.Empty<GameObject> ();
  102. }
  103. }
  104. private void LoadArmies (bool useDelegate)
  105. {
  106. var army1 = new Army () {
  107. Designation = "3rd Infantry",
  108. Units = new List<Unit>{
  109. new Unit(){Name = "Orc"},
  110. new Unit(){Name = "Troll"},
  111. new Unit(){Name = "Goblin"},
  112. }
  113. };
  114. if (currentTree != null) {
  115. Win.Remove (currentTree);
  116. }
  117. var tree = new TreeView<GameObject> () {
  118. X = 0,
  119. Y = 0,
  120. Width = 40,
  121. Height = 20
  122. };
  123. if (useDelegate) {
  124. tree.TreeBuilder = new DelegateTreeBuilder<GameObject> ((o) => o is Army a ? a.Units : Enumerable.Empty<GameObject> ());
  125. } else {
  126. tree.TreeBuilder = new GameObjectTreeBuilder ();
  127. }
  128. Win.Add (tree);
  129. tree.AddObject (army1);
  130. currentTree = tree;
  131. }
  132. private void Quit ()
  133. {
  134. Application.RequestStop ();
  135. }
  136. private void LoadSimpleNodes ()
  137. {
  138. if (currentTree != null) {
  139. Win.Remove (currentTree);
  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. }