qss: Introduce new message label "hovered"
[quassel.git] / src / uisupport / uistyle.h
index 7d1a8bc..6ea9fa8 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2016 by the Quassel Project                        *
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -23,6 +23,7 @@
 #include <utility>
 #include <vector>
 
+#include <QColor>
 #include <QDataStream>
 #include <QFontMetricsF>
 #include <QHash>
@@ -40,6 +41,7 @@
 class UiStyle : public QObject
 {
     Q_OBJECT
+    Q_ENUMS(SenderPrefixModes)
 
 public:
     UiStyle(QObject *parent = 0);
@@ -80,7 +82,7 @@ public:
         Bold            = 0x00000100,
         Italic          = 0x00000200,
         Underline       = 0x00000400,
-        Reverse         = 0x00000800,
+        Strikethrough   = 0x00000800,
 
         // Individual parts of a message
         Timestamp       = 0x00001000,
@@ -103,7 +105,9 @@ public:
         None            = 0x00000000,
         OwnMsg          = 0x00000001,
         Highlight       = 0x00000002,
-        Selected        = 0x00000004 // must be last!
+        Selected        = 0x00000004,
+        Hovered         = 0x00000008,
+        Last            = Hovered
     };
 
     enum class ItemFormatType : quint32 {
@@ -127,6 +131,11 @@ public:
         Invalid           = 0xffffffff
     };
 
+    enum class FormatProperty {
+        AllowForegroundOverride = QTextFormat::UserProperty,
+        AllowBackgroundOverride
+    };
+
     enum class ColorRole {
         MarkerLine,
         // Sender colors (16 + self)
@@ -156,8 +165,23 @@ public:
         NumRoles // must be last!
     };
 
