X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferviewfilter.cpp;h=12109ba4be1fbad4ff606bdd40a5c9456532b7eb;hp=5b58ee5618709f80731053724e00ca481da40547;hb=617a3966941742a4e235af440d3665d0274354a8;hpb=bbff8b7b37e35f61279b1e8b06a97969fe87f2a6 diff --git a/src/uisupport/bufferviewfilter.cpp b/src/uisupport/bufferviewfilter.cpp index 5b58ee56..12109ba4 100644 --- a/src/uisupport/bufferviewfilter.cpp +++ b/src/uisupport/bufferviewfilter.cpp @@ -29,8 +29,10 @@ #include "buffersettings.h" #include "client.h" #include "clientbufferviewconfig.h" +#include "graphicalui.h" #include "iconloader.h" #include "networkmodel.h" +#include "uistyle.h" class CheckRemovalEvent : public QEvent { public: @@ -44,86 +46,85 @@ public: BufferViewFilter::BufferViewFilter(QAbstractItemModel *model, BufferViewConfig *config) : QSortFilterProxyModel(model), _config(0), + _tmpConfig(0), _sortOrder(Qt::AscendingOrder), - _channelJoinedIcon(SmallIcon("irc-channel-active")), - _channelPartedIcon(SmallIcon("irc-channel-inactive")), - _userOfflineIcon(SmallIcon("im-user-offline")), - _userAwayIcon(SmallIcon("im-user-away")), - _userOnlineIcon(SmallIcon("im-user")), + _showServerQueries(false), _editMode(false), - _enableEditMode(tr("Show / Hide buffers"), this) + _enableEditMode(tr("Show / Hide Chats"), this) { setConfig(config); setSourceModel(model); setDynamicSortFilter(true); - connect(this, SIGNAL(_dataChanged(const QModelIndex &, const QModelIndex &)), - this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex))); + connect(this, SIGNAL(_dataChanged(QModelIndex,QModelIndex)), + this, SLOT(_q_sourceDataChanged(QModelIndex,QModelIndex))); _enableEditMode.setCheckable(true); _enableEditMode.setChecked(_editMode); connect(&_enableEditMode, SIGNAL(toggled(bool)), this, SLOT(enableEditMode(bool))); - BufferSettings bufferSettings; - _showUserStateIcons = bufferSettings.showUserStateIcons(); - bufferSettings.notify("ShowUserStateIcons", this, SLOT(showUserStateIconsChanged())); -} - -void BufferViewFilter::showUserStateIconsChanged() { - BufferSettings bufferSettings; - _showUserStateIcons = bufferSettings.showUserStateIcons(); + BufferSettings defaultSettings; + defaultSettings.notify("ServerNoticesTarget", this, SLOT(showServerQueriesChanged())); + showServerQueriesChanged(); } void BufferViewFilter::setConfig(BufferViewConfig *config) { if(_config == config) return; - if(_config) { - disconnect(_config, 0, this, 0); - } +#if QT_VERSION >= 0x040600 + beginResetModel(); +#endif - _config = config; + _tmpConfig = config; // don't invalidate the old config before we're initialized - if(!config) { - invalidate(); - setObjectName(""); - return; - } - - if(config->isInitialized()) { + if(!config || config->isInitialized()) { configInitialized(); } else { - connect(config, SIGNAL(initDone()), this, SLOT(configInitialized())); - invalidate(); + // we use a queued connection here since manipulating the connection list of a sending object + // doesn't seem to be such a good idea while executing a connected slots. + connect(config, SIGNAL(initDone()), this, SLOT(configInitialized()), Qt::QueuedConnection); + //invalidate(); // not needed as we still have the old config and will reset once init is done } } void BufferViewFilter::configInitialized() { - if(!config()) - return; - - connect(config(), SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(invalidate())); - connect(config(), SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(invalidate())); - connect(config(), SIGNAL(addNewBuffersAutomaticallySet(bool)), this, SLOT(invalidate())); - connect(config(), SIGNAL(sortAlphabeticallySet(bool)), this, SLOT(invalidate())); - connect(config(), SIGNAL(hideInactiveBuffersSet(bool)), this, SLOT(invalidate())); - connect(config(), SIGNAL(allowedBufferTypesSet(int)), this, SLOT(invalidate())); - connect(config(), SIGNAL(minimumActivitySet(int)), this, SLOT(invalidate())); - connect(config(), SIGNAL(bufferListSet()), this, SLOT(invalidate())); - connect(config(), SIGNAL(bufferAdded(const BufferId &, int)), this, SLOT(invalidate())); - connect(config(), SIGNAL(bufferMoved(const BufferId &, int)), this, SLOT(invalidate())); - connect(config(), SIGNAL(bufferRemoved(const BufferId &)), this, SLOT(invalidate())); - connect(config(), SIGNAL(bufferPermanentlyRemoved(const BufferId &)), this, SLOT(invalidate())); + if(_config) { + disconnect(_config, 0, this, 0); + } - disconnect(config(), SIGNAL(initDone()), this, SLOT(configInitialized())); + _config = _tmpConfig; + _tmpConfig = 0; - setObjectName(config()->bufferViewName()); + if(config()) { + connect(config(), SIGNAL(configChanged()), this, SLOT(invalidate())); + disconnect(config(), SIGNAL(initDone()), this, SLOT(configInitialized())); + setObjectName(config()->bufferViewName()); + } else { + setObjectName(""); + } - invalidate(); + // not resetting the model can trigger bug #663 for some reason I haven't understood yet + // we get invalid model indexes in attached views even if no source model has been set yet... wtf? +#if QT_VERSION >= 0x040600 + endResetModel(); +#else + reset(); +#endif emit configChanged(); } +void BufferViewFilter::showServerQueriesChanged() { + BufferSettings bufferSettings; + + bool showQueries = (bufferSettings.serverNoticesTarget() & BufferSettings::DefaultBuffer); + if(_showServerQueries != showQueries) { + _showServerQueries = showQueries; + invalidate(); + } +} + QList BufferViewFilter::actions(const QModelIndex &index) { Q_UNUSED(index) QList actionList; @@ -145,12 +146,12 @@ void BufferViewFilter::enableEditMode(bool enable) { QSet::const_iterator iter; for(iter = _toTempRemove.constBegin(); iter != _toTempRemove.constEnd(); iter++) { if(config()->temporarilyRemovedBuffers().contains(*iter)) - continue; + continue; config()->requestRemoveBuffer(*iter); } for(iter = _toRemove.constBegin(); iter != _toRemove.constEnd(); iter++) { if(config()->removedBuffers().contains(*iter)) - continue; + continue; config()->requestRemoveBufferPermanently(*iter); } } @@ -179,7 +180,7 @@ Qt::ItemFlags BufferViewFilter::flags(const QModelIndex &index) const { if(bufferType != BufferInfo::QueryBuffer) { ClientBufferViewConfig *clientConf = qobject_cast(config()); if(clientConf && clientConf->isLocked()) { - flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled); + flags &= ~(Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled); } } } @@ -204,29 +205,29 @@ bool BufferViewFilter::dropMimeData(const QMimeData *data, Qt::DropAction action bufferId = bufferList[i].second; if(droppedNetworkId == networkId) { if(row < 0) - row = 0; + row = 0; if(row < rowCount(parent)) { - QModelIndex source_child = mapToSource(index(row, 0, parent)); - BufferId beforeBufferId = sourceModel()->data(source_child, NetworkModel::BufferIdRole).value(); - pos = config()->bufferList().indexOf(beforeBufferId); - if(_sortOrder == Qt::DescendingOrder) - pos++; + QModelIndex source_child = mapToSource(index(row, 0, parent)); + BufferId beforeBufferId = sourceModel()->data(source_child, NetworkModel::BufferIdRole).value(); + pos = config()->bufferList().indexOf(beforeBufferId); + if(_sortOrder == Qt::DescendingOrder) + pos++; } else { - if(_sortOrder == Qt::AscendingOrder) - pos = config()->bufferList().count(); - else - pos = 0; + if(_sortOrder == Qt::AscendingOrder) + pos = config()->bufferList().count(); + else + pos = 0; } if(config()->bufferList().contains(bufferId) && !config()->sortAlphabetically()) { - if(config()->bufferList().indexOf(bufferId) < pos) - pos--; - ClientBufferViewConfig *clientConf = qobject_cast(config()); - if(!clientConf || !clientConf->isLocked()) - config()->requestMoveBuffer(bufferId, pos); + if(config()->bufferList().indexOf(bufferId) < pos) + pos--; + ClientBufferViewConfig *clientConf = qobject_cast(config()); + if(!clientConf || !clientConf->isLocked()) + config()->requestMoveBuffer(bufferId, pos); } else { - config()->requestAddBuffer(bufferId, pos); + config()->requestAddBuffer(bufferId, pos); } } else { @@ -274,14 +275,14 @@ void BufferViewFilter::addBuffers(const QList &bufferIds) const { bool lt; for(int i = 0; i < bufferList.count(); i++) { if(config() && config()->sortAlphabetically()) - lt = bufferIdLessThan(bufferId, bufferList[i]); + lt = bufferIdLessThan(bufferId, bufferList[i]); else - lt = bufferId < config()->bufferList()[i]; + lt = bufferId < config()->bufferList()[i]; if(lt) { - pos = i; - bufferList.insert(pos, bufferId); - break; + pos = i; + bufferList.insert(pos, bufferId); + break; } } config()->requestAddBuffer(bufferId, pos); @@ -303,7 +304,7 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) if(config()->isInitialized() && !config()->removedBuffers().contains(bufferId) // it hasn't been manually removed and either && ((config()->addNewBuffersAutomatically() && !config()->temporarilyRemovedBuffers().contains(bufferId)) // is totally unknown to us (a new buffer)... - || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > BufferInfo::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us. + || (config()->temporarilyRemovedBuffers().contains(bufferId) && activityLevel > BufferInfo::OtherActivity))) { // or was just temporarily hidden and has a new message waiting for us. addBuffer(bufferId); } // note: adding the buffer to the valid list does not temper with the following filters ("show only channels" and stuff) @@ -316,8 +317,13 @@ bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) int allowedBufferTypes = config()->allowedBufferTypes(); if(!config()->networkId().isValid()) allowedBufferTypes &= ~BufferInfo::StatusBuffer; - if(!(allowedBufferTypes & sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt())) + int bufferType = sourceModel()->data(source_bufferIndex, NetworkModel::BufferTypeRole).toInt(); + if(!(allowedBufferTypes & bufferType)) + return false; + + if(bufferType & BufferInfo::QueryBuffer && !_showServerQueries && sourceModel()->data(source_bufferIndex, Qt::DisplayRole).toString().contains('.')) { return false; + } // the following dynamic filters may not trigger if the buffer is currently selected. QModelIndex currentIndex = Client::bufferModel()->standardSelectionModel()->currentIndex(); @@ -401,8 +407,13 @@ bool BufferViewFilter::networkLessThan(const QModelIndex &source_left, const QMo QVariant BufferViewFilter::data(const QModelIndex &index, int role) const { switch(role) { + case Qt::FontRole: + case Qt::ForegroundRole: + case Qt::BackgroundRole: case Qt::DecorationRole: - return icon(index); + if((config() && config()->disableDecoration())) + return QVariant(); + return GraphicalUi::uiStyle()->bufferViewItemData(mapToSource(index), role); case Qt::CheckStateRole: return checkedState(index); default: @@ -410,39 +421,6 @@ QVariant BufferViewFilter::data(const QModelIndex &index, int role) const { } } -QVariant BufferViewFilter::icon(const QModelIndex &index) const { - if(!_showUserStateIcons || (config() && config()->disableDecoration())) - return QVariant(); - - if(index.column() != 0) - return QVariant(); - - QModelIndex source_index = mapToSource(index); - NetworkModel::ItemType itemType = (NetworkModel::ItemType)sourceModel()->data(source_index, NetworkModel::ItemTypeRole).toInt(); - BufferInfo::Type bufferType = (BufferInfo::Type)sourceModel()->data(source_index, NetworkModel::BufferTypeRole).toInt(); - bool isActive = sourceModel()->data(source_index, NetworkModel::ItemActiveRole).toBool(); - - if(itemType != NetworkModel::BufferItemType) - return QVariant(); - - switch(bufferType) { - case BufferInfo::ChannelBuffer: - if(isActive) - return _channelJoinedIcon; - else - return _channelPartedIcon; - case BufferInfo::QueryBuffer: - if(!isActive) - return _userOfflineIcon; - if(sourceModel()->data(source_index, NetworkModel::UserAwayRole).toBool()) - return _userAwayIcon; - else - return _userOnlineIcon; - default: - return QVariant(); - } -} - QVariant BufferViewFilter::checkedState(const QModelIndex &index) const { if(!_editMode || !config()) return QVariant(); @@ -547,3 +525,4 @@ bool BufferViewFilter::bufferIdLessThan(const BufferId &left, const BufferId &ri return QString::compare(Client::networkModel()->data(leftIndex, Qt::DisplayRole).toString(), Client::networkModel()->data(rightIndex, Qt::DisplayRole).toString(), Qt::CaseInsensitive) < 0; } +