X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fqtuistyle.cpp;h=d167b2ebf7312e182911335aea48ccb1e9c3c92a;hp=8c9f5dc0e916af34515d9f8ea162912077787726;hb=b06a827aea68b050bf23c37e0162189a94595ee9;hpb=dfbd0465f2a58eee4771472afd261869e5e5c400 diff --git a/src/qtui/qtuistyle.cpp b/src/qtui/qtuistyle.cpp index 8c9f5dc0..d167b2eb 100644 --- a/src/qtui/qtuistyle.cpp +++ b/src/qtui/qtuistyle.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 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 * @@ -15,94 +15,265 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include "chatviewsettings.h" #include "qtuistyle.h" -QtUiStyle::QtUiStyle() : UiStyle("QtUiStyleNew") { // FIXME QtUiStyleNew naming - // We need to just set our internal formats; everything else is done by the base class... +#include +#include +#include - // Internal message formats - QTextCharFormat plainMsg; - plainMsg.setForeground(QBrush("black")); - setFormat(PlainMsg, plainMsg, Settings::Default); +QtUiStyle::QtUiStyle(QObject *parent) : UiStyle(parent) +{ + ChatViewSettings s; + s.notify("UseCustomTimestampFormat", this, SLOT(updateUseCustomTimestampFormat())); + updateUseCustomTimestampFormat(); + s.notify("TimestampFormat", this, SLOT(updateTimestampFormatString())); + updateTimestampFormatString(); + s.notify("ShowSenderBrackets", this, SLOT(updateShowSenderBrackets())); + updateShowSenderBrackets(); - QTextCharFormat notice; - notice.setForeground(QBrush("navy")); - setFormat(NoticeMsg, notice, Settings::Default); + // If no style sheet exists, generate it on first run. + initializeSettingsQss(); +} + + +QtUiStyle::~QtUiStyle() {} - QTextCharFormat server; - server.setForeground(QBrush("navy")); - setFormat(ServerMsg, server, Settings::Default); +void QtUiStyle::updateUseCustomTimestampFormat() +{ + ChatViewSettings s; + setUseCustomTimestampFormat(s.useCustomTimestampFormat()); +} - QTextCharFormat error; - error.setForeground(QBrush("red")); - setFormat(ErrorMsg, error, Settings::Default); +void QtUiStyle::updateTimestampFormatString() +{ + ChatViewSettings s; + setTimestampFormatString(s.timestampFormatString()); +} - QTextCharFormat join; - join.setForeground(QBrush("green")); - setFormat(JoinMsg, join, Settings::Default); +void QtUiStyle::updateShowSenderBrackets() +{ + ChatViewSettings s; + enableSenderBrackets(s.showSenderBrackets()); +} + + +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(); +} - QTextCharFormat part; - part.setForeground(QBrush("indianred")); - setFormat(PartMsg, part, Settings::Default); +void QtUiStyle::generateSettingsQss() const +{ + QFile settingsQss(Quassel::configDirPath() + "settings.qss"); - QTextCharFormat quit; - quit.setForeground(QBrush("indianred")); - setFormat(QuitMsg, quit, Settings::Default); + if (!settingsQss.open(QFile::WriteOnly|QFile::Truncate)) { + qWarning() << "Could not open" << settingsQss.fileName() << "for writing!"; + return; + } + QTextStream out(&settingsQss); - QTextCharFormat kick; - kick.setForeground(QBrush("indianred")); - setFormat(KickMsg, kick, Settings::Default); + out << "// Style settings made in Quassel's configuration dialog\n" + << "// This file is automatically generated, do not edit\n"; - QTextCharFormat nren; - nren.setForeground(QBrush("magenta")); - setFormat(RenameMsg, nren, Settings::Default); + // ChatView + /////////// + QtUiStyleSettings fs("Fonts"); + if (fs.value("UseCustomChatViewFont").toBool()) + out << "\n// ChatView Font\n" + << "ChatLine { " << fontDescription(fs.value("ChatView").value()) << "; }\n"; - QTextCharFormat mode; - mode.setForeground(QBrush("steelblue")); - setFormat(ModeMsg, mode, Settings::Default); + QtUiStyleSettings s("Colors"); + if (s.value("UseChatViewColors").toBool()) { + out << "\n// Custom ChatView Colors\n" - QTextCharFormat action; - action.setFontItalic(true); - action.setForeground(QBrush("darkmagenta")); - setFormat(ActionMsg, action, Settings::Default); + // 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" - // Internal message element formats - QTextCharFormat ts; - ts.setForeground(QBrush("grey")); - setFormat(Timestamp, ts, Settings::Default); + << 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"; + } - QTextCharFormat sender; - sender.setAnchor(true); - sender.setForeground(QBrush("navy")); - setFormat(Sender, sender, Settings::Default); + if (s.value("UseSenderColors", true).toBool()) { + out << "\n// Sender Colors\n"; + // Generate a color palette for easy reuse elsewhere + // NOTE: A color palette is not a complete replacement for specifying the colors below, as + // specifying the colors one-by-one instead of with QtUi::style()->brush(...) makes it easy + // to toggle the specific coloring of sender/nick at the cost of regenerating this file. + // See UiStyle::ColorRole + out << senderPaletteQss(s); - QTextCharFormat nick; - nick.setAnchor(true); - nick.setFontWeight(QFont::Bold); - setFormat(Nick, nick, Settings::Default); + out << "ChatLine::sender#plain[sender=\"self\"] { foreground: palette(sender-color-self); }\n\n"; - QTextCharFormat hostmask; - hostmask.setFontItalic(true); - setFormat(Hostmask, hostmask, Settings::Default); + // Matches qssparser.cpp for UiStyle::PlainMsg + for (int i = 0; i < defaultSenderColors.count(); i++) + out << senderQss(i, "plain"); - QTextCharFormat channel; - channel.setAnchor(true); - channel.setFontWeight(QFont::Bold); - setFormat(ChannelName, channel, Settings::Default); + // Only color the nicks in CTCP ACTIONs if sender colors are enabled + 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" + << "ChatLine::sender#action[sender=\"self\"] { foreground: palette(sender-color-self); }\n" + << "ChatLine::nick#action[sender=\"self\"] { foreground: palette(sender-color-self); }\n\n"; - QTextCharFormat flags; - flags.setFontWeight(QFont::Bold); - setFormat(ModeFlags, flags, Settings::Default); + // Matches qssparser.cpp for UiStyle::ActionMsg + for (int i = 0; i < defaultSenderColors.count(); i++) + out << senderQss(i, "action", true); + } - QTextCharFormat url; - url.setFontUnderline(true); - url.setAnchor(true); - setFormat(Url, url, Settings::Default); + // Only color the nicks in CTCP ACTIONs if sender colors are enabled + if (s.value("UseNickGeneralColors", true).toBool()) { + // For action messages, color the 'sender' column -and- the nick itself + out << "\n// Nickname colors for all messages\n" + << "ChatLine::nick[sender=\"self\"] { foreground: palette(sender-color-self); }\n\n"; + // Matches qssparser.cpp for any style of message (UiStyle::...) + for (int i = 0; i < defaultSenderColors.count(); i++) + out << nickQss(i); + } + } + + // ItemViews + //////////// + + UiStyleSettings uiFonts("Fonts"); + if (uiFonts.value("UseCustomItemViewFont").toBool()) { + QString fontDesc = fontDescription(uiFonts.value("ItemView").value()); + out << "\n// ItemView Font\n" + << "ChatListItem { " << fontDesc << "; }\n" + << "NickListItem { " << fontDesc << "; }\n\n"; + } + + UiStyleSettings uiColors("Colors"); + 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); + } + + 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"; + } + + settingsQss.close(); } -QtUiStyle::~QtUiStyle() {} + +QString QtUiStyle::color(const QString &key, UiSettings &settings, const QColor &defaultColor) const +{ + return settings.value(key, defaultColor).value().name(); +} + + +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; +} + + +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 result; + result += "Palette {\n"; + + // Generate entries for sender-color-self + 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])); + } + result += "}\n\n"; + return result; +} + + +QString QtUiStyle::senderQss(int i, const QString &messageType, bool includeNick) const +{ + QString dez = QString::number(i); + 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 { + return QString("ChatLine::sender#%1[sender=\"0%2\"] { foreground: palette(sender-color-0%2); }\n") + .arg(messageType, QString::number(i, 16)); + } +} + + +QString QtUiStyle::nickQss(int i) const +{ + QString dez = QString::number(i); + 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)); +} + + +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)); +}