X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fuistyle.h;h=843d2f225167653f6efc6d6261c0d066e801f1ac;hp=c722be829b652ca162940dc41554d47ede928362;hb=d33a73406dc7b2a41c97d169b865836f6fce4980;hpb=aa40491595ffec54ba340a9850d99dc14d920eb3 diff --git a/src/uisupport/uistyle.h b/src/uisupport/uistyle.h index c722be82..843d2f22 100644 --- a/src/uisupport/uistyle.h +++ b/src/uisupport/uistyle.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,66 +18,156 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef _UISTYLE_H_ -#define _UISTYLE_H_ +#ifndef UISTYLE_H_ +#define UISTYLE_H_ +#include +#include +#include #include #include -#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 &); +class UiStyle : public QObject{ + Q_OBJECT + +public: + UiStyle(QObject *parent = 0); + virtual ~UiStyle(); + + typedef QList > FormatList; + + //! 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 { + Base = 0x00000000, + Invalid = 0xffffffff, + + // Message Formats (mutually exclusive!) + PlainMsg = 0x00000001, + NoticeMsg = 0x00000002, + ActionMsg = 0x00000003, + NickMsg = 0x00000004, + ModeMsg = 0x00000005, + JoinMsg = 0x00000006, + PartMsg = 0x00000007, + QuitMsg = 0x00000008, + KickMsg = 0x00000009, + KillMsg = 0x0000000a, + ServerMsg = 0x0000000b, + InfoMsg = 0x0000000c, + ErrorMsg = 0x0000000d, + DayChangeMsg = 0x0000000e, + + // Standard Formats + Bold = 0x00000100, + Italic = 0x00000200, + Underline = 0x00000400, + Reverse = 0x00000800, + + // Individual parts of a message + Timestamp = 0x00001000, + Sender = 0x00002000, + Contents = 0x00004000, + Nick = 0x00008000, + Hostmask = 0x00010000, + ChannelName = 0x00020000, + ModeFlags = 0x00040000, + + // URL is special, we want that to take precedence over the rest... + Url = 0x00080000 + + // mIRC Colors - we assume those to be present only in plain contents + // foreground: 0x0.400000 + // background: 0x.0800000 + }; + + enum MessageLabel { + OwnMsg = 0x00000001, + Highlight = 0x00000002, + Selected = 0x00000004 // must be last! + }; + + struct StyledString { + QString plainText; + FormatList formatList; // starting pos, ftypes + }; + + class StyledMessage; + + static FormatType formatType(Message::Type msgType); + static StyledString styleString(const QString &string, quint32 baseFormat = Base); + static QString mircToInternal(const QString &); + static inline QString timestampFormatString() { return _timestampFormatString; } + + QTextCharFormat format(quint32 formatType, quint32 messageLabel = 0); + QFontMetricsF *fontMetrics(quint32 formatType, quint32 messageLabel = 0); + + inline QFont defaultFont() const { return _defaultFont; } + + QList toTextLayoutList(const FormatList &, int textLength, quint32 messageLabel = 0); + +public slots: + void reload(); + +signals: + void changed(); + +protected: + void loadStyleSheet(); + QString loadStyleSheet(const QString &name, bool shouldExist = false); + + QTextCharFormat cachedFormat(quint64 key) const; + QTextCharFormat cachedFormat(quint32 formatType, quint32 messageLabel = 0) const; + void setCachedFormat(const QTextCharFormat &format, quint32 formatType, quint32 messageLabel = 0); + void mergeFormat(QTextCharFormat &format, quint32 formatType, quint64 messageLabel); + void mergeSubElementFormat(QTextCharFormat &format, quint32 formatType, quint64 messageLabel); + + static FormatType formatType(const QString &code); + static QString formatCode(FormatType); + static void setTimestampFormatString(const QString &format); + +private: + QFont _defaultFont; + QHash _formatCache; + QHash _metricsCache; + static QHash _formatCodes; + static QString _timestampFormatString; +}; - void setFormat(FormatType, QTextCharFormat, Settings::Mode mode/* = Settings::Custom*/); - QTextCharFormat format(FormatType, Settings::Mode mode = Settings::Custom) const; +class UiStyle::StyledMessage : public Message { +public: + explicit StyledMessage(const Message &message); - FormatType formatType(const QString &code) const; - QString formatCode(FormatType) const; + QString decoratedTimestamp() const; + QString plainSender() const; //!< Nickname (no decorations) for Plain and Notice, empty else + QString decoratedSender() const; + const QString &plainContents() const; - protected: + const FormatList &contentsFormatList() const; + quint8 senderHash() const; - private: - QTextCharFormat mergedFormat(QList); +protected: + void style() const; - QVector _defaultFormats; - QVector _customFormats; - QHash _formatCodes; +private: + mutable StyledString _contents; + mutable quint8 _senderHash; +}; - QString _settingsKey; +QDataStream &operator<<(QDataStream &out, const UiStyle::FormatList &formatList); +QDataStream &operator>>(QDataStream &in, UiStyle::FormatList &formatList); -}; +Q_DECLARE_METATYPE(UiStyle::FormatList) #endif