From b21b5bb2aeecda8df530da37e3269f99dba771b1 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 22 Feb 2016 15:54:14 +0100 Subject: [PATCH] TextEditor: Add mixins for font settings You can only set one text style but in many cases like Function and Declaration it would be nice if they could be merged. Change-Id: Icda892057b79eef1bea2fa8b2c5f0f7cbc5f518a Reviewed-by: David Schulz --- src/plugins/texteditor/fontsettings.cpp | 59 +++++++++++++++++++- src/plugins/texteditor/fontsettings.h | 14 +++++ src/plugins/texteditor/texteditorconstants.h | 2 +- 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/fontsettings.cpp b/src/plugins/texteditor/fontsettings.cpp index e78ce6412c7..5303cf9c8de 100644 --- a/src/plugins/texteditor/fontsettings.cpp +++ b/src/plugins/texteditor/fontsettings.cpp @@ -139,8 +139,9 @@ bool FontSettings::equals(const FontSettings &f) const */ QTextCharFormat FontSettings::toTextCharFormat(TextStyle category) const { - if (m_formatCache.contains(category)) - return m_formatCache.value(category); + auto textCharFormatIterator = m_formatCache.find(category); + if (textCharFormatIterator != m_formatCache.end()) + return *textCharFormatIterator; const Format &f = m_scheme.formatFor(category); QTextCharFormat tf; @@ -174,6 +175,60 @@ QTextCharFormat FontSettings::toTextCharFormat(TextStyle category) const return tf; } +uint qHash(const TextStyles &textStyles) +{ + uint hash = ::qHash(quint8(textStyles.mainStyle)); + + hash ^= ::qHashRange(textStyles.mixinStyles.cbegin(), textStyles.mixinStyles.cend()); + + return hash; +} + +bool operator==(const TextStyles &first, const TextStyles &second) +{ + return first.mainStyle == second.mainStyle + && first.mixinStyles == second.mixinStyles; +} + +void FontSettings::addMixinStyle(QTextCharFormat &textCharFormat, + const MixinTextStyles &mixinStyles) const +{ + for (TextStyle mixinStyle : mixinStyles) { + const QTextCharFormat mixinTextCharFormat = toTextCharFormat(mixinStyle); + if (!textCharFormat.hasProperty(QTextFormat::ForegroundBrush)) + textCharFormat.setForeground(mixinTextCharFormat.foreground()); + + if (!textCharFormat.hasProperty(QTextFormat::BackgroundBrush)) + textCharFormat.setBackground(mixinTextCharFormat.background()); + + if (!textCharFormat.fontItalic()) + textCharFormat.setFontItalic(mixinTextCharFormat.fontItalic()); + + if (textCharFormat.fontWeight() == QFont::Normal) + textCharFormat.setFontWeight(mixinTextCharFormat.fontWeight()); + + if (textCharFormat.underlineStyle() == QTextCharFormat::NoUnderline) { + textCharFormat.setUnderlineStyle(mixinTextCharFormat.underlineStyle()); + textCharFormat.setUnderlineColor(mixinTextCharFormat.underlineColor()); + } + }; +} + +QTextCharFormat FontSettings::toTextCharFormat(const TextStyles textStyles) const +{ + auto textCharFormatIterator = m_textCharFormatCache.find(textStyles); + if (textCharFormatIterator != m_textCharFormatCache.end()) + return *textCharFormatIterator; + + QTextCharFormat textCharFormat = toTextCharFormat(textStyles.mainStyle); + + addMixinStyle(textCharFormat, textStyles.mixinStyles); + + m_textCharFormatCache.insert(textStyles, textCharFormat); + + return textCharFormat; +} + /** * Returns the list of QTextCharFormats that corresponds to the list of * requested format categories. diff --git a/src/plugins/texteditor/fontsettings.h b/src/plugins/texteditor/fontsettings.h index fef4ede8e98..fea0ca5fd46 100644 --- a/src/plugins/texteditor/fontsettings.h +++ b/src/plugins/texteditor/fontsettings.h @@ -30,6 +30,8 @@ #include "colorscheme.h" +#include + #include #include #include @@ -45,6 +47,13 @@ namespace TextEditor { class FormatDescription; +using MixinTextStyles = Utils::SizedArray; + +struct TextStyles { + TextStyle mainStyle; + MixinTextStyles mixinStyles; +}; + /** * Font settings (default font and enumerated list of formats). */ @@ -66,6 +75,7 @@ public: QVector toTextCharFormats(const QVector &categories) const; QTextCharFormat toTextCharFormat(TextStyle category) const; + QTextCharFormat toTextCharFormat(const TextStyles textStyles) const; QString family() const; void setFamily(const QString &family); @@ -99,6 +109,9 @@ public: static QString defaultSchemeFileName(const QString &fileName = QString()); +private: + void addMixinStyle(QTextCharFormat &textCharFormat, const MixinTextStyles &mixinStyles) const; + private: QString m_family; QString m_schemeFileName; @@ -107,6 +120,7 @@ private: bool m_antialias; ColorScheme m_scheme; mutable QHash m_formatCache; + mutable QHash m_textCharFormatCache; }; inline bool operator==(const FontSettings &f1, const FontSettings &f2) { return f1.equals(f2); } diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h index b69ca61f632..19cf640957a 100644 --- a/src/plugins/texteditor/texteditorconstants.h +++ b/src/plugins/texteditor/texteditorconstants.h @@ -31,7 +31,7 @@ namespace TextEditor { // Text color and style categories -enum TextStyle { +enum TextStyle : quint8 { C_TEXT, C_LINK,