Browse Source

support changing background color of editor

Signed-off-by: Le Tan <[email protected]>
Le Tan 9 years ago
parent
commit
0c3fc3b006
10 changed files with 261 additions and 5 deletions
  1. 12 0
      src/resources/vnote.ini
  2. 24 1
      src/utils/vutils.cpp
  3. 4 0
      src/utils/vutils.h
  4. 48 0
      src/vconfigmanager.cpp
  5. 67 1
      src/vconfigmanager.h
  6. 19 3
      src/vedit.cpp
  7. 1 0
      src/vedit.h
  8. 3 0
      src/veditor.cpp
  9. 78 0
      src/vmainwindow.cpp
  10. 5 0
      src/vmainwindow.h

+ 12 - 0
src/resources/vnote.ini

@@ -7,3 +7,15 @@ template_css_url=qrc:/resources/markdown.css
 current_notebook=0
 tab_stop_width=4
 is_expand_tab=1
+current_background_color=System
+
+[predefined_colors]
+1\name=White
+1\rgb=EEEEEE
+2\name=Green
+2\rgb=CCE8CF
+3\name=Wheat2
+3\rgb=EED8AE
+4\name=LightGrey
+4\rgb=D3D3D3
+size=4

+ 24 - 1
src/utils/vutils.cpp

@@ -4,7 +4,6 @@
 
 VUtils::VUtils()
 {
-
 }
 
 QString VUtils::readFileFromDisk(const QString &filePath)
@@ -33,3 +32,27 @@ bool VUtils::writeFileToDisk(const QString &filePath, const QString &text)
     qDebug() << "write file content:" << filePath;
     return true;
 }
+
+QRgb VUtils::QRgbFromString(const QString &str)
+{
+    Q_ASSERT(str.length() == 6);
+    QString rStr = str.left(2);
+    QString gStr = str.mid(2, 2);
+    QString bStr = str.right(2);
+
+    qDebug() << rStr << gStr << bStr;
+
+    bool ok, ret = true;
+    int red = rStr.toInt(&ok, 16);
+    ret = ret && ok;
+    int green = gStr.toInt(&ok, 16);
+    ret = ret && ok;
+    int blue = bStr.toInt(&ok, 16);
+    ret = ret && ok;
+
+    if (ret) {
+        return qRgb(red, green, blue);
+    }
+    qWarning() << "error: fail to construct QRgb from string" << str;
+    return QRgb();
+}

+ 4 - 0
src/utils/vutils.h

@@ -2,6 +2,8 @@
 #define VUTILS_H
 
 #include <QString>
+#include <QColor>
+#include "vconfigmanager.h"
 
 class VUtils
 {
@@ -10,6 +12,8 @@ public:
 
     static QString readFileFromDisk(const QString &filePath);
     static bool writeFileToDisk(const QString &filePath, const QString &text);
+    // Transform FFFFFF string to QRgb
+    static QRgb QRgbFromString(const QString &str);
 };
 
 #endif // VUTILS_H

+ 48 - 0
src/vconfigmanager.cpp

@@ -53,12 +53,34 @@ void VConfigManager::initialize()
     tabStopWidth = getConfigFromSettings("global", "tab_stop_width").toInt();
     isExpandTab = getConfigFromSettings("global", "is_expand_tab").toBool();
 
+    readPredefinedColorsFromSettings();
+    curBackgroundColor = getConfigFromSettings("global", "current_background_color").toString();
+    customBackgroundColor = getConfigFromSettings("global", "custom_background_color").toString();
+
+    updatePaletteColor();
+
     // Update notebooks
     readNotebookFromSettings();
 
     updateMarkdownEditStyle();
 }
 
+void VConfigManager::readPredefinedColorsFromSettings()
+{
+    predefinedColors.clear();
+    int size = defaultSettings->beginReadArray("predefined_colors");
+    for (int i = 0; i < size; ++i) {
+        defaultSettings->setArrayIndex(i);
+        VColor color;
+        color.name = defaultSettings->value("name").toString();
+        color.rgb = defaultSettings->value("rgb").toString();
+        predefinedColors.append(color);
+    }
+    defaultSettings->endArray();
+    qDebug() << "read" << predefinedColors.size()
+             << "pre-defined colors from [predefined_colors] section";
+}
+
 void VConfigManager::readNotebookFromSettings()
 {
     notebooks.clear();
@@ -183,3 +205,29 @@ void VConfigManager::updateMarkdownEditStyle()
     mdEditFont = baseEditFont;
     parser.fetchMarkdownEditorStyles(mdEditPalette, mdEditFont);
 }
