#include "textviewwindow.h" #include #include #include #include #include #include #include "textviewwindowhelper.h" #include "toolbarhelper.h" #include "editors/texteditor.h" #include #include #include "editors/statuswidget.h" #include using namespace vnotex; TextViewWindow::TextViewWindow(QWidget *p_parent) : ViewWindow(p_parent) { m_mode = ViewWindowMode::Edit; setupUI(); } void TextViewWindow::setupUI() { const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &textEditorConfig = editorConfig.getTextEditorConfig(); m_editorConfigRevision = editorConfig.revision(); m_textEditorConfigRevision = textEditorConfig.revision(); // Central widget. { m_editor = new TextEditor(createTextEditorConfig(textEditorConfig), createTextEditorParameters(editorConfig, textEditorConfig), this); setCentralWidget(m_editor); updateEditorFromConfig(); } TextViewWindowHelper::connectEditor(this); // Status widget. { auto statusWidget = QSharedPointer::create(); statusWidget->setEditorStatusWidget(m_editor->statusWidget()); setStatusWidget(statusWidget); } setupToolBar(); } void TextViewWindow::setupToolBar() { auto toolBar = createToolBar(this); const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const int iconSize = editorConfig.getToolBarIconSize(); toolBar->setIconSize(QSize(iconSize, iconSize)); addToolBar(toolBar); addAction(toolBar, ViewWindowToolBarHelper::Save); toolBar->addSeparator(); addAction(toolBar, ViewWindowToolBarHelper::Attachment); ToolBarHelper::addSpacer(toolBar); addAction(toolBar, ViewWindowToolBarHelper::FindAndReplace); } void TextViewWindow::handleBufferChangedInternal(const QSharedPointer &p_paras) { Q_UNUSED(p_paras); TextViewWindowHelper::handleBufferChanged(this); handleFileOpenParameters(p_paras); } void TextViewWindow::syncEditorFromBuffer() { const bool old = m_propogateEditorToBuffer; m_propogateEditorToBuffer = false; auto buffer = getBuffer(); if (buffer) { m_editor->setSyntax(QFileInfo(buffer->getPath()).suffix()); m_editor->setReadOnly(buffer->isReadOnly()); m_editor->setText(buffer->getContent()); m_editor->setModified(buffer->isModified()); } else { m_editor->setSyntax(""); m_editor->setReadOnly(true); m_editor->setText(""); m_editor->setModified(false); } m_bufferRevision = buffer ? buffer->getRevision() : 0; m_propogateEditorToBuffer = old; } void TextViewWindow::syncEditorFromBufferContent() { const bool old = m_propogateEditorToBuffer; m_propogateEditorToBuffer = false; auto buffer = getBuffer(); Q_ASSERT(buffer); m_editor->setText(buffer->getContent()); m_editor->setModified(buffer->isModified()); m_bufferRevision = buffer->getRevision(); m_propogateEditorToBuffer = old; } QString TextViewWindow::getLatestContent() const { return m_editor->getText(); } void TextViewWindow::setModified(bool p_modified) { m_editor->setModified(p_modified); } void TextViewWindow::handleEditorConfigChange() { const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &textEditorConfig = editorConfig.getTextEditorConfig(); if (m_textEditorConfigRevision != textEditorConfig.revision()) { m_textEditorConfigRevision = textEditorConfig.revision(); auto config = createTextEditorConfig(textEditorConfig); m_editor->setConfig(config); updateEditorFromConfig(); } } void TextViewWindow::setBufferRevisionAfterInvalidation(int p_bufferRevision) { m_bufferRevision = p_bufferRevision; } void TextViewWindow::setMode(ViewWindowMode p_mode) { Q_UNUSED(p_mode); Q_ASSERT(false); } QSharedPointer TextViewWindow::createTextEditorConfig(const TextEditorConfig &p_config) { const auto &themeMgr = VNoteX::getInst().getThemeMgr(); auto config = TextViewWindowHelper::createTextEditorConfig(p_config, themeMgr.getFile(Theme::File::TextEditorStyle), themeMgr.getEditorHighlightTheme()); return config; } QSharedPointer TextViewWindow::createTextEditorParameters(const EditorConfig& p_editorConfig, const TextEditorConfig &p_config) { auto paras = QSharedPointer::create(); paras->m_spellCheckEnabled = p_config.isSpellCheckEnabled(); paras->m_autoDetectLanguageEnabled = p_editorConfig.isSpellCheckAutoDetectLanguageEnabled(); paras->m_defaultSpellCheckLanguage = p_editorConfig.getSpellCheckDefaultDictionary(); return paras; } void TextViewWindow::scrollUp() { QScrollBar *vbar = m_editor->getTextEdit()->verticalScrollBar(); if (vbar && (vbar->minimum() != vbar->maximum())) { vbar->triggerAction(QAbstractSlider::SliderSingleStepAdd); } } void TextViewWindow::scrollDown() { QScrollBar *vbar = m_editor->getTextEdit()->verticalScrollBar(); if (vbar && (vbar->minimum() != vbar->maximum())) { vbar->triggerAction(QAbstractSlider::SliderSingleStepSub); } } void TextViewWindow::zoom(bool p_zoomIn) { m_editor->zoom(m_editor->zoomDelta() + (p_zoomIn ? 1 : -1)); auto &textEditorConfig = ConfigMgr::getInst().getEditorConfig().getTextEditorConfig(); textEditorConfig.setZoomDelta(m_editor->zoomDelta()); showZoomDelta(m_editor->zoomDelta()); } void TextViewWindow::handleFindTextChanged(const QString &p_text, FindOptions p_options) { TextViewWindowHelper::handleFindTextChanged(this, p_text, p_options); } void TextViewWindow::handleFindNext(const QString &p_text, FindOptions p_options) { TextViewWindowHelper::handleFindNext(this, p_text, p_options); } void TextViewWindow::handleReplace(const QString &p_text, FindOptions p_options, const QString &p_replaceText) { TextViewWindowHelper::handleReplace(this, p_text, p_options, p_replaceText); } void TextViewWindow::handleReplaceAll(const QString &p_text, FindOptions p_options, const QString &p_replaceText) { TextViewWindowHelper::handleReplaceAll(this, p_text, p_options, p_replaceText); } void TextViewWindow::handleFindAndReplaceWidgetClosed() { TextViewWindowHelper::handleFindAndReplaceWidgetClosed(this); } void TextViewWindow::updateEditorFromConfig() { const auto &editorConfig = ConfigMgr::getInst().getEditorConfig(); const auto &textEditorConfig = editorConfig.getTextEditorConfig(); if (textEditorConfig.getZoomDelta() != 0) { m_editor->zoom(textEditorConfig.getZoomDelta()); } } void TextViewWindow::openTwice(const QSharedPointer &p_paras) { handleFileOpenParameters(p_paras); } void TextViewWindow::handleFileOpenParameters(const QSharedPointer &p_paras) { if (!p_paras) { return; } if (p_paras->m_lineNumber > -1) { m_editor->scrollToLine(p_paras->m_lineNumber, true); } } ViewWindowSession TextViewWindow::saveSession() const { auto session = ViewWindow::saveSession(); if (getBuffer()) { session.m_lineNumber = m_editor->getCursorPosition().first; } return session; }