diff --git a/src/dialog/vsettingsdialog.cpp b/src/dialog/vsettingsdialog.cpp index 8aa7a1b3..7b3ad644 100644 --- a/src/dialog/vsettingsdialog.cpp +++ b/src/dialog/vsettingsdialog.cpp @@ -2,10 +2,9 @@ #include #include "vconfigmanager.h" #include "utils/vutils.h" +#include "vconstants.h" extern VConfigManager vconfig; -static const qreal c_webZoomFactorMax = 5; -static const qreal c_webZoomFactorMin = 0.25; VSettingsDialog::VSettingsDialog(QWidget *p_parent) : QDialog(p_parent) diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js index 800fa0ce..554732af 100644 --- a/src/resources/markdown_template.js +++ b/src/resources/markdown_template.js @@ -35,6 +35,14 @@ var scrollToAnchor = function(anchor) { } }; +window.onwheel = function(e) { + e = e || window.event; + var ctrl = !!e.ctrlKey; + if (ctrl) { + e.preventDefault(); + } +} + window.onscroll = function() { var scrollTop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset; var eles = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); @@ -129,7 +137,7 @@ document.onkeydown = function(e) { return; default: - content.keyPressEvent(key); + content.keyPressEvent(key, ctrl, shift); keyState = 0; return; } diff --git a/src/vconstants.h b/src/vconstants.h index 925e7829..d78f37df 100644 --- a/src/vconstants.h +++ b/src/vconstants.h @@ -5,4 +5,7 @@ enum class DocType { Html, Markdown }; enum class ClipboardOpType { Invalid, CopyFile, CopyDir }; enum class OpenFileMode {Read = 0, Edit}; +static const qreal c_webZoomFactorMax = 5; +static const qreal c_webZoomFactorMin = 0.25; + #endif diff --git a/src/vdocument.cpp b/src/vdocument.cpp index 2291c9f1..60c5343e 100644 --- a/src/vdocument.cpp +++ b/src/vdocument.cpp @@ -55,7 +55,7 @@ void VDocument::setLog(const QString &p_log) emit logChanged(p_log); } -void VDocument::keyPressEvent(int p_key) +void VDocument::keyPressEvent(int p_key, bool p_ctrl, bool p_shift) { - emit keyPressed(p_key); + emit keyPressed(p_key, p_ctrl, p_shift); } diff --git a/src/vdocument.h b/src/vdocument.h index 0a8901c8..d9c34dd0 100644 --- a/src/vdocument.h +++ b/src/vdocument.h @@ -24,7 +24,7 @@ public slots: void setToc(const QString &toc); void setHeader(const QString &anchor); void setLog(const QString &p_log); - void keyPressEvent(int p_key); + void keyPressEvent(int p_key, bool p_ctrl, bool p_shift); void updateText(); signals: @@ -34,7 +34,7 @@ signals: void headerChanged(const QString &anchor); void htmlChanged(const QString &html); void logChanged(const QString &p_log); - void keyPressed(int p_key); + void keyPressed(int p_key, bool p_ctrl, bool p_shift); private: QString m_toc; diff --git a/src/vedittab.cpp b/src/vedittab.cpp index 8f08cf07..9a345ad1 100644 --- a/src/vedittab.cpp +++ b/src/vedittab.cpp @@ -17,6 +17,7 @@ #include "vmdedit.h" #include "dialog/vfindreplacedialog.h" #include "veditarea.h" +#include "vconstants.h" extern VConfigManager vconfig; @@ -592,16 +593,67 @@ bool VEditTab::checkToc() return ret; } -void VEditTab::handleWebKeyPressed(int p_key) +void VEditTab::handleWebKeyPressed(int p_key, bool p_ctrl, bool /* p_shift */) { + Q_ASSERT(webPreviewer); switch (p_key) { // Esc case 27: m_editArea->getFindReplaceDialog()->closeDialog(); break; + // Dash + case 189: + if (p_ctrl) { + // Zoom out. + zoomWebPage(false); + } + break; + + // Equal + case 187: + if (p_ctrl) { + // Zoom in. + zoomWebPage(true); + } + break; + + // 0 + case 48: + if (p_ctrl) { + // Recover zoom. + webPreviewer->setZoomFactor(1); + } + break; + default: break; } } +void VEditTab::wheelEvent(QWheelEvent *p_event) +{ + if (!isEditMode && webPreviewer) { + QPoint angle = p_event->angleDelta(); + Qt::KeyboardModifiers modifiers = p_event->modifiers(); + if (!angle.isNull() && (angle.y() != 0) && (modifiers & Qt::ControlModifier)) { + zoomWebPage(angle.y() > 0); + p_event->accept(); + return; + } + } + p_event->ignore(); +} + +void VEditTab::zoomWebPage(bool p_zoomIn, qreal p_step) +{ + Q_ASSERT(webPreviewer); + qreal curFactor = webPreviewer->zoomFactor(); + qreal newFactor = p_zoomIn ? curFactor + p_step : curFactor - p_step; + if (newFactor < c_webZoomFactorMin) { + newFactor = c_webZoomFactorMin; + } else if (newFactor > c_webZoomFactorMax) { + newFactor = c_webZoomFactorMax; + } + webPreviewer->setZoomFactor(newFactor); +} diff --git a/src/vedittab.h b/src/vedittab.h index baf91cfb..70221e04 100644 --- a/src/vedittab.h +++ b/src/vedittab.h @@ -51,6 +51,9 @@ public: QString getSelectedText() const; void clearSearchedWordHighlight(); +protected: + void wheelEvent(QWheelEvent *p_event) Q_DECL_OVERRIDE; + signals: void getFocused(); void outlineChanged(const VToc &toc); @@ -65,7 +68,7 @@ private slots: void updateTocFromHeaders(const QVector &headers); void handleTextChanged(); void noticeStatusChanged(); - void handleWebKeyPressed(int p_key); + void handleWebKeyPressed(int p_key, bool p_ctrl, bool p_shift); private: void setupUI(); @@ -83,6 +86,7 @@ private: // Check if @tableOfContent is outdated (such as renaming the file). // Return true if we need to update toc. bool checkToc(); + void zoomWebPage(bool p_zoomIn, qreal p_step = 0.25); QPointer m_file; bool isEditMode;