X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fnetworkmodelactionprovider.cpp;h=8d72131bad65b553ee15f8b70b63d37c47fbc5dd;hp=31117f4eff54e8d4c86110c45ad4b54d206b9ffc;hb=ff87e964d7bd93f7a851d570c27b97943578a734;hpb=6eebebc97f84a94f732b05a793ea8e4c000643ab diff --git a/src/uisupport/networkmodelactionprovider.cpp b/src/uisupport/networkmodelactionprovider.cpp index 31117f4e..8d72131b 100644 --- a/src/uisupport/networkmodelactionprovider.cpp +++ b/src/uisupport/networkmodelactionprovider.cpp @@ -27,8 +27,9 @@ #include "buffermodel.h" #include "buffersettings.h" #include "iconloader.h" -#include "identity.h" +#include "clientidentity.h" #include "network.h" +#include "util.h" NetworkModelActionProvider::NetworkModelActionProvider(QObject *parent) : AbstractActionProvider(parent), @@ -41,7 +42,7 @@ NetworkModelActionProvider::NetworkModelActionProvider(QObject *parent) registerAction(BufferJoin, tr("Join")); registerAction(BufferPart, tr("Part")); - registerAction(BufferRemove, tr("Delete Buffer...")); + registerAction(BufferRemove, tr("Delete Buffer(s)...")); registerAction(BufferSwitchTo, tr("Show Buffer")); registerAction(HideJoin, tr("Joins"), true); @@ -219,6 +220,24 @@ void NetworkModelActionProvider::addActions(QMenu *menu, // TODO: actions for merged buffers... _indexList contains the index of the message we clicked on } + } else { + // context item = chan or nick, _indexList = buf where the msg clicked on originated + if(isChannelName(_contextItem)) { + QModelIndex msgIdx = _indexList.at(0); + if(!msgIdx.isValid()) + return; + NetworkId networkId = msgIdx.data(NetworkModel::NetworkIdRole).value(); + BufferId bufId = Client::networkModel()->bufferId(networkId, _contextItem); + if(bufId.isValid()) { + QModelIndex targetIdx = Client::networkModel()->bufferIndex(bufId); + _indexList = QList() << targetIdx; + addAction(BufferJoin, menu, targetIdx, InactiveState); + addAction(BufferSwitchTo, menu, targetIdx, ActiveState); + } else + addAction(JoinChannel, menu); + } else { + // TODO: actions for a nick + } } } } @@ -252,7 +271,7 @@ void NetworkModelActionProvider::addBufferItemActions(QMenu *menu, const QModelI menu->addSeparator(); addAction(HideBufferTemporarily, menu, isCustomBufferView); addAction(HideBufferPermanently, menu, isCustomBufferView); - addAction(BufferRemove, menu, index); + addAction(BufferRemove, menu, index, InactiveState); break; case BufferInfo::QueryBuffer: @@ -284,12 +303,12 @@ void NetworkModelActionProvider::addIrcUserActions(QMenu *menu, const QModelInde if(_contextItem.isNull()) { // cases a, b, c - bool haveQuery = findQueryBuffer(index).isValid(); + bool haveQuery = _indexList.count() == 1 && findQueryBuffer(index).isValid(); NetworkModel::ItemType itemType = static_cast(index.data(NetworkModel::ItemTypeRole).toInt()); addAction(_nickModeMenuAction, menu, itemType == NetworkModel::IrcUserItemType); addAction(_nickCtcpMenuAction, menu); menu->addSeparator(); - addAction(NickQuery, menu, itemType == NetworkModel::IrcUserItemType && !haveQuery); + addAction(NickQuery, menu, itemType == NetworkModel::IrcUserItemType && !haveQuery && _indexList.count() == 1); addAction(NickSwitchTo, menu, itemType == NetworkModel::IrcUserItemType && haveQuery); menu->addSeparator(); addAction(NickWhois, menu, true); @@ -366,12 +385,14 @@ QString NetworkModelActionProvider::nickName(const QModelIndex &index) const { BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); if(!bufferInfo.isValid()) return QString(); + if(!bufferInfo.type() == BufferInfo::QueryBuffer) + return QString(); return bufferInfo.bufferName(); // FIXME this might break with merged queries maybe } BufferId NetworkModelActionProvider::findQueryBuffer(const QModelIndex &index, const QString &predefinedNick) const { - NetworkId networkId = _indexList.at(0).data(NetworkModel::NetworkIdRole).value(); + NetworkId networkId = index.data(NetworkModel::NetworkIdRole).value(); if(!networkId.isValid()) return BufferId(); @@ -440,37 +461,58 @@ void NetworkModelActionProvider::handleNetworkAction(ActionType type, QAction *) } void NetworkModelActionProvider::handleBufferAction(ActionType type, QAction *) { - foreach(QModelIndex index, _indexList) { - BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); - if(!bufferInfo.isValid()) - continue; + if(type == BufferRemove) { + removeBuffers(_indexList); + } else { - switch(type) { - case BufferJoin: - Client::userInput(bufferInfo, QString("/JOIN %1").arg(bufferInfo.bufferName())); - break; - case BufferPart: - { - QString reason = Client::identity(Client::network(bufferInfo.networkId())->identity())->partReason(); - Client::userInput(bufferInfo, QString("/PART %1").arg(reason)); - break; - } - case BufferSwitchTo: - Client::bufferModel()->switchToBuffer(bufferInfo.bufferId()); - break; - case BufferRemove: - { - int res = QMessageBox::question(0, tr("Remove buffer permanently?"), - tr("Do you want to delete the buffer \"%1\" permanently? This will delete all related data, including all backlog " - "data, from the core's database!").arg(bufferInfo.bufferName()), - QMessageBox::Yes|QMessageBox::No, QMessageBox::No); - if(res == QMessageBox::Yes) { - Client::removeBuffer(bufferInfo.bufferId()); + foreach(QModelIndex index, _indexList) { + BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); + if(!bufferInfo.isValid()) + continue; + + switch(type) { + case BufferJoin: + Client::userInput(bufferInfo, QString("/JOIN %1").arg(bufferInfo.bufferName())); + break; + case BufferPart: + { + QString reason = Client::identity(Client::network(bufferInfo.networkId())->identity())->partReason(); + Client::userInput(bufferInfo, QString("/PART %1").arg(reason)); + break; } - break; + case BufferSwitchTo: + Client::bufferModel()->switchToBuffer(bufferInfo.bufferId()); + break; + default: + break; } - default: - break; + } + } +} + +void NetworkModelActionProvider::removeBuffers(const QModelIndexList &indexList) { + QList inactive; + foreach(QModelIndex index, indexList) { + if(!index.data(NetworkModel::ItemActiveRole).toBool()) { + BufferInfo info = index.data(NetworkModel::BufferInfoRole).value(); + if(info.isValid()) + inactive << info; + } + } + QString msg; + if(inactive.count()) { + msg = tr("Do you want to delete the following buffer(s) permanently?", 0, inactive.count()); + msg += "
    "; + foreach(BufferInfo info, inactive) + msg += QString("
  • %1
  • ").arg(info.bufferName()); + msg += "
