Default nick/action color on, sender brackets off
authorShane Synan <digitalcircuit36939@gmail.com>
Mon, 27 Jun 2016 23:53:31 +0000 (19:53 -0400)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 6 Sep 2016 20:14:48 +0000 (22:14 +0200)
Add default sender colors in a QList accessible to the stylesheet
generator to allow for enabling colors by default.  This complements
removing sender brackets by default.

Generate a default stylesheet on first run so stylesheet-dependent
defaults such as sender colors will be applied.

Enable both sender and action colors, disable sender brackets by
default when not otherwise selected.

src/qtui/chatviewsettings.h
src/qtui/qtuistyle.cpp
src/qtui/qtuistyle.h
src/qtui/settingspages/chatviewsettingspage.ui
src/uisupport/uistyle.h

index 286de7c..cb57b68 100644 (file)
@@ -65,7 +65,7 @@ public:
      *
      * @returns True if sender brackets enabled, otherwise false
      */
      *
      * @returns True if sender brackets enabled, otherwise false
      */
-    inline bool showSenderBrackets() { return localValue("ShowSenderBrackets", true).toBool(); }
+    inline bool showSenderBrackets() { return localValue("ShowSenderBrackets", false).toBool(); }
     /**
      * Sets whether brackets are shown around around sender names.
      *
     /**
      * Sets whether brackets are shown around around sender names.
      *
index f195dfb..ebf1947 100644 (file)
@@ -31,6 +31,9 @@ QtUiStyle::QtUiStyle(QObject *parent) : UiStyle(parent)
     updateTimestampFormatString();
     s.notify("ShowSenderBrackets", this, SLOT(updateShowSenderBrackets()));
     updateShowSenderBrackets();
     updateTimestampFormatString();
     s.notify("ShowSenderBrackets", this, SLOT(updateShowSenderBrackets()));
     updateShowSenderBrackets();
+
+    // If no style sheet exists, generate it on first run.
+    initializeSettingsQss();
 }
 
 
 }
 
 
@@ -49,9 +52,22 @@ void QtUiStyle::updateShowSenderBrackets()
 }
 
 
 }
 
 
+void QtUiStyle::initializeSettingsQss()
+{
+    QFileInfo settingsQss(Quassel::configDirPath() + "settings.qss");
+    // Only initialize if it doesn't already exist
+    if (settingsQss.exists())
+        return;
+
+    // Generate and load the new stylesheet
+    generateSettingsQss();
+    reload();
+}
+
 void QtUiStyle::generateSettingsQss() const
 {
     QFile settingsQss(Quassel::configDirPath() + "settings.qss");
 void QtUiStyle::generateSettingsQss() const
 {
     QFile settingsQss(Quassel::configDirPath() + "settings.qss");
+
     if (!settingsQss.open(QFile::WriteOnly|QFile::Truncate)) {
         qWarning() << "Could not open" << settingsQss.fileName() << "for writing!";
         return;
     if (!settingsQss.open(QFile::WriteOnly|QFile::Truncate)) {
         qWarning() << "Could not open" << settingsQss.fileName() << "for writing!";
         return;
@@ -102,25 +118,26 @@ void QtUiStyle::generateSettingsQss() const
         << "\n";
     }
 
         << "\n";
     }
 
-    if (s.value("UseSenderColors").toBool()) {
+    if (s.value("UseSenderColors", true).toBool()) {
         out << "\n// Sender Colors\n"
         out << "\n// Sender Colors\n"
-            << "ChatLine::sender#plain[sender=\"self\"] { foreground: " << color("SenderSelf", s) << "; }\n\n";
+            << "ChatLine::sender#plain[sender=\"self\"] { foreground: " << color("SenderSelf", s, defaultSenderColorSelf) << "; }\n\n";
 
         // Matches qssparser.cpp for UiStyle::PlainMsg
 
         // Matches qssparser.cpp for UiStyle::PlainMsg
-        for (int i = 0; i < 16; i++)
+        for (int i = 0; i < defaultSenderColors.count(); i++)
             out << senderQss(i, s, "plain");
 
         // Only color the nicks in CTCP ACTIONs if sender colors are enabled
             out << senderQss(i, s, "plain");
 
         // Only color the nicks in CTCP ACTIONs if sender colors are enabled
-        if (s.value("UseSenderActionColors").toBool()) {
+        if (s.value("UseSenderActionColors", true).toBool()) {
             // For action messages, color the 'sender' column -and- the nick itself
             out << "\n// Sender Nickname Colors for action messages\n"
             // For action messages, color the 'sender' column -and- the nick itself
             out << "\n// Sender Nickname Colors for action messages\n"
-                << "ChatLine::sender#action[sender=\"self\"] { foreground: " << color("SenderSelf", s) << "; }\n"
-                << "ChatLine::nick#action[sender=\"self\"] { foreground: " << color("SenderSelf", s) << "; }\n\n";
+                << "ChatLine::sender#action[sender=\"self\"] { foreground: " << color("SenderSelf", s, defaultSenderColorSelf) << "; }\n"
+                << "ChatLine::nick#action[sender=\"self\"] { foreground: " << color("SenderSelf", s, defaultSenderColorSelf) << "; }\n\n";
 
             // Matches qssparser.cpp for UiStyle::ActionMsg
 
             // Matches qssparser.cpp for UiStyle::ActionMsg
-            for (int i = 0; i < 16; i++)
+            for (int i = 0; i < defaultSenderColors.count(); i++)
                 out << senderQss(i, s, "action", true);
         }
                 out << senderQss(i, s, "action", true);
         }
+
     }
 
     // ItemViews
     }
 
     // ItemViews
@@ -155,9 +172,9 @@ void QtUiStyle::generateSettingsQss() const
 }
 
 
 }
 
 
-QString QtUiStyle::color(const QString &key, UiSettings &settings) const
+QString QtUiStyle::color(const QString &key, UiSettings &settings, const QColor &defaultColor) const
 {
 {
-    return settings.value(key).value<QColor>().name();
+    return settings.value(key, defaultColor).value<QColor>().name();
 }
 
 
 }
 
 
@@ -190,10 +207,10 @@ QString QtUiStyle::senderQss(int i, UiSettings &settings, const QString &message
         // Include the nickname in the color rules
         return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: %3; }\n"
                        "ChatLine::nick#%1[sender=\"0%2\"]   { foreground: %3; }\n")
         // Include the nickname in the color rules
         return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: %3; }\n"
                        "ChatLine::nick#%1[sender=\"0%2\"]   { foreground: %3; }\n")
-                .arg(messageType, QString::number(i, 16), color("Sender"+dez, settings));
+                .arg(messageType, QString::number(i, 16), color("Sender"+dez, settings, defaultSenderColors[i]));
     } else {
         return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: %3; }\n")
     } else {
         return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: %3; }\n")
-                .arg(messageType, QString::number(i, 16), color("Sender"+dez, settings));
+                .arg(messageType, QString::number(i, 16), color("Sender"+dez, settings, defaultSenderColors[i]));
     }
 }
 
     }
 }
 
index 365640c..d824740 100644 (file)
@@ -36,6 +36,17 @@ public:
     virtual inline qreal secondColumnSeparator() const { return 6; }
 
 public slots:
     virtual inline qreal secondColumnSeparator() const { return 6; }
 
 public slots:
+    /**
+     * Generates initial settingsQss if it doesn't exist
+     *
+     * This allows for default fonts, colors, etc to specified.
+     */
+
+    void initializeSettingsQss();
+
+    /**
+     * Generates UI stylesheet based on selected fonts, colors, etc
+     */
     void generateSettingsQss() const;
 
 private slots:
     void generateSettingsQss() const;
 
 private slots:
