X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fnetworkmodelactionprovider.cpp;h=9c817bfa3967e56b9d7e2bc1c9aef0edb5b05d6f;hp=31117f4eff54e8d4c86110c45ad4b54d206b9ffc;hb=e32fd68ac69cada52a65598d4781f1cc735145fc;hpb=6eebebc97f84a94f732b05a793ea8e4c000643ab diff --git a/src/uisupport/networkmodelactionprovider.cpp b/src/uisupport/networkmodelactionprovider.cpp index 31117f4e..9c817bfa 100644 --- a/src/uisupport/networkmodelactionprovider.cpp +++ b/src/uisupport/networkmodelactionprovider.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -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); @@ -50,7 +51,8 @@ NetworkModelActionProvider::NetworkModelActionProvider(QObject *parent) registerAction(HideNick, tr("Nick Changes"), true); registerAction(HideMode, tr("Mode Changes"), true); registerAction(HideDayChange, tr("Day Changes"), true); - registerAction(HideApplyToAll, tr("Apply to All Chat Views...")); + registerAction(HideApplyToAll, tr("Set as Default...")); + registerAction(HideUseDefaults, tr("Use Defaults...")); registerAction(JoinChannel, tr("Join Channel...")); @@ -78,8 +80,6 @@ NetworkModelActionProvider::NetworkModelActionProvider(QObject *parent) connect(_actionCollection, SIGNAL(actionTriggered(QAction *)), SLOT(actionTriggered(QAction *))); - action(HideApplyToAll)->setDisabled(true); - QMenu *hideEventsMenu = new QMenu(); hideEventsMenu->addAction(action(HideJoin)); hideEventsMenu->addAction(action(HidePart)); @@ -89,6 +89,7 @@ NetworkModelActionProvider::NetworkModelActionProvider(QObject *parent) hideEventsMenu->addAction(action(HideDayChange)); hideEventsMenu->addSeparator(); hideEventsMenu->addAction(action(HideApplyToAll)); + hideEventsMenu->addAction(action(HideUseDefaults)); _hideEventsMenuAction = new Action(tr("Hide Events"), 0); _hideEventsMenuAction->setMenu(hideEventsMenu); @@ -143,17 +144,13 @@ void NetworkModelActionProvider::registerAction(ActionType type, const QPixmap & void NetworkModelActionProvider::addActions(QMenu *menu, BufferId bufId, QObject *receiver, const char *method) { if(!bufId.isValid()) return; - _messageFilter = 0; - _contextItem = QString(); addActions(menu, Client::networkModel()->bufferIndex(bufId), receiver, method); } void NetworkModelActionProvider::addActions(QMenu *menu, const QModelIndex &index, QObject *receiver, const char *method, bool isCustomBufferView) { if(!index.isValid()) return; - _messageFilter = 0; - _contextItem = QString(); - addActions(menu, QList() << index, receiver, method, isCustomBufferView); + addActions(menu, QList() << index, 0, QString(), receiver, method, isCustomBufferView); } void NetworkModelActionProvider::addActions(QMenu *menu, MessageFilter *filter, BufferId msgBuffer, QObject *receiver, const char *slot) { @@ -163,14 +160,18 @@ void NetworkModelActionProvider::addActions(QMenu *menu, MessageFilter *filter, void NetworkModelActionProvider::addActions(QMenu *menu, MessageFilter *filter, BufferId msgBuffer, const QString &chanOrNick, QObject *receiver, const char *method) { if(!filter) return; - _messageFilter = filter; - _contextItem = chanOrNick; - addActions(menu, QList() << Client::networkModel()->bufferIndex(msgBuffer), receiver, method); + addActions(menu, QList() << Client::networkModel()->bufferIndex(msgBuffer), filter, chanOrNick, receiver, method, false); +} + +void NetworkModelActionProvider::addActions(QMenu *menu, const QList &indexList, QObject *receiver, const char *method, bool isCustomBufferView) { + addActions(menu, indexList, 0, QString(), receiver, method, isCustomBufferView); } // add a list of actions sensible for the current item(s) void NetworkModelActionProvider::addActions(QMenu *menu, const QList &indexList, + MessageFilter *filter, + const QString &contextItem, QObject *receiver, const char *method, bool isCustomBufferView) @@ -179,6 +180,8 @@ void NetworkModelActionProvider::addActions(QMenu *menu, return; _indexList = indexList; + _messageFilter = filter; + _contextItem = contextItem; _receiver = receiver; _method = method; @@ -219,6 +222,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 + } } } } @@ -243,6 +264,7 @@ void NetworkModelActionProvider::addNetworkItemActions(QMenu *menu, const QModel void NetworkModelActionProvider::addBufferItemActions(QMenu *menu, const QModelIndex &index, bool isCustomBufferView) { BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); + menu->addSeparator(); switch(bufferInfo.type()) { case BufferInfo::ChannelBuffer: addAction(BufferJoin, menu, index, InactiveState); @@ -252,7 +274,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 +306,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); @@ -340,14 +362,25 @@ Action * NetworkModelActionProvider::addAction(Action *action , QMenu *menu, boo } void NetworkModelActionProvider::addHideEventsMenu(QMenu *menu, BufferId bufferId) { - addHideEventsMenu(menu, BufferSettings(bufferId).messageFilter()); + if(BufferSettings(bufferId).hasFilter()) + addHideEventsMenu(menu, BufferSettings(bufferId).messageFilter()); + else + addHideEventsMenu(menu); } void NetworkModelActionProvider::addHideEventsMenu(QMenu *menu, MessageFilter *msgFilter) { - addHideEventsMenu(menu, BufferSettings(msgFilter->idString()).messageFilter()); + if(BufferSettings(msgFilter->idString()).hasFilter()) + addHideEventsMenu(menu, BufferSettings(msgFilter->idString()).messageFilter()); + else + addHideEventsMenu(menu); } void NetworkModelActionProvider::addHideEventsMenu(QMenu *menu, int filter) { + action(HideApplyToAll)->setEnabled(filter != -1); + action(HideUseDefaults)->setEnabled(filter != -1); + if(filter == -1) + filter = BufferSettings().messageFilter(); + action(HideJoin)->setChecked(filter & Message::Join); action(HidePart)->setChecked(filter & Message::Part); action(HideQuit)->setChecked(filter & Message::Quit); @@ -366,12 +399,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,76 +475,117 @@ 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::handleHideAction(ActionType type, QAction *action) { - Message::Type msgType; - switch(type) { - case HideJoin: - msgType = Message::Join; break; - case HidePart: - msgType = Message::Part; break; - case HideQuit: - msgType = Message::Quit; break; - case HideNick: - msgType = Message::Nick; break; - case HideMode: - msgType = Message::Mode; break; - case HideDayChange: - msgType = Message::DayChange; break; - case HideApplyToAll: - // TODO implement "apply to all" for hiding messages - return; - break; - default: - return; +void NetworkModelActionProvider::removeBuffers(const QModelIndexList &indexList) { + QList inactive; + foreach(QModelIndex index, indexList) { + BufferInfo info = index.data(NetworkModel::BufferInfoRole).value(); + if(info.isValid()) { + if(info.type() == BufferInfo::QueryBuffer + || (info.type() == BufferInfo::ChannelBuffer && !index.data(NetworkModel::ItemActiveRole).toBool())) + inactive << info; + } } - - if(_messageFilter) - BufferSettings(_messageFilter->idString()).filterMessage(msgType, action->isChecked()); - else { - foreach(QModelIndex index, _indexList) { - BufferId bufferId = index.data(NetworkModel::BufferIdRole).value(); - if(!bufferId.isValid()) - continue; - BufferSettings(bufferId).filterMessage(msgType, action->isChecked()); + 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()); } } } +void NetworkModelActionProvider::handleHideAction(ActionType type, QAction *action) { + Q_UNUSED(action) + + int filter = 0; + if(NetworkModelActionProvider::action(HideJoin)->isChecked()) + filter |= Message::Join; + if(NetworkModelActionProvider::action(HidePart)->isChecked()) + filter |= Message::Part; + if(NetworkModelActionProvider::action(HideQuit)->isChecked()) + filter |= Message::Quit; + if(NetworkModelActionProvider::action(HideNick)->isChecked()) + filter |= Message::Nick; + if(NetworkModelActionProvider::action(HideMode)->isChecked()) + filter |= Message::Mode; + if(NetworkModelActionProvider::action(HideDayChange)->isChecked()) + filter |= Message::DayChange; + + switch(type) { + case HideJoin: + case HidePart: + case HideQuit: + case HideNick: + case HideMode: + case HideDayChange: + if(_messageFilter) + BufferSettings(_messageFilter->idString()).setMessageFilter(filter); + else { + foreach(QModelIndex index, _indexList) { + BufferId bufferId = index.data(NetworkModel::BufferIdRole).value(); + if(!bufferId.isValid()) + continue; + BufferSettings(bufferId).setMessageFilter(filter); + } + } + return; + case HideApplyToAll: + BufferSettings().setMessageFilter(filter); + case HideUseDefaults: + if(_messageFilter) + BufferSettings(_messageFilter->idString()).removeFilter(); + else { + foreach(QModelIndex index, _indexList) { + BufferId bufferId = index.data(NetworkModel::BufferIdRole).value(); + if(!bufferId.isValid()) + continue; + BufferSettings(bufferId).removeFilter(); + } + } + return; + default: + return; + }; +} + void NetworkModelActionProvider::handleGeneralAction(ActionType type, QAction *action) { Q_UNUSED(action) @@ -520,17 +596,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 +621,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"; + } } }