CmQtProjectSelection.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  42. mListWidget->insertItem(i, gEditorPrefs().getRecentlyUsedProjectPath(i));
  43. retranslateUi();
  44. setupSignals();
  45. }
  46. void QtProjectSelection::retranslateUi()
  47. {
  48. setWindowTitle(tr("Project selection"));
  49. mBtnNew->setText(tr("New"));
  50. mBtnBrowse->setText(tr("Browse"));
  51. mBtnOpen->setText(tr("Open"));
  52. }
  53. void QtProjectSelection::setupSignals()
  54. {
  55. connect(mBtnNew, SIGNAL(clicked()), this, SLOT(newProject()));
  56. connect(mBtnBrowse, SIGNAL(clicked()), this, SLOT(browseProject()));
  57. connect(mBtnOpen, SIGNAL(clicked()), this, SLOT(openSelectedProject()));
  58. }
  59. void QtProjectSelection::newProject()
  60. {
  61. QtNewProject newProject;
  62. newProject.exec();
  63. }
  64. void QtProjectSelection::browseProject()
  65. {
  66. QFileDialog dialog(this, tr("Select project directory"));
  67. dialog.setFileMode(QFileDialog::Directory);
  68. dialog.setOption(QFileDialog::ShowDirsOnly, true);
  69. QDir lastUsedDir = gEditorPrefs().getLastUsedProjectDirectory();
  70. if(lastUsedDir.exists())
  71. dialog.setDirectory(lastUsedDir);
  72. if(dialog.exec())
  73. {
  74. QStringList fileNames = dialog.selectedFiles();
  75. if(fileNames.size() > 0)
  76. {
  77. openProject(fileNames[0]);
  78. }
  79. }
  80. }
  81. void QtProjectSelection::openSelectedProject()
  82. {
  83. QListWidgetItem* item = mListWidget->currentItem();
  84. if(item == nullptr)
  85. {
  86. QMessageBox msgBox;
  87. msgBox.setWindowTitle("Error");
  88. msgBox.setText("Please select a project before continuing.");
  89. msgBox.exec();
  90. return;
  91. }
  92. openProject(item->text());
  93. }
  94. void QtProjectSelection::openProject(const QString& path)
  95. {
  96. if(gEditorApp().isValidProjectDirectory(path))
  97. {
  98. addRecentlyUsedProject(path);
  99. gEditorPrefs().setLastUsedProjectDirectory(path);
  100. onProjectSelected(path);
  101. close();
  102. }
  103. else
  104. {
  105. removeRecentlyUsedProject(path);
  106. QMessageBox msgBox;
  107. msgBox.setWindowTitle("Error");
  108. msgBox.setText("Selected directory doesn't contain a valid Camelot project");
  109. msgBox.exec();
  110. return;
  111. }
  112. }
  113. void QtProjectSelection::addRecentlyUsedProject(const QString& path)
  114. {
  115. bool found = false;
  116. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  117. {
  118. if(path == gEditorPrefs().getRecentlyUsedProjectPath(i))
  119. {
  120. found = true;
  121. break;
  122. }
  123. }
  124. gEditorPrefs().addRecentlyUsedProjectPath(path);
  125. }
  126. void QtProjectSelection::removeRecentlyUsedProject(const QString& path)
  127. {
  128. for(int i = 0; i < gEditorPrefs().getNumRecentlyUsedProjects(); i++)
  129. {
  130. if(path == gEditorPrefs().getRecentlyUsedProjectPath(i))
  131. {
  132. gEditorPrefs().removeRecentlyUsedProjectPath(i);
  133. break;
  134. }
  135. }
  136. }
  137. }