+
+void VConfigManager::updatePaletteColor()
+{
+    QString rgb;
+    if (curBackgroundColor == "Custom") {
+        rgb = customBackgroundColor;
+    } else if (curBackgroundColor == "System") {
+        return;
+    } else {
+        for (int i = 0; i < predefinedColors.size(); ++i) {
+            if (predefinedColors[i].name == curBackgroundColor) {
+                rgb = predefinedColors[i].rgb;
+                break;
+            }
+        }
+    }
+    if (rgb.isEmpty()) {
+        return;
+    }
+
+    baseEditPalette.setColor(QPalette::Base,
+                             QColor(VUtils::QRgbFromString(rgb)));
+
+    // Update markdown editor palette
+    updateMarkdownEditStyle();
+}

+ 67 - 1
src/vconfigmanager.h

@@ -13,11 +13,18 @@
 class QJsonObject;
 class QString;
 
-enum MarkdownConverterType {
+enum MarkdownConverterType
+{
     Hoedown = 0,
     Marked
 };
 
+struct VColor
+{
+    QString name;
+    QString rgb; // 'FFFFFF', ithout '#'
+};
+
 class VConfigManager
 {
 public:
@@ -48,6 +55,7 @@ public:
     inline QString getTemplateCssUrl() const;
 
     inline QFont getBaseEditFont() const;
+    inline QPalette getBaseEditPalette() const;
 
     inline int getCurNotebookIndex() const;
     inline void setCurNotebookIndex(int index);
@@ -67,12 +75,23 @@ public:
     inline bool getIsExpandTab() const;
     inline void setIsExpandTab(bool isExpandTab);
 
+    inline const QVector<VColor> &getPredefinedColors() const;
+
+    inline const QString &getCurBackgroundColor() const;
+    inline void setCurBackgroundColor(const QString &colorName);
+
+    inline const QString &getCustomBackgroundColor() const;
+    inline void setCustomBackgroundColor(const QString &colorRgb);
+
 private:
     void updateMarkdownEditStyle();
     QVariant getConfigFromSettings(const QString &section, const QString &key);
     void setConfigToSettings(const QString &section, const QString &key, const QVariant &value);
     void readNotebookFromSettings();
     void writeNotebookToSettings();
+    void readPredefinedColorsFromSettings();
+    // Update baseEditPalette according to curBackgroundColor
+    void updatePaletteColor();
 
     QFont baseEditFont;
     QPalette baseEditPalette;
@@ -96,6 +115,11 @@ private:
     // Expand tab to @tabStopWidth spaces
     bool isExpandTab;
 
+    // App defined color
+    QVector<VColor> predefinedColors;
+    QString curBackgroundColor;
+    QString customBackgroundColor;
+
     // The name of the config file in each directory
     static const QString dirConfigFileName;
     // The name of the default configuration file
@@ -142,6 +166,11 @@ inline QFont VConfigManager::getBaseEditFont() const
     return baseEditFont;
 }
 
+inline QPalette VConfigManager::getBaseEditPalette() const
+{
+    return baseEditPalette;
+}
+
 inline int VConfigManager::getCurNotebookIndex() const
 {
     return curNotebookIndex;
@@ -224,4 +253,41 @@ inline void VConfigManager::setIsExpandTab(bool isExpandTab)
     setConfigToSettings("global", "is_expand_tab", this->isExpandTab);
 }
 
+inline const QVector<VColor>& VConfigManager::getPredefinedColors() const
+{
+    return predefinedColors;
+}
+
+inline const QString& VConfigManager::getCurBackgroundColor() const
+{
+    return curBackgroundColor;
+}
+
+inline void VConfigManager::setCurBackgroundColor(const QString &colorName)
+{
+    if (curBackgroundColor == colorName) {
+        return;
+    }
+    curBackgroundColor = colorName;
+    setConfigToSettings("global", "current_background_color",
+                        curBackgroundColor);
+    updatePaletteColor();
+}
+
+inline const QString& VConfigManager::getCustomBackgroundColor() const
+{
+    return customBackgroundColor;
+}
+
+inline void VConfigManager::setCustomBackgroundColor(const QString &colorRgb)
+{
+    if (customBackgroundColor == colorRgb) {
+        return;
+    }
+    customBackgroundColor = colorRgb;
+    setConfigToSettings("global", "custom_background_color",
+                        customBackgroundColor);
+    updatePaletteColor();
+}
+
 #endif // VCONFIGMANAGER_H

+ 19 - 3
src/vedit.cpp

@@ -10,17 +10,32 @@ VEdit::VEdit(VNoteFile *noteFile, QWidget *parent)
     : QTextEdit(parent), noteFile(noteFile), mdHighlighter(NULL)
 {
     if (noteFile->docType == DocType::Markdown) {
-        setPalette(vconfig.getMdEditPalette());
-        setFont(vconfig.getMdEditFont());
         setAcceptRichText(false);
         mdHighlighter = new HGMarkdownHighlighter(vconfig.getMdHighlightingStyles(),
                                                   500, document());
     } else {
-        setFont(vconfig.getBaseEditFont());
         setAutoFormatting(QTextEdit::AutoBulletList);
     }
 
     updateTabSettings();
+    updateFontAndPalette();
+}
+
+void VEdit::updateFontAndPalette()
+{
+    switch (noteFile->docType) {
+    case DocType::Markdown:
+        setFont(vconfig.getMdEditFont());
+        setPalette(vconfig.getMdEditPalette());
+        break;
+    case DocType::Html:
+        setFont(vconfig.getBaseEditFont());
+        setPalette(vconfig.getBaseEditPalette());
+        break;
+    default:
+        qWarning() << "error: unknown doc type" << int(noteFile->docType);
+        return;
+    }
 }
 
 void VEdit::updateTabSettings()
@@ -53,6 +68,7 @@ void VEdit::beginEdit()
 {
     setReadOnly(false);
     updateTabSettings();
+    updateFontAndPalette();
     switch (noteFile->docType) {
     case DocType::Html:
         setHtml(noteFile->content);

+ 1 - 0
src/vedit.h

@@ -28,6 +28,7 @@ protected:
 
 private:
     void updateTabSettings();
+    void updateFontAndPalette();
 
     bool isExpandTab;
     QString tabSpaces;

+ 3 - 0
src/veditor.cpp

@@ -56,6 +56,7 @@ void VEditor::setupUI()
         textBrowser = new QTextBrowser();
         addWidget(textBrowser);
         textBrowser->setFont(vconfig.getBaseEditFont());
+        textBrowser->setPalette(vconfig.getBaseEditPalette());
         webPreviewer = NULL;
         break;
     default:
@@ -86,6 +87,8 @@ void VEditor::showFileReadMode()
     switch (noteFile->docType) {
     case DocType::Html:
         textBrowser->setHtml(noteFile->content);
+        textBrowser->setFont(vconfig.getBaseEditFont());
+        textBrowser->setPalette(vconfig.getBaseEditPalette());
         setCurrentWidget(textBrowser);
         break;
     case DocType::Markdown:

+ 78 - 0
src/vmainwindow.cpp

@@ -7,6 +7,7 @@
 #include "vconfigmanager.h"
 #include "dialog/vnewnotebookdialog.h"
 #include "dialog/vnotebookinfodialog.h"
+#include "utils/vutils.h"
 
 extern VConfigManager vconfig;
 
@@ -15,6 +16,7 @@ VMainWindow::VMainWindow(QWidget *parent)
 {
     // Must be called before those who uses VConfigManager
     vnote = new VNote();
+    initPredefinedColorPixmaps();
     setupUI();
     initActions();
     initToolBar();
@@ -205,6 +207,10 @@ void VMainWindow::initActions()
     eightSpaceTabAct->setData(8);
     connect(tabStopWidthAct, &QActionGroup::triggered,
             this, &VMainWindow::setTabStopWidth);
+
+    backgroundColorAct = new QActionGroup(this);
+    connect(backgroundColorAct, &QActionGroup::triggered,
+            this, &VMainWindow::setEditorBackgroundColor);
 }
 
 void VMainWindow::initToolBar()
@@ -253,6 +259,43 @@ void VMainWindow::initMenuBar()
         qWarning() << "error: unsupported tab stop width" << tabStopWidth <<  "in config";
     }
 
+    QMenu *backgroundColorMenu = editMenu->addMenu(tr("&Background Color"));
+    // System background color
+    const QString &curBgColor = vconfig.getCurBackgroundColor();
+    QAction *tmpAct = new QAction(tr("System"), backgroundColorAct);
+    tmpAct->setStatusTip(tr("Use system's background color configuration for editor"));
+    tmpAct->setCheckable(true);
+    tmpAct->setData("System");
+    if (curBgColor == "System") {
+        tmpAct->setChecked(true);
+    }
+    backgroundColorMenu->addAction(tmpAct);
+    const QVector<VColor> &bgColors = vconfig.getPredefinedColors();
+    for (int i = 0; i < bgColors.size(); ++i) {
+        tmpAct = new QAction(bgColors[i].name, backgroundColorAct);
+        tmpAct->setStatusTip(tr("Set background color for editor"));
+        tmpAct->setCheckable(true);
+        tmpAct->setData(bgColors[i].name);
+        tmpAct->setIcon(QIcon(predefinedColorPixmaps[i]));
+        if (curBgColor == bgColors[i].name) {
+            tmpAct->setChecked(true);
+        }
+
+        backgroundColorMenu->addAction(tmpAct);
+    }
+    // Custom background color
+    tmpAct = new QAction(tr("Custom"), backgroundColorAct);
+    tmpAct->setStatusTip(tr("Set customed background color for editor"));
+    tmpAct->setCheckable(true);
+    tmpAct->setData("Custom");
+    if (!vconfig.getCustomBackgroundColor().isEmpty()) {
+        tmpAct->setIcon(QIcon(predefinedColorPixmaps.back()));
+    }
+    if (curBgColor == "Custom") {
+        tmpAct->setChecked(true);
+    }
+    backgroundColorMenu->addAction(tmpAct);
+
     // Markdown Menu
     QMenu *converterMenu = markdownMenu->addMenu(tr("&Converter"));
     converterMenu->addAction(hoedownAct);
@@ -485,3 +528,38 @@ void VMainWindow::setTabStopWidth(QAction *action)
     }
     vconfig.setTabStopWidth(action->data().toInt());
 }
+
+void VMainWindow::setEditorBackgroundColor(QAction *action)
+{
+    if (!action) {
+        return;
+    }
+    // TODO: implement custom color logics
+    if (action->data().toString() == "Custom") {
+        return;
+    }
+
+    vconfig.setCurBackgroundColor(action->data().toString());
+}
+
+void VMainWindow::initPredefinedColorPixmaps()
+{
+    const QVector<VColor> &bgColors = vconfig.getPredefinedColors();
+    predefinedColorPixmaps.clear();
+    int size = 256;
+    for (int i = 0; i < bgColors.size(); ++i) {
+        // Generate QPixmap filled in this color
+        QColor color(VUtils::QRgbFromString(bgColors[i].rgb));
+        QPixmap pixmap(size, size);
+        pixmap.fill(color);
+        predefinedColorPixmaps.append(pixmap);
+    }
+
+    const QString &customBgColor = vconfig.getCustomBackgroundColor();
+    if (!customBgColor.isEmpty()) {
+        QColor color(VUtils::QRgbFromString(customBgColor));
+        QPixmap pixmap(size, size);
+        pixmap.fill(color);
+        predefinedColorPixmaps.append(pixmap);
+    }
+}

+ 5 - 0
src/vmainwindow.h

@@ -42,6 +42,7 @@ private slots:
     void aboutMessage();
     void changeExpandTab(bool checked);
     void setTabStopWidth(QAction *action);
+    void setEditorBackgroundColor(QAction *action);
 
 signals:
     void curNotebookChanged(const QString &notebookName);
@@ -52,6 +53,7 @@ private:
     void initToolBar();
     void initMenuBar();
     bool isConflictWithExistingNotebooks(const QString &name);
+    void initPredefinedColorPixmaps();
 
     // If true, comboBox changes will not trigger any signal out
     bool notebookComboMuted;
@@ -86,6 +88,9 @@ private:
     QAction *twoSpaceTabAct;
     QAction *fourSpaceTabAct;
     QAction *eightSpaceTabAct;
+    QActionGroup *backgroundColorAct;
+
+    QVector<QPixmap> predefinedColorPixmaps;
 };
 
 #endif // VMAINWINDOW_H