+ // 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>>;
+
+ struct StyledString
+ {
+ QString plainText;
+ FormatList formatList; // starting pos, ftypes
+ };
+
+ class StyledMessage;
+
+ /**
+ * List of default sender colors
+ *
+ * In order from 1 - 16, matching the Sender## format in the settings file.
+ * Don't change the length or values of the colors without updating the UI and color roles, too.
+ *
+ * @see ../qtui/settingspages/chatviewsettingspage.ui
+ * @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
+ };
+ // 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);