X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fuistyle.h;h=843d2f225167653f6efc6d6261c0d066e801f1ac;hp=60123e2904a8963c8a7bade47dacd976eb1ff8ce;hb=d33a73406dc7b2a41c97d169b865836f6fce4980;hpb=ec2b99363141d3cad003b8533b5462a313ade3c1 diff --git a/src/uisupport/uistyle.h b/src/uisupport/uistyle.h index 60123e29..843d2f22 100644 --- a/src/uisupport/uistyle.h +++ b/src/uisupport/uistyle.h @@ -32,11 +32,11 @@ #include "message.h" #include "settings.h" -class UiStyle { - Q_DECLARE_TR_FUNCTIONS(UiStyle) +class UiStyle : public QObject{ + Q_OBJECT public: - UiStyle(); + UiStyle(QObject *parent = 0); virtual ~UiStyle(); typedef QList > FormatList; @@ -49,35 +49,39 @@ public: * Also, we _do_ rely on certain properties of these values in styleString() and friends! */ enum FormatType { - None = 0x00000000, - Invalid = 0x11111111, + Base = 0x00000000, + Invalid = 0xffffffff, // 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, + 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 = 0x00000010, - Italic = 0x00000020, - Underline = 0x00000040, - Reverse = 0x00000080, + Bold = 0x00000100, + Italic = 0x00000200, + Underline = 0x00000400, + Reverse = 0x00000800, // Individual parts of a message - Timestamp = 0x00000100, - Sender = 0x00000200, - Nick = 0x00000400, - Hostmask = 0x00000800, - ChannelName = 0x00001000, - ModeFlags = 0x00002000, + 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 @@ -89,7 +93,8 @@ public: enum MessageLabel { OwnMsg = 0x00000001, - Highlight = 0x00000002 + Highlight = 0x00000002, + Selected = 0x00000004 // must be last! }; struct StyledString { @@ -99,59 +104,65 @@ public: class StyledMessage; - StyledString styleString(const QString &); - QString mircToInternal(const QString &) const; + 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); + QList toTextLayoutList(const FormatList &, int textLength, quint32 messageLabel = 0); + +public slots: + void reload(); + +signals: + void changed(); protected: void loadStyleSheet(); - - //! Determines the format set to be used for the given hostmask - //int formatSetIndex(const QString &hostmask) const; - //int formatSetIndexForSelf() const; + 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 mergeSubElementFormat(QTextCharFormat &format, quint32 formatType, quint32 messageLabel = 0); + void mergeFormat(QTextCharFormat &format, quint32 formatType, quint64 messageLabel); + void mergeSubElementFormat(QTextCharFormat &format, quint32 formatType, quint64 messageLabel); - FormatType formatType(const QString &code) const; - QString formatCode(FormatType) const; + static FormatType formatType(const QString &code); + static QString formatCode(FormatType); + static void setTimestampFormatString(const QString &format); private: QFont _defaultFont; QHash _formatCache; QHash _metricsCache; - QHash _formatCodes; + static QHash _formatCodes; + static QString _timestampFormatString; }; class UiStyle::StyledMessage : public Message { public: explicit StyledMessage(const Message &message); - //! Styling is only needed for calls to plainContents() and contentsFormatList() - // StyledMessage can't style lazily by itself, as it doesn't know the used style - bool inline needsStyling() const { return _contents.plainText.isNull(); } - void style(UiStyle *style) const; - - QString decoratedTimestamp() const; QString plainSender() const; //!< Nickname (no decorations) for Plain and Notice, empty else QString decoratedSender() const; - inline const QString &plainContents() const { return _contents.plainText; } + const QString &plainContents() const; + + const FormatList &contentsFormatList() const; - inline FormatType timestampFormat() const { return UiStyle::Timestamp; } - FormatType senderFormat() const; - inline const FormatList &contentsFormatList() const { return _contents.formatList; } + quint8 senderHash() const; + +protected: + void style() const; private: mutable StyledString _contents; + mutable quint8 _senderHash; }; QDataStream &operator<<(QDataStream &out, const UiStyle::FormatList &formatList);