1
0

importnotebookdialog.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "importnotebookdialog.h"
  2. #include <QtWidgets>
  3. #include "../widgetsfactory.h"
  4. #include "vnotex.h"
  5. #include "notebookmgr.h"
  6. #include "notebook/inotebookfactory.h"
  7. #include "notebook/notebookparameters.h"
  8. #include "versioncontroller/iversioncontrollerfactory.h"
  9. #include "notebookconfigmgr/inotebookconfigmgrfactory.h"
  10. #include "notebookbackend/inotebookbackendfactory.h"
  11. #include "configmgr.h"
  12. #include <utils/pathutils.h>
  13. #include <utils/utils.h>
  14. #include "exception.h"
  15. #include "notebookinfowidget.h"
  16. using namespace vnotex;
  17. ImportNotebookDialog::ImportNotebookDialog(QWidget *p_parent)
  18. : ScrollDialog(p_parent)
  19. {
  20. setupUI();
  21. m_infoWidget->getRootFolderPathLineEdit()->setFocus();
  22. }
  23. void ImportNotebookDialog::setupUI()
  24. {
  25. setupNotebookInfoWidget(this);
  26. setCentralWidget(m_infoWidget);
  27. setDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
  28. setButtonEnabled(QDialogButtonBox::Ok, false);
  29. setWindowTitle(tr("Open Notebook"));
  30. }
  31. void ImportNotebookDialog::setupNotebookInfoWidget(QWidget *p_parent)
  32. {
  33. m_infoWidget = new NotebookInfoWidget(NotebookInfoWidget::Import, p_parent);
  34. connect(m_infoWidget, &NotebookInfoWidget::basicInfoEdited,
  35. this, &ImportNotebookDialog::validateInputs);
  36. connect(m_infoWidget, &NotebookInfoWidget::notebookBackendEdited,
  37. this, &ImportNotebookDialog::validateInputs);
  38. }
  39. void ImportNotebookDialog::acceptedButtonClicked()
  40. {
  41. if (importNotebook()) {
  42. accept();
  43. }
  44. }
  45. void ImportNotebookDialog::validateInputs()
  46. {
  47. bool valid = true;
  48. QString msg;
  49. valid = valid && validateRootFolderInput(msg);
  50. if (valid) {
  51. valid = createNotebookToImport(msg);
  52. } else {
  53. m_notebookToImport.clear();
  54. }
  55. m_infoWidget->setNotebook(m_notebookToImport.data());
  56. setInformationText(msg, valid ? ScrollDialog::InformationLevel::Info
  57. : ScrollDialog::InformationLevel::Error);
  58. setButtonEnabled(QDialogButtonBox::Ok, valid);
  59. }
  60. bool ImportNotebookDialog::validateRootFolderInput(QString &p_msg)
  61. {
  62. auto rootFolderPath = m_infoWidget->getRootFolderPath();
  63. if (rootFolderPath.isEmpty() || !QFileInfo::exists(rootFolderPath)) {
  64. Utils::appendMsg(p_msg, tr("The root folder specified does not exist."));
  65. return false;
  66. }
  67. auto &notebookMgr = VNoteX::getInst().getNotebookMgr();
  68. // Check if there already exists one notebook with the same root folder.
  69. {
  70. auto notebook = notebookMgr.findNotebookByRootFolderPath(rootFolderPath);
  71. if (notebook) {
  72. Utils::appendMsg(p_msg,
  73. tr("There already exists a notebook (%1) with the same root folder.").arg(notebook->getName()));
  74. return false;
  75. }
  76. }
  77. // Check if it is a valid bundle notebook root folder.
  78. {
  79. auto factory = notebookMgr.getBundleNotebookFactory();
  80. auto backendName = m_infoWidget->getBackend();
  81. auto backend = notebookMgr.createNotebookBackend(backendName, rootFolderPath);
  82. if (!factory->checkRootFolder(backend)) {
  83. Utils::appendMsg(p_msg,
  84. tr("Not a valid %1 root folder (%2).").arg(factory->getDisplayName(), rootFolderPath));
  85. return false;
  86. }
  87. }
  88. return true;
  89. }
  90. bool ImportNotebookDialog::createNotebookToImport(QString &p_msg)
  91. {
  92. auto &notebookMgr = VNoteX::getInst().getNotebookMgr();
  93. auto factory = notebookMgr.getBundleNotebookFactory();
  94. auto rootFolderPath = m_infoWidget->getRootFolderPath();
  95. auto backendName = m_infoWidget->getBackend();
  96. auto backend = notebookMgr.createNotebookBackend(backendName, rootFolderPath);
  97. try {
  98. m_notebookToImport = factory->createNotebook(notebookMgr,
  99. rootFolderPath,
  100. backend);
  101. } catch (Exception &p_e) {
  102. Utils::appendMsg(p_msg, tr("Failed to create notebook from root folder (%1) (%2).").arg(rootFolderPath, p_e.what()));
  103. return false;
  104. }
  105. Q_ASSERT(m_notebookToImport);
  106. return true;
  107. }
  108. bool ImportNotebookDialog::importNotebook()
  109. {
  110. if (!m_notebookToImport) {
  111. QString msg = tr("Failed to open notebook.");
  112. qCritical() << msg;
  113. setInformationText(msg, ScrollDialog::InformationLevel::Error);
  114. return false;
  115. }
  116. try {
  117. auto &notebookMgr = VNoteX::getInst().getNotebookMgr();
  118. notebookMgr.importNotebook(m_notebookToImport);
  119. } catch (Exception &p_e) {
  120. QString msg = tr("Failed to open notebook (%1).").arg(p_e.what());
  121. qCritical() << msg;
  122. setInformationText(msg, ScrollDialog::InformationLevel::Error);
  123. return false;
  124. }
  125. return true;
  126. }