MaterialModifier.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. /*
  2. ===========================================================================
  3. Doom 3 GPL Source Code
  4. Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
  5. This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
  6. Doom 3 Source Code is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. Doom 3 Source Code is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
  16. In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
  17. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
  18. ===========================================================================
  19. */
  20. #include "../../idlib/precompiled.h"
  21. #pragma hdrstop
  22. #include "MaterialModifier.h"
  23. #include "MaterialDocManager.h"
  24. #include "MaterialTreeView.h"
  25. //////////////////////////////////////////////////////////////////////////////
  26. //MaterialModifier
  27. //////////////////////////////////////////////////////////////////////////////
  28. /**
  29. * Constructor for MaterialModifier
  30. */
  31. MaterialModifier::MaterialModifier(MaterialDocManager* manager, const char* materialName) {
  32. this->manager = manager;
  33. this->materialName = materialName;
  34. }
  35. //////////////////////////////////////////////////////////////////////////////
  36. //AttributeMaterialModifier
  37. //////////////////////////////////////////////////////////////////////////////
  38. /**
  39. * Constructor for AttributeMaterialModifier
  40. */
  41. AttributeMaterialModifier::AttributeMaterialModifier(MaterialDocManager* manager, const char* materialName, int stage, const char* key)
  42. : MaterialModifier(manager, materialName) {
  43. this->stage = stage;
  44. this->key = key;
  45. }
  46. //////////////////////////////////////////////////////////////////////////////
  47. //AttributeMaterialModifierString
  48. //////////////////////////////////////////////////////////////////////////////
  49. /**
  50. * Constructor for AttributeMaterialModifierString
  51. */
  52. AttributeMaterialModifierString::AttributeMaterialModifierString(MaterialDocManager* manager, const char* materialName, int stage, const char* key, const char* value, const char* oldValue)
  53. : AttributeMaterialModifier(manager, materialName, stage, key) {
  54. this->value = value;
  55. this->oldValue = oldValue;
  56. }
  57. /**
  58. * Performs an undo operation of a string attribute change.
  59. */
  60. void AttributeMaterialModifierString::Undo() {
  61. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  62. material->SetAttribute(stage, key, oldValue, false);
  63. }
  64. /**
  65. * Performs a redo operation of a string attribute change.
  66. */
  67. void AttributeMaterialModifierString::Redo() {
  68. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  69. material->SetAttribute(stage, key, value, false);
  70. }
  71. //////////////////////////////////////////////////////////////////////////////
  72. //AttributeMaterialModifierBool
  73. //////////////////////////////////////////////////////////////////////////////
  74. /**
  75. * Constructor for AttributeMaterialModifierBool
  76. */
  77. AttributeMaterialModifierBool::AttributeMaterialModifierBool(MaterialDocManager* manager, const char* materialName, int stage, const char* key, bool value, bool oldValue)
  78. : AttributeMaterialModifier(manager, materialName, stage, key) {
  79. this->value = value;
  80. this->oldValue = oldValue;
  81. }
  82. /**
  83. * Performs an undo operation of a boolean attribute change.
  84. */
  85. void AttributeMaterialModifierBool::Undo() {
  86. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  87. material->SetAttributeBool(stage, key, oldValue, false);
  88. }
  89. /**
  90. * Performs a redo operation of a boolean attribute change.
  91. */
  92. void AttributeMaterialModifierBool::Redo() {
  93. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  94. material->SetAttributeBool(stage, key, value, false);
  95. }
  96. //////////////////////////////////////////////////////////////////////////////
  97. //StageMoveModifier
  98. //////////////////////////////////////////////////////////////////////////////
  99. /**
  100. * Constructor for StageMoveModifier
  101. */
  102. StageMoveModifier::StageMoveModifier(MaterialDocManager* manager, const char* materialName, int from, int to)
  103. : MaterialModifier(manager, materialName) {
  104. this->from = from;
  105. this->to = to;
  106. }
  107. /**
  108. * Performs an undo operation of a stage move.
  109. */
  110. void StageMoveModifier::Undo() {
  111. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  112. material->MoveStage(to, from, false);
  113. }
  114. /**
  115. * Performs a redo operation of a moved stage.
  116. */
  117. void StageMoveModifier::Redo() {
  118. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  119. material->MoveStage(from, to, false);
  120. }
  121. //////////////////////////////////////////////////////////////////////////////
  122. //StageDeleteModifier
  123. //////////////////////////////////////////////////////////////////////////////
  124. /**
  125. * Constructor for StageDeleteModifier
  126. */
  127. StageDeleteModifier::StageDeleteModifier(MaterialDocManager* manager, const char* materialName, int stageNum, idDict stageData)
  128. : MaterialModifier(manager, materialName) {
  129. this->stageNum = stageNum;
  130. this->stageData = stageData;
  131. }
  132. /**
  133. * Performs an undo operation of a deleted stage.
  134. */
  135. void StageDeleteModifier::Undo() {
  136. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  137. material->InsertStage(stageNum, stageData.GetInt("stagetype"), stageData.GetString("name"), false);
  138. material->SetData(stageNum, &stageData);
  139. }
  140. /**
  141. * Performs a redo operation of a deleted stage.
  142. */
  143. void StageDeleteModifier::Redo() {
  144. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  145. material->RemoveStage(stageNum, false);
  146. }
  147. //////////////////////////////////////////////////////////////////////////////
  148. //StageInsertModifier
  149. //////////////////////////////////////////////////////////////////////////////
  150. /**
  151. * Constructor for StageInsertModifier
  152. */
  153. StageInsertModifier::StageInsertModifier(MaterialDocManager* manager, const char* materialName, int stageNum, int stageType, const char* stageName)
  154. : MaterialModifier(manager, materialName) {
  155. this->stageNum = stageNum;
  156. this->stageType = stageType;
  157. this->stageName = stageName;
  158. }
  159. /**
  160. * Performs an undo operation of an inserted stage.
  161. */
  162. void StageInsertModifier::Undo() {
  163. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  164. material->RemoveStage(stageNum, false);
  165. }
  166. /**
  167. * Performs a redo operation of an inserted stage.
  168. */
  169. void StageInsertModifier::Redo() {
  170. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  171. material->InsertStage(stageNum, stageType, stageName, false);
  172. }
  173. //////////////////////////////////////////////////////////////////////////////
  174. //AddMaterialModifier
  175. //////////////////////////////////////////////////////////////////////////////
  176. /**
  177. * Constructor for AddMaterialModifier
  178. */
  179. AddMaterialModifier::AddMaterialModifier(MaterialDocManager* manager, const char* materialName, const char* materialFile)
  180. : MaterialModifier(manager, materialName) {
  181. this->materialFile = materialFile;
  182. }
  183. /**
  184. * Performs an undo operation of an added material.
  185. */
  186. void AddMaterialModifier::Undo() {
  187. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  188. manager->DeleteMaterial(material, false);
  189. }
  190. /**
  191. * Performs a redo operation of an added material.
  192. */
  193. void AddMaterialModifier::Redo() {
  194. manager->RedoAddMaterial(materialName);
  195. }
  196. //////////////////////////////////////////////////////////////////////////////
  197. //DeleteMaterialModifier
  198. //////////////////////////////////////////////////////////////////////////////
  199. /**
  200. * Constructor for DeleteMaterialModifier
  201. */
  202. DeleteMaterialModifier::DeleteMaterialModifier(MaterialDocManager* manager, const char* materialName)
  203. : MaterialModifier(manager, materialName) {
  204. }
  205. /**
  206. * Performs an undo operation of a deleted material.
  207. */
  208. void DeleteMaterialModifier::Undo() {
  209. manager->RedoAddMaterial(materialName, false);
  210. }
  211. /**
  212. * Performs a redo operation of a deleted material.
  213. */
  214. void DeleteMaterialModifier::Redo() {
  215. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  216. manager->DeleteMaterial(material, false);
  217. }
  218. //////////////////////////////////////////////////////////////////////////////
  219. //MoveMaterialModifier
  220. //////////////////////////////////////////////////////////////////////////////
  221. /**
  222. * Constructor for MoveMaterialModifier
  223. */
  224. MoveMaterialModifier::MoveMaterialModifier(MaterialDocManager* manager, const char* materialName, const char* materialFile, const char* copyMaterial)
  225. : MaterialModifier(manager, materialName) {
  226. this->materialFile = materialFile;
  227. this->copyMaterial = copyMaterial;
  228. }
  229. /**
  230. * Performs an undo operation of a moved material
  231. */
  232. void MoveMaterialModifier::Undo() {
  233. //Delete New Material
  234. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  235. manager->DeleteMaterial(material, false);
  236. //RedoAdd Old Material
  237. manager->RedoAddMaterial(copyMaterial, false);
  238. }
  239. /**
  240. * Performs a redo operation of a moved material.
  241. */
  242. void MoveMaterialModifier::Redo() {
  243. //Delete Old Material
  244. MaterialDoc* material = manager->CreateMaterialDoc(copyMaterial);
  245. manager->DeleteMaterial(material, false);
  246. //Redo Add New Material
  247. manager->RedoAddMaterial(materialName, false);
  248. }
  249. //////////////////////////////////////////////////////////////////////////////
  250. //RenameMaterialModifier
  251. //////////////////////////////////////////////////////////////////////////////
  252. /**
  253. * Constructor for RenameMaterialModifier
  254. */
  255. RenameMaterialModifier::RenameMaterialModifier(MaterialDocManager* manager, const char* materialName, const char* oldName)
  256. : MaterialModifier(manager, materialName) {
  257. this->oldName = oldName;
  258. }
  259. /**
  260. * Performs an undo operation of a renamed material
  261. */
  262. void RenameMaterialModifier::Undo() {
  263. MaterialDoc* material = manager->CreateMaterialDoc(materialName);
  264. material->SetMaterialName(oldName, false);
  265. }
  266. /**
  267. * Performs a redo operation of a renamed material.
  268. */
  269. void RenameMaterialModifier::Redo() {
  270. MaterialDoc* material = manager->CreateMaterialDoc(oldName);
  271. material->SetMaterialName(materialName, false);
  272. }
  273. //////////////////////////////////////////////////////////////////////////////
  274. //AddMaterialFolderModifier
  275. //////////////////////////////////////////////////////////////////////////////
  276. /**
  277. * Constructor for AddMaterialFolderModifier
  278. */
  279. AddMaterialFolderModifier::AddMaterialFolderModifier(MaterialDocManager* manager, const char* materialName, MaterialTreeView* view, HTREEITEM item, HTREEITEM parent)
  280. : MaterialModifier(manager, materialName) {
  281. this->view = view;
  282. this->item = item;
  283. this->parent = parent;
  284. }
  285. /**
  286. * Performs an undo operation of an added material folder.
  287. */
  288. void AddMaterialFolderModifier::Undo() {
  289. view->DeleteFolder(item, false);
  290. }
  291. /**
  292. * Performs a redo operation of an added material folder.
  293. */
  294. void AddMaterialFolderModifier::Redo() {
  295. view->AddFolder(materialName, parent);
  296. }
  297. //////////////////////////////////////////////////////////////////////////////
  298. //RenameMaterialFolderModifier
  299. //////////////////////////////////////////////////////////////////////////////
  300. /**
  301. * Constructor for RenameMaterialFolderModifier
  302. */
  303. RenameMaterialFolderModifier::RenameMaterialFolderModifier(MaterialDocManager* manager, const char* materialName, MaterialTreeView* view, HTREEITEM item, const char* oldName)
  304. : MaterialModifier(manager, materialName) {
  305. this->view = view;
  306. this->item = item;
  307. this->oldName = oldName;
  308. }
  309. /**
  310. * Performs an undo operation of a renamed material folder.
  311. */
  312. void RenameMaterialFolderModifier::Undo() {
  313. view->RenameFolder(item, oldName);
  314. }
  315. /**
  316. * Performs a redo operation of a renamed material folder.
  317. */
  318. void RenameMaterialFolderModifier::Redo() {
  319. view->RenameFolder(item, materialName);
  320. }
  321. //////////////////////////////////////////////////////////////////////////////
  322. //DeleteMaterialFolderModifier
  323. //////////////////////////////////////////////////////////////////////////////
  324. /**
  325. * Constructor for DeleteMaterialFolderModifier
  326. */
  327. DeleteMaterialFolderModifier::DeleteMaterialFolderModifier(MaterialDocManager* manager, const char* materialName, MaterialTreeView* view, HTREEITEM parent, idStrList* affectedMaterials)
  328. : MaterialModifier(manager, materialName) {
  329. this->view = view;
  330. this->parent = parent;
  331. this->affectedMaterials = *affectedMaterials;
  332. }
  333. /**
  334. * Performs an undo operation of a deleted material folder.
  335. */
  336. void DeleteMaterialFolderModifier::Undo() {
  337. //Add the folder back and save the folder position for the redo
  338. item = view->AddFolder(materialName, parent);
  339. //Add each of the children back
  340. for(int i = 0; i < affectedMaterials.Num(); i++) {
  341. manager->RedoAddMaterial(affectedMaterials[i], false);
  342. }
  343. }
  344. /**
  345. * Performs a redo operation of a deleted material folder.
  346. */
  347. void DeleteMaterialFolderModifier::Redo() {
  348. view->DeleteFolder(item, false);
  349. }