projects.nim 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # author: Ethosa
  2. import
  3. os,
  4. nodesnim,
  5. editor
  6. var
  7. projects_scene* = Scene("Projects")
  8. scroll_box* = Scroll()
  9. projects_box* = VBox()
  10. project_template* = ColorRect("Project")
  11. project_template_title* = Label("Title")
  12. project_template_icon* = TextureRect("Icon")
  13. default_icon*: GlTextureObj
  14. projects_scene.addChild(scroll_box)
  15. scroll_box.addChild(projects_box)
  16. scroll_box.setBackgroundColor(Color(0x1d242aff))
  17. projects_box.setChildAnchor(0, 0, 0, 0)
  18. projects_box.resize(720, 480)
  19. projects_box.separator = 0
  20. project_template.resize(10, 48)
  21. project_template.setSizeAnchor(1, 0)
  22. project_template.addChilds(project_template_title, project_template_icon)
  23. project_template_title.setText("Template title")
  24. project_template_title.setTextColor(Color(0xf2f2f7ff'u32))
  25. project_template_title.move(-2, 2)
  26. project_template_title.resize(128, 20)
  27. project_template_title.setSizeAnchor(1, 0)
  28. project_template_title.setTextAlign(1, 0, 1, 0)
  29. project_template_title.mousemode = MOUSEMODE_IGNORE
  30. project_template_title.setFont(GLUT_BITMAP_HELVETICA_18, 18)
  31. project_template_icon.resize(42, 42)
  32. project_template_icon.move(3, 3)
  33. project_template_icon.texture_mode = TEXTURE_KEEP_ASPECT_RATIO
  34. scroll_box@on_process(self):
  35. scroll_box.viewport_w = projects_scene.rect_size.x
  36. scroll_box.viewport_h = projects_scene.rect_size.y
  37. scroll_box.rect_size.x = scroll_box.viewport_w
  38. projects_box.rect_size.x = projects_scene.rect_size.x
  39. if scroll_box.rect_size.y < scroll_box.viewport_h:
  40. scroll_box.rect_size.y = scroll_box.viewport_h
  41. for child in scroll_box.getChildIter():
  42. child.calcPositionAnchor()
  43. project_template@on_process(self):
  44. var s = self.ColorRectRef
  45. if s.pressed and s.focused:
  46. s.color = Color(0x4e606eff)
  47. elif s.hovered and not mouse_pressed:
  48. s.color = Color(0x3a4652ff)
  49. else:
  50. s.color = Color(0x1d242aff)
  51. project_template@on_click(self, x, y):
  52. changeScene("Editor", @[(k: "title", v: self.getNode("Title").LabelRef.text)])
  53. glutReshapeWindow(1280, 720)
  54. proc init* =
  55. default_icon = load("assets/project_default_icon.jpg")
  56. proc addNewProject*(name: string) =
  57. if not dirExists(nodesnim_folder / name):
  58. # files and folders
  59. createDir(nodesnim_folder / name)
  60. createDir(nodesnim_folder / name / "assets")
  61. copyFile("assets/project_default_icon.jpg", nodesnim_folder / name / "icon.jpg")
  62. var readme = open(nodesnim_folder / name / "README.md", fmWrite)
  63. readme.write("# " & name)
  64. readme.close()
  65. var gitignore = open(nodesnim_folder / name / ".gitignore", fmWrite)
  66. gitignore.write("nimcache/\nnimblecache/\nhtmldocs/\n\n*.exe\n*.log")
  67. gitignore.close()
  68. var new_project = project_template.duplicate()
  69. new_project.name = name
  70. new_project.getNode("Title").LabelRef.setText(name)
  71. new_project.getNode("Icon").TextureRectRef.setTexture(default_icon)
  72. projects_box.addChild(new_project)
  73. proc loadProject*(name: string) =
  74. var
  75. new_project = project_template.duplicate()
  76. project_icon = load(nodesnim_folder / name / "icon.jpg")
  77. new_project.name = name
  78. new_project.getNode("Title").LabelRef.setText(name)
  79. new_project.getNode("Icon").TextureRectRef.setTexture(default_icon)
  80. projects_box.addChild(new_project)
  81. proc loadProjects* =
  82. for kind, path in walkDir(nodesnim_folder):
  83. if dirExists(path) and path != nodesnim_folder / "saves":
  84. loadProject(path.lastPathPart())
  85. proc hasProject*(name: string): bool =
  86. dirExists(nodesnim_folder / name)