src: Yearly copyright bump
[quassel.git] / src / qtui / qtuistyle.cpp
index 60d858a..2aa2ece 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2016 by the Quassel Project                        *
+ *   Copyright (C) 2005-2019 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
-#include "chatviewsettings.h"
 #include "qtuistyle.h"
 
 #include <QFile>
 #include <QFileInfo>
 #include <QTextStream>
 
-QtUiStyle::QtUiStyle(QObject *parent) : UiStyle(parent)
+#include "chatviewsettings.h"
+
+QtUiStyle::QtUiStyle(QObject* parent)
+    : UiStyle(parent)
 {
     ChatViewSettings s;
-    s.notify("UseCustomTimestampFormat", this, SLOT(updateUseCustomTimestampFormat()));
-    updateUseCustomTimestampFormat();
-    s.notify("TimestampFormat", this, SLOT(updateTimestampFormatString()));
-    updateTimestampFormatString();
-    s.notify("ShowSenderPrefixes", this, SLOT(updateShowSenderPrefixes()));
-    updateShowSenderPrefixes();
-    s.notify("ShowSenderBrackets", this, SLOT(updateShowSenderBrackets()));
-    updateShowSenderBrackets();
+    s.initAndNotify("UseCustomTimestampFormat", this, &QtUiStyle::updateUseCustomTimestampFormat);
+    s.initAndNotify("TimestampFormat", this, &QtUiStyle::updateTimestampFormatString);
+    s.initAndNotify("SenderPrefixMode", this, &QtUiStyle::updateSenderPrefixDisplay);
+    s.initAndNotify("ShowSenderBrackets", this, &QtUiStyle::updateShowSenderBrackets);
 
     // If no style sheet exists, generate it on first run.
     initializeSettingsQss();
 }
 
-
-QtUiStyle::~QtUiStyle() {}
-
 void QtUiStyle::updateUseCustomTimestampFormat()
 {
     ChatViewSettings s;
@@ -56,10 +51,10 @@ void QtUiStyle::updateTimestampFormatString()
     setTimestampFormatString(s.timestampFormatString());
 }
 
-void QtUiStyle::updateShowSenderPrefixes()
+void QtUiStyle::updateSenderPrefixDisplay()
 {
     ChatViewSettings s;
-    enableSenderPrefixes(s.showSenderPrefixes());
+    setSenderPrefixDisplay(s.senderPrefixDisplay());
 }
 
 void QtUiStyle::updateShowSenderBrackets()
@@ -68,7 +63,6 @@ void QtUiStyle::updateShowSenderBrackets()
     enableSenderBrackets(s.showSenderBrackets());
 }
 
