소스 검색

add config setting for Web zoom factor

Le Tan 8 년 전
부모
커밋
1f845d5ba8
6개의 변경된 파일177개의 추가작업 그리고 34개의 파일을 삭제
  1. 116 20
      src/dialog/vsettingsdialog.cpp
  2. 26 5
      src/dialog/vsettingsdialog.h
  3. 6 0
      src/utils/vutils.cpp
  4. 1 0
      src/utils/vutils.h
  5. 21 1
      src/vconfigmanager.cpp
  6. 7 8
      src/vconfigmanager.h

+ 116 - 20
src/dialog/vsettingsdialog.cpp

@@ -4,12 +4,15 @@
 #include "utils/vutils.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)
 {
     m_tabs = new QTabWidget;
     m_tabs->addTab(new VGeneralTab(), tr("General"));
+    m_tabs->addTab(new VReadEditTab(), tr("Read/Edit"));
 
     m_btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
     connect(m_btnBox, &QDialogButtonBox::accepted, this, &VSettingsDialog::saveConfiguration);
@@ -28,11 +31,21 @@ VSettingsDialog::VSettingsDialog(QWidget *p_parent)
 void VSettingsDialog::loadConfiguration()
 {
     // General Tab.
-    VGeneralTab *generalTab = dynamic_cast<VGeneralTab *>(m_tabs->widget(0));
-    Q_ASSERT(generalTab);
-    bool ret = generalTab->loadConfiguration();
-    if (!ret) {
-        goto err;
+    {
+        VGeneralTab *generalTab = dynamic_cast<VGeneralTab *>(m_tabs->widget(0));
+        Q_ASSERT(generalTab);
+        if (!generalTab->loadConfiguration()) {
+            goto err;
+        }
+    }
+
+    // Read/Edit Tab.
+    {
+        VReadEditTab *readEditTab = dynamic_cast<VReadEditTab *>(m_tabs->widget(1));
+        Q_ASSERT(readEditTab);
+        if (!readEditTab->loadConfiguration()) {
+            goto err;
+        }
     }
 
     return;
@@ -46,11 +59,21 @@ err:
 void VSettingsDialog::saveConfiguration()
 {
     // General Tab.
-    VGeneralTab *generalTab = dynamic_cast<VGeneralTab *>(m_tabs->widget(0));
-    Q_ASSERT(generalTab);
-    bool ret = generalTab->saveConfiguration();
-    if (!ret) {
-        goto err;
+    {
+        VGeneralTab *generalTab = dynamic_cast<VGeneralTab *>(m_tabs->widget(0));
+        Q_ASSERT(generalTab);
+        if (!generalTab->saveConfiguration()) {
+            goto err;
+        }
+    }
+
+    // Read/Edit Tab.
+    {
+        VReadEditTab *readEditTab = dynamic_cast<VReadEditTab *>(m_tabs->widget(1));
+        Q_ASSERT(readEditTab);
+        if (!readEditTab->saveConfiguration()) {
+            goto err;
+        }
     }
 
     accept();
@@ -64,7 +87,7 @@ err:
 const QVector<QString> VGeneralTab::c_availableLangs = { "System", "English", "Chinese" };
 
 VGeneralTab::VGeneralTab(QWidget *p_parent)
-    : QWidget(p_parent), m_langChanged(false)
+    : QWidget(p_parent)
 {
     QLabel *langLabel = new QLabel(tr("&Language:"));
     m_langCombo = new QComboBox(this);
@@ -73,8 +96,6 @@ VGeneralTab::VGeneralTab(QWidget *p_parent)
     for (auto lang : langs) {
         m_langCombo->addItem(lang.second, lang.first);
     }
-    connect(m_langCombo, SIGNAL(currentIndexChanged(int)),
-            this, SLOT(handleIndexChange(int)));
     langLabel->setBuddy(m_langCombo);
 
     QFormLayout *optionLayout = new QFormLayout();
@@ -112,7 +133,7 @@ bool VGeneralTab::loadLanguage()
         return true;
     }
     bool found = false;
-    // Lang is the value, not name.
+    // lang is the value, not name.
     for (int i = 0; i < m_langCombo->count(); ++i) {
         if (m_langCombo->itemData(i).toString() == lang) {
             found = true;
@@ -129,16 +150,91 @@ bool VGeneralTab::loadLanguage()
 
 bool VGeneralTab::saveLanguage()
 {
-    if (m_langChanged) {
-        vconfig.setLanguage(m_langCombo->currentData().toString());
+    QString curLang = m_langCombo->currentData().toString();
+    vconfig.setLanguage(curLang);
+    return true;
+}
+
+VReadEditTab::VReadEditTab(QWidget *p_parent)
+    : QWidget(p_parent)
+{
+    m_readBox = new QGroupBox(tr("Read Mode (For Markdown Only)"));
+    m_editBox = new QGroupBox(tr("Edit Mode"));
+
+    // Web Zoom Factor.
+    m_customWebZoom = new QCheckBox(tr("Custom Web zoom factor"), this);
+    m_customWebZoom->setToolTip(tr("Set the zoom factor of the Web page when reading"));
+    connect(m_customWebZoom, &QCheckBox::stateChanged,
+            this, &VReadEditTab::customWebZoomChanged);
+    m_webZoomFactorSpin = new QDoubleSpinBox(this);
+    m_webZoomFactorSpin->setMaximum(c_webZoomFactorMax);
+    m_webZoomFactorSpin->setMinimum(c_webZoomFactorMin);
+    m_webZoomFactorSpin->setSingleStep(0.25);
+    QHBoxLayout *zoomFactorLayout = new QHBoxLayout();
+    zoomFactorLayout->addWidget(m_customWebZoom);
+    zoomFactorLayout->addWidget(m_webZoomFactorSpin);
+
+    QFormLayout *readLayout = new QFormLayout();
+    readLayout->addRow(zoomFactorLayout);
+
+    m_readBox->setLayout(readLayout);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout();
+    mainLayout->addWidget(m_readBox);
+    mainLayout->addWidget(m_editBox);
+    m_editBox->hide();
+    setLayout(mainLayout);
+}
+
+bool VReadEditTab::loadConfiguration()
+{
+    if (!loadWebZoomFactor()) {
+        return false;
+    }
+    return true;
+}
+
+bool VReadEditTab::saveConfiguration()
+{
+    if (!saveWebZoomFactor()) {
+        return false;
+    }
+    return true;
+}
+
+bool VReadEditTab::loadWebZoomFactor()
+{
+    qreal factor = vconfig.getWebZoomFactor();
+    bool customFactor = vconfig.isCustomWebZoomFactor();
+    if (customFactor) {
+        if (factor < c_webZoomFactorMin || factor > c_webZoomFactorMax) {
+            factor = 1;
+        }
+        m_customWebZoom->setChecked(true);
+        m_webZoomFactorSpin->setValue(factor);
+    } else {
+        m_customWebZoom->setChecked(false);
+        m_webZoomFactorSpin->setValue(factor);
+        m_webZoomFactorSpin->setEnabled(false);
+    }
+    return true;
+}
+
+bool VReadEditTab::saveWebZoomFactor()
+{
+    if (m_customWebZoom->isChecked()) {
+        vconfig.setWebZoomFactor(m_webZoomFactorSpin->value());
+    } else {
+        vconfig.setWebZoomFactor(-1);
     }
     return true;
 }
 
-void VGeneralTab::handleIndexChange(int p_index)
+void VReadEditTab::customWebZoomChanged(int p_state)
 {
-    if (p_index == -1) {
-        return;
+    if (p_state == Qt::Unchecked) {
+        m_webZoomFactorSpin->setEnabled(false);
+    } else {
+        m_webZoomFactorSpin->setEnabled(true);
     }
-    m_langChanged = true;
 }

+ 26 - 5
src/dialog/vsettingsdialog.h

@@ -8,6 +8,9 @@
 class QDialogButtonBox;
 class QTabWidget;
 class QComboBox;
+class QGroupBox;
+class QDoubleSpinBox;
+class QCheckBox;
 
 class VGeneralTab : public QWidget
 {
@@ -17,21 +20,39 @@ public:
     bool loadConfiguration();
     bool saveConfiguration();
 
-private slots:
-    void handleIndexChange(int p_index);
-
 private:
     bool loadLanguage();
     bool saveLanguage();
 
     // Language
     QComboBox *m_langCombo;
-    // Whether language changes.
-    bool m_langChanged;
 
     static const QVector<QString> c_availableLangs;
 };
 
+class VReadEditTab : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit VReadEditTab(QWidget *p_parent = 0);
+    bool loadConfiguration();
+    bool saveConfiguration();
+
+    QGroupBox *m_readBox;
+    QGroupBox *m_editBox;
+
+    // Web zoom factor.
+    QCheckBox *m_customWebZoom;
+    QDoubleSpinBox *m_webZoomFactorSpin;
+
+private slots:
+    void customWebZoomChanged(int p_state);
+
+private:
+    bool loadWebZoomFactor();
+    bool saveWebZoomFactor();
+};
+
 class VSettingsDialog : public QDialog
 {
     Q_OBJECT

+ 6 - 0
src/utils/vutils.cpp

@@ -353,3 +353,9 @@ qreal VUtils::calculateScaleFactor()
     qreal factor = dpi / refDpi;
     return factor < 1 ? 1 : factor;
 }
+
+bool VUtils::realEqual(qreal p_a, qreal p_b)
+{
+    return abs(p_a - p_b) < 1e-8;
+}
+

+ 1 - 0
src/utils/vutils.h

@@ -43,6 +43,7 @@ public:
     static bool isImageURL(const QUrl &p_url);
     static bool isImageURLText(const QString &p_url);
     static qreal calculateScaleFactor();
+    static bool realEqual(qreal p_a, qreal p_b);
 
 private:
     // <value, name>

+ 21 - 1
src/vconfigmanager.cpp

@@ -89,7 +89,7 @@ void VConfigManager::initialize()
     m_enableMathjax = getConfigFromSettings("global", "enable_mathjax").toBool();
 
     m_webZoomFactor = getConfigFromSettings("global", "web_zoom_factor").toReal();
-    if (m_webZoomFactor < 0) {
+    if (!isCustomWebZoomFactor()) {
         // Calculate the zoom factor based on DPI.
         m_webZoomFactor = VUtils::calculateScaleFactor();
         qDebug() << "set WebZoomFactor to" << m_webZoomFactor;
@@ -264,3 +264,23 @@ void VConfigManager::updatePaletteColor()
     // Update markdown editor palette
     updateMarkdownEditStyle();
 }
+
+void VConfigManager::setWebZoomFactor(qreal p_factor)
+{
+    if (isCustomWebZoomFactor()) {
+        if (VUtils::realEqual(m_webZoomFactor, p_factor)) {
+            return;
+        } else if (VUtils::realEqual(p_factor, -1)) {
+            m_webZoomFactor = VUtils::calculateScaleFactor();
+            setConfigToSettings("global", "web_zoom_factor", -1);
+            return;
+        }
+    } else {
+        if (VUtils::realEqual(p_factor, -1)) {
+            return;
+        }
+    }
+    m_webZoomFactor = p_factor;
+    setConfigToSettings("global", "web_zoom_factor", m_webZoomFactor);
+}
+

+ 7 - 8
src/vconfigmanager.h

@@ -6,7 +6,6 @@
 #include <QVector>
 #include <QSettings>
 #include "vnotebook.h"
-
 #include "hgmarkdownhighlighter.h"
 #include "vmarkdownconverter.h"
 
@@ -124,7 +123,8 @@ public:
     inline void setEnableMathjax(bool p_enabled);
 
     inline qreal getWebZoomFactor() const;
-    inline void setWebZoomFactor(qreal p_factor);
+    void setWebZoomFactor(qreal p_factor);
+    inline bool isCustomWebZoomFactor();
 
 private:
     void updateMarkdownEditStyle();
@@ -543,12 +543,11 @@ inline qreal VConfigManager::getWebZoomFactor() const
     return m_webZoomFactor;
 }
 
-inline void VConfigManager::setWebZoomFactor(qreal p_factor)
+inline bool VConfigManager::isCustomWebZoomFactor()
 {
-    if (m_webZoomFactor == p_factor) {
-        return;
-    }
-    m_webZoomFactor = p_factor;
-    setConfigToSettings("global", "web_zoom_factor", m_webZoomFactor);
+    qreal factorFromIni = getConfigFromSettings("global", "web_zoom_factor").toReal();
+    // -1 indicates let system automatically calculate the factor.
+    return factorFromIni > 0;
 }
+
 #endif // VCONFIGMANAGER_H