WelcomeFrame.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //
  2. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  3. // LICENSE: Atomic Game Engine Editor and Tools EULA
  4. // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
  5. // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
  6. //
  7. import EditorEvents = require("editor/EditorEvents");
  8. import EditorUI = require("ui/EditorUI");
  9. import ScriptWidget = require("ui/ScriptWidget");
  10. import Preferences = require("editor/Preferences");
  11. import ProjectTemplates = require("resources/ProjectTemplates");
  12. class WelcomeFrame extends ScriptWidget {
  13. constructor(parent: Atomic.UIWidget) {
  14. super();
  15. this.load("AtomicEditor/editor/ui/welcomeframe.tb.txt");
  16. var recentProjects = <Atomic.UILayout>this.getWidget("recentprojects");
  17. this.gravity = Atomic.UI_GRAVITY_ALL;
  18. this.recentList = new Atomic.UIListView();
  19. this.recentList.rootList.id = "recentList";
  20. recentProjects.addChild(this.recentList);
  21. var container = <Atomic.UILayout>parent.getWidget("resourceviewcontainer");
  22. container.addChild(this);
  23. this.updateRecentProjects();
  24. this.subscribeToEvent(EditorEvents.CloseProject, () => {
  25. this.updateRecentProjects();
  26. });
  27. this.initExampleBrowser();
  28. }
  29. handleClickedExample(example: ProjectTemplates.ProjectTemplateDefinition) {
  30. var ops = EditorUI.getModelOps();
  31. var env = ToolCore.toolEnvironment;
  32. ops.showCreateProject(example);
  33. }
  34. addExample(example: ProjectTemplates.ProjectTemplateDefinition) {
  35. var exlayout = <Atomic.UILayout>this.getWidget("examples_layout");
  36. if (!this.currentExampleLayout) {
  37. this.currentExampleLayout = new Atomic.UILayout();
  38. this.currentExampleLayout.spacing = 8;
  39. exlayout.addChild(this.currentExampleLayout);
  40. }
  41. // 200x150
  42. var exampleLayout = new Atomic.UILayout();
  43. exampleLayout.skinBg = "StarCondition";
  44. exampleLayout.axis = Atomic.UI_AXIS_Y;
  45. exampleLayout.layoutDistribution = Atomic.UI_LAYOUT_DISTRIBUTION_GRAVITY;
  46. exampleLayout.layoutSize = Atomic.UI_LAYOUT_SIZE_AVAILABLE;
  47. // IMAGE BUTTON
  48. var id = example.name;
  49. var button = new Atomic.UIButton();
  50. button.skinBg = "StarButton";
  51. button.id = id;
  52. var image = new Atomic.UIImageWidget();
  53. button.onClick = () => {
  54. this.handleClickedExample(example);
  55. };
  56. image.image = example.screenshot;
  57. image.skinBg = "ImageFrame";
  58. var rect = [0, 0, image.imageWidth / 2, image.imageHeight / 2];
  59. image.rect = rect;
  60. // NAME FIELD
  61. var nameField = new Atomic.UITextField();
  62. nameField.skinBg = "ImageCaption";
  63. nameField.text = example.name;
  64. var nameRect = [0, image.imageHeight / 2 - 16, image.imageWidth / 2, image.imageHeight / 2];
  65. nameField.rect = nameRect;
  66. nameField.gravity = Atomic.UI_GRAVITY_BOTTOM;
  67. image.addChild(nameField);
  68. button.addChild(image);
  69. var lp = new Atomic.UILayoutParams();
  70. lp.minWidth = image.imageWidth / 2;
  71. lp.minHeight = image.imageHeight / 2;
  72. button.layoutParams = lp;
  73. button.gravity = Atomic.UI_GRAVITY_LEFT;
  74. exampleLayout.addChild(button);
  75. // DESC TEXT
  76. var descField = new Atomic.UIEditField();
  77. descField.styling = true;
  78. descField.multiline = true;
  79. descField.readOnly = true;
  80. descField.wrapping = true;
  81. var styleDesc = "<color #A9A9A9>" + example.desc + "</color>";
  82. descField.text = styleDesc;
  83. descField.adaptToContentSize = true;
  84. lp.height = 42;
  85. lp.width = image.imageWidth / 2;
  86. descField.layoutParams = lp;
  87. exampleLayout.addChild(descField);
  88. this.currentExampleLayout.addChild(exampleLayout);
  89. this.exampleCount++;
  90. // three across, todo, be smarter about this
  91. if (!(this.exampleCount % 3)) {
  92. this.currentExampleLayout = null;
  93. }
  94. }
  95. initExampleBrowser() {
  96. let examples = ProjectTemplates.getExampleProjectTemplateDefinitions();
  97. for (var i = 0; i < examples.length; i++) {
  98. this.addExample(examples[i]);
  99. }
  100. }
  101. handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
  102. if (ev.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
  103. if (ev.target.id == "recentList") {
  104. this.openFrameMenu(ev.x, ev.y);
  105. }
  106. }
  107. if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
  108. var id = ev.target.id;
  109. if (id == "open project") {
  110. var utils = new Editor.FileUtils();
  111. var path = utils.openProjectFileDialog();
  112. if (path) {
  113. this.sendEvent(EditorEvents.LoadProject, { path: path });
  114. }
  115. return true;
  116. }
  117. if (id == "new project") {
  118. var mo = EditorUI.getModelOps();
  119. mo.showNewProject();
  120. return true;
  121. }
  122. if (id == "recentList") {
  123. var path: string = this.recent[this.recentList.getSelectedItemID()];
  124. this.sendEvent(EditorEvents.LoadProject, { path: path });
  125. }
  126. if (id == "recentProjectsContextMenu") {
  127. var prefs = Preferences.getInstance();
  128. if (ev.refid == "clear recent projects") {
  129. prefs.deleteRecentProjects();
  130. this.updateRecentProjects();
  131. }
  132. }
  133. }
  134. }
  135. updateRecentProjects() {
  136. this.recentList.deleteAllItems();
  137. var prefs = Preferences.getInstance();
  138. prefs.updateRecentProjects();
  139. this.recent = prefs.recentProjects;
  140. for (var i in this.recent) {
  141. this.recentList.addRootItem(this.recent[i], "Folder.icon", i);
  142. }
  143. }
  144. private openFrameMenu(x: number, y: number) {
  145. var menu = new Atomic.UIMenuWindow(this, "recentProjectsContextMenu");
  146. var menuButtons = new Atomic.UISelectItemSource();
  147. menuButtons.addItem(new Atomic.UISelectItem("Clear Recent Projects", "clear recent projects"));
  148. menu.show(menuButtons, x, y);
  149. }
  150. // examples
  151. exampleCount = 0;
  152. currentExampleLayout: Atomic.UILayout;
  153. recent: string[] = [];
  154. recentList: Atomic.UIListView;
  155. }
  156. export = WelcomeFrame;