TreeUseCases.cs 4.2 KB

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