From: Manuel Nickschas Date: Sat, 3 May 2008 18:03:17 +0000 (+0000) Subject: First version of our new optimized style engine. Not functional yet, so don't bother... X-Git-Tag: 0.3.0~425^2~9 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=e017aca90eb3444df68fb365a5d50b05881b1c5c First version of our new optimized style engine. Not functional yet, so don't bother using sputdev. --- diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index fb610e06..1d2aeb96 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -486,15 +486,6 @@ void MainWin::setDisconnectedState() { sslLabel->setPixmap(QPixmap()); } -AbstractUiMsg *MainWin::layoutMsg(const Message &msg) { -#ifdef SPUTDEV - //return new ChatLine(msg); - return 0; -#else - return new ChatLineOld(msg); -#endif -} - void MainWin::showCoreConnectionDlg(bool autoConnect) { coreConnectDlg = new CoreConnectDlg(this, autoConnect); connect(coreConnectDlg, SIGNAL(finished(int)), this, SLOT(coreConnectionDlgFinished(int))); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 96e0c715..e2e703f0 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -52,7 +52,6 @@ class MainWin : public QMainWindow { void init(); void addBufferView(BufferViewConfig *config = 0); - AbstractUiMsg *layoutMsg(const Message &); void displayTrayIconMessage(const QString &title, const QString &message); virtual bool event(QEvent *event); diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index e0fac9c4..a65a4794 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -22,9 +22,10 @@ #ifdef SPUTDEV # include "chatlinemodel.h" +#else +# include "chatline-old.h" #endif #include "mainwin.h" -#include "chatline-old.h" QtUiStyle *QtUi::_style; @@ -61,7 +62,11 @@ MessageModel *QtUi::createMessageModel(QObject *parent) { } AbstractUiMsg *QtUi::layoutMsg(const Message &msg) { +#ifndef SPUTDEV return new ChatLineOld(msg); +#else + return 0; +#endif } void QtUi::connectedToCore() { diff --git a/src/qtui/qtuistyle.cpp b/src/qtui/qtuistyle.cpp index cb4436d0..78255dca 100644 --- a/src/qtui/qtuistyle.cpp +++ b/src/qtui/qtuistyle.cpp @@ -20,7 +20,11 @@ #include "qtuistyle.h" +#ifndef SPUTDEV QtUiStyle::QtUiStyle() : UiStyle("QtUiStyle") { +#else +QtUiStyle::QtUiStyle() : UiStyle("QtUiStyleNew") { +#endif // We need to just set our internal formats; everything else is done by the base class... // Internal message formats diff --git a/src/uisupport/old-uistyle.cpp b/src/uisupport/old-uistyle.cpp new file mode 100644 index 00000000..94c9742b --- /dev/null +++ b/src/uisupport/old-uistyle.cpp @@ -0,0 +1,242 @@ +/*************************************************************************** + * Copyright (C) 2005-08 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include + +#include "uistyle.h" +#include "uistylesettings.h" + +UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) { + // Default format + QTextCharFormat def; + def.setForeground(QBrush("#000000")); + def.setFont(QFont("Monospace", QApplication::font().pointSize())); + def.font().setFixedPitch(true); + def.font().setStyleHint(QFont::TypeWriter); + _defaultFormats = QVector(NumFormatTypes, def); + _customFormats = QVector(NumFormatTypes, QTextFormat().toCharFormat()); + + // Load saved custom formats + UiStyleSettings s(_settingsKey); + foreach(FormatType type, s.availableFormats()) { + _customFormats[type] = s.customFormat(type); + } + + // Initialize color codes according to mIRC "standard" + QStringList colors; + //colors << "white" << "black" << "navy" << "green" << "red" << "maroon" << "purple" << "orange"; + //colors << "yellow" << "lime" << "teal" << "aqua" << "royalblue" << "fuchsia" << "grey" << "silver"; + colors << "#ffffff" << "#000000" << "#000080" << "#008000" << "#ff0000" << "#800000" << "#800080" << "#ffa500"; + colors << "#ffff00" << "#00ff00" << "#008080" << "#00ffff" << "#4169E1" << "#ff00ff" << "#808080" << "#c0c0c0"; + + // Now initialize the mapping between FormatCodes and FormatTypes... + _formatCodes["%O"] = None; + _formatCodes["%B"] = Bold; + _formatCodes["%S"] = Italic; + _formatCodes["%U"] = Underline; + _formatCodes["%R"] = Reverse; + + _formatCodes["%D0"] = PlainMsg; + _formatCodes["%Dn"] = NoticeMsg; + _formatCodes["%Ds"] = ServerMsg; + _formatCodes["%De"] = ErrorMsg; + _formatCodes["%Dj"] = JoinMsg; + _formatCodes["%Dp"] = PartMsg; + _formatCodes["%Dq"] = QuitMsg; + _formatCodes["%Dk"] = KickMsg; + _formatCodes["%Dr"] = RenameMsg; + _formatCodes["%Dm"] = ModeMsg; + _formatCodes["%Da"] = ActionMsg; + + _formatCodes["%DT"] = Timestamp; + _formatCodes["%DS"] = Sender; + _formatCodes["%DN"] = Nick; + _formatCodes["%DH"] = Hostmask; + _formatCodes["%DC"] = ChannelName; + _formatCodes["%DM"] = ModeFlags; + _formatCodes["%DU"] = Url; + + // Set color formats + for(int i = 0; i < 16; i++) { + QString idx = QString("%1").arg(i, (int)2, (int)10, (QChar)'0'); + _formatCodes[QString("%Dcf%1").arg(idx)] = (FormatType)(FgCol00 + i); + _formatCodes[QString("%Dcb%1").arg(idx)] = (FormatType)(BgCol00 + i); + QTextCharFormat fgf, bgf; + fgf.setForeground(QBrush(QColor(colors[i]))); setFormat((FormatType)(FgCol00 + i), fgf, Settings::Default); + bgf.setBackground(QBrush(QColor(colors[i]))); setFormat((FormatType)(BgCol00 + i), bgf, Settings::Default); + //FIXME fix the havoc caused by ColorSettingsPage + setFormat((FormatType)(FgCol00 + i), fgf, Settings::Custom); + setFormat((FormatType)(BgCol00 + i), bgf, Settings::Custom); + } + + // Set a few more standard formats + QTextCharFormat bold; bold.setFontWeight(QFont::Bold); + setFormat(Bold, bold, Settings::Default); + + QTextCharFormat italic; italic.setFontItalic(true); + setFormat(Italic, italic, Settings::Default); + + QTextCharFormat underline; underline.setFontUnderline(true); + setFormat(Underline, underline, Settings::Default); + + // All other formats should be defined in derived classes. +} + +UiStyle::~ UiStyle() { + +} + +void UiStyle::setFormat(FormatType ftype, QTextCharFormat fmt, Settings::Mode mode) { + if(mode == Settings::Default) { + _defaultFormats[ftype] = fmt; + } else { + UiStyleSettings s(_settingsKey); + if(fmt != _defaultFormats[ftype]) { + _customFormats[ftype] = fmt; + s.setCustomFormat(ftype, fmt); + } else { + _customFormats[ftype] = QTextFormat().toCharFormat(); + s.removeCustomFormat(ftype); + } + } +} + +QTextCharFormat UiStyle::format(FormatType ftype, Settings::Mode mode) const { + if(mode == Settings::Custom && _customFormats[ftype].isValid()) return _customFormats[ftype]; + else return _defaultFormats[ftype]; +} + +UiStyle::FormatType UiStyle::formatType(const QString & code) const { + if(_formatCodes.contains(code)) return _formatCodes.value(code); + return Invalid; +} + +QString UiStyle::formatCode(FormatType ftype) const { + return _formatCodes.key(ftype); +} + +UiStyle::StyledText UiStyle::styleString(const QString &_s) { + QString s = _s; + StyledText result; + QList fmtList; + fmtList.append(None); + QTextLayout::FormatRange curFmtRng; + curFmtRng.format = format(None); + curFmtRng.start = 0; + result.formats.append(curFmtRng); + int pos = 0; int length = 0; + int fgCol = -1, bgCol = -1; // marks current mIRC color + for(;;) { + pos = s.indexOf('%', pos); + if(pos < 0) break; + if(s[pos+1] == '%') { // escaped %, just remove one and continue + s.remove(pos, 1); + pos++; + continue; + } else if(s[pos+1] == 'D' && s[pos+2] == 'c') { // color code + if(s[pos+3] == '-') { // color off + if(fgCol >= 0) { + fmtList.removeAll((FormatType)(FgCol00 + fgCol)); + fgCol = -1; + } + if(bgCol >= 0) { + fmtList.removeAll((FormatType)(BgCol00 + bgCol)); + bgCol = -1; + } + curFmtRng.format = mergedFormat(fmtList); + length = 4; + } else { + int color = 10 * s[pos+4].digitValue() + s[pos+5].digitValue(); + //TODO: use 99 as transparent color (re mirc color "standard") + color &= 0x0f; + int *colptr; FormatType coltype; + if(s[pos+3] == 'f') { // foreground + colptr = &fgCol; coltype = FgCol00; + } else { // background + Q_ASSERT(s[pos+3] == 'b'); + colptr = &bgCol; coltype = BgCol00; + } + if(*colptr >= 0) { + // color already set, remove format code and add new one + Q_ASSERT(fmtList.contains((FormatType)(coltype + *colptr))); + fmtList.removeAll((FormatType)(coltype + *colptr)); + fmtList.append((FormatType)(coltype + color)); + curFmtRng.format = mergedFormat(fmtList); + } else { + fmtList.append((FormatType)(coltype + color)); + curFmtRng.format.merge(format(fmtList.last())); + } + *colptr = color; + length = 6; + } + } else if(s[pos+1] == 'O') { // reset formatting + fmtList.clear(); fmtList.append(None); + curFmtRng.format = format(None); + fgCol = bgCol = -1; + length = 2; + } else if(s[pos+1] == 'R') { // reverse + // TODO: implement reverse formatting + + length = 2; + } else { // all others are toggles + QString code = QString("%") + s[pos+1]; + if(s[pos+1] == 'D') code += s[pos+2]; + FormatType ftype = formatType(code); + if(ftype == Invalid) { + qWarning(qPrintable(QString("Invalid format code in string: %1").arg(s))); + continue; + } + //Q_ASSERT(ftype != Invalid); + length = code.length(); + if(!fmtList.contains(ftype)) { + // toggle it on + fmtList.append(ftype); + curFmtRng.format.merge(format(ftype)); + } else { + // toggle it off + fmtList.removeAll(ftype); + curFmtRng.format = mergedFormat(fmtList); + } + } + s.remove(pos, length); // remove format code from string + // now see if something changed and else insert the format + if(curFmtRng.format == result.formats.last().format) continue; // no change, so we just ignore + curFmtRng.start = pos; + if(pos == result.formats.last().start) { + // same starting point -> we just overwrite the old format + result.formats.last() = curFmtRng; + } else { + // fix length of last format + result.formats.last().length = pos - result.formats.last().start; + result.formats.append(curFmtRng); + } + } + result.formats.last().length = s.length() - result.formats.last().start; + if(result.formats.last().length == 0) result.formats.removeLast(); + result.text = s; + return result; +} + +QTextCharFormat UiStyle::mergedFormat(QList formatList) { + QTextCharFormat fmt; + foreach(FormatType ftype, formatList) { + fmt.merge(format(ftype)); + } + return fmt; +} diff --git a/src/uisupport/old-uistyle.h b/src/uisupport/old-uistyle.h new file mode 100644 index 00000000..ab2d86de --- /dev/null +++ b/src/uisupport/old-uistyle.h @@ -0,0 +1,83 @@ +/*************************************************************************** + * Copyright (C) 2005-08 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _OLD_UISTYLE_H_ +#define _OLD_UISTYLE_H_ + +#include +#include +#include + +#include "message.h" +#include "settings.h" + +class UiStyle { + + public: + UiStyle(const QString &settingsKey); + virtual ~UiStyle(); + + /** This enumerates the possible formats a text element may have. */ + enum FormatType { + None, Bold, Italic, Underline, Reverse, // Standard formats + PlainMsg, NoticeMsg, ServerMsg, ErrorMsg, JoinMsg, PartMsg, QuitMsg, KickMsg, // Internal message formats + RenameMsg, ModeMsg, ActionMsg, // ...cnt'd + Timestamp, Sender, Nick, Hostmask, ChannelName, ModeFlags, Url, // individual elements + FgCol00, FgCol01, FgCol02, FgCol03, FgCol04, FgCol05, FgCol06, FgCol07, // Color codes + FgCol08, FgCol09, FgCol10, FgCol11, FgCol12, FgCol13, FgCol14, FgCol15, + BgCol00, BgCol01, BgCol02, BgCol03, BgCol04, BgCol05, BgCol06, BgCol07, + BgCol08, BgCol09, BgCol10, BgCol11, BgCol12, BgCol13, BgCol14, BgCol15, + NumFormatTypes, Invalid // Do not add anything after this + }; + + struct UrlInfo { + int start, end; + QUrl url; + }; + + struct StyledText { + QString text; + QList formats; + QList urls; + }; + + StyledText styleString(const QString &); + + void setFormat(FormatType, QTextCharFormat, Settings::Mode mode/* = Settings::Custom*/); + QTextCharFormat format(FormatType, Settings::Mode mode = Settings::Custom) const; + + FormatType formatType(const QString &code) const; + QString formatCode(FormatType) const; + + protected: + + + private: + QTextCharFormat mergedFormat(QList); + + QVector _defaultFormats; + QVector _customFormats; + QHash _formatCodes; + + QString _settingsKey; + +}; + +#endif diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index 94c9742b..e0d34c66 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -24,14 +24,12 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) { // Default format - QTextCharFormat def; - def.setForeground(QBrush("#000000")); - def.setFont(QFont("Monospace", QApplication::font().pointSize())); - def.font().setFixedPitch(true); - def.font().setStyleHint(QFont::TypeWriter); - _defaultFormats = QVector(NumFormatTypes, def); - _customFormats = QVector(NumFormatTypes, QTextFormat().toCharFormat()); - + _defaultPlainFormat.setForeground(QBrush("#000000")); + _defaultPlainFormat.setFont(QFont("Monospace", QApplication::font().pointSize())); + _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()) { @@ -80,9 +78,6 @@ UiStyle::UiStyle(const QString &settingsKey) : _settingsKey(settingsKey) { QTextCharFormat fgf, bgf; fgf.setForeground(QBrush(QColor(colors[i]))); setFormat((FormatType)(FgCol00 + i), fgf, Settings::Default); bgf.setBackground(QBrush(QColor(colors[i]))); setFormat((FormatType)(BgCol00 + i), bgf, Settings::Default); - //FIXME fix the havoc caused by ColorSettingsPage - setFormat((FormatType)(FgCol00 + i), fgf, Settings::Custom); - setFormat((FormatType)(BgCol00 + i), bgf, Settings::Custom); } // Set a few more standard formats @@ -118,8 +113,29 @@ void UiStyle::setFormat(FormatType ftype, QTextCharFormat fmt, Settings::Mode mo } QTextCharFormat UiStyle::format(FormatType ftype, Settings::Mode mode) const { - if(mode == Settings::Custom && _customFormats[ftype].isValid()) return _customFormats[ftype]; - else return _defaultFormats[ftype]; + if(mode == Settings::Custom && _customFormats.contains(ftype)) return _customFormats.value(ftype); + else return _defaultFormats.value(ftype, QTextCharFormat()); +} + +// 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(ftype == Invalid) return QTextCharFormat(); + // Now we construct the merged format, starting with the default + QTextCharFormat fmt = format(None); + // First: general message format + fmt.merge(format((FormatType)(ftype & 0x0f))); + // now more specific ones + for(quint32 mask = 0x0010; mask <= 0x2000; mask <<= 1) { + if(ftype & mask) fmt.merge(format((FormatType)mask)); + } + // color codes! + if(ftype & 0x00400000) fmt.merge(format((FormatType)(ftype & 0x0f400000))); // foreground + if(ftype & 0x00800000) fmt.merge(format((FormatType)(ftype & 0xf0800000))); // background + // URL + if(ftype & Url) fmt.merge(format(Url)); + return fmt; } UiStyle::FormatType UiStyle::formatType(const QString & code) const { @@ -131,64 +147,38 @@ QString UiStyle::formatCode(FormatType ftype) const { return _formatCodes.key(ftype); } -UiStyle::StyledText UiStyle::styleString(const QString &_s) { - QString s = _s; - StyledText result; - QList fmtList; - fmtList.append(None); - QTextLayout::FormatRange curFmtRng; - curFmtRng.format = format(None); - curFmtRng.start = 0; - result.formats.append(curFmtRng); +// 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_) { + QString s = s_; + StyledString result; + result.formats.append(qMakePair(0, (quint32)None)); + quint32 curfmt = (quint32)None; int pos = 0; int length = 0; - int fgCol = -1, bgCol = -1; // marks current mIRC color for(;;) { pos = s.indexOf('%', pos); if(pos < 0) break; - if(s[pos+1] == '%') { // escaped %, just remove one and continue + if(s[pos+1] == '%') { // escaped %, we just remove one and continue s.remove(pos, 1); pos++; continue; - } else if(s[pos+1] == 'D' && s[pos+2] == 'c') { // color code - if(s[pos+3] == '-') { // color off - if(fgCol >= 0) { - fmtList.removeAll((FormatType)(FgCol00 + fgCol)); - fgCol = -1; - } - if(bgCol >= 0) { - fmtList.removeAll((FormatType)(BgCol00 + bgCol)); - bgCol = -1; - } - curFmtRng.format = mergedFormat(fmtList); + } + if(s[pos+1] == 'D' && s[pos+2] == 'c') { // color code + if(s[pos+3] == '-') { // color off + curfmt &= 0x003fffff; length = 4; } else { int color = 10 * s[pos+4].digitValue() + s[pos+5].digitValue(); //TODO: use 99 as transparent color (re mirc color "standard") color &= 0x0f; - int *colptr; FormatType coltype; - if(s[pos+3] == 'f') { // foreground - colptr = &fgCol; coltype = FgCol00; - } else { // background - Q_ASSERT(s[pos+3] == 'b'); - colptr = &bgCol; coltype = BgCol00; - } - if(*colptr >= 0) { - // color already set, remove format code and add new one - Q_ASSERT(fmtList.contains((FormatType)(coltype + *colptr))); - fmtList.removeAll((FormatType)(coltype + *colptr)); - fmtList.append((FormatType)(coltype + color)); - curFmtRng.format = mergedFormat(fmtList); - } else { - fmtList.append((FormatType)(coltype + color)); - curFmtRng.format.merge(format(fmtList.last())); - } - *colptr = color; + if(pos+3 == 'f') + curfmt |= (color << 24) | 0x00400000; + else + curfmt |= (color << 28) | 0x00800000; length = 6; } } else if(s[pos+1] == 'O') { // reset formatting - fmtList.clear(); fmtList.append(None); - curFmtRng.format = format(None); - fgCol = bgCol = -1; + curfmt &= 0x0000000f; // we keep message type-specific formatting length = 2; } else if(s[pos+1] == 'R') { // reverse // TODO: implement reverse formatting @@ -202,41 +192,15 @@ UiStyle::StyledText UiStyle::styleString(const QString &_s) { qWarning(qPrintable(QString("Invalid format code in string: %1").arg(s))); continue; } - //Q_ASSERT(ftype != Invalid); + curfmt ^= ftype; length = code.length(); - if(!fmtList.contains(ftype)) { - // toggle it on - fmtList.append(ftype); - curFmtRng.format.merge(format(ftype)); - } else { - // toggle it off - fmtList.removeAll(ftype); - curFmtRng.format = mergedFormat(fmtList); - } - } - s.remove(pos, length); // remove format code from string - // now see if something changed and else insert the format - if(curFmtRng.format == result.formats.last().format) continue; // no change, so we just ignore - curFmtRng.start = pos; - if(pos == result.formats.last().start) { - // same starting point -> we just overwrite the old format - result.formats.last() = curFmtRng; - } else { - // fix length of last format - result.formats.last().length = pos - result.formats.last().start; - result.formats.append(curFmtRng); } + s.remove(pos, length); + if(pos == result.formats.last().first) + result.formats.last().second = curfmt; + else + result.formats.append(qMakePair(pos, curfmt)); } - result.formats.last().length = s.length() - result.formats.last().start; - if(result.formats.last().length == 0) result.formats.removeLast(); result.text = s; return result; } - -QTextCharFormat UiStyle::mergedFormat(QList formatList) { - QTextCharFormat fmt; - foreach(FormatType ftype, formatList) { - fmt.merge(format(ftype)); - } - return fmt; -} diff --git a/src/uisupport/uistyle.h b/src/uisupport/uistyle.h index c722be82..59841dc7 100644 --- a/src/uisupport/uistyle.h +++ b/src/uisupport/uistyle.h @@ -21,6 +21,10 @@ #ifndef _UISTYLE_H_ #define _UISTYLE_H_ +#ifndef SPUTDEV +# include "old-uistyle.h" +#else + #include #include #include @@ -34,17 +38,77 @@ class UiStyle { UiStyle(const QString &settingsKey); virtual ~UiStyle(); - /** This enumerates the possible formats a text element may have. */ + //! This enumerates the possible formats a text element may have. */ + /** These formats are ordered on increasing importance, in cases where a given property is specified + * by multiple active formats. + * \NOTE: Do not change/add values here without also adapting the relevant + * methods in this class (in particular mergedFormat())! + * Also, we _do_ rely on certain properties of these values in styleString() and friends! + */ enum FormatType { - None, Bold, Italic, Underline, Reverse, // Standard formats - PlainMsg, NoticeMsg, ServerMsg, ErrorMsg, JoinMsg, PartMsg, QuitMsg, KickMsg, // Internal message formats - RenameMsg, ModeMsg, ActionMsg, // ...cnt'd - Timestamp, Sender, Nick, Hostmask, ChannelName, ModeFlags, Url, // individual elements - FgCol00, FgCol01, FgCol02, FgCol03, FgCol04, FgCol05, FgCol06, FgCol07, // Color codes - FgCol08, FgCol09, FgCol10, FgCol11, FgCol12, FgCol13, FgCol14, FgCol15, - BgCol00, BgCol01, BgCol02, BgCol03, BgCol04, BgCol05, BgCol06, BgCol07, - BgCol08, BgCol09, BgCol10, BgCol11, BgCol12, BgCol13, BgCol14, BgCol15, - NumFormatTypes, Invalid // Do not add anything after this + None = 0x00000000, + Invalid = 0x11111111, + // Message Formats (mutually exclusive!) + PlainMsg = 0x00000001, + NoticeMsg = 0x00000002, + ServerMsg = 0x00000003, + ErrorMsg = 0x00000004, + JoinMsg = 0x00000005, + PartMsg = 0x00000006, + QuitMsg = 0x00000007, + KickMsg = 0x00000008, + RenameMsg = 0x00000009, + ModeMsg = 0x0000000a, + ActionMsg = 0x0000000b, + // Standard Formats + Bold = 0x00000010, + Italic = 0x00000020, + Underline = 0x00000040, + Reverse = 0x00000080, + // Individual parts of a message + Timestamp = 0x00000100, + Sender = 0x00000200, + Nick = 0x00000400, + Hostmask = 0x00000800, + ChannelName = 0x00001000, + ModeFlags = 0x00002000, + // URL is special, we want that to take precedence over the rest... + Url = 0x00100000, + // Colors + FgCol00 = 0x00400000, + FgCol01 = 0x01400000, + FgCol02 = 0x02400000, + FgCol03 = 0x03400000, + FgCol04 = 0x04400000, + FgCol05 = 0x05400000, + FgCol06 = 0x06400000, + FgCol07 = 0x07400000, + FgCol08 = 0x08400000, + FgCol09 = 0x09400000, + FgCol10 = 0x0a400000, + FgCol11 = 0x0b400000, + FgCol12 = 0x0c400000, + FgCol13 = 0x0d400000, + FgCol14 = 0x0e400000, + FgCol15 = 0x0f400000, + + BgCol00 = 0x00800000, + BgCol01 = 0x10800000, + BgCol02 = 0x20800000, + BgCol03 = 0x30800000, + BgCol04 = 0x40800000, + BgCol05 = 0x50800000, + BgCol06 = 0x60800000, + BgCol07 = 0x70800000, + BgCol08 = 0x80800000, + BgCol09 = 0x90800000, + BgCol10 = 0xa0800000, + BgCol11 = 0xb0800000, + BgCol12 = 0xc0800000, + BgCol13 = 0xd0800000, + BgCol14 = 0xe0800000, + BgCol15 = 0xf0800000 + }; struct UrlInfo { @@ -52,16 +116,16 @@ class UiStyle { QUrl url; }; - struct StyledText { + struct StyledString { QString text; - QList formats; - QList urls; + QList > formats; // starting pos, ftypes }; - StyledText styleString(const QString &); + StyledString styleString(const QString &); void setFormat(FormatType, QTextCharFormat, Settings::Mode mode/* = Settings::Custom*/); QTextCharFormat format(FormatType, Settings::Mode mode = Settings::Custom) const; + QTextCharFormat mergedFormat(quint32 formatType); FormatType formatType(const QString &code) const; QString formatCode(FormatType) const; @@ -70,14 +134,14 @@ class UiStyle { private: - QTextCharFormat mergedFormat(QList); - - QVector _defaultFormats; - QVector _customFormats; + QTextCharFormat _defaultPlainFormat; + QHash _defaultFormats; + QHash _customFormats; + QHash _cachedFormats; QHash _formatCodes; QString _settingsKey; - }; +#endif // SPUTDEV #endif diff --git a/src/uisupport/uisupport.pri b/src/uisupport/uisupport.pri index 1f5de7f0..d23c4082 100644 --- a/src/uisupport/uisupport.pri +++ b/src/uisupport/uisupport.pri @@ -6,6 +6,13 @@ SRCS += abstractbuffercontainer.cpp abstractitemview.cpp bufferview.cpp buffervi HDRS += abstractbuffercontainer.h abstractitemview.h bufferview.h bufferviewfilter.h clearablelineedit.h colorbutton.h \ nickviewfilter.h inputline.h nickview.h settingspage.h tabcompleter.h uisettings.h uistyle.h uistylesettings.h +!sputdev { + SRCS += old-uistyle.cpp + SRCS -= uistyle.cpp + HDRS += old-uistyle.h + HDRS -= uistyle.h +} + FORMNAMES = for(ui, FORMNAMES) {