AudioControlsEditorUndo.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AudioControlsEditorUndo.h>
  9. #include <ATLControlsModel.h>
  10. #include <AudioControlsEditorPlugin.h>
  11. #include <ImplementationManager.h>
  12. #include <QStandardItemModel>
  13. #include <QList>
  14. namespace AudioControls
  15. {
  16. //-------------------------------------------------------------------------------------------//
  17. QStandardItem* GetParent(QATLTreeModel* pTree, const TPath& path)
  18. {
  19. QStandardItem* pParent = pTree->invisibleRootItem();
  20. if (pParent)
  21. {
  22. const size_t size = path.size();
  23. for (size_t i = 0; i < size - 1; ++i)
  24. {
  25. pParent = pParent->child(path[(size - 1) - i]);
  26. }
  27. }
  28. return pParent;
  29. }
  30. //-------------------------------------------------------------------------------------------//
  31. QStandardItem* GetItem(QATLTreeModel* pTree, const TPath& path)
  32. {
  33. QStandardItem* pParent = GetParent(pTree, path);
  34. if (pParent && path.size() > 0)
  35. {
  36. return pParent->child(path[0]);
  37. }
  38. return nullptr;
  39. }
  40. //-------------------------------------------------------------------------------------------//
  41. void UpdatePath(QStandardItem* pItem, TPath& path)
  42. {
  43. if (pItem)
  44. {
  45. path.clear();
  46. path.push_back(pItem->row());
  47. QStandardItem* pParent = pItem->parent();
  48. while (pParent)
  49. {
  50. path.push_back(pParent->row());
  51. pParent = pParent->parent();
  52. }
  53. }
  54. }
  55. //-------------------------------------------------------------------------------------------//
  56. void IUndoControlOperation::AddStoredControl()
  57. {
  58. const CUndoSuspend suspendUndo;
  59. CATLControlsModel* pModel = CAudioControlsEditorPlugin::GetATLModel();
  60. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  61. if (pModel && pTree)
  62. {
  63. if (m_pStoredControl)
  64. {
  65. pModel->InsertControl(m_pStoredControl);
  66. m_id = m_pStoredControl->GetId();
  67. QStandardItem* pParent = GetParent(pTree, m_path);
  68. if (pParent && m_path.size() > 0)
  69. {
  70. pTree->AddControl(m_pStoredControl.get(), pParent, m_path[0]);
  71. }
  72. }
  73. m_pStoredControl = nullptr;
  74. }
  75. }
  76. //-------------------------------------------------------------------------------------------//
  77. void IUndoControlOperation::RemoveStoredControl()
  78. {
  79. const CUndoSuspend suspendUndo;
  80. CATLControlsModel* pModel = CAudioControlsEditorPlugin::GetATLModel();
  81. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  82. if (pModel && pTree)
  83. {
  84. m_pStoredControl = pModel->TakeControl(m_id);
  85. QStandardItem* pItem = pTree->GetItemFromControlID(m_id);
  86. if (pItem)
  87. {
  88. UpdatePath(pItem, m_path);
  89. pTree->RemoveItem(pTree->indexFromItem(pItem));
  90. }
  91. }
  92. }
  93. //-------------------------------------------------------------------------------------------//
  94. CUndoControlAdd::CUndoControlAdd(CID id)
  95. {
  96. m_id = id;
  97. }
  98. //-------------------------------------------------------------------------------------------//
  99. void CUndoControlAdd::Undo([[maybe_unused]] bool bUndo)
  100. {
  101. RemoveStoredControl();
  102. }
  103. //-------------------------------------------------------------------------------------------//
  104. void CUndoControlAdd::Redo()
  105. {
  106. AddStoredControl();
  107. }
  108. //-------------------------------------------------------------------------------------------//
  109. CUndoControlRemove::CUndoControlRemove(AZStd::shared_ptr<CATLControl>& pControl)
  110. {
  111. CUndoSuspend suspendUndo;
  112. m_pStoredControl = pControl;
  113. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  114. if (pTree)
  115. {
  116. QStandardItem* pItem = pTree->GetItemFromControlID(m_pStoredControl->GetId());
  117. if (pItem)
  118. {
  119. UpdatePath(pItem, m_path);
  120. }
  121. }
  122. }
  123. //-------------------------------------------------------------------------------------------//
  124. void CUndoControlRemove::Undo([[maybe_unused]] bool bUndo)
  125. {
  126. AddStoredControl();
  127. }
  128. //-------------------------------------------------------------------------------------------//
  129. void CUndoControlRemove::Redo()
  130. {
  131. RemoveStoredControl();
  132. }
  133. //-------------------------------------------------------------------------------------------//
  134. IUndoFolderOperation::IUndoFolderOperation(QStandardItem* pItem)
  135. {
  136. if (pItem)
  137. {
  138. m_sName = pItem->text();
  139. UpdatePath(pItem, m_path);
  140. }
  141. }
  142. //-------------------------------------------------------------------------------------------//
  143. void IUndoFolderOperation::AddFolderItem()
  144. {
  145. CUndoSuspend suspendUndo;
  146. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  147. if (pTree)
  148. {
  149. QStandardItem* pParent = GetParent(pTree, m_path);
  150. if (pParent && m_path.size() > 0)
  151. {
  152. pTree->CreateFolder(pParent, m_sName.toUtf8().data(), m_path[0]);
  153. }
  154. }
  155. }
  156. //-------------------------------------------------------------------------------------------//
  157. void IUndoFolderOperation::RemoveItem()
  158. {
  159. CUndoSuspend suspendUndo;
  160. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  161. if (pTree)
  162. {
  163. QStandardItem* pItem = GetItem(pTree, m_path);
  164. if (pItem)
  165. {
  166. pTree->RemoveItem(pTree->indexFromItem(pItem));
  167. }
  168. }
  169. }
  170. //-------------------------------------------------------------------------------------------//
  171. CUndoFolderRemove::CUndoFolderRemove(QStandardItem* pItem)
  172. : IUndoFolderOperation(pItem)
  173. {
  174. }
  175. //-------------------------------------------------------------------------------------------//
  176. void CUndoFolderRemove::Undo([[maybe_unused]] bool bUndo)
  177. {
  178. AddFolderItem();
  179. }
  180. //-------------------------------------------------------------------------------------------//
  181. void CUndoFolderRemove::Redo()
  182. {
  183. RemoveItem();
  184. }
  185. //-------------------------------------------------------------------------------------------//
  186. CUndoFolderAdd::CUndoFolderAdd(QStandardItem* pItem)
  187. : IUndoFolderOperation(pItem)
  188. {
  189. }
  190. //-------------------------------------------------------------------------------------------//
  191. void CUndoFolderAdd::Undo([[maybe_unused]] bool bUndo)
  192. {
  193. RemoveItem();
  194. }
  195. //-------------------------------------------------------------------------------------------//
  196. void CUndoFolderAdd::Redo()
  197. {
  198. AddFolderItem();
  199. }
  200. //-------------------------------------------------------------------------------------------//
  201. CUndoFolderRename::CUndoFolderRename(QStandardItem* pItem)
  202. : IUndoFolderOperation(pItem)
  203. {
  204. }
  205. //-------------------------------------------------------------------------------------------//
  206. void CUndoFolderRename::Undo([[maybe_unused]] bool bUndo)
  207. {
  208. SwapNames();
  209. }
  210. //-------------------------------------------------------------------------------------------//
  211. void CUndoFolderRename::Redo()
  212. {
  213. SwapNames();
  214. }
  215. //-------------------------------------------------------------------------------------------//
  216. void CUndoFolderRename::SwapNames()
  217. {
  218. CUndoSuspend suspendUndo;
  219. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  220. if (pTree)
  221. {
  222. QStandardItem* pItem = GetItem(pTree, m_path);
  223. if (pItem)
  224. {
  225. QString oldName = pItem->text();
  226. pItem->setText(m_sName);
  227. m_sName = oldName;
  228. }
  229. }
  230. }
  231. //-------------------------------------------------------------------------------------------//
  232. CUndoControlModified::CUndoControlModified(CID id)
  233. : m_id(id)
  234. {
  235. CATLControlsModel* pModel = CAudioControlsEditorPlugin::GetATLModel();
  236. if (pModel)
  237. {
  238. CATLControl* pControl = pModel->GetControlByID(m_id);
  239. if (pControl)
  240. {
  241. m_name = pControl->GetName();
  242. m_scope = pControl->GetScope();
  243. m_isAutoLoad = pControl->IsAutoLoad();
  244. m_connectedControls = pControl->m_connectedControls;
  245. }
  246. }
  247. }
  248. //-------------------------------------------------------------------------------------------//
  249. void CUndoControlModified::Undo([[maybe_unused]] bool bUndo)
  250. {
  251. SwapData();
  252. }
  253. //-------------------------------------------------------------------------------------------//
  254. void CUndoControlModified::Redo()
  255. {
  256. SwapData();
  257. }
  258. //-------------------------------------------------------------------------------------------//
  259. void CUndoControlModified::SwapData()
  260. {
  261. const CUndoSuspend suspendUndo;
  262. CATLControlsModel* pModel = CAudioControlsEditorPlugin::GetATLModel();
  263. if (pModel)
  264. {
  265. CATLControl* pControl = pModel->GetControlByID(m_id);
  266. if (pControl)
  267. {
  268. AZStd::string name = pControl->GetName();
  269. AZStd::string scope = pControl->GetScope();
  270. bool isAutoLoad = pControl->IsAutoLoad();
  271. AZStd::vector<TConnectionPtr> connectedControls = pControl->m_connectedControls;
  272. pControl->SetName(m_name);
  273. pControl->SetScope(m_scope);
  274. pControl->SetAutoLoad(m_isAutoLoad);
  275. pControl->m_connectedControls = m_connectedControls;
  276. pModel->OnControlModified(pControl);
  277. auto& tmpConnectedControls1 =
  278. connectedControls.size() > m_connectedControls.size() ? connectedControls : m_connectedControls;
  279. auto& tmpConnectedControls2 =
  280. connectedControls.size() > m_connectedControls.size() ? m_connectedControls : connectedControls;
  281. for (auto& connection1 : tmpConnectedControls1)
  282. {
  283. bool bCheck = true;
  284. for (auto& connection2 : tmpConnectedControls2)
  285. {
  286. if (connection1 == connection2)
  287. {
  288. bCheck = false;
  289. break;
  290. }
  291. }
  292. if (!bCheck)
  293. {
  294. continue;
  295. }
  296. if (IAudioSystemEditor* audioSystemImpl = CAudioControlsEditorPlugin::GetImplementationManager()->GetImplementation())
  297. {
  298. if (IAudioSystemControl* middlewareControl = audioSystemImpl->GetControl(connection1->GetID()))
  299. {
  300. if (connectedControls.size() > m_connectedControls.size())
  301. {
  302. audioSystemImpl->ConnectionRemoved(middlewareControl);
  303. pControl->SignalConnectionRemoved(middlewareControl);
  304. }
  305. else
  306. {
  307. TConnectionPtr connection =
  308. audioSystemImpl->CreateConnectionToControl(pControl->GetType(), middlewareControl);
  309. if (connection)
  310. {
  311. pControl->SignalConnectionAdded(middlewareControl);
  312. }
  313. }
  314. pControl->SignalControlModified();
  315. }
  316. }
  317. }
  318. m_name = name;
  319. m_scope = scope;
  320. m_isAutoLoad = isAutoLoad;
  321. m_connectedControls = connectedControls;
  322. }
  323. }
  324. }
  325. //-------------------------------------------------------------------------------------------//
  326. void CUndoItemMove::Undo([[maybe_unused]] bool bUndo)
  327. {
  328. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  329. if (pTree)
  330. {
  331. if (!bModifiedInitialised)
  332. {
  333. Copy(pTree->invisibleRootItem(), m_modified.invisibleRootItem());
  334. bModifiedInitialised = true;
  335. }
  336. pTree->clear();
  337. Copy(m_original.invisibleRootItem(), pTree->invisibleRootItem());
  338. }
  339. }
  340. //-------------------------------------------------------------------------------------------//
  341. void CUndoItemMove::Redo()
  342. {
  343. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  344. if (pTree)
  345. {
  346. pTree->clear();
  347. Copy(m_modified.invisibleRootItem(), pTree->invisibleRootItem());
  348. }
  349. }
  350. //-------------------------------------------------------------------------------------------//
  351. void CUndoItemMove::Copy(QStandardItem* pSource, QStandardItem* pDest)
  352. {
  353. if (pSource && pDest)
  354. {
  355. for (int i = 0; i < pSource->rowCount(); ++i)
  356. {
  357. QStandardItem* pSourceItem = pSource->child(i);
  358. QStandardItem* pDestItem = pSourceItem->clone();
  359. Copy(pSourceItem, pDestItem);
  360. pDest->appendRow(pDestItem);
  361. }
  362. }
  363. }
  364. //-------------------------------------------------------------------------------------------//
  365. CUndoItemMove::CUndoItemMove()
  366. : bModifiedInitialised(false)
  367. {
  368. QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
  369. if (pTree)
  370. {
  371. Copy(pTree->invisibleRootItem(), m_original.invisibleRootItem());
  372. }
  373. }
  374. } // namespace AudioControls