From 10c6dbcf23305cc57e2f577600a289cfc0b12c2a Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Wed, 11 Jun 2008 02:04:41 +0200 Subject: [PATCH 1/1] Add cached fontmetrics to UiStyle Allow fast access to fontmetrics for a given FormatType. --- src/uisupport/uistyle.cpp | 17 ++++++++++++----- src/uisupport/uistyle.h | 6 ++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index 9abdeb53..b0a2a3ab 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -32,9 +32,11 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) { Q_ASSERT(QVariant::nameToType("UiStyle::FormatList") != QVariant::Invalid); } + _defaultFont = QFont("Monospace", QApplication::font().pointSize()); + // Default format _defaultPlainFormat.setForeground(QBrush("#000000")); - _defaultPlainFormat.setFont(QFont("Monospace", QApplication::font().pointSize())); + _defaultPlainFormat.setFont(_defaultFont); _defaultPlainFormat.font().setFixedPitch(true); _defaultPlainFormat.font().setStyleHint(QFont::TypeWriter); setFormat(None, _defaultPlainFormat, Settings::Default); @@ -103,7 +105,7 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) { } UiStyle::~ UiStyle() { - + qDeleteAll(_cachedFontMetrics); } void UiStyle::setFormat(FormatType ftype, QTextCharFormat fmt, Settings::Mode mode) { @@ -131,7 +133,7 @@ QTextCharFormat UiStyle::format(FormatType ftype, Settings::Mode mode) const { // NOTE: This function is intimately tied to the values in FormatType. Don't change this // until you _really_ know what you do! QTextCharFormat UiStyle::mergedFormat(quint32 ftype) { - if(_cachedFormats.contains(ftype)) return _cachedFormats[ftype]; + if(_cachedFormats.contains(ftype)) return _cachedFormats.value(ftype); if(ftype == Invalid) return QTextCharFormat(); // Now we construct the merged format, starting with the default QTextCharFormat fmt = format(None); @@ -146,8 +148,13 @@ QTextCharFormat UiStyle::mergedFormat(quint32 ftype) { if(ftype & 0x00800000) fmt.merge(format((FormatType)(ftype & 0xf0800000))); // background // URL if(ftype & Url) fmt.merge(format(Url)); - _cachedFormats[ftype] = fmt; - return fmt; + return _cachedFormats[ftype] = fmt; +} + +QFontMetricsF *UiStyle::fontMetrics(quint32 ftype) { + // QFontMetricsF is not assignable, so we need to store pointers :/ + if(_cachedFontMetrics.contains(ftype)) return _cachedFontMetrics.value(ftype); + return (_cachedFontMetrics[ftype] = new QFontMetricsF(mergedFormat(ftype).font())); } UiStyle::FormatType UiStyle::formatType(const QString & code) const { diff --git a/src/uisupport/uistyle.h b/src/uisupport/uistyle.h index 43f248a2..cd6458e5 100644 --- a/src/uisupport/uistyle.h +++ b/src/uisupport/uistyle.h @@ -22,6 +22,7 @@ #define _UISTYLE_H_ #include +#include #include #include #include @@ -133,20 +134,25 @@ class UiStyle { void setFormat(FormatType, QTextCharFormat, Settings::Mode mode/* = Settings::Custom*/); QTextCharFormat format(FormatType, Settings::Mode mode = Settings::Custom) const; QTextCharFormat mergedFormat(quint32 formatType); + QFontMetricsF *fontMetrics(quint32 formatType); FormatType formatType(const QString &code) const; QString formatCode(FormatType) const; + inline QFont defaultFont() const { return _defaultFont; } + protected: private: QString mircToInternal(const QString &); + QFont _defaultFont; QTextCharFormat _defaultPlainFormat; QHash _defaultFormats; QHash _customFormats; QHash _cachedFormats; + QHash _cachedFontMetrics; QHash _formatCodes; QString _settingsKey; -- 2.20.1