ProjectManager.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include "pch.h"
  2. #include <QTreeWidget>
  3. #include <QAction>
  4. #include <QMenu>
  5. #include "ProjectManager.h"
  6. #include <QtConcurrent>
  7. ProjectManager::ProjectManager(metavis* owner)
  8. : QWidget(owner), owner(owner)
  9. {
  10. QGridLayout* gridlayout = new QGridLayout();
  11. gridlayout->setContentsMargins(0, 0, 0, 0);
  12. treeWidget = new QTreeWidget();
  13. treeWidget->setColumnCount(1);
  14. treeWidget->setHeaderHidden(true);
  15. treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
  16. connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, &ProjectManager::prepareMenu);
  17. connect(treeWidget, &QTreeWidget::itemActivated, this, &ProjectManager::itemClicked);
  18. projectItem = new QTreeWidgetItem(treeWidget, QStringList("Project"), ProjectManager::Types::ProjectHeader);
  19. projectItem->setExpanded(true);
  20. gridlayout->addWidget(treeWidget);
  21. this->setLayout(gridlayout);
  22. //Create Menus
  23. projectMenu = new QMenu(this);
  24. QAction* metaLogAddAction = new QAction("Add .csv-File...");
  25. QIcon test(":/metavis/Resources/file.svg");
  26. metaLogAddAction->setIcon(test);
  27. connect(metaLogAddAction, &QAction::triggered, this, &ProjectManager::openFileDialog);
  28. //connect(metaLogAddAction, &QAction::triggered, this, [this]() { project.addFile(); });
  29. QAction* removeAllFilesAction = new QAction("Remove all .csv-Files");
  30. removeAllFilesAction->setIcon(QIcon(":/metavis/Resources/csv_remove.svg"));
  31. connect(removeAllFilesAction, &QAction::triggered, this, [this]() {
  32. for (RunData& data : project.getRunList()) {
  33. this->owner->removeRunDataFromAllViews(&data);
  34. }
  35. project.clearDataList();
  36. createTreeWidget();
  37. });
  38. projectMenu->addAction(metaLogAddAction);
  39. projectMenu->addAction(removeAllFilesAction);
  40. metalogFileMenu = new QMenu(this);
  41. QIcon removeIcon(":/metavis/Resources/close_big_red.svg");
  42. removeMetalogFileAction = new QAction("Remove");
  43. removeMetalogFileAction->setIcon(removeIcon);
  44. //connect(removeMetalogFileAction, &QAction::triggered, this, [this]() {project.clearDataList(); });
  45. selectAction = new QAction("Show");
  46. selectAction->setIcon(QIcon(":/metavis/Resources/arrow_right.svg"));
  47. metalogFileMenu->addAction(selectAction);
  48. metalogFileMenu->addAction(removeMetalogFileAction);
  49. singleRunMenu = new QMenu(this);
  50. singleRunMenu->addAction(selectAction);
  51. connect(&watcher, &QFutureWatcher<void>::finished, this, &ProjectManager::displayNewFile);
  52. //Settings
  53. QSettings settings("settings.ini", QSettings::IniFormat, this);
  54. settings.beginGroup("ProjectManager");
  55. lastPath = settings.value("path", "").toString();
  56. settings.endGroup();
  57. }
  58. ProjectManager::~ProjectManager()
  59. {
  60. //Settings
  61. QSettings settings("settings.ini", QSettings::IniFormat, this);
  62. settings.beginGroup("ProjectManager");
  63. settings.setValue("path", lastPath);
  64. settings.endGroup();
  65. }
  66. void ProjectManager::openFileDialog()
  67. {
  68. qDebug() << "openFile";
  69. this->lastPath != "";
  70. QStringList pathList = QFileDialog::getOpenFileNames(this, "Open logFile",(this->lastPath != "")? lastPath :QStandardPaths::displayName(QStandardPaths::DesktopLocation), "Logfile (*.csv)");
  71. if (pathList.isEmpty()) {
  72. qDebug() << "No file selected";
  73. return;
  74. }
  75. QDir d = QFileInfo(pathList.front()).absoluteDir();
  76. lastPath = d.absolutePath();
  77. owner->showStatusBarLoading();
  78. //this->loadingFuture = std::async(std::launch::async, static_cast<void(ProjectManager::*)(std::list<QString>)>(&ProjectManager::openFiles), this, stdList);
  79. future = QtConcurrent::run(this, &ProjectManager::openFiles, pathList);
  80. watcher.setFuture(future);
  81. }
  82. void ProjectManager::openFiles(QStringList pathList)
  83. {
  84. int size = project.getRunList().size();
  85. for (QString& string: pathList) {
  86. qDebug() << "file:" << string;
  87. project.addFile(string.toStdString());
  88. }
  89. for (std::list<RunData>::iterator iter = std::next(project.getRunList().begin(), size); iter != project.getRunList().end(); iter++) {
  90. //owner->addRunDataToCompareViews(&*iter);
  91. }
  92. }
  93. void ProjectManager::displayNewFile()
  94. {
  95. owner->selectRunData(&project.getRunList().back());
  96. owner->selectSingleRun(&project.getRunList().back().singleRunList.front());
  97. createTreeWidget();
  98. owner->clearStatusBar();
  99. }
  100. void ProjectManager::createTreeWidget()
  101. {
  102. //remove all clidren
  103. for (QTreeWidgetItem* item : projectItem->takeChildren()) {
  104. delete item;
  105. }
  106. for (RunData& run : project.getRunList()) {
  107. qDebug() << "RunList add" << QString::fromStdString(run.name);
  108. QTreeWidgetItem* item = new QTreeWidgetItem(projectItem, QStringList(QString::fromStdString(run.name)), ProjectManager::Types::LogFile);
  109. QVariant variant(QVariant::fromValue(static_cast<void*>(&run)));
  110. item->setData(1, Qt::UserRole, variant);
  111. item->setExpanded(true);
  112. int count = 0;
  113. for (SingleRun& srun : run.singleRunList) {
  114. QTreeWidgetItem* runitem = new QTreeWidgetItem(item, QStringList(QString::fromStdString(run.name) + "[" + QString::number(count) + "]"), ProjectManager::Types::Run);
  115. QVariant srunVariant(QVariant::fromValue(static_cast<void*>(&srun)));
  116. runitem->setData(1, Qt::UserRole, srunVariant);
  117. count++;
  118. }
  119. }
  120. }
  121. void ProjectManager::showItem(QTreeWidgetItem* item)
  122. {
  123. switch (item->type()) {
  124. case LogFile:
  125. {
  126. RunData* data = static_cast<RunData*>(item->data(1, Qt::UserRole).value<void*>());
  127. if (data != nullptr) {
  128. owner->selectRunData(data);
  129. }
  130. break;
  131. }
  132. case Run:
  133. {
  134. SingleRun* data = static_cast<SingleRun*>(item->data(1, Qt::UserRole).value<void*>());
  135. if (data != nullptr) {
  136. owner->selectSingleRun(data);
  137. }
  138. break;
  139. }
  140. default:
  141. break;
  142. }
  143. }
  144. void ProjectManager::itemClicked(QTreeWidgetItem* item, int column)
  145. {
  146. switch (item->type()) {
  147. case Types::Graph:
  148. break;
  149. case Types::GraphManger:
  150. break;
  151. case Types::LogFile:
  152. case Types::Run:
  153. showItem(item);
  154. break;
  155. case Types::LogManger:
  156. break;
  157. default:
  158. break;
  159. }
  160. }
  161. void ProjectManager::prepareMenu(const QPoint& pos) {
  162. QTreeWidgetItem* item = treeWidget->itemAt(pos);
  163. if (item == nullptr) return;
  164. switch (item->type()) {
  165. case Types::Graph:
  166. //graphMenu->exec(treeWidget->mapToGlobal(pos));
  167. break;
  168. case Types::GraphManger:
  169. break;
  170. case Types::Run:
  171. {
  172. QAction* used = singleRunMenu->exec(treeWidget->mapToGlobal(pos));
  173. if (used == selectAction) {
  174. showItem(item);
  175. }
  176. break;
  177. }
  178. case Types::LogFile:
  179. {
  180. QAction* used = metalogFileMenu->exec(treeWidget->mapToGlobal(pos));
  181. if (used == removeMetalogFileAction) {
  182. RunData* data = static_cast<RunData*>(item->data(1, Qt::UserRole).value<void*>());
  183. owner->removeRunDataFromAllViews(data);
  184. project.removeRunData(data);
  185. createTreeWidget();
  186. }
  187. else if (used == selectAction) {
  188. showItem(item);
  189. }
  190. break;
  191. }
  192. case Types::ProjectHeader:
  193. projectMenu->exec(treeWidget->mapToGlobal(pos));
  194. break;
  195. default:
  196. break;
  197. }
  198. }