@@ -47,7 +58,15 @@ private slots:
 
 private:
     QString fontDescription(const QFont &font) const;
 
 private:
     QString fontDescription(const QFont &font) const;
-    QString color(const QString &key, UiSettings &settings) const;
+
+    /**
+     * Generate a Qt stylesheet color string from a given setting
+     *
+     * @param[in] key          Reference to settings key containing a QColor
+     * @param[in] settings     UiSettings manager to search
+     * @param[in] defaultColor Fallback color if not found; when unspecified default is black
+     */
+    QString color(const QString &key, UiSettings &settings, const QColor &defaultColor = QColor()) const;
 
     QString msgTypeQss(const QString &msgType, const QString &key, UiSettings &settings) const;
 
 
     QString msgTypeQss(const QString &msgType, const QString &key, UiSettings &settings) const;
 
index f37821a..5e4eb24 100644 (file)
       <bool>true</bool>
      </property>
      <property name="checked">
       <bool>true</bool>
      </property>
      <property name="checked">
-      <bool>false</bool>
+      <bool>true</bool>
      </property>
      <property name="settingsKey" stdset="0">
       <string notr="true">/QtUiStyle/Colors/UseSenderColors</string>
      </property>
      <property name="defaultValue" stdset="0">
      </property>
      <property name="settingsKey" stdset="0">
       <string notr="true">/QtUiStyle/Colors/UseSenderColors</string>
      </property>
      <property name="defaultValue" stdset="0">
-      <bool>false</bool>
+      <bool>true</bool>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
          <string>Color senders in action messages</string>
         </property>
         <property name="checked">
          <string>Color senders in action messages</string>
         </property>
         <property name="checked">
-         <bool>false</bool>
+         <bool>true</bool>
         </property>
         <property name="settingsKey" stdset="0">
          <string notr="true">/QtUiStyle/Colors/UseSenderActionColors</string>
         </property>
         </property>
         <property name="settingsKey" stdset="0">
          <string notr="true">/QtUiStyle/Colors/UseSenderActionColors</string>
         </property>
+        <property name="defaultValue" stdset="0">
+         <bool>true</bool>
+        </property>
        </widget>
       </item>
      </layout>
        </widget>
       </item>
      </layout>
index c4dda11..b179147 100644 (file)
@@ -134,6 +134,47 @@ public:
 
     class StyledMessage;
 
 
     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 FormatType formatType(Message::Type msgType);
     static StyledString styleString(const QString &string, quint32 baseFormat = Base);
     static QString mircToInternal(const QString &);