WelcomeFrame.ts 6.6 KB

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