+ // Explicitly declare QList<QColor> type for defaultSenderColors, otherwise error C2797
+ // "list initialization inside member initializer list" will occur in Windows builds with Visual
+ // Studio's compiler.
+ //
+ // See https://blogs.msdn.microsoft.com/vcblog/2014/08/19/the-future-of-non-static-data-member-initialization/
+ // Note: Qt Creator flags this as invalid unless you set Clang in
+ // Settings -> C++ -> Code Model -> Code Completion and Semantic Highlighting -> C
+ //
+ // See https://bugreports.qt.io/browse/QTCREATORBUG-1902
+
+ /**
+ * Default sender color for sent messages
+ */
+ const QColor defaultSenderColorSelf = QColor(0, 0, 0);
+
+ static FormatType formatType(Message::Type msgType);
+ static StyledString styleString(const QString &string, FormatType baseFormat = FormatType::Base);
+ static QString mircToInternal(const QString &);
+
+ /**
+ * Gets if a custom timestamp format is used.
+ *
+ * @return True if custom timestamp format used, otherwise false
+ */
+ static inline bool useCustomTimestampFormat() { return _useCustomTimestampFormat; }
+
+ /**
+ * Gets the format string for chat log timestamps according to the system locale.
+ *
+ * This will return " hh:mm:ss" for system locales with 24-hour time or " h:mm:ss AP" for
+ * systems with 12-hour time.
+ *
+ * @return String representing timestamp format according to system locale, e.g. " hh:mm:ss"
+ */
+ static QString systemTimestampFormatString();
+
+ /**
+ * Gets the format string for chat log timestamps, either system locale or custom.
+ *
+ * Depending on useCustomTimestampFormat(), this will return either the system locale based
+ * time format, or the custom user-specified string.
+ *
+ * @return String representing timestamp format, e.g. "[hh:mm:ss]" or " hh:mm:ss"
+ */
+ static QString timestampFormatString();
+
+ 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;
+
+ inline const QBrush &brush(ColorRole role) const { return _uiStylePalette.at((int)role); }
+ inline void setBrush(ColorRole role, const QBrush &brush) { _uiStylePalette[(int)role] = brush; }
+
+ QVariant bufferViewItemData(const QModelIndex &networkModelIndex, int role) const;
+ QVariant nickViewItemData(const QModelIndex &networkModelIndex, int role) const;
+
+public slots:
+ void reload();
+
+signals:
+ void changed();
+
+protected:
+ void loadStyleSheet();
+ QString loadStyleSheet(const QString &name, bool shouldExist = false);
+
+ 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);
+
+ /**
+ * Cache the system locale timestamp format string
+ *
+ * Based on whether or not AM/PM designators are used in the QLocale.timeFormat(), this extends
+ * the application locale timestamp format string to include seconds.
+ *
+ * @see UiStyle::systemTimestampFormatString()
+ */
+ static void updateSystemTimestampFormat();
+
+ /**
+ * Updates the local setting cache of whether or not to use the custom timestamp format
+ *
+ * @param[in] enabled If true, custom timestamp format used, otherwise false
+ */
+ static void setUseCustomTimestampFormat(bool enabled);
+
+ /**
+ * Updates the local setting cache of the timestamp format string
+ *
+ * @param[in] format Timestamp format string
+ */
+ static void setTimestampFormatString(const QString &format);
+ /**
+ * Updates the local setting cache of how to display sender prefix modes
+ *
+ * @param[in] mode Display format for sender prefix modes
+ */
+ static void setSenderPrefixDisplay(UiStyle::SenderPrefixMode mode);
+
+ /**
+ * Updates the local setting cache of whether or not to show sender brackets
+ *
+ * @param[in] enabled If true, sender brackets are enabled, otherwise false.
+ */
+ static void enableSenderBrackets(bool enabled);
+
+ QVariant itemData(int role, const QTextCharFormat &format) const;
+
+private slots:
+ void allowMircColorsChanged(const QVariant &);
+ void showItemViewIconsChanged(const QVariant &);
+
+private:
+ QVector<QBrush> _uiStylePalette;
+ QBrush _markerLineBrush;
+ QHash<quint64, QTextCharFormat> _formats;
+ 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 UiStyle::SenderPrefixMode _senderPrefixDisplay; ///< Prefix mode display before sender
+ static bool _showSenderBrackets; ///< If true, show brackets around sender names
+
+ QIcon _channelJoinedIcon;
+ QIcon _channelPartedIcon;
+ QIcon _userOfflineIcon;
+ QIcon _userOnlineIcon;
+ QIcon _userAwayIcon;
+ QIcon _categoryOpIcon;
+ QIcon _categoryVoiceIcon;
+ int _opIconLimit;
+ int _voiceIconLimit;
+ bool _showNickViewIcons;
+ bool _showBufferViewIcons;
+ bool _allowMircColors;
+};