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);
-
+
// Load saved custom formats
UiStyleSettings s(_settingsKey);
foreach(FormatType type, s.availableFormats()) {
}
UiStyle::~ UiStyle() {
-
+ qDeleteAll(_cachedFontMetrics);
}
void UiStyle::setFormat(FormatType ftype, QTextCharFormat fmt, Settings::Mode mode) {
// 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);
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 {
return _formatCodes.key(ftype);
}
+QList<QTextLayout::FormatRange> UiStyle::toTextLayoutList(const FormatList &formatList, int textLength) {
+ QList<QTextLayout::FormatRange> formatRanges;
+ QTextLayout::FormatRange range;
+ int i = 0;
+ for(i = 0; i < formatList.count(); i++) {
+ range.format = mergedFormat(formatList.at(i).second);
+ range.start = formatList.at(i).first;
+ if(i > 0) formatRanges.last().length = range.start - formatRanges.last().start;
+ formatRanges.append(range);
+ }
+ if(i > 0) formatRanges.last().length = textLength - formatRanges.last().start;
+ return formatRanges;
+}
+
// This method expects a well-formatted string, there is no error checking!
// Since we create those ourselves, we should be pretty safe that nobody does something crappy here.
UiStyle::StyledString UiStyle::styleString(const QString &s_) {
quint32 curfmt = (quint32)None;
int pos = 0; quint16 length = 0;
for(;;) {
- int pos = s.indexOf('%', pos);
+ pos = s.indexOf('%', pos);
if(pos < 0) break;
if(s[pos+1] == '%') { // escaped %, we just remove one and continue
s.remove(pos, 1);