X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fuistyle.cpp;h=1626c01bcd1844aa81c7ae9e9ef09462c2896283;hp=ce39d2d8c696b51ae30e1b141a1ecd203091ecc2;hb=55049803e1f4215cedaa30935eae4ca2aa5835d2;hpb=120861b909702039da9993278d8319dad14fd292 diff --git a/src/uisupport/uistyle.cpp b/src/uisupport/uistyle.cpp index ce39d2d8..1626c01b 100644 --- a/src/uisupport/uistyle.cpp +++ b/src/uisupport/uistyle.cpp @@ -19,6 +19,8 @@ ***************************************************************************/ #include +#include "buffersettings.h" +#include "iconloader.h" #include "qssparser.h" #include "quassel.h" #include "uistyle.h" @@ -28,7 +30,18 @@ QHash UiStyle::_formatCodes; QString UiStyle::_timestampFormatString; -UiStyle::UiStyle(QObject *parent) : QObject(parent) { +UiStyle::UiStyle(QObject *parent) +: QObject(parent), + _channelJoinedIcon(SmallIcon("irc-channel-active")), + _channelPartedIcon(SmallIcon("irc-channel-inactive")), + _userOfflineIcon(SmallIcon("im-user-offline")), + _userOnlineIcon(SmallIcon("im-user")), + _userAwayIcon(SmallIcon("im-user-away")), + _categoryOpIcon(SmallIcon("irc-operator")), + _categoryVoiceIcon(SmallIcon("irc-voice")), + _opIconLimit(UserCategoryItem::categoryFromModes("o")), + _voiceIconLimit(UserCategoryItem::categoryFromModes("v")) +{ // register FormatList if that hasn't happened yet // FIXME I don't think this actually avoids double registration... then again... does it hurt? if(QVariant::nameToType("UiStyle::FormatList") == QVariant::Invalid) { @@ -54,6 +67,11 @@ UiStyle::UiStyle(QObject *parent) : QObject(parent) { setTimestampFormatString("[hh:mm:ss]"); + // BufferView / NickView settings + BufferSettings bufferSettings; + _showBufferViewIcons = _showNickViewIcons = bufferSettings.showUserStateIcons(); + bufferSettings.notify("ShowUserStateIcons", this, SLOT(showUserStateIconsChanged())); + loadStyleSheet(); } @@ -89,8 +107,9 @@ void UiStyle::loadStyleSheet() { foreach(quint64 fmtType, parser.formats().keys()) { QTextCharFormat fmt = baseFmt; fmt.merge(parser.formats().value(fmtType)); - _formatCache[fmtType] = fmt; + _formats[fmtType] = fmt; } + _listItemFormats = parser.listItemFormats(); qApp->setStyleSheet(styleSheet); // pass the remaining sections to the application } @@ -126,14 +145,146 @@ void UiStyle::setTimestampFormatString(const QString &format) { } } +/******** ItemView Styling *******/ + +void UiStyle::showUserStateIconsChanged() { + BufferSettings bufferSettings; + _showBufferViewIcons = _showNickViewIcons = bufferSettings.showUserStateIcons(); +} + +QVariant UiStyle::bufferViewItemData(const QModelIndex &index, int role) const { + BufferInfo::Type type = (BufferInfo::Type)index.data(NetworkModel::BufferTypeRole).toInt(); + bool isActive = index.data(NetworkModel::ItemActiveRole).toBool(); + + if(role == Qt::DecorationRole) { + if(!_showBufferViewIcons) + return QVariant(); + + switch(type) { + case BufferInfo::ChannelBuffer: + if(isActive) + return _channelJoinedIcon; + else + return _channelPartedIcon; + case BufferInfo::QueryBuffer: + if(!isActive) + return _userOfflineIcon; + if(index.data(NetworkModel::UserAwayRole).toBool()) + return _userAwayIcon; + else + return _userOnlineIcon; + default: + return QVariant(); + } + } + + quint32 fmtType = BufferViewItem; + switch(type) { + case BufferInfo::StatusBuffer: + fmtType |= NetworkItem; + break; + case BufferInfo::ChannelBuffer: + fmtType |= ChannelBufferItem; + break; + case BufferInfo::QueryBuffer: + fmtType |= QueryBufferItem; + break; + default: + return QVariant(); + } + + QTextCharFormat fmt = _listItemFormats.value(BufferViewItem); + fmt.merge(_listItemFormats.value(fmtType)); + + BufferInfo::ActivityLevel activity = (BufferInfo::ActivityLevel)index.data(NetworkModel::BufferActivityRole).toInt(); + if(activity & BufferInfo::Highlight) { + fmt.merge(_listItemFormats.value(BufferViewItem | HighlightedBuffer)); + fmt.merge(_listItemFormats.value(fmtType | HighlightedBuffer)); + } else if(activity & BufferInfo::NewMessage) { + fmt.merge(_listItemFormats.value(BufferViewItem | UnreadBuffer)); + fmt.merge(_listItemFormats.value(fmtType | UnreadBuffer)); + } else if(activity & BufferInfo::OtherActivity) { + fmt.merge(_listItemFormats.value(BufferViewItem | ActiveBuffer)); + fmt.merge(_listItemFormats.value(fmtType | ActiveBuffer)); + } else if(!isActive) { + fmt.merge(_listItemFormats.value(BufferViewItem | InactiveBuffer)); + fmt.merge(_listItemFormats.value(fmtType | InactiveBuffer)); + } else if(index.data(NetworkModel::UserAwayRole).toBool()) { + fmt.merge(_listItemFormats.value(BufferViewItem | UserAway)); + fmt.merge(_listItemFormats.value(fmtType | UserAway)); + } + + return itemData(role, fmt); +} + +QVariant UiStyle::nickViewItemData(const QModelIndex &index, int role) const { + NetworkModel::ItemType type = (NetworkModel::ItemType)index.data(NetworkModel::ItemTypeRole).toInt(); + + if(role == Qt::DecorationRole) { + if(!_showNickViewIcons) + return QVariant(); + + switch(type) { + case NetworkModel::UserCategoryItemType: + { + int categoryId = index.data(TreeModel::SortRole).toInt(); + if(categoryId <= _opIconLimit) + return _categoryOpIcon; + if(categoryId <= _voiceIconLimit) + return _categoryVoiceIcon; + return _userOnlineIcon; + } + case NetworkModel::IrcUserItemType: + if(index.data(NetworkModel::ItemActiveRole).toBool()) + return _userOnlineIcon; + else + return _userAwayIcon; + default: + return QVariant(); + } + } + + QTextCharFormat fmt = _listItemFormats.value(NickViewItem); + + switch(type) { + case NetworkModel::IrcUserItemType: + fmt.merge(_listItemFormats.value(NickViewItem | IrcUserItem)); + if(!index.data(NetworkModel::ItemActiveRole).toBool()) { + fmt.merge(_listItemFormats.value(NickViewItem | UserAway)); + fmt.merge(_listItemFormats.value(NickViewItem | IrcUserItem | UserAway)); + } + break; + case NetworkModel::UserCategoryItemType: + fmt.merge(_listItemFormats.value(NickViewItem | UserCategoryItem)); + break; + default: + return QVariant(); + } + + return itemData(role, fmt); +} + +QVariant UiStyle::itemData(int role, const QTextCharFormat &format) const { + switch(role) { + case Qt::FontRole: + return format.font(); + case Qt::ForegroundRole: + return format.property(QTextFormat::ForegroundBrush); + case Qt::BackgroundRole: + return format.property(QTextFormat::BackgroundBrush); + default: + return QVariant(); + } +} + /******** Caching *******/ -QTextCharFormat UiStyle::cachedFormat(quint64 key) const { - return _formatCache.value(key, QTextCharFormat()); +QTextCharFormat UiStyle::format(quint64 key) const { + return _formats.value(key, QTextCharFormat()); } QTextCharFormat UiStyle::cachedFormat(quint32 formatType, quint32 messageLabel) const { - return cachedFormat(formatType | ((quint64)messageLabel << 32)); + return _formatCache.value(formatType | ((quint64)messageLabel << 32), QTextCharFormat()); } void UiStyle::setCachedFormat(const QTextCharFormat &format, quint32 formatType, quint32 messageLabel) { @@ -161,7 +312,7 @@ QTextCharFormat UiStyle::format(quint32 ftype, quint32 label_) { quint64 label = (quint64)label_ << 32; // check if we have exactly this format readily cached already - QTextCharFormat fmt = cachedFormat(label|ftype); + QTextCharFormat fmt = cachedFormat(ftype, label_); if(fmt.properties().count()) return fmt; @@ -181,7 +332,7 @@ void UiStyle::mergeFormat(QTextCharFormat &fmt, quint32 ftype, quint64 label) { // TODO: allow combinations for mirc formats and colors (each), e.g. setting a special format for "bold and italic" // or "foreground 01 and background 03" - if((ftype & 0xfff0)) { // element format + if((ftype & 0xfff00)) { // element format for(quint32 mask = 0x00100; mask <= 0x40000; mask <<= 1) { if(ftype & mask) { mergeSubElementFormat(fmt, mask | 0xff, label); @@ -206,10 +357,10 @@ void UiStyle::mergeFormat(QTextCharFormat &fmt, quint32 ftype, quint64 label) { // Merge a subelement format into an existing message format void UiStyle::mergeSubElementFormat(QTextCharFormat& fmt, quint32 ftype, quint64 label) { quint64 key = ftype | label; - fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffffffffff00))); // label + subelement - fmt.merge(cachedFormat(key & Q_UINT64_C(0x0000ffffffffffff))); // label + subelement + msgtype - fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffffffffff00))); // label + subelement + nickhash - fmt.merge(cachedFormat(key & Q_UINT64_C(0xffffffffffffffff))); // label + subelement + nickhash + msgtype + fmt.merge(format(key & Q_UINT64_C(0x0000ffffffffff00))); // label + subelement + fmt.merge(format(key & Q_UINT64_C(0x0000ffffffffffff))); // label + subelement + msgtype + fmt.merge(format(key & Q_UINT64_C(0xffffffffffffff00))); // label + subelement + nickhash + fmt.merge(format(key & Q_UINT64_C(0xffffffffffffffff))); // label + subelement + nickhash + msgtype } UiStyle::FormatType UiStyle::formatType(Message::Type msgType) {