vedit.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include <QtWidgets>
  2. #include "vedit.h"
  3. VEdit::VEdit(const QString &path, const QString &name, bool modifiable,
  4. QWidget *parent)
  5. : QTextEdit(parent), path(path), name(name), modifiable(modifiable)
  6. {
  7. docType = isMarkdown() ? DocType::Markdown : DocType::Html;
  8. fileText = readFileFromDisk(QDir(path).filePath(name));
  9. showFileReadMode();
  10. fileLoaded = true;
  11. qDebug() << "VEdit:" << name << (docType == DocType::Markdown ? "Markdown" : "Html");
  12. }
  13. void VEdit::showFileReadMode()
  14. {
  15. setReadOnly(true);
  16. switch (docType) {
  17. case DocType::Html:
  18. if (!fileLoaded) {
  19. setHtml(fileText);
  20. }
  21. break;
  22. case DocType::Markdown:
  23. setText(fileText);
  24. break;
  25. default:
  26. qWarning() << "error: unknown doc type" << int(docType);
  27. }
  28. }
  29. void VEdit::showFileEditMode()
  30. {
  31. setReadOnly(false);
  32. switch (docType) {
  33. case DocType::Html:
  34. if (!fileLoaded) {
  35. setHtml(fileText);
  36. }
  37. break;
  38. case DocType::Markdown:
  39. setText(fileText);
  40. break;
  41. default:
  42. qWarning() << "error: unknown doc type" << int(docType);
  43. }
  44. }
  45. QString VEdit::readFileFromDisk(const QString &filePath)
  46. {
  47. QFile file(filePath);
  48. if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  49. qWarning() << "error: fail to read file" << filePath;
  50. return QString();
  51. }
  52. QString fileText(file.readAll());
  53. file.close();
  54. qDebug() << "read file content:" << filePath;
  55. return fileText;
  56. }
  57. bool VEdit::writeFileToDisk(const QString &filePath, const QString &text)
  58. {
  59. QFile file(filePath);
  60. if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
  61. qWarning() << "error: fail to open file" << filePath << "to write to";
  62. return false;
  63. }
  64. QTextStream stream(&file);
  65. stream << text;
  66. file.close();
  67. qDebug() << "write file content:" << filePath;
  68. return true;
  69. }
  70. bool VEdit::requestClose()
  71. {
  72. readFile();
  73. return isReadOnly();
  74. }
  75. void VEdit::editFile()
  76. {
  77. if (!modifiable || !isReadOnly()) {
  78. return;
  79. }
  80. showFileEditMode();
  81. }
  82. void VEdit::readFile()
  83. {
  84. if (isReadOnly()) {
  85. return;
  86. }
  87. if (document()->isModified()) {
  88. QMessageBox msgBox(QMessageBox::Information, tr("Exit edit mode"),
  89. QString("Note has been changed. Do you want to save it before exit?"));
  90. msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel);
  91. msgBox.setDefaultButton(QMessageBox::Save);
  92. int ret = msgBox.exec();
  93. switch (ret) {
  94. case QMessageBox::Save:
  95. saveFile();
  96. // Fall through
  97. case QMessageBox::No:
  98. showFileReadMode();
  99. break;
  100. case QMessageBox::Cancel:
  101. break;
  102. default:
  103. qWarning() << "error: wrong return value from QMessageBox:" << ret;
  104. }
  105. } else {
  106. showFileReadMode();
  107. }
  108. }
  109. void VEdit::saveFile()
  110. {
  111. if (!modifiable || !document()->isModified()) {
  112. return;
  113. }
  114. switch (docType) {
  115. case DocType::Html:
  116. fileText = toHtml();
  117. writeFileToDisk(QDir(path).filePath(name), fileText);
  118. break;
  119. case DocType::Markdown:
  120. break;
  121. default:
  122. qWarning() << "error: unknown doc type" << int(docType);
  123. }
  124. document()->setModified(false);
  125. }
  126. bool VEdit::isMarkdown()
  127. {
  128. const QVector<QString> mdPostfix({"md", "markdown", "mkd"});
  129. QStringList list = name.split('.', QString::SkipEmptyParts);
  130. if (list.isEmpty()) {
  131. return false;
  132. }
  133. const QString &postfix = list.last();
  134. for (int i = 0; i < mdPostfix.size(); ++i) {
  135. if (postfix == mdPostfix[i]) {
  136. return true;
  137. }
  138. }
  139. return false;
  140. }