CmQtProjectSelection.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "CmQtProjectSelection.h"
  2. #include "CmEditorPrefs.h"
  3. #include "CmEditorApplication.h"
  4. #include "CmQtNewProject.h"
  5. #include <QtWidgets/QApplication>
  6. #include <QtWidgets/QVBoxLayout>
  7. #include <QtWidgets/QHBoxLayout>
  8. #include <QtWidgets/QListWidget>
  9. #include <QtWidgets/QFileDialog>
  10. #include <QtWidgets/QMessageBox>
  11. namespace CamelotEditor
  12. {
  13. QtProjectSelection::QtProjectSelection(QWidget *parent)
  14. :QDialog(parent)
  15. {
  16. setupUi();
  17. }
  18. QtProjectSelection::~QtProjectSelection()
  19. {
  20. }
  21. void QtProjectSelection::setupUi()
  22. {
  23. setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::MSWindowsFixedSizeDialogHint);
  24. setFixedSize(400, 170);
  25. mListWidget = new QListWidget(this);
  26. QWidget* buttonsWidget = new QWidget(this);
  27. mBtnNew = new QPushButton(buttonsWidget);
  28. mBtnOpen = new QPushButton(buttonsWidget);
  29. mBtnBrowse = new QPushButton(buttonsWidget);
  30. QHBoxLayout* buttonLayout = new QHBoxLayout(this);
  31. buttonLayout->setMargin(0);
  32. buttonLayout->addWidget(mBtnNew);
  33. buttonLayout->addWidget(mBtnBrowse);
  34. buttonLayout->addWidget(mBtnOpen);
  35. buttonsWidget->setLayout(buttonLayout);
  36. QVBoxLayout* centralLayout = new QVBoxLayout(this);
  37. centralLayout->setMargin(0);
  38. centralLayout->addWidget(mListWidget);
  39. centralLayout->addWidget(buttonsWidget);
  40. setLayout(centralLayout);
  41. reloadProjectList();
  42. retranslateUi();
  43. setupSignals();
  44. }
  45. void QtProjectSelection::retranslateUi()
  46. {
  47. setWindowTitle(tr("Project selection"));
  48. mBtnNew->setText(tr("New"));
  49. mBtnBrowse->setText(tr("Browse"));
  50. mBtnOpen->setText(tr("Open"));
  51. }
  52. void QtProjectSelection::setupSignals()
  53. {
  54. connect(mBtnNew, &QPushButton::clicked, this, &QtProjectSelection::newProject);
  55. connect(mBtnBrowse, &QPushButton::clicked, this, &QtProjectSelection::browseProject);
  56. connect(mBtnOpen, &QPushButton::clicked, this, &QtProjectSelection::openSelectedProject);
  57. }
  58. void QtProjectSelection::reloadProjectList()
  59. {
  60. mListWidget->clear();
  61. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  62. mListWidget->insertItem(i, gEditorPrefs().getRecentlyUsedProjectPath(i));
  63. }
  64. void QtProjectSelection::newProject()
  65. {
  66. QtNewProject newProject;
  67. if(newProject.exec() == QDialog::Accepted)
  68. {
  69. openProject(newProject.getProjectPath());
  70. }
  71. }
  72. void QtProjectSelection::browseProject()
  73. {
  74. QFileDialog dialog(this, tr("Select project directory"));
  75. dialog.setFileMode(QFileDialog::Directory);
  76. dialog.setOption(QFileDialog::ShowDirsOnly, true);
  77. QDir lastUsedDir = gEditorPrefs().getLastUsedProjectDirectory();
  78. if(lastUsedDir.exists())
  79. dialog.setDirectory(lastUsedDir);
  80. if(dialog.exec() == QDialog::Accepted)
  81. {
  82. QStringList fileNames = dialog.selectedFiles();
  83. if(fileNames.size() > 0)
  84. {
  85. openProject(fileNames[0]);
  86. }
  87. }
  88. }
  89. void QtProjectSelection::openSelectedProject()
  90. {
  91. QListWidgetItem* item = mListWidget->currentItem();
  92. if(item == nullptr)
  93. {
  94. QMessageBox msgBox;
  95. msgBox.setWindowTitle("Error");
  96. msgBox.setText("Please select a project before continuing.");
  97. msgBox.exec();
  98. return;
  99. }
  100. openProject(item->text());
  101. }
  102. void QtProjectSelection::openProject(const QString& path)
  103. {
  104. if(gEditorApp().isValidProject(path))
  105. {
  106. addRecentlyUsedProject(path);
  107. onProjectSelected(path);
  108. accept();
  109. }
  110. else
  111. {
  112. removeRecentlyUsedProject(path);
  113. reloadProjectList();
  114. QMessageBox msgBox;
  115. msgBox.setWindowTitle("Error");
  116. msgBox.setText("Selected directory doesn't contain a valid Camelot project");
  117. msgBox.exec();
  118. return;
  119. }
  120. }
  121. void QtProjectSelection::addRecentlyUsedProject(const QString& path)
  122. {
  123. bool found = false;
  124. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  125. {
  126. if(path == gEditorPrefs().getRecentlyUsedProjectPath(i))
  127. {
  128. found = true;
  129. break;
  130. }
  131. }
  132. gEditorPrefs().addRecentlyUsedProjectPath(path);
  133. }
  134. void QtProjectSelection::removeRecentlyUsedProject(const QString& path)
  135. {
  136. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  137. {
  138. if(path == gEditorPrefs().getRecentlyUsedProjectPath(i))
  139. {
  140. gEditorPrefs().removeRecentlyUsedProjectPath(i);
  141. break;
  142. }
  143. }
  144. }
  145. }