UICreateProject.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  2. // Please see LICENSE.md in repository root for license information
  3. // https://github.com/AtomicGameEngine/AtomicGameEngine
  4. #include <Poco/File.h>
  5. #include "AtomicEditor.h"
  6. #include <TurboBadger/tb_window.h>
  7. #include <TurboBadger/tb_select.h>
  8. #include <TurboBadger/tb_editfield.h>
  9. #include <TurboBadger/image/tb_image_widget.h>
  10. #include <Atomic/Core/Context.h>
  11. #include <Atomic/Core/StringUtils.h>
  12. #include <Atomic/UI/UI.h>
  13. #include "Resources/AEResourceOps.h"
  14. #include "AEPreferences.h"
  15. #include "AEEditor.h"
  16. #include "AEEvents.h"
  17. #include "Project/AEProject.h"
  18. #include "Project/ProjectUtils.h"
  19. #include "UICreateProject.h"
  20. namespace AtomicEditor
  21. {
  22. // UIBuildSettings------------------------------------------------
  23. UICreateProject::UICreateProject(Context* context, const String &templateFolder, const String &imagePath):
  24. UIModalOpWindow(context)
  25. , projectPathField_(0)
  26. , templateFolder_(templateFolder)
  27. {
  28. Editor* editor = GetSubsystem<Editor>();
  29. Project* project = editor->GetProject();
  30. UI* tbui = GetSubsystem<UI>();
  31. window_->SetText("Create Project");
  32. tbui->LoadResourceFile(window_->GetContentRoot(), "AtomicEditor/editor/ui/createproject.tb.txt");
  33. projectPathField_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("project_path"));
  34. assert(projectPathField_);
  35. projectNameField_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("project_name"));
  36. assert(projectNameField_);
  37. TBImageWidget* image = delegate_->GetWidgetByIDAndType<TBImageWidget>(TBIDC("project_image"));
  38. assert(image);
  39. if (!imagePath.Length())
  40. image->SetVisibilility(WIDGET_VISIBILITY_GONE);
  41. else
  42. image->SetImage(imagePath.CString());
  43. FileSystem* fileSystem = GetSubsystem<FileSystem>();
  44. String userDocuments = fileSystem->GetUserDocumentsDir();
  45. #if defined(ATOMIC_PLATFORM_OSX)
  46. userDocuments += "Documents/AtomicProjects";
  47. #else
  48. userDocuments += "AtomicProjects";
  49. #endif
  50. projectPathField_->SetText(userDocuments.CString());
  51. window_->ResizeToFitContent();
  52. Center();
  53. }
  54. UICreateProject::~UICreateProject()
  55. {
  56. }
  57. bool UICreateProject::DoCreate(const String& folder, const String& projectName)
  58. {
  59. FileSystem* fileSystem = GetSubsystem<FileSystem>();
  60. fileSystem->CopyDir(templateFolder_ + "/Resources", folder + "/Resources");
  61. File file(context_, folder + "/" + projectName + ".atomic", FILE_WRITE);
  62. file.Close();
  63. return true;
  64. }
  65. bool UICreateProject::OnEvent(const TBWidgetEvent &ev)
  66. {
  67. FileSystem* fileSystem = GetSubsystem<FileSystem>();
  68. Editor* editor = GetSubsystem<Editor>();
  69. UIModalOps* ops = GetSubsystem<UIModalOps>();
  70. ProjectUtils* utils = context_->GetSubsystem<ProjectUtils>();
  71. if (ev.type == EVENT_TYPE_CLICK)
  72. {
  73. if (ev.target->GetID() == TBIDC("choose_path"))
  74. {
  75. String buildPath = utils->NewProjectFileDialog();
  76. if (buildPath.Length())
  77. projectPathField_->SetText(buildPath.CString());
  78. return true;
  79. }
  80. else if (ev.target->GetID() == TBIDC("create"))
  81. {
  82. String name = projectNameField_->GetText().CStr();
  83. name = name.Trimmed();
  84. if (!name.Length())
  85. {
  86. editor->PostModalInfo("New Project Editor Error", "Please enter a project name");
  87. return true;
  88. }
  89. String folder = projectPathField_->GetText().CStr();
  90. folder = folder.Trimmed();
  91. if (!folder.Length())
  92. {
  93. editor->PostModalInfo("New Project Editor Error", "Please choose a root project folder");
  94. return true;
  95. }
  96. folder += "/" + name;
  97. if (fileSystem->DirExists(folder) || fileSystem->FileExists(folder))
  98. {
  99. editor->PostModalInfo("New Project Editor Error",
  100. ToString("%s exists\n\nPlease choose a different root folder or project name", folder.CString()));
  101. return true;
  102. }
  103. if (!fileSystem->DirExists(folder))
  104. {
  105. Poco::File dirs(folder.CString());
  106. dirs.createDirectories();
  107. if (!fileSystem->DirExists(folder))
  108. {
  109. editor->PostModalInfo("New Project Editor Error",
  110. ToString("Unable to create project folder:\n%s", folder.CString()));
  111. return true;
  112. }
  113. if (DoCreate(folder, name))
  114. {
  115. SharedPtr<UICreateProject> keepAlive(this);
  116. UIModalOps* ops = GetSubsystem<UIModalOps>();
  117. ops->Hide();
  118. editor->LoadProject(folder + "/" + name + ".atomic");
  119. return true;
  120. }
  121. }
  122. }
  123. else if (ev.target->GetID() == TBIDC("cancel"))
  124. {
  125. ops->Hide();
  126. return true;
  127. }
  128. }
  129. return false;
  130. }
  131. }