SettingsManagerDialog.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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 "EditorDefs.h"
  9. #include "SettingsManagerDialog.h"
  10. // Qt
  11. #include <QMessageBox>
  12. // AzToolsFramework
  13. #include <AzToolsFramework/API/ViewPaneOptions.h>
  14. // Editor
  15. #include "SettingsManager.h"
  16. #include "MainWindow.h"
  17. #include "QtViewPaneManager.h"
  18. #include "Util/AutoDirectoryRestoreFileDialog.h" // for CAutoDirectoryRestoreFileDialog
  19. #include "LyViewPaneNames.h" // for LyViewPane::
  20. #include "ui_SettingsManagerDialog.h"
  21. //////////////////////////////////////////////////////////////////////////
  22. CSettingsManagerDialog::CSettingsManagerDialog(QWidget* pParent)
  23. : QDialog(pParent)
  24. , ui(new Ui::SettingsManagerDialog)
  25. {
  26. ui->setupUi(this);
  27. ui->m_skipToolsChk->setChecked(false);
  28. ui->m_importSettingsChk->setChecked(false);
  29. connect(ui->m_exportBtn, &QAbstractButton::clicked, this, &CSettingsManagerDialog::OnExportBtnClick);
  30. connect(ui->m_readBtn, &QAbstractButton::clicked, this, &CSettingsManagerDialog::OnReadBtnClick);
  31. connect(ui->m_importBtn, &QAbstractButton::clicked, this, &CSettingsManagerDialog::OnImportBtnClick);
  32. connect(ui->m_closeAllToolsBtn, &QAbstractButton::clicked, this, &CSettingsManagerDialog::OnCloseAllTools);
  33. connect(ui->m_layoutListBox, &QListWidget::itemSelectionChanged, this, &CSettingsManagerDialog::OnSelectionChanged);
  34. // Disable import button until a layout is selected.
  35. ui->m_importBtn->setEnabled(false);
  36. }
  37. CSettingsManagerDialog::~CSettingsManagerDialog()
  38. {
  39. }
  40. const GUID& CSettingsManagerDialog::GetClassID()
  41. {
  42. // {64E0B47F-FA9B-46a9-AEF4-BDAC021B5B2F}
  43. static const GUID guid =
  44. {
  45. 0x64e0b47f, 0xfa9b, 0x46a9, { 0xae, 0xf4, 0xbd, 0xac, 0x2, 0x1b, 0x5b, 0x2f }
  46. };
  47. return guid;
  48. }
  49. void CSettingsManagerDialog::RegisterViewClass()
  50. {
  51. AzToolsFramework::ViewPaneOptions options;
  52. options.paneRect = QRect(5, 100, 210, 505);
  53. options.showInMenu = false;
  54. AzToolsFramework::RegisterViewPane<CSettingsManagerDialog>(LyViewPane::EditorSettingsManager, LyViewPane::CategoryOther, options);
  55. }
  56. void CSettingsManagerDialog::OnReadBtnClick()
  57. {
  58. char szFilters[] = "Editor Settings and Layout File (*.xml);;All files (*)";
  59. CAutoDirectoryRestoreFileDialog importFileSelectionDialog(QFileDialog::AcceptOpen, QFileDialog::ExistingFile, "xml", {}, szFilters, {}, {}, this);
  60. if (importFileSelectionDialog.exec())
  61. {
  62. m_importFileStr = importFileSelectionDialog.selectedFiles().first();
  63. ui->m_layoutListBox->clear();
  64. TToolNamesMap toolNames;
  65. XmlNodeRef dummyNode = nullptr;
  66. GetIEditor()->GetSettingsManager()->GetMatchingLayoutNames(toolNames, dummyNode, m_importFileStr);
  67. if (!toolNames.empty())
  68. {
  69. TToolNamesMap::const_iterator tIt = toolNames.begin();
  70. for (; tIt != toolNames.end(); ++tIt)
  71. {
  72. if (!tIt->second.isEmpty())
  73. {
  74. ui->m_layoutListBox->addItem(tIt->second);
  75. }
  76. else
  77. if (!tIt->first.isEmpty())
  78. {
  79. ui->m_layoutListBox->addItem(tIt->first);
  80. }
  81. }
  82. }
  83. ui->m_layoutListBox->selectAll();
  84. }
  85. }
  86. void CSettingsManagerDialog::OnExportBtnClick()
  87. {
  88. char szFilters[] = "Editor Settings and Layout File (*.xml);;All files (*)";
  89. CAutoDirectoryRestoreFileDialog exportFileSelectionDialog(QFileDialog::AcceptSave, QFileDialog::AnyFile, "xml", "ExportedEditor.xml", szFilters, {}, {}, this);
  90. if (exportFileSelectionDialog.exec())
  91. {
  92. QString file = exportFileSelectionDialog.selectedFiles().first();
  93. GetIEditor()->GetSettingsManager()->SetExportFileName(file);
  94. QtViewPaneManager::instance()->ClosePane(LyViewPane::EditorSettingsManager);
  95. GetIEditor()->GetSettingsManager()->Export();
  96. }
  97. }
  98. void CSettingsManagerDialog::OnImportBtnClick()
  99. {
  100. QString importFileStr = m_importFileStr;
  101. bool bImportSettings = ui->m_importSettingsChk->isChecked();
  102. QString ask = tr("This will close all opened Views. Make sure to save your projects and backup layout before continuing");
  103. QStringList layouts;
  104. for (auto& item : ui->m_layoutListBox->selectedItems())
  105. {
  106. layouts.append(item->text());
  107. }
  108. // Show warning window to the user in case he selects some layouts to import
  109. if (!layouts.isEmpty())
  110. {
  111. if (QMessageBox::question(this, tr("Editor"), ask) != QMessageBox::Yes)
  112. {
  113. return;
  114. }
  115. }
  116. // Import Settings
  117. if (bImportSettings)
  118. {
  119. ImportSettings(importFileStr);
  120. }
  121. QtViewPaneManager::instance()->CloseAllNonStandardPanes();
  122. // Import layout
  123. if (!layouts.isEmpty())
  124. {
  125. ImportLayouts(importFileStr, layouts);
  126. }
  127. }
  128. void CSettingsManagerDialog::ImportSettings(QString file)
  129. {
  130. if (QFile::exists(file))
  131. {
  132. GetIEditor()->GetSettingsManager()->ImportSettings(file);
  133. }
  134. }
  135. void CSettingsManagerDialog::ImportLayouts(QString file, const QStringList& layouts)
  136. {
  137. auto viewPaneManager = QtViewPaneManager::instance();
  138. if (!layouts.isEmpty())
  139. {
  140. TToolNamesMap& allToolNames = *GetIEditor()->GetSettingsManager()->GetToolNames();
  141. if (allToolNames.empty())
  142. {
  143. return;
  144. }
  145. TToolNamesMap toolNames;
  146. for (const QString& layoutStr : layouts)
  147. {
  148. auto it = std::find_if(allToolNames.begin(), allToolNames.end(),
  149. [&](const std::pair<QString, QString>& v)
  150. {
  151. return layoutStr == v.second;
  152. });
  153. if (it == allToolNames.end())
  154. {
  155. continue;
  156. }
  157. toolNames.insert(*it);
  158. }
  159. // Remove previous tool node
  160. XmlNodeRef layoutNode = XmlHelpers::CreateXmlNode(EDITOR_LAYOUT_NODE);
  161. // Find in file and add selected tool node
  162. GetIEditor()->GetSettingsManager()->GetMatchingLayoutNames(toolNames, layoutNode, file);
  163. // restore main window layout
  164. auto it = toolNames.find(QStringLiteral(MAINFRM_LAYOUT_NORMAL));
  165. if (it == toolNames.end())
  166. {
  167. it = toolNames.find(QStringLiteral(MAINFRM_LAYOUT_PREVIEW));
  168. }
  169. if (it != toolNames.end())
  170. {
  171. const QString& className = it->first;
  172. XmlNodeRef dockingLayoutNode = layoutNode->findChild(className.toUtf8().data());
  173. if (dockingLayoutNode)
  174. {
  175. viewPaneManager->DeserializeLayout(dockingLayoutNode);
  176. }
  177. }
  178. // restore tool panes layouts
  179. for (it = toolNames.begin(); it != toolNames.end(); ++it)
  180. {
  181. const QString& className = it->first;
  182. const QString& paneName = it->second;
  183. if (className == QStringLiteral(MAINFRM_LAYOUT_NORMAL) || className == QStringLiteral(MAINFRM_LAYOUT_PREVIEW))
  184. {
  185. continue;
  186. }
  187. XmlNodeRef dockingLayoutNode = layoutNode->findChild(className.toUtf8().data());
  188. if (!dockingLayoutNode)
  189. {
  190. continue;
  191. }
  192. auto toolPanel = FindViewPane<QMainWindow>(paneName);
  193. if (!toolPanel)
  194. {
  195. continue;
  196. }
  197. XmlNodeRef windowStateNode = dockingLayoutNode->findChild("WindowState");
  198. if (windowStateNode)
  199. {
  200. toolPanel->restoreState(QByteArray::fromHex(windowStateNode->getContent()));
  201. }
  202. }
  203. }
  204. }
  205. void CSettingsManagerDialog::OnCloseAllTools()
  206. {
  207. auto viewPaneManager = QtViewPaneManager::instance();
  208. viewPaneManager->CloseAllNonStandardPanes();
  209. viewPaneManager->SaveLayout();
  210. }
  211. void CSettingsManagerDialog::OnSelectionChanged()
  212. {
  213. ui->m_importBtn->setEnabled(ui->m_layoutListBox->selectedItems().count());
  214. }
  215. #include <moc_SettingsManagerDialog.cpp>