"; + msg += tr("Note: This will delete all related data, including all backlog data, from the core's database and cannot be undone."); + if(inactive.count() != indexList.count()) + msg += tr("
Active channel buffers cannot be deleted, please part the channel first."); + + if(QMessageBox::question(0, tr("Remove buffers permanently?"), msg, QMessageBox::Yes|QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { + foreach(BufferInfo info, inactive) + Client::removeBuffer(info.bufferId()); } } } @@ -520,17 +562,17 @@ void NetworkModelActionProvider::handleGeneralAction(ActionType type, QAction *a return; switch(type) { - case JoinChannel: - { - // FIXME no QInputDialog in Qtopia -# ifndef Q_WS_QWS - bool ok; - QString channelName = QInputDialog::getText(0, tr("Join Channel"), tr("Input channel name:"), QLineEdit::Normal, QString(), &ok); - if(ok && !channelName.isEmpty()) { - Client::instance()->userInput(BufferInfo::fakeStatusBuffer(networkId), - QString("/JOIN %1").arg(channelName)); + case JoinChannel: { + QString channelName = _contextItem; + if(channelName.isEmpty()) { + bool ok; + channelName = QInputDialog::getText(0, tr("Join Channel"), tr("Input channel name:"), QLineEdit::Normal, QString(), &ok); + if(!ok) + return; + } + if(!channelName.isEmpty()) { + Client::instance()->userInput(BufferInfo::fakeStatusBuffer(networkId), QString("/JOIN %1").arg(channelName)); } -# endif break; } case ShowChannelList: @@ -545,63 +587,63 @@ void NetworkModelActionProvider::handleGeneralAction(ActionType type, QAction *a } void NetworkModelActionProvider::handleNickAction(ActionType type, QAction *) { - if(!_indexList.count()) - return; - NetworkId networkId = _indexList.at(0).data(NetworkModel::NetworkIdRole).value(); - if(!networkId.isValid()) - return; - QString nick = nickName(_indexList.at(0)); - if(nick.isEmpty()) - return; - BufferInfo bufferInfo = _indexList.at(0).data(NetworkModel::BufferInfoRole).value(); - if(!bufferInfo.isValid()) - return; + foreach(QModelIndex index, _indexList) { + NetworkId networkId = index.data(NetworkModel::NetworkIdRole).value(); + if(!networkId.isValid()) + continue; + QString nick = nickName(index); + if(nick.isEmpty()) + continue; + BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); + if(!bufferInfo.isValid()) + continue; - switch(type) { - case NickWhois: - Client::userInput(bufferInfo, QString("/WHOIS %1 %1").arg(nick)); - break; - case NickCtcpVersion: - Client::userInput(bufferInfo, QString("/CTCP %1 VERSION").arg(nick)); - break; - case NickCtcpPing: - Client::userInput(bufferInfo, QString("/CTCP %1 PING").arg(nick)); - break; - case NickCtcpTime: - Client::userInput(bufferInfo, QString("/CTCP %1 TIME").arg(nick)); - break; - case NickCtcpFinger: - Client::userInput(bufferInfo, QString("/CTCP %1 FINGER").arg(nick)); - break; - case NickOp: - Client::userInput(bufferInfo, QString("/OP %1").arg(nick)); - break; - case NickDeop: - Client::userInput(bufferInfo, QString("/DEOP %1").arg(nick)); - break; - case NickVoice: - Client::userInput(bufferInfo, QString("/VOICE %1").arg(nick)); - break; - case NickDevoice: - Client::userInput(bufferInfo, QString("/DEVOICE %1").arg(nick)); - break; - case NickKick: - Client::userInput(bufferInfo, QString("/KICK %1").arg(nick)); - break; - case NickBan: - Client::userInput(bufferInfo, QString("/BAN %1").arg(nick)); - break; - case NickKickBan: - Client::userInput(bufferInfo, QString("/BAN %1").arg(nick)); - Client::userInput(bufferInfo, QString("/KICK %1").arg(nick)); - break; - case NickSwitchTo: - Client::bufferModel()->switchToBuffer(findQueryBuffer(networkId, nick)); - break; - case NickQuery: - Client::userInput(bufferInfo, QString("/QUERY %1").arg(nick)); - break; - default: - qWarning() << "Unhandled nick action"; + switch(type) { + case NickWhois: + Client::userInput(bufferInfo, QString("/WHOIS %1 %1").arg(nick)); + break; + case NickCtcpVersion: + Client::userInput(bufferInfo, QString("/CTCP %1 VERSION").arg(nick)); + break; + case NickCtcpPing: + Client::userInput(bufferInfo, QString("/CTCP %1 PING").arg(nick)); + break; + case NickCtcpTime: + Client::userInput(bufferInfo, QString("/CTCP %1 TIME").arg(nick)); + break; + case NickCtcpFinger: + Client::userInput(bufferInfo, QString("/CTCP %1 FINGER").arg(nick)); + break; + case NickOp: + Client::userInput(bufferInfo, QString("/OP %1").arg(nick)); + break; + case NickDeop: + Client::userInput(bufferInfo, QString("/DEOP %1").arg(nick)); + break; + case NickVoice: + Client::userInput(bufferInfo, QString("/VOICE %1").arg(nick)); + break; + case NickDevoice: + Client::userInput(bufferInfo, QString("/DEVOICE %1").arg(nick)); + break; + case NickKick: + Client::userInput(bufferInfo, QString("/KICK %1").arg(nick)); + break; + case NickBan: + Client::userInput(bufferInfo, QString("/BAN %1").arg(nick)); + break; + case NickKickBan: + Client::userInput(bufferInfo, QString("/BAN %1").arg(nick)); + Client::userInput(bufferInfo, QString("/KICK %1").arg(nick)); + break; + case NickSwitchTo: + Client::bufferModel()->switchToBuffer(findQueryBuffer(networkId, nick)); + break; + case NickQuery: + Client::userInput(bufferInfo, QString("/QUERY %1").arg(nick)); + break; + default: + qWarning() << "Unhandled nick action"; + } } }