Optionally use system locale for chat timestamp
[quassel.git] / src / uisupport / uistyle.h
index 993aab3..0b4589a 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 by the Quassel Project                        *
+ *   Copyright (C) 2005-2016 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -24,6 +24,7 @@
 #include <QDataStream>
 #include <QFontMetricsF>
 #include <QHash>
+#include <QIcon>
 #include <QTextCharFormat>
 #include <QTextLayout>
 #include <QPalette>
@@ -133,10 +134,77 @@ public:
 
     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, too.
+     *
+     * @see ../qtui/settingspages/chatviewsettingspage.ui
+     */
+    const QList<QColor> defaultSenderColors = QList<QColor> {
+        QColor(233, 13, 127),  /// Sender00
+        QColor(142, 85, 233),  /// Sender01
+        QColor(179, 14, 14),   /// Sender02
+        QColor(23, 179, 57),   /// Sender03
+        QColor(88, 175, 179),  /// Sender04
+        QColor(157, 84, 179),  /// Sender05
+        QColor(179, 151, 117), /// Sender06
+        QColor(49, 118, 179),  /// Sender07
+        QColor(233, 13, 127),  /// Sender08
+        QColor(142, 85, 233),  /// Sender09
+        QColor(179, 14, 14),   /// Sender10
+        QColor(23, 179, 57),   /// Sender11
+        QColor(88, 175, 179),  /// Sender12
+        QColor(157, 84, 179),  /// Sender13
+        QColor(179, 151, 117), /// Sender14
+        QColor(49, 118, 179),  /// 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, quint32 baseFormat = Base);
     static QString mircToInternal(const QString &);
-    static inline QString timestampFormatString() { return _timestampFormatString; }
+
+    /**
+     * 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(quint32 formatType, quint32 messageLabel) const;
     QFontMetricsF *fontMetrics(quint32 formatType, quint32 messageLabel) const;
@@ -167,8 +235,38 @@ protected:
 
     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::system().timeFormat(),
+     * this extends the system 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 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:
@@ -183,15 +281,18 @@ private:
     mutable QHash<quint64, QFontMetricsF *> _metricsCache;
     QHash<quint32, QTextCharFormat> _listItemFormats;
     static QHash<QString, FormatType> _formatCodes;
-    static QString _timestampFormatString;
-
-    QPixmap _channelJoinedIcon;
-    QPixmap _channelPartedIcon;
-    QPixmap _userOfflineIcon;
-    QPixmap _userOnlineIcon;
-    QPixmap _userAwayIcon;
-    QPixmap _categoryOpIcon;
-    QPixmap _categoryVoiceIcon;
+    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 _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;