diff --git a/src/resources/themes/v_moonlight/v_moonlight.css b/src/resources/themes/v_moonlight/v_moonlight.css index 7976c9e0..2df47929 100644 --- a/src/resources/themes/v_moonlight/v_moonlight.css +++ b/src/resources/themes/v_moonlight/v_moonlight.css @@ -68,8 +68,8 @@ li { line-height: 24px; } -li ul, li ul { - margin-left: 24px; +li ul, li ol { + margin-left: 16px; } p, ul, ol { diff --git a/src/resources/themes/v_pure/v_pure.css b/src/resources/themes/v_pure/v_pure.css index b2f6a9e5..6e587f29 100644 --- a/src/resources/themes/v_pure/v_pure.css +++ b/src/resources/themes/v_pure/v_pure.css @@ -68,8 +68,8 @@ li { line-height: 24px; } -li ul, li ul { - margin-left: 24px; +li ul, li ol { + margin-left: 16px; } p, ul, ol { diff --git a/src/resources/themes/v_white/v_white.css b/src/resources/themes/v_white/v_white.css index d7219aca..3d43deb7 100644 --- a/src/resources/themes/v_white/v_white.css +++ b/src/resources/themes/v_white/v_white.css @@ -67,8 +67,8 @@ li { line-height: 24px; } -li ul, li ul { - margin-left: 24px; +li ul, li ol { + margin-left: 16px; } p, ul, ol { diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index 6f64f336..33e8c82d 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -1167,3 +1167,28 @@ QString VUtils::getCaptainShortcutSequenceText(const QString &p_operation) return QString(); } + +QString VUtils::getAvailableFontFamily(const QStringList &p_families) +{ + QStringList availFamilies = QFontDatabase().families(); + + for (int i = 0; i < p_families.size(); ++i) { + QString family = p_families[i].trimmed(); + if (family.isEmpty()) { + continue; + } + + for (int j = 0; j < availFamilies.size(); ++j) { + QString availFamily = availFamilies[j]; + availFamily.remove(QRegExp("\\[.*\\]")); + availFamily = availFamily.trimmed(); + if (family == availFamily + || family.toLower() == availFamily.toLower()) { + qDebug() << "matched font family" << availFamilies[j]; + return availFamilies[j]; + } + } + } + + return QString(); +} diff --git a/src/utils/vutils.h b/src/utils/vutils.h index 3832c747..99ca4a61 100644 --- a/src/utils/vutils.h +++ b/src/utils/vutils.h @@ -285,6 +285,8 @@ public: static QString getCaptainShortcutSequenceText(const QString &p_operation); + static QString getAvailableFontFamily(const QStringList &p_families); + // Regular expression for image link. // ![image title]( http://github.com/tamlok/vnote.jpg "alt \" text" ) // Captured texts (need to be trimmed): diff --git a/src/vlinenumberarea.cpp b/src/vlinenumberarea.cpp index 5a91b445..50fde2df 100644 --- a/src/vlinenumberarea.cpp +++ b/src/vlinenumberarea.cpp @@ -6,7 +6,6 @@ VLineNumberArea::VLineNumberArea(VTextEditWithLineNumber *p_editor, const QTextDocument *p_document, int p_digitWidth, - int p_digitHeight, QWidget *p_parent) : QWidget(p_parent), m_editor(p_editor), @@ -14,7 +13,6 @@ VLineNumberArea::VLineNumberArea(VTextEditWithLineNumber *p_editor, m_width(0), m_blockCount(-1), m_digitWidth(p_digitWidth), - m_digitHeight(p_digitHeight), m_foregroundColor("black"), m_backgroundColor("grey") { diff --git a/src/vlinenumberarea.h b/src/vlinenumberarea.h index 014151b4..32df4204 100644 --- a/src/vlinenumberarea.h +++ b/src/vlinenumberarea.h @@ -35,7 +35,6 @@ public: VLineNumberArea(VTextEditWithLineNumber *p_editor, const QTextDocument *p_document, int p_digitWidth, - int p_digitHeight, QWidget *p_parent = nullptr); QSize sizeHint() const Q_DECL_OVERRIDE @@ -45,11 +44,6 @@ public: int calculateWidth() const; - int getDigitHeight() const - { - return m_digitHeight; - } - const QColor &getBackgroundColor() const; void setBackgroundColor(const QColor &p_color); @@ -68,7 +62,6 @@ private: int m_width; int m_blockCount; int m_digitWidth; - int m_digitHeight; QColor m_foregroundColor; QColor m_backgroundColor; }; diff --git a/src/vpalette.cpp b/src/vpalette.cpp index 45aed935..3e8c01bc 100644 --- a/src/vpalette.cpp +++ b/src/vpalette.cpp @@ -116,6 +116,7 @@ QString VPalette::fetchQtStyleSheet() const QString style = VUtils::readFileFromDisk(m_data.m_qssFile); fillStyle(style); fillAbsoluteUrl(style); + fillFontFamily(style); return style; } @@ -262,3 +263,32 @@ QString VPalette::themeCodeBlockCssStyle(const QString &p_paletteFile) VPaletteMetaData data = getPaletteMetaData(p_paletteFile); return themeName(p_paletteFile) + "/" + QFileInfo(data.m_codeBlockCssFile).completeBaseName(); } + +void VPalette::fillFontFamily(QString &p_text) const +{ + QRegExp reg("(\\s|^)font-family:([^;]+);"); + + int pos = 0; + while (pos < p_text.size()) { + int idx = p_text.indexOf(reg, pos); + if (idx == -1) { + break; + } + + QString familyList = reg.cap(2).trimmed(); + familyList.remove('"'); + QString family = VUtils::getAvailableFontFamily(familyList.split(',')); + if (!family.isEmpty() && family != familyList) { + if (family.contains(' ')) { + family = "\"" + family + "\""; + } + + QString str = QString("%1font-family: %2;").arg(reg.cap(1)).arg(family); + p_text.replace(idx, reg.matchedLength(), str); + + pos = idx + str.size(); + } else { + pos = idx + reg.matchedLength(); + } + } +} diff --git a/src/vpalette.h b/src/vpalette.h index b170d109..12993666 100644 --- a/src/vpalette.h +++ b/src/vpalette.h @@ -44,6 +44,10 @@ public: // Fill "@xxx" in @p_text with corresponding style. void fillStyle(QString &p_text) const; + // QSS seems not to recognize multiple font-family values. + // We will choose the first existing one. + void fillFontFamily(QString &p_text) const; + const QHash &getColorMapping() const; // Read themes and return the mappings of editor styles. diff --git a/src/vplaintextedit.cpp b/src/vplaintextedit.cpp index 7d33d463..6f6c5211 100644 --- a/src/vplaintextedit.cpp +++ b/src/vplaintextedit.cpp @@ -64,7 +64,6 @@ void VPlainTextEdit::init() m_lineNumberArea = new VLineNumberArea(this, document(), fontMetrics().width(QLatin1Char('8')), - fontMetrics().height(), this); connect(document(), &QTextDocument::blockCountChanged, this, &VPlainTextEdit::updateLineNumberAreaMargin); @@ -393,7 +392,7 @@ void VPlainTextEdit::paintLineNumberArea(QPaintEvent *p_event) int bottom = top + (int)rect.height(); int eventTop = p_event->rect().top(); int eventBtm = p_event->rect().bottom(); - const int digitHeight = m_lineNumberArea->getDigitHeight(); + const int digitHeight = painter.fontMetrics().height(); const int curBlockNumber = textCursor().block().blockNumber(); painter.setPen(m_lineNumberArea->getForegroundColor()); diff --git a/src/vstyleparser.cpp b/src/vstyleparser.cpp index 5dce82f9..c442a694 100644 --- a/src/vstyleparser.cpp +++ b/src/vstyleparser.cpp @@ -10,6 +10,8 @@ #include #include +#include "utils/vutils.h" + VStyleParser::VStyleParser() { markdownStyles = NULL; @@ -73,7 +75,7 @@ QTextCharFormat VStyleParser::QTextCharFormatFromAttrs(pmh_style_attribute *attr case pmh_attr_type_font_family: { QString familyList(attrs->value->font_family); - QString finalFamily = filterAvailableFontFamily(familyList); + QString finalFamily = VUtils::getAvailableFontFamily(familyList.split(',')); if (!finalFamily.isEmpty()) { format.setFontFamily(finalFamily); } @@ -211,7 +213,7 @@ void VStyleParser::fetchMarkdownEditorStyles(QPalette &palette, QFont &font, case pmh_attr_type_font_family: { QString familyList(editorStyles->value->font_family); - QString finalFamily = filterAvailableFontFamily(familyList); + QString finalFamily = VUtils::getAvailableFontFamily(familyList.split(',')); if (!finalFamily.isEmpty()) { font.setFamily(finalFamily); } @@ -299,27 +301,3 @@ void VStyleParser::fetchMarkdownEditorStyles(QPalette &palette, QFont &font, selStyles = selStyles->next; } } - -// @familyList is a comma separated string -QString VStyleParser::filterAvailableFontFamily(const QString &familyList) const -{ - QStringList families = familyList.split(',', QString::SkipEmptyParts); - QStringList availFamilies = QFontDatabase().families(); - - qDebug() << "family:" << familyList; - for (int i = 0; i < families.size(); ++i) { - QString family = families[i].trimmed(); - for (int j = 0; j < availFamilies.size(); ++j) { - QString availFamily = availFamilies[j]; - availFamily.remove(QRegExp("\\[.*\\]")); - availFamily = availFamily.trimmed(); - if (family == availFamily - || family.toLower() == availFamily.toLower()) { - qDebug() << "matched family:" << availFamilies[j]; - return availFamilies[j]; - } - } - } - - return QString(); -} diff --git a/src/vstyleparser.h b/src/vstyleparser.h index f7a49d37..5eff16fb 100644 --- a/src/vstyleparser.h +++ b/src/vstyleparser.h @@ -36,7 +36,6 @@ private: QBrush QBrushFromPmhAttr(pmh_attr_argb_color *attr) const; QTextCharFormat QTextCharFormatFromAttrs(pmh_style_attribute *attrs, const QFont &baseFont) const; - QString filterAvailableFontFamily(const QString &familyList) const; pmh_style_collection *markdownStyles; }; diff --git a/src/vtextedit.cpp b/src/vtextedit.cpp index c8004c07..68b6595a 100644 --- a/src/vtextedit.cpp +++ b/src/vtextedit.cpp @@ -73,7 +73,6 @@ void VTextEdit::init() m_lineNumberArea = new VLineNumberArea(this, document(), fontMetrics().width(QLatin1Char('8')), - fontMetrics().height(), this); connect(doc, &QTextDocument::blockCountChanged, this, &VTextEdit::updateLineNumberAreaMargin); @@ -140,7 +139,7 @@ void VTextEdit::paintLineNumberArea(QPaintEvent *p_event) int bottom = top + (int)rect.height(); int eventTop = p_event->rect().top(); int eventBtm = p_event->rect().bottom(); - const int digitHeight = m_lineNumberArea->getDigitHeight(); + const int digitHeight = painter.fontMetrics().height(); const int curBlockNumber = textCursor().block().blockNumber(); painter.setPen(m_lineNumberArea->getForegroundColor()); const int leading = (int)layout->getLineLeading(); @@ -187,7 +186,7 @@ void VTextEdit::paintLineNumberArea(QPaintEvent *p_event) top + leading, m_lineNumberArea->width(), digitHeight, - Qt::AlignRight, + Qt::AlignRight | Qt::AlignTop, numberStr); } @@ -233,7 +232,7 @@ void VTextEdit::paintLineNumberArea(QPaintEvent *p_event) top + leading, m_lineNumberArea->width(), digitHeight, - Qt::AlignRight, + Qt::AlignRight | Qt::AlignTop, numberStr); if (currentLine) {