-
 void QtUiStyle::initializeSettingsQss()
 {
     QFileInfo settingsQss(Quassel::configDirPath() + "settings.qss");
@@ -85,7 +79,7 @@ void QtUiStyle::generateSettingsQss() const
 {
     QFile settingsQss(Quassel::configDirPath() + "settings.qss");
 
-    if (!settingsQss.open(QFile::WriteOnly|QFile::Truncate)) {
+    if (!settingsQss.open(QFile::WriteOnly | QFile::Truncate)) {
         qWarning() << "Could not open" << settingsQss.fileName() << "for writing!";
         return;
     }
@@ -105,34 +99,23 @@ void QtUiStyle::generateSettingsQss() const
     if (s.value("UseChatViewColors").toBool()) {
         out << "\n// Custom ChatView Colors\n"
 
-        // markerline is special in that it always used to use a gradient, so we keep this behavior even with the new implementation
-        << "Palette { marker-line: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 " << color("MarkerLine", s) << ", stop: 0.1 transparent); }\n"
-        << "ChatView { background: " << color("ChatViewBackground", s) << "; }\n\n"
-        << "ChatLine[label=\"highlight\"] {\n"
-        << "  foreground: " << color("Highlight", s) << ";\n"
-        << "  background: " << color("HighlightBackground", s) << ";\n"
-        << "}\n\n"
-        << "ChatLine::timestamp { foreground: " << color("Timestamp", s) << "; }\n\n"
-
-        << msgTypeQss("plain", "ChannelMsg", s)
-        << msgTypeQss("notice", "ServerMsg", s)
-        << msgTypeQss("action", "ActionMsg", s)
-        << msgTypeQss("nick", "CommandMsg", s)
-        << msgTypeQss("mode", "CommandMsg", s)
-        << msgTypeQss("join", "CommandMsg", s)
-        << msgTypeQss("part", "CommandMsg", s)
-        << msgTypeQss("quit", "CommandMsg", s)
-        << msgTypeQss("kick", "CommandMsg", s)
-        << msgTypeQss("kill", "CommandMsg", s)
-        << msgTypeQss("server", "ServerMsg", s)
-        << msgTypeQss("info", "ServerMsg", s)
-        << msgTypeQss("error", "ErrorMsg", s)
-        << msgTypeQss("daychange", "ServerMsg", s)
-        << msgTypeQss("topic", "CommandMsg", s)
-        << msgTypeQss("netsplit-join", "CommandMsg", s)
-        << msgTypeQss("netsplit-quit", "CommandMsg", s)
-        << msgTypeQss("invite", "CommandMsg", s)
-        << "\n";
+            // markerline is special in that it always used to use a gradient, so we keep this behavior even with the new implementation
+            << "Palette { marker-line: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 " << color("MarkerLine", s)
+            << ", stop: 0.1 transparent); }\n"
+            << "ChatView { background: " << color("ChatViewBackground", s) << "; }\n\n"
+            << "ChatLine[label=\"highlight\"] {\n"
+            << "  foreground: " << color("Highlight", s) << ";\n"
+            << "  background: " << color("HighlightBackground", s) << ";\n"
+            << "}\n\n"
+            << "ChatLine::timestamp { foreground: " << color("Timestamp", s) << "; }\n\n"
+
+            << msgTypeQss("plain", "ChannelMsg", s) << msgTypeQss("notice", "ServerMsg", s) << msgTypeQss("action", "ActionMsg", s)
+            << msgTypeQss("nick", "CommandMsg", s) << msgTypeQss("mode", "CommandMsg", s) << msgTypeQss("join", "CommandMsg", s)
+            << msgTypeQss("part", "CommandMsg", s) << msgTypeQss("quit", "CommandMsg", s) << msgTypeQss("kick", "CommandMsg", s)
+            << msgTypeQss("kill", "CommandMsg", s) << msgTypeQss("server", "ServerMsg", s) << msgTypeQss("info", "ServerMsg", s)
+            << msgTypeQss("error", "ErrorMsg", s) << msgTypeQss("daychange", "ServerMsg", s) << msgTypeQss("topic", "CommandMsg", s)
+            << msgTypeQss("netsplit-join", "CommandMsg", s) << msgTypeQss("netsplit-quit", "CommandMsg", s)
+            << msgTypeQss("invite", "CommandMsg", s) << "\n";
     }
 
     if (s.value("UseSenderColors", true).toBool()) {
@@ -172,7 +155,6 @@ void QtUiStyle::generateSettingsQss() const
             for (int i = 0; i < defaultSenderColors.count(); i++)
                 out << nickQss(i);
         }
-
     }
 
     // ItemViews
@@ -190,98 +172,89 @@ void QtUiStyle::generateSettingsQss() const
     if (uiColors.value("UseBufferViewColors").toBool()) {
         out << "\n// BufferView Colors\n"
             << "ChatListItem { foreground: " << color("DefaultBuffer", uiColors) << "; }\n"
-            << chatListItemQss("inactive", "InactiveBuffer", uiColors)
-            << chatListItemQss("channel-event", "ActiveBuffer", uiColors)
-            << chatListItemQss("unread-message", "UnreadBuffer", uiColors)
-            << chatListItemQss("highlighted", "HighlightedBuffer", uiColors);
+            << chatListItemQss("inactive", "InactiveBuffer", uiColors) << chatListItemQss("channel-event", "ActiveBuffer", uiColors)
+            << chatListItemQss("unread-message", "UnreadBuffer", uiColors) << chatListItemQss("highlighted", "HighlightedBuffer", uiColors);
     }
 
     if (uiColors.value("UseNickViewColors").toBool()) {
         out << "\n// NickView Colors\n"
             << "NickListItem[type=\"category\"] { foreground: " << color("DefaultBuffer", uiColors) << "; }\n"
             << "NickListItem[type=\"user\"] { foreground: " << color("OnlineNick", uiColors) << "; }\n"
-            << "NickListItem[type=\"user\", state=\"away\"] { foreground: " << color("AwayNick", uiColors) << "; }\n";
+            << R"(NickListItem[type="user", state="away"] { foreground: )" << color("AwayNick", uiColors) << "; }\n";
     }
 
     settingsQss.close();
 }
 
-
-QString QtUiStyle::color(const QString &key, UiSettings &settings, const QColor &defaultColor) const
+QString QtUiStyle::color(const QString& key, UiSettings& settings, const QColor& defaultColor) const
 {
     return settings.value(key, defaultColor).value<QColor>().name();
 }
 
-
-QString QtUiStyle::fontDescription(const QFont &font) const
+QString QtUiStyle::fontDescription(const QFont& font) const
 {
-    QString desc = "font: ";
-    if (font.italic())
-        desc += "italic ";
-    if (font.bold())
-        desc += "bold ";
-    if (!font.italic() && !font.bold())
-        desc += "normal ";
-    desc += QString("%1pt \"%2\"").arg(font.pointSize()).arg(font.family());
-    return desc;
+    QFont::Style style = font.style();
+    int weight = font.weight();
+
+    return QString("font: %1 %2 %3pt \"%4\"")
+        .arg(style == QFont::StyleItalic ? "italic" : style == QFont::StyleOblique ? "oblique" : "normal")
+        .arg(100 * qBound(1, (weight * 8 + 50) / 100, 9))
+        .arg(font.pointSize())
+        .arg(font.family());
 }
 
-
-QString QtUiStyle::msgTypeQss(const QString &msgType, const QString &key, UiSettings &settings) const
+QString QtUiStyle::msgTypeQss(const QString& msgType, const QString& key, UiSettings& settings) const
 {
     return QString("ChatLine#%1 { foreground: %2; }\n").arg(msgType, color(key, settings));
 }
 
-
-QString QtUiStyle::senderPaletteQss(UiSettings &settings) const
+QString QtUiStyle::senderPaletteQss(UiSettings& settings) const
 {
     QString result;
     result += "Palette {\n";
 
     // Generate entries for sender-color-self
-    result += QString("    sender-color-self: %1;\n")
-              .arg(color("SenderSelf", settings, defaultSenderColorSelf));
+    result += QString("    sender-color-self: %1;\n").arg(color("SenderSelf", settings, defaultSenderColorSelf));
 
     // Generate entries for sender-color-HASH
     for (int i = 0; i < defaultSenderColors.count(); i++) {
         QString dez = QString::number(i);
-        if (dez.length() == 1) dez.prepend('0');
-        result += QString("    sender-color-0%1: %2;\n")
-                .arg(QString::number(i, 16), color("Sender"+dez, settings, defaultSenderColors[i]));
+        if (dez.length() == 1)
+            dez.prepend('0');
+        result += QString("    sender-color-0%1: %2;\n").arg(QString::number(i, 16), color("Sender" + dez, settings, defaultSenderColors[i]));
     }
     result += "}\n\n";
     return result;
 }
 
-
-QString QtUiStyle::senderQss(int i, const QString &messageType, bool includeNick) const
+QString QtUiStyle::senderQss(int i, const QString& messageType, bool includeNick) const
 {
     QString dez = QString::number(i);
-    if (dez.length() == 1) dez.prepend('0');
+    if (dez.length() == 1)
+        dez.prepend('0');
 
     if (includeNick) {
         // Include the nickname in the color rules
         return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: palette(sender-color-0%2); }\n"
                        "ChatLine::nick#%1[sender=\"0%2\"]   { foreground: palette(sender-color-0%2); }\n")
-                .arg(messageType, QString::number(i, 16));
-    } else {
+            .arg(messageType, QString::number(i, 16));
+    }
+    else {
         return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: palette(sender-color-0%2); }\n")
-                .arg(messageType, QString::number(i, 16));
+            .arg(messageType, QString::number(i, 16));
     }
 }
 
-
 QString QtUiStyle::nickQss(int i) const
 {
     QString dez = QString::number(i);
-    if (dez.length() == 1) dez.prepend('0');
+    if (dez.length() == 1)
+        dez.prepend('0');
 
-    return QString("ChatLine::nick[sender=\"0%1\"]   { foreground: palette(sender-color-0%1); }\n")
-            .arg(QString::number(i, 16));
+    return QString("ChatLine::nick[sender=\"0%1\"]   { foreground: palette(sender-color-0%1); }\n").arg(QString::number(i, 16));
 }
 
-
-QString QtUiStyle::chatListItemQss(const QString &state, const QString &key, UiSettings &settings) const
+QString QtUiStyle::chatListItemQss(const QString& state, const QString& key, UiSettings& settings) const
 {
     return QString("ChatListItem[state=\"%1\"] { foreground: %2; }\n").arg(state, color(key, settings));
 }