+    /// Display of sender prefix modes
+#if QT_VERSION >= 0x050000
+    enum class SenderPrefixMode {
+#else
+    enum SenderPrefixMode {
+#endif
+        NoModes = 0,      ///< Hide sender modes
+        HighestMode = 1,  ///< Show the highest active sender mode
+        AllModes = 2      ///< Show all active sender modes
+    };
+    // Do not change SenderPrefixMode numbering without also adjusting
+    // ChatViewSettingsPage::initSenderPrefixComboBox() and chatviewsettingspage.ui "defaultValue"
+
     struct Format {
         FormatType type;
+        QColor foreground;
+        QColor background;
     };
 
     using FormatList = std::vector<std::pair<quint16, Format>>;
@@ -179,22 +203,22 @@ public:
      * @see UiStyle::ColorRole
      */
     const QList<QColor> defaultSenderColors = QList<QColor> {
-        QColor(204,   0,   0),  /// Sender00
-        QColor(  0, 108, 173),  /// Sender01
-        QColor( 77, 153,   0),  /// Sender02
-        QColor(102,   0, 204),  /// Sender03
-        QColor(166, 125,   0),  /// Sender04
-        QColor(  0, 153,  39),  /// Sender05
-        QColor(  0,  48, 192),  /// Sender06
-        QColor(204,   0, 154),  /// Sender07
-        QColor(185,  70,   0),  /// Sender08
-        QColor(134, 153,   0),  /// Sender09
-        QColor( 20, 153,   0),  /// Sender10
-        QColor(  0, 153,  96),  /// Sender11
-        QColor(  0, 108, 173),  /// Sender12
-        QColor(  0, 153, 204),  /// Sender13
-        QColor(179,   0, 204),  /// Sender14
-        QColor(204,   0,  77),  /// Sender15
+        QColor(204,   0,   0),  ///< Sender00
+        QColor(  0, 108, 173),  ///< Sender01
+        QColor( 77, 153,   0),  ///< Sender02
+        QColor(102,   0, 204),  ///< Sender03
+        QColor(166, 125,   0),  ///< Sender04
+        QColor(  0, 153,  39),  ///< Sender05
+        QColor(  0,  48, 192),  ///< Sender06
+        QColor(204,   0, 154),  ///< Sender07
+        QColor(185,  70,   0),  ///< Sender08
+        QColor(134, 153,   0),  ///< Sender09
+        QColor( 20, 153,   0),  ///< Sender10
+        QColor(  0, 153,  96),  ///< Sender11
+        QColor(  0, 108, 173),  ///< Sender12
+        QColor(  0, 153, 204),  ///< Sender13
+        QColor(179,   0, 204),  ///< Sender14
+        QColor(204,   0,  77),  ///< Sender15
     };
     // Explicitly declare QList<QColor> type for defaultSenderColors, otherwise error C2797
     // "list initialization inside member initializer list" will occur in Windows builds with Visual
@@ -242,7 +266,7 @@ public:
      */
     static QString timestampFormatString();
 
-    QTextCharFormat format(FormatType formatType, MessageLabel messageLabel) const;
+    QTextCharFormat format(const Format &format, MessageLabel messageLabel) const;
     QFontMetricsF *fontMetrics(FormatType formatType, MessageLabel messageLabel) const;
 
     QList<QTextLayout::FormatRange> toTextLayoutList(const FormatList &, int textLength, MessageLabel messageLabel) const;
@@ -263,11 +287,12 @@ protected:
     void loadStyleSheet();
     QString loadStyleSheet(const QString &name, bool shouldExist = false);
 
-    QTextCharFormat format(quint64 key) const;
-    QTextCharFormat cachedFormat(FormatType formatType, MessageLabel messageLabel) const;
-    void setCachedFormat(const QTextCharFormat &format, FormatType formatType, MessageLabel messageLabel) const;
-    void mergeFormat(QTextCharFormat &format, FormatType formatType, MessageLabel messageLabel) const;
-    void mergeSubElementFormat(QTextCharFormat &format, FormatType formatType, MessageLabel messageLabel) const;
+    QTextCharFormat parsedFormat(quint64 key) const;
+    QTextCharFormat cachedFormat(const Format &format, MessageLabel messageLabel) const;
+    void setCachedFormat(const QTextCharFormat &charFormat, const Format &format, MessageLabel messageLabel) const;
+    void mergeFormat(QTextCharFormat &charFormat, const Format &format, MessageLabel messageLabel) const;
+    void mergeSubElementFormat(QTextCharFormat &charFormat, FormatType formatType, MessageLabel messageLabel) const;
+    void mergeColors(QTextCharFormat &charFormat, const Format &format, MessageLabel messageLabel) const;
 
     static FormatType formatType(const QString &code);
     static QString formatCode(FormatType);
@@ -296,11 +321,11 @@ protected:
      */
     static void setTimestampFormatString(const QString &format);
     /**
-     * Updates the local setting cache of whether or not to show sender prefixmodes
+     * Updates the local setting cache of how to display sender prefix modes
      *
-     * @param[in] enabled  If true, sender prefixmodes are enabled, otherwise false.
+     * @param[in] mode  Display format for sender prefix modes
      */
-    static void enableSenderPrefixes(bool enabled);
+    static void setSenderPrefixDisplay(UiStyle::SenderPrefixMode mode);
 
     /**
      * Updates the local setting cache of whether or not to show sender brackets
@@ -319,15 +344,15 @@ private:
     QVector<QBrush> _uiStylePalette;
     QBrush _markerLineBrush;
     QHash<quint64, QTextCharFormat> _formats;
-    mutable QHash<quint64, QTextCharFormat> _formatCache;
+    mutable QHash<QString, QTextCharFormat> _formatCache;
     mutable QHash<quint64, QFontMetricsF *> _metricsCache;
     QHash<UiStyle::ItemFormatType, QTextCharFormat> _listItemFormats;
     static QHash<QString, FormatType> _formatCodes;
-    static bool _useCustomTimestampFormat;        /// If true, use the custom timestamp format
-    static QString _systemTimestampFormatString;  /// Cached copy of system locale timestamp format
-    static QString _timestampFormatString;        /// Timestamp format string
-    static bool _showSenderPrefixes;              /// If true, show prefixmodes before sender names
-    static bool _showSenderBrackets;              /// If true, show brackets around sender names
+    static bool _useCustomTimestampFormat;        ///< If true, use the custom timestamp format
+    static QString _systemTimestampFormatString;  ///< Cached copy of system locale timestamp format
+    static QString _timestampFormatString;        ///< Timestamp format string
+    static UiStyle::SenderPrefixMode _senderPrefixDisplay; ///< Prefix mode display before sender
+    static bool _showSenderBrackets;              ///< If true, show brackets around sender names
 
     QIcon _channelJoinedIcon;
     QIcon _channelPartedIcon;
@@ -404,3 +429,4 @@ QDataStream &operator>>(QDataStream &in, UiStyle::FormatList &formatList);
 
 Q_DECLARE_METATYPE(UiStyle::FormatList)
 Q_DECLARE_METATYPE(UiStyle::MessageLabel)
+Q_DECLARE_METATYPE(UiStyle::SenderPrefixMode)