X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fcontextmenuactionprovider.cpp;h=55932e3f274487fda08dde43c3e627464b748b70;hp=22147239aba911d82a7a78afcbb2923fd20e344e;hb=bfc818029e87656c7b7f322d04f6e168261a96f6;hpb=57058eabefe58082635c0ff83bbd4714baa5b6a9 diff --git a/src/uisupport/contextmenuactionprovider.cpp b/src/uisupport/contextmenuactionprovider.cpp index 22147239..55932e3f 100644 --- a/src/uisupport/contextmenuactionprovider.cpp +++ b/src/uisupport/contextmenuactionprovider.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include "contextmenuactionprovider.h" @@ -30,15 +31,17 @@ #include "clientidentity.h" #include "network.h" #include "util.h" +#include "client.h" +#include "clientignorelistmanager.h" ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkModelController(parent) { registerAction(NetworkConnect, SmallIcon("network-connect"), tr("Connect")); registerAction(NetworkDisconnect, SmallIcon("network-disconnect"), tr("Disconnect")); - registerAction(BufferJoin, tr("Join")); - registerAction(BufferPart, tr("Part")); - registerAction(BufferRemove, tr("Delete Buffer(s)...")); - registerAction(BufferSwitchTo, tr("Show Buffer")); + registerAction(BufferJoin, SmallIcon("irc-join-channel"), tr("Join")); + registerAction(BufferPart, SmallIcon("irc-close-channel"), tr("Part")); + registerAction(BufferRemove, tr("Delete Chat(s)...")); + registerAction(BufferSwitchTo, tr("Go to Chat")); registerAction(HideJoin, tr("Joins"), true); registerAction(HidePart, tr("Parts"), true); @@ -46,10 +49,11 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM registerAction(HideNick, tr("Nick Changes"), true); registerAction(HideMode, tr("Mode Changes"), true); registerAction(HideDayChange, tr("Day Changes"), true); + registerAction(HideTopic, tr("Topic Changes"), true); registerAction(HideApplyToAll, tr("Set as Default...")); registerAction(HideUseDefaults, tr("Use Defaults...")); - registerAction(JoinChannel, tr("Join Channel...")); + registerAction(JoinChannel, SmallIcon("irc-join-channel"), tr("Join Channel...")); registerAction(NickQuery, tr("Start Query")); registerAction(NickSwitchTo, tr("Show Query")); @@ -59,18 +63,29 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM registerAction(NickCtcpTime, tr("Time")); registerAction(NickCtcpPing, tr("Ping")); registerAction(NickCtcpFinger, tr("Finger")); - - registerAction(NickOp, tr("Give Operator Status")); - registerAction(NickDeop, tr("Take Operator Status")); - registerAction(NickVoice, tr("Give Voice")); - registerAction(NickDevoice, tr("Take Voice")); - registerAction(NickKick, tr("Kick From Channel")); - registerAction(NickBan, tr("Ban From Channel")); - registerAction(NickKickBan, tr("Kick && Ban")); - - registerAction(HideBufferTemporarily, tr("Hide Buffer(s) Temporarily")); - registerAction(HideBufferPermanently, tr("Hide Buffer(s) Permanently")); - registerAction(ShowChannelList, SmallIcon("format-list-unordered"), tr("Show Channel List")); + registerAction(NickIgnoreCustom, tr("Custom...")); + + // these texts are only dummies! don't think about tr() here! + registerAction(NickIgnoreUser, "*!ident@host.domain.tld"); + registerAction(NickIgnoreHost, "*!*@host.domain.tld"); + registerAction(NickIgnoreDomain, "*!ident@*.domain.tld"); + registerAction(NickIgnoreToggleEnabled0, "Enable", true); + registerAction(NickIgnoreToggleEnabled1, "Enable", true); + registerAction(NickIgnoreToggleEnabled2, "Enable", true); + registerAction(NickIgnoreToggleEnabled3, "Enable", true); + registerAction(NickIgnoreToggleEnabled4, "Enable", true); + + registerAction(NickOp, SmallIcon("irc-operator"), tr("Give Operator Status")); + registerAction(NickDeop, SmallIcon("irc-remove-operator"), tr("Take Operator Status")); + registerAction(NickVoice, SmallIcon("irc-voice"), tr("Give Voice")); + registerAction(NickDevoice, SmallIcon("irc-unvoice"), tr("Take Voice")); + registerAction(NickKick, SmallIcon("im-kick-user"), tr("Kick From Channel")); + registerAction(NickBan, SmallIcon("im-ban-user"), tr("Ban From Channel")); + registerAction(NickKickBan, SmallIcon("im-ban-kick-user"), tr("Kick && Ban")); + + registerAction(HideBufferTemporarily, tr("Hide Chat(s) Temporarily")); + registerAction(HideBufferPermanently, tr("Hide Chat(s) Permanently")); + registerAction(ShowChannelList, tr("Show Channel List")); registerAction(ShowIgnoreList, tr("Show Ignore List")); QMenu *hideEventsMenu = new QMenu(); @@ -79,6 +94,7 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM hideEventsMenu->addAction(action(HideQuit)); hideEventsMenu->addAction(action(HideNick)); hideEventsMenu->addAction(action(HideMode)); + hideEventsMenu->addAction(action(HideTopic)); hideEventsMenu->addAction(action(HideDayChange)); hideEventsMenu->addSeparator(); hideEventsMenu->addAction(action(HideApplyToAll)); @@ -105,6 +121,17 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM nickModeMenu->addAction(action(NickKickBan)); _nickModeMenuAction = new Action(tr("Actions"), 0); _nickModeMenuAction->setMenu(nickModeMenu); + + QMenu *ignoreMenu = new QMenu(); + _nickIgnoreMenuAction = new Action(tr("Ignore"), 0); + _nickIgnoreMenuAction->setMenu(ignoreMenu); + + // These are disabled actions used as descriptions + // They don't need any of the Action fancyness so we use plain QActions + _ignoreDescriptions << new QAction(tr("Add Ignore Rule"), this); + _ignoreDescriptions << new QAction(tr("Existing Rules"), this); + foreach(QAction *act, _ignoreDescriptions) + act->setEnabled(false); } ContextMenuActionProvider::~ContextMenuActionProvider() { @@ -114,6 +141,10 @@ ContextMenuActionProvider::~ContextMenuActionProvider() { _nickCtcpMenuAction->deleteLater(); _nickModeMenuAction->menu()->deleteLater(); _nickModeMenuAction->deleteLater(); + _nickIgnoreMenuAction->menu()->deleteLater(); + _nickIgnoreMenuAction->deleteLater(); + qDeleteAll(_ignoreDescriptions); + _ignoreDescriptions.clear(); } void ContextMenuActionProvider::addActions(QMenu *menu, BufferId bufId, QObject *receiver, const char *method) { @@ -284,6 +315,18 @@ void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex NetworkModel::ItemType itemType = static_cast(index.data(NetworkModel::ItemTypeRole).toInt()); addAction(_nickModeMenuAction, menu, itemType == NetworkModel::IrcUserItemType); addAction(_nickCtcpMenuAction, menu); + + IrcUser *ircUser = qobject_cast(index.data(NetworkModel::IrcUserRole).value()); + if(ircUser) { + // ignoreliststuff + QString bufferName; + BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); + if(bufferInfo.type() == BufferInfo::ChannelBuffer) + bufferName = bufferInfo.bufferName(); + QMap ignoreMap = Client::ignoreListManager()->matchingRulesForHostmask(ircUser->hostmask(), ircUser->network()->networkName(), bufferName); + addIgnoreMenu(menu, ircUser->hostmask(), ignoreMap); + // end of ignoreliststuff + } menu->addSeparator(); addAction(NickQuery, menu, itemType == NetworkModel::IrcUserItemType && !haveQuery && indexList().count() == 1); addAction(NickSwitchTo, menu, itemType == NetworkModel::IrcUserItemType && haveQuery); @@ -345,6 +388,81 @@ void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, int filter) { action(HideNick)->setChecked(filter & Message::Nick); action(HideMode)->setChecked(filter & Message::Mode); action(HideDayChange)->setChecked(filter & Message::DayChange); + action(HideTopic)->setChecked(filter & Message::Topic); menu->addAction(_hideEventsMenuAction); } + +void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostmask, const QMap &ignoreMap) { + QMenu *ignoreMenu = _nickIgnoreMenuAction->menu(); + ignoreMenu->clear(); + QString nick = nickFromMask(hostmask); + QString ident = userFromMask(hostmask); + QString host = hostFromMask(hostmask); + QString domain = host; + QRegExp domainRx = QRegExp("(\\.[^.]+\\.\\w+\\D)$"); + if(domainRx.indexIn(host) != -1) + domain = domainRx.cap(1); + // we can't rely on who-data + // if we don't have the data, we skip actions where we would need it + bool haveWhoData = !ident.isEmpty() && !host.isEmpty(); + + // add "Add Ignore Rule" description + ignoreMenu->addAction(_ignoreDescriptions.at(0)); + + if(haveWhoData) { + QString text; + text = QString("*!%1@%2").arg(ident, host); + action(NickIgnoreUser)->setText(text); + action(NickIgnoreUser)->setProperty("ignoreRule", text); + + text = QString("*!*@%1").arg(host); + action(NickIgnoreHost)->setText(text); + action(NickIgnoreHost)->setProperty("ignoreRule", text); + + text = domain.at(0) == '.' ? QString("*!%1@*%2").arg(ident, domain) + : QString("*!%1@%2").arg(ident, domain); + + action(NickIgnoreDomain)->setText(text); + action(NickIgnoreDomain)->setProperty("ignoreRule", text); + + if(!ignoreMap.contains(action(NickIgnoreUser)->property("ignoreRule").toString())) + ignoreMenu->addAction(action(NickIgnoreUser)); + if(!ignoreMap.contains(action(NickIgnoreHost)->property("ignoreRule").toString())) + ignoreMenu->addAction(action(NickIgnoreHost)); + // we only add that NickIgnoreDomain if it isn't the same as NickIgnoreUser + // as happens with @foobar.com hostmasks and ips + if(!ignoreMap.contains(action(NickIgnoreDomain)->property("ignoreRule").toString()) + && action(NickIgnoreUser)->property("ignoreRule").toString() != action(NickIgnoreDomain)->property("ignoreRule").toString()) + ignoreMenu->addAction(action(NickIgnoreDomain)); + } + + action(NickIgnoreCustom)->setProperty("ignoreRule", hostmask); + ignoreMenu->addAction(action(NickIgnoreCustom)); + + ignoreMenu->addSeparator(); + + if(haveWhoData) { + QMap::const_iterator ruleIter = ignoreMap.begin(); + int counter = 0; + if(!ignoreMap.isEmpty()) + // add "Existing Rules" description + ignoreMenu->addAction(_ignoreDescriptions.at(1)); + while(ruleIter != ignoreMap.constEnd()) { + if(counter < 5) { + ActionType type = static_cast(NickIgnoreToggleEnabled0 + counter*0x100000); + Action *act = action(type); + act->setText(ruleIter.key()); + act->setProperty("ignoreRule", ruleIter.key()); + act->setChecked(ruleIter.value()); + ignoreMenu->addAction(act); + } + counter++; + ruleIter++; + } + if(counter) + ignoreMenu->addSeparator(); + } + ignoreMenu->addAction(action(ShowIgnoreList)); + addAction(_nickIgnoreMenuAction, menu); +}