CmQtProjectSelection.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. mListRecentProjects = new QListWidget(this);
  26. QWidget* buttonsWidget = new QWidget(this);
  27. mBtnNew = new QPushButton(buttonsWidget);
  28. mBtnOpen = new QPushButton(buttonsWidget);
  29. mBtnOpenOther = new QPushButton(buttonsWidget);
  30. QHBoxLayout* buttonLayout = new QHBoxLayout(this);
  31. buttonLayout->setMargin(0);
  32. buttonLayout->addWidget(mBtnNew);
  33. buttonLayout->addWidget(mBtnOpenOther);
  34. buttonLayout->addWidget(mBtnOpen);
  35. buttonsWidget->setLayout(buttonLayout);
  36. QVBoxLayout* centralLayout = new QVBoxLayout(this);
  37. centralLayout->setMargin(0);
  38. centralLayout->addWidget(mListRecentProjects);
  39. centralLayout->addWidget(buttonsWidget);
  40. setLayout(centralLayout);
  41. reloadProjectList();
  42. setObjectNames();
  43. retranslateUi();
  44. setupSignals();
  45. }
  46. void QtProjectSelection::retranslateUi()
  47. {
  48. setWindowTitle(tr("Project selection"));
  49. mBtnNew->setText(tr("New"));
  50. mBtnOpenOther->setText(tr("Open other"));
  51. mBtnOpen->setText(tr("Open"));
  52. }
  53. void QtProjectSelection::setupSignals()
  54. {
  55. connect(mBtnNew, &QPushButton::clicked, this, &QtProjectSelection::newProject);
  56. connect(mBtnOpenOther, &QPushButton::clicked, this, &QtProjectSelection::browseProject);
  57. connect(mBtnOpen, &QPushButton::clicked, this, &QtProjectSelection::openSelectedProject);
  58. }
  59. void QtProjectSelection::setObjectNames()
  60. {
  61. mListRecentProjects->setObjectName(QStringLiteral("ListRecentProjects"));
  62. mBtnOpen->setObjectName(QStringLiteral("BtnOpen"));
  63. mBtnNew->setObjectName(QStringLiteral("BtnNew"));
  64. mBtnOpenOther->setObjectName(QStringLiteral("BtnOpenOther"));
  65. }
  66. void QtProjectSelection::reloadProjectList()
  67. {
  68. mListRecentProjects->clear();
  69. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  70. mListRecentProjects->insertItem(i, gEditorPrefs().getRecentlyUsedProjectPath(i));
  71. }
  72. void QtProjectSelection::newProject()
  73. {
  74. QtNewProject newProject;
  75. if(newProject.exec() == QDialog::Accepted)
  76. {
  77. openProject(newProject.getProjectPath());
  78. }
  79. }
  80. void QtProjectSelection::browseProject()
  81. {
  82. QFileDialog dialog(this, tr("Select project directory"));
  83. dialog.setFileMode(QFileDialog::Directory);
  84. dialog.setOption(QFileDialog::ShowDirsOnly, true);
  85. QDir lastUsedDir = gEditorPrefs().getLastUsedProjectDirectory();
  86. if(lastUsedDir.exists())
  87. dialog.setDirectory(lastUsedDir);
  88. if(dialog.exec() == QDialog::Accepted)
  89. {
  90. QStringList fileNames = dialog.selectedFiles();
  91. if(fileNames.size() > 0)
  92. {
  93. openProject(fileNames[0]);
  94. }
  95. }
  96. }
  97. void QtProjectSelection::openSelectedProject()
  98. {
  99. QListWidgetItem* item = mListRecentProjects->currentItem();
  100. if(item == nullptr)
  101. {
  102. QMessageBox msgBox;
  103. msgBox.setWindowTitle("Error");
  104. msgBox.setText("Please select a project before continuing.");
  105. msgBox.exec();
  106. return;
  107. }
  108. openProject(item->text());
  109. }
  110. void QtProjectSelection::openProject(const QString& path)
  111. {
  112. if(gEditorApp().isValidProject(path))
  113. {
  114. addRecentlyUsedProject(path);
  115. onProjectSelected(path);
  116. accept();
  117. }
  118. else
  119. {
  120. removeRecentlyUsedProject(path);
  121. reloadProjectList();
  122. QMessageBox msgBox;
  123. msgBox.setWindowTitle("Error");
  124. msgBox.setText("Selected directory doesn't contain a valid Camelot project");
  125. msgBox.exec();
  126. return;
  127. }
  128. }
  129. void QtProjectSelection::addRecentlyUsedProject(const QString& path)
  130. {
  131. bool found = false;
  132. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  133. {
  134. if(path == gEditorPrefs().getRecentlyUsedProjectPath(i))
  135. {
  136. found = true;
  137. break;
  138. }
  139. }
  140. gEditorPrefs().addRecentlyUsedProjectPath(path);
  141. }
  142. void QtProjectSelection::removeRecentlyUsedProject(const QString& path)
  143. {
  144. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  145. {
  146. if(path == gEditorPrefs().getRecentlyUsedProjectPath(i))
  147. {
  148. gEditorPrefs().removeRecentlyUsedProjectPath(i);
  149. break;
  150. }
  151. }
  152. }
  153. }