PageRenderTime 43ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/RevistaUI/UI/MainWindow.cpp

https://gitlab.com/mvaldivia/RevistaGit
C++ | 218 lines | 181 code | 31 blank | 6 comment | 14 complexity | 2d7c0c14552bd291d2006dd8eeab456b MD5 | raw file
  1. #include "MainWindow.h"
  2. #include "ui_MainWindow.h"
  3. #include "GitProjectPropertiesDialog.h"
  4. #include "Models/GitProjectsModel.h"
  5. #include "Models/GitCommitTreeModel.h"
  6. #include "Models/GitLogModel.h"
  7. #include "Core/GitProject.h"
  8. #include "Core/Settings.h"
  9. #include "Components/GitProjectListViewDelegate.h"
  10. #include <Repository.h>
  11. #include <Reference.h>
  12. #include <Commit.h>
  13. #include <Tree.h>
  14. #include <Object.h>
  15. #include <QSettings>
  16. #include <QMessageBox>
  17. #include <QDir>
  18. #include <QUrl>
  19. #include <QDesktopServices>
  20. #include <iostream>
  21. namespace RevistaGit {
  22. MainWindow::MainWindow(QWidget *parent)
  23. : QMainWindow(parent)
  24. , ui(new Ui::MainWindow)
  25. , mGitProjectsModel(new GitProjectsModel(this))
  26. , mGitCommitTreeModel(nullptr)
  27. , mCurrentProject(nullptr)
  28. , mProjectListViewDelegate(new CustomWidgetItemDelegate(new GitProjectListViewDelegate()))
  29. {
  30. ui->setupUi(this);
  31. setupUI();
  32. }
  33. MainWindow::~MainWindow()
  34. {
  35. saveUIState();
  36. delete ui;
  37. delete mGitCommitTreeModel;
  38. delete mGitProjectsModel;
  39. delete mProjectListViewDelegate;
  40. }
  41. void MainWindow::setupUI()
  42. {
  43. Settings settings;
  44. mGitProjectsModel->setProjectsList(settings.loadGitProjects());
  45. ui->gitProjectsListView->setItemDelegate(mProjectListViewDelegate);
  46. ui->gitProjectsListView->setModel(mGitProjectsModel);
  47. // Context Menu
  48. QList<QAction *> contextMenuItems;
  49. contextMenuItems << ui->actionRepositoryAddExisting;
  50. contextMenuItems << ui->actionRepositoryClone;
  51. contextMenuItems << ui->actionRepositoryCreate;
  52. contextMenuItems << ui->actionRepositoryRemove;
  53. QAction *sep = new QAction(this);
  54. sep->setSeparator(true);
  55. contextMenuItems << sep;
  56. contextMenuItems << ui->actionOpenInBrowser;
  57. ui->gitProjectsListView->addActions(contextMenuItems);
  58. // UI State
  59. loadUIState();
  60. }
  61. void MainWindow::loadUIState()
  62. {
  63. QSettings settings;
  64. settings.beginGroup("mainwindow");
  65. restoreGeometry(settings.value("geometry").toByteArray());
  66. ui->splitter->restoreState(settings.value("mainsplitter").toByteArray());
  67. settings.endGroup();
  68. }
  69. void MainWindow::saveUIState()
  70. {
  71. QSettings settings;
  72. settings.beginGroup("mainwindow");
  73. settings.setValue("geometry", saveGeometry());
  74. settings.setValue("mainsplitter", ui->splitter->saveState());
  75. settings.endGroup();
  76. }
  77. void MainWindow::openNewGitProjectDialog(int mode)
  78. {
  79. GitProjectUPtr proj(new GitProject());
  80. GitProjectPropertiesDialog::DialogModeT dMode = static_cast<GitProjectPropertiesDialog::DialogModeT>(mode);
  81. GitProjectPropertiesDialog dlg(this, dMode, proj.get());
  82. if (dlg.exec() == QDialog::Accepted)
  83. {
  84. mGitProjectsModel->addProject(proj.release());
  85. Settings settings;
  86. settings.saveGitProjects(mGitProjectsModel->getProjectsList());
  87. }
  88. }
  89. void MainWindow::on_actionRepositoryAddExisting_triggered()
  90. {
  91. openNewGitProjectDialog(GitProjectPropertiesDialog::ExistingRepository);
  92. }
  93. void MainWindow::on_actionRepositoryCreate_triggered()
  94. {
  95. openNewGitProjectDialog(GitProjectPropertiesDialog::Creation);
  96. }
  97. void MainWindow::on_actionRepositoryClone_triggered()
  98. {
  99. openNewGitProjectDialog(GitProjectPropertiesDialog::Clone);
  100. }
  101. void MainWindow::on_actionRepositoryRemove_triggered()
  102. {
  103. if (!ui->gitProjectsListView->selectionModel()->hasSelection())
  104. return;
  105. QModelIndex index = ui->gitProjectsListView->selectionModel()->currentIndex();
  106. QString repoName = index.data().toString();
  107. // TODO add param to erase from disk
  108. if (QMessageBox::Yes == QMessageBox::question(this, tr("Delete repository"),
  109. tr("Do you really want to remove the project \"%1\" ?").arg(repoName),
  110. QMessageBox::Yes | QMessageBox::No,
  111. QMessageBox::No))
  112. {
  113. mGitProjectsModel->removeProject(index);
  114. }
  115. }
  116. void MainWindow::on_actionOpenInBrowser_triggered()
  117. {
  118. if (!ui->gitProjectsListView->selectionModel()->hasSelection())
  119. return;
  120. QModelIndex index = ui->gitProjectsListView->selectionModel()->currentIndex();
  121. QString repoPath = index.data(GitProjectsModel::PathRole).toString();
  122. QDir path(repoPath);
  123. if (!path.exists())
  124. {
  125. if (QMessageBox::Yes == QMessageBox::critical(this, tr("Error opening repository folder"),
  126. tr("The repository folder does not exist !\nDo you want to remove the project \"%1\" ?").arg(index.data().toString()),
  127. QMessageBox::Yes | QMessageBox::No,
  128. QMessageBox::No))
  129. {
  130. mGitProjectsModel->removeProject(index);
  131. }
  132. }
  133. else
  134. QDesktopServices::openUrl(QUrl::fromLocalFile(repoPath));
  135. }
  136. void MainWindow::displayGitProject(GitProject * project)
  137. {
  138. mCurrentProject = project;
  139. const Git2Cpp::Repository * repo = mCurrentProject->repository();
  140. Git2Cpp::Reference head = repo->getHead();
  141. Git2Cpp::Object obj = repo->lookup<Git2Cpp::Object>(head.target());
  142. Git2Cpp::Commit commit(std::move(obj));
  143. std::cout << "Info on commit " << commit.getId() << std::endl;
  144. std::cout << "Author : " << commit.getAuthor() << std::endl;
  145. std::cout << "Committer : " << commit.getCommitter() << std::endl;
  146. std::cout << "Summary : " << commit.getSummary() << std::endl;
  147. std::cout << "Body : " << commit.getBody() << std::endl;
  148. std::cout << "Message : " << commit.getMessage() << std::endl;
  149. if (mGitCommitTreeModel != nullptr)
  150. delete mGitCommitTreeModel;
  151. mGitCommitTreeModel = new GitCommitTreeModel(this, &commit);
  152. ui->gitCommitTreeView->setModel(mGitCommitTreeModel);
  153. ui->tabLog->setGitProject(mCurrentProject);
  154. }
  155. void MainWindow::on_gitProjectsListView_doubleClicked(const QModelIndex &index)
  156. {
  157. GitProject * project = mGitProjectsModel->getProject(index);
  158. QString res = project->open();
  159. if (res.isEmpty())
  160. displayGitProject(project);
  161. else
  162. {
  163. // TODO add param to erase from disk
  164. if (QMessageBox::Yes == QMessageBox::question(this, tr("Error opening repository"),
  165. tr("Do you want to remove the project \"%1\" ?").arg(project->getName()),
  166. QMessageBox::Yes | QMessageBox::No,
  167. QMessageBox::No))
  168. {
  169. mGitProjectsModel->removeProject(index);
  170. }
  171. }
  172. }
  173. void MainWindow::on_gitCommitTreeView_doubleClicked(const QModelIndex &index)
  174. {
  175. QVariant tmp = index.data(GitCommitTreeModel::OidRole);
  176. std::string oidStr = tmp.toString().toStdString();
  177. Git2Cpp::Oid oid = oidStr;
  178. try {
  179. //Git2Cpp::Commit commit = mCurrentProject->getRepository()->lookup<Git2Cpp::Commit>(oid);
  180. //std::cout << "Found commit : " << commit.getId() << std::endl;
  181. Git2Cpp::Object obj = mCurrentProject->repository()->lookup<Git2Cpp::Object>(oid);
  182. std::cout << "Found object : " << obj.getId() << ":"<< obj.typeStr() << std::endl;
  183. } catch (std::exception &ex) {
  184. std::cout << "Lookup Exception : " << ex.what() << std::endl;
  185. }
  186. }
  187. } // namespace RevistaGit