PageRenderTime 99ms CodeModel.GetById 43ms RepoModel.GetById 1ms app.codeStats 0ms

/Sources/MarbleEditor/MarbleEditor/Engines/Medias.cpp

https://bitbucket.org/kamicode/marblepower
C++ | 378 lines | 291 code | 70 blank | 17 comment | 24 complexity | b7057fcc2c7d5d7844ea11434f300812 MD5 | raw file
  1. /*
  2. Copyright(C) 2012 Tristan Kahn
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public
  5. License as published by the Free Software Foundation; either
  6. version 2.1 of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public
  12. License along with this program; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  14. */
  15. #include "MarbleEditor/Engines/Medias.h"
  16. #include <algorithm>
  17. #include "MarbleEditor/Engines/Engine.h"
  18. #include "MarbleEditor/Editors/XMLEditor.h"
  19. #include "MarbleEditor/Editors/ScriptEditor.h"
  20. #include "MarbleEditor/Elements/Element.h"
  21. namespace MarbleEditor {
  22. Medias::Medias(Engine *engine, QWidget *parent) : QDockWidget(parent) {
  23. setupUi(this);
  24. this->engine = engine;
  25. tabWidget->setEnabled(false);
  26. modeleModels = new QFileSystemModel(this);
  27. modeleModels->sort(0);
  28. modeleTextures = new QFileSystemModel(this);
  29. modeleTextures->sort(0);
  30. modeleMusics = new QFileSystemModel(this);
  31. modeleMusics->sort(0);
  32. modeleVideos = new QFileSystemModel(this);
  33. modeleVideos->sort(0);
  34. modeleGui = new QFileSystemModel(this);
  35. modeleGui->sort(0);
  36. modeleScripts = new QFileSystemModel(this);
  37. modeleScripts->sort(0);
  38. modeleShaders = new QFileSystemModel(this);
  39. modeleShaders->sort(0);
  40. connect(treeViewModels, &QTreeView::doubleClicked,
  41. this, &Medias::openModel);
  42. connect(pushAddModelFolder, &QPushButton::clicked,
  43. this, &Medias::addModelFolder);
  44. connect(pushAddExistingModelFile, &QPushButton::clicked,
  45. this, &Medias::addExistingModelFile);
  46. connect(treeViewTextures, &QTreeView::doubleClicked,
  47. this, &Medias::openTexture);
  48. connect(pushAddTextureFolder, &QPushButton::clicked,
  49. this, &Medias::addTextureFolder);
  50. connect(pushAddExistingTextureFile, &QPushButton::clicked,
  51. this, &Medias::addExistingTextureFile);
  52. connect(treeViewMusics, &QTreeView::doubleClicked,
  53. this, &Medias::openMusic);
  54. connect(pushAddMusicFolder, &QPushButton::clicked,
  55. this, &Medias::addMusicFolder);
  56. connect(pushAddExistingMusicFile, &QPushButton::clicked,
  57. this, &Medias::addExistingMusicFile);
  58. connect(treeViewVideos, &QTreeView::doubleClicked,
  59. this, &Medias::openVideo);
  60. connect(pushAddVideoFolder, &QPushButton::clicked,
  61. this, &Medias::addVideoFolder);
  62. connect(pushAddExistingVideoFile, &QPushButton::clicked,
  63. this, &Medias::addExistingVideoFile);
  64. connect(treeViewGui, &QTreeView::doubleClicked,
  65. this, &Medias::editGuiFile);
  66. connect(pushAddNewGuiFile, &QPushButton::clicked,
  67. this, &Medias::addNewGuiFile);
  68. connect(pushAddExistingGuiFile, &QPushButton::clicked,
  69. this, &Medias::addExistingGuiFile);
  70. connect(treeViewScripts, &QTreeView::doubleClicked,
  71. this, &Medias::editScriptFile);
  72. connect(pushAddScriptFolder, &QPushButton::clicked,
  73. this, &Medias::addScriptFolder);
  74. connect(pushAddNewScriptFile, &QPushButton::clicked,
  75. this, &Medias::addNewScriptFile);
  76. connect(pushAddExistingScriptFile, &QPushButton::clicked,
  77. this, &Medias::addExistingScriptFile);
  78. connect(treeViewShaders, &QTreeView::doubleClicked,
  79. this, &Medias::editShaderFile);
  80. connect(pushAddNewShader, &QPushButton::clicked,
  81. this, &Medias::addNewShader);
  82. }
  83. void Medias::loadProject() {
  84. tabWidget->setEnabled(true);
  85. QString directory = engine->getDirMedias();
  86. treeViewGui->setModel(modeleGui);
  87. modeleGui->setRootPath(directory + "Gui");
  88. treeViewGui->setRootIndex(
  89. modeleGui->index(directory + "Gui"));
  90. treeViewGui->resizeColumnToContents(1);
  91. treeViewModels->setModel(modeleModels);
  92. modeleModels->setRootPath(directory + "Models");
  93. treeViewModels->setRootIndex(
  94. modeleModels->index(directory + "Models"));
  95. treeViewModels->resizeColumnToContents(1);
  96. treeViewMusics->setModel(modeleMusics);
  97. modeleMusics->setRootPath(directory + "Musics");
  98. treeViewMusics->setRootIndex(
  99. modeleMusics->index(directory + "Musics"));
  100. treeViewMusics->resizeColumnToContents(1);
  101. treeViewVideos->setModel(modeleVideos);
  102. modeleVideos->setRootPath(directory + "Videos");
  103. treeViewVideos->setRootIndex(
  104. modeleVideos->index(directory + "Videos"));
  105. treeViewVideos->resizeColumnToContents(1);
  106. treeViewScripts->setModel(modeleScripts);
  107. modeleScripts->setRootPath(directory + "Scripts");
  108. treeViewScripts->setRootIndex(
  109. modeleScripts->index(directory + "Scripts"));
  110. treeViewScripts->resizeColumnToContents(1);
  111. treeViewShaders->setModel(modeleShaders);
  112. modeleShaders->setRootPath(directory + "Shaders");
  113. treeViewShaders->setRootIndex(
  114. modeleShaders->index(directory + "Shaders"));
  115. treeViewShaders->resizeColumnToContents(1);
  116. treeViewTextures->setModel(modeleTextures);
  117. modeleTextures->setRootPath(directory + "Textures");
  118. treeViewTextures->setRootIndex(
  119. modeleTextures->index(directory + "Textures"));
  120. treeViewTextures->resizeColumnToContents(1);
  121. }
  122. void Medias::unloadProject() {
  123. treeViewGui->setModel(NULL);
  124. treeViewModels->setModel(NULL);
  125. treeViewMusics->setModel(NULL);
  126. treeViewVideos->setModel(NULL);
  127. treeViewScripts->setModel(NULL);
  128. treeViewShaders->setModel(NULL);
  129. treeViewTextures->setModel(NULL);
  130. tabWidget->setEnabled(false);
  131. }
  132. void Medias::addNewGuiFile() {
  133. addNewFile(treeViewGui, modeleGui);
  134. }
  135. void Medias::addExistingGuiFile() {
  136. addExistingFile(treeViewGui, modeleGui);
  137. }
  138. void Medias::editGuiFile() {
  139. editFileXML(treeViewGui, modeleGui);
  140. }
  141. void Medias::addModelFolder() {
  142. addFolder(treeViewModels, modeleModels);
  143. }
  144. void Medias::addExistingModelFile() {
  145. addExistingFile(treeViewModels, modeleModels);
  146. }
  147. void Medias::addMusicFolder() {
  148. addFolder(treeViewMusics, modeleMusics);
  149. }
  150. void Medias::addExistingMusicFile() {
  151. addExistingFile(treeViewVideos, modeleVideos);
  152. }
  153. void Medias::addVideoFolder() {
  154. addFolder(treeViewVideos, modeleVideos);
  155. }
  156. void Medias::addExistingVideoFile() {
  157. addExistingFile(treeViewMusics, modeleMusics);
  158. }
  159. void Medias::addScriptFolder() {
  160. addFolder(treeViewScripts, modeleScripts);
  161. }
  162. void Medias::addNewScriptFile() {
  163. addNewFile(treeViewScripts, modeleScripts);
  164. }
  165. void Medias::addExistingScriptFile() {
  166. addExistingFile(treeViewScripts, modeleScripts);
  167. }
  168. void Medias::editScriptFile() {
  169. editFileScript(treeViewScripts, modeleScripts);
  170. }
  171. void Medias::addTextureFolder() {
  172. addFolder(treeViewTextures, modeleTextures);
  173. }
  174. void Medias::addExistingTextureFile() {
  175. addExistingFile(treeViewTextures, modeleTextures);
  176. }
  177. void Medias::addNewShader() {
  178. bool ok;
  179. QString text = QInputDialog::getText(
  180. engine, tr("Add Folder"),
  181. tr("Folder Name : "), QLineEdit::Normal, "", &ok);
  182. if (ok && !text.isEmpty()) {
  183. QString root = modeleShaders->rootPath();
  184. QDir d(root);
  185. if (d.mkdir(text)) {
  186. root.append("/" + text);
  187. QFile::copy("Gismos/Shader/Constants.shad",
  188. root + "/Constants.shad");
  189. QFile::copy("Gismos/Shader/Shader.cg", root + "/Shader.cg");
  190. Element* elt = engine->getSelectedElement();
  191. if (elt) {
  192. elt->updateElementEditor();
  193. }
  194. } else {
  195. QMessageBox::warning(engine, tr("Warning"),
  196. tr("Shader Already exist"), QMessageBox::Ok);
  197. }
  198. }
  199. }
  200. void Medias::editShaderFile() {
  201. editFileScript(treeViewShaders, modeleShaders);
  202. }
  203. void Medias::editFileXML(QTreeView *view, QFileSystemModel *model) {
  204. QString select = model->filePath(view->currentIndex());
  205. if (QFileInfo(select).isFile()) {
  206. XMLEditor* editeur = new XMLEditor();
  207. editeur->load(select);
  208. }
  209. }
  210. void Medias::editFileScript(QTreeView* view, QFileSystemModel* model) {
  211. QString select = model->filePath(view->currentIndex());
  212. if (QFileInfo(select).isFile()) {
  213. ScriptEditor* editeur = new ScriptEditor(NULL, true, false);
  214. editeur->load(select);
  215. }
  216. }
  217. QString Medias::getCurrentViewFolder(QTreeView* view,
  218. QFileSystemModel* model) {
  219. QString select = model->filePath(view->currentIndex());
  220. if (select.isEmpty()) {
  221. select = model->rootPath();
  222. }
  223. QFileInfo f(select);
  224. if (f.isFile()) {
  225. select = f.canonicalPath();
  226. }
  227. return select;
  228. }
  229. void Medias::addFolder(QTreeView* view, QFileSystemModel* model) {
  230. bool ok;
  231. QString text = QInputDialog::getText(engine, tr("Add Folder"),
  232. tr("Folder Name : "),
  233. QLineEdit::Normal, "", &ok);
  234. if (ok && !text.isEmpty()) {
  235. QDir(getCurrentViewFolder(view, model)).mkdir(text);
  236. }
  237. }
  238. void Medias::addNewFile(QTreeView* view, QFileSystemModel* model) {
  239. bool ok;
  240. QString text = QInputDialog::getText(engine, tr("Add File"),
  241. tr("File Name : "),
  242. QLineEdit::Normal, "", &ok);
  243. if (ok && !text.isEmpty()) {
  244. QFile fichier(getCurrentViewFolder(view, model) + "/" + text);
  245. if (fichier.exists()) {
  246. QMessageBox::warning(engine, tr("Warning"),
  247. tr("File Already exist"),
  248. QMessageBox::Ok);
  249. } else {
  250. fichier.open(QIODevice::WriteOnly);
  251. fichier.close();
  252. Element* elt = engine->getSelectedElement();
  253. if (elt) {
  254. elt->updateElementEditor();
  255. }
  256. }
  257. }
  258. }
  259. void Medias::addExistingFile(QTreeView* view, QFileSystemModel* model) {
  260. QString text = QFileDialog::getOpenFileName(engine, "Media", "Medias");
  261. if (!text.isEmpty()) {
  262. QString select = getCurrentViewFolder(view, model)
  263. + "/" + QFileInfo(text).fileName();
  264. QFile fichier(select);
  265. if (fichier.exists()) {
  266. QMessageBox::warning(engine, tr("Warning"),
  267. tr("File Already exist"), QMessageBox::Ok);
  268. } else {
  269. QFile::copy(text, select);
  270. Element* elt = engine->getSelectedElement();
  271. if (elt) {
  272. elt->updateElementEditor();
  273. }
  274. }
  275. }
  276. }
  277. void Medias::openModel() {
  278. QString select = modeleModels->filePath(treeViewModels->currentIndex());
  279. if (QFileInfo(select).isFile()) {
  280. QDesktopServices::openUrl(QUrl(QString("file:///") + select,
  281. QUrl::TolerantMode));
  282. }
  283. }
  284. void Medias::openMusic() {
  285. QString select = modeleMusics->filePath(treeViewMusics->currentIndex());
  286. if (QFileInfo(select).isFile()) {
  287. QDesktopServices::openUrl(QUrl(QString("file:///") + select,
  288. QUrl::TolerantMode));
  289. }
  290. }
  291. void Medias::openVideo() {
  292. QString select = modeleVideos->filePath(treeViewVideos->currentIndex());
  293. if (QFileInfo(select).isFile()) {
  294. QDesktopServices::openUrl(QUrl(QString("file:///") + select,
  295. QUrl::TolerantMode));
  296. }
  297. }
  298. void Medias::openTexture() {
  299. QString select = modeleTextures->filePath(treeViewTextures->currentIndex());
  300. if (QFileInfo(select).isFile()) {
  301. QDesktopServices::openUrl(QUrl(QString("file:///") + select,
  302. QUrl::TolerantMode));
  303. }
  304. }
  305. } // namespace MarbleEditor