vmathjaxpreviewhelper.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "vmathjaxpreviewhelper.h"
  2. #include <QWebEngineView>
  3. #include <QWebChannel>
  4. #include "utils/vutils.h"
  5. #include "vmathjaxwebdocument.h"
  6. #include "vconfigmanager.h"
  7. extern VConfigManager *g_config;
  8. VMathJaxPreviewHelper::VMathJaxPreviewHelper(QWidget *p_parentWidget, QObject *p_parent)
  9. : QObject(p_parent),
  10. m_parentWidget(p_parentWidget),
  11. m_initialized(false),
  12. m_nextID(0),
  13. m_webView(NULL),
  14. m_webReady(false)
  15. {
  16. }
  17. VMathJaxPreviewHelper::~VMathJaxPreviewHelper()
  18. {
  19. }
  20. void VMathJaxPreviewHelper::doInit()
  21. {
  22. Q_ASSERT(!m_initialized);
  23. Q_ASSERT(m_parentWidget);
  24. m_initialized = true;
  25. m_webView = new QWebEngineView(m_parentWidget);
  26. connect(m_webView, &QWebEngineView::loadFinished,
  27. this, [this]() {
  28. m_webReady = true;
  29. for (auto const & it : m_pendingFunc) {
  30. it();
  31. }
  32. m_pendingFunc.clear();
  33. });
  34. m_webView->hide();
  35. m_webView->setFocusPolicy(Qt::NoFocus);
  36. m_webDoc = new VMathJaxWebDocument(m_webView);
  37. connect(m_webDoc, &VMathJaxWebDocument::mathjaxPreviewResultReady,
  38. this, [this](int p_identifier,
  39. int p_id,
  40. TimeStamp p_timeStamp,
  41. const QString &p_format,
  42. const QString &p_data) {
  43. QByteArray ba = QByteArray::fromBase64(p_data.toUtf8());
  44. emit mathjaxPreviewResultReady(p_identifier, p_id, p_timeStamp, p_format, ba);
  45. });
  46. connect(m_webDoc, &VMathJaxWebDocument::diagramPreviewResultReady,
  47. this, [this](int p_identifier,
  48. int p_id,
  49. TimeStamp p_timeStamp,
  50. const QString &p_format,
  51. const QString &p_data) {
  52. QByteArray ba;
  53. if (p_format == "png") {
  54. ba = QByteArray::fromBase64(p_data.toUtf8());
  55. } else {
  56. ba = p_data.toUtf8();
  57. }
  58. emit diagramPreviewResultReady(p_identifier, p_id, p_timeStamp, p_format, ba);
  59. });
  60. QWebChannel *channel = new QWebChannel(m_webView);
  61. channel->registerObject(QStringLiteral("content"), m_webDoc);
  62. m_webView->page()->setWebChannel(channel);
  63. // setHtml() will change focus if it is not disabled.
  64. m_webView->setEnabled(false);
  65. QUrl baseUrl(QUrl::fromLocalFile(g_config->getDocumentPathOrHomePath() + QDir::separator()));
  66. m_webView->setHtml(VUtils::generateMathJaxPreviewTemplate(), baseUrl);
  67. m_webView->setEnabled(true);
  68. }
  69. void VMathJaxPreviewHelper::previewMathJax(int p_identifier,
  70. int p_id,
  71. TimeStamp p_timeStamp,
  72. const QString &p_text)
  73. {
  74. init();
  75. if (!m_webReady) {
  76. auto func = std::bind(&VMathJaxWebDocument::previewMathJax,
  77. m_webDoc,
  78. p_identifier,
  79. p_id,
  80. p_timeStamp,
  81. p_text,
  82. false);
  83. m_pendingFunc.append(func);
  84. } else {
  85. m_webDoc->previewMathJax(p_identifier, p_id, p_timeStamp, p_text, false);
  86. }
  87. }
  88. void VMathJaxPreviewHelper::previewMathJaxFromHtml(int p_identifier,
  89. int p_id,
  90. TimeStamp p_timeStamp,
  91. const QString &p_html)
  92. {
  93. init();
  94. if (!m_webReady) {
  95. auto func = std::bind(&VMathJaxWebDocument::previewMathJax,
  96. m_webDoc,
  97. p_identifier,
  98. p_id,
  99. p_timeStamp,
  100. p_html,
  101. true);
  102. m_pendingFunc.append(func);
  103. } else {
  104. m_webDoc->previewMathJax(p_identifier, p_id, p_timeStamp, p_html, true);
  105. }
  106. }
  107. void VMathJaxPreviewHelper::previewDiagram(int p_identifier,
  108. int p_id,
  109. TimeStamp p_timeStamp,
  110. const QString &p_lang,
  111. const QString &p_text)
  112. {
  113. init();
  114. if (!m_webReady) {
  115. auto func = std::bind(&VMathJaxWebDocument::previewDiagram,
  116. m_webDoc,
  117. p_identifier,
  118. p_id,
  119. p_timeStamp,
  120. p_lang,
  121. p_text);
  122. m_pendingFunc.append(func);
  123. } else {
  124. m_webDoc->previewDiagram(p_identifier, p_id, p_timeStamp, p_lang, p_text);
  125. }
  126. }