X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fcontextmenuactionprovider.cpp;h=02542332c9a9557c060327267f0e81653ee82c49;hp=03c2de6076c71e68e3dd9faa7c48b074e7cf8b1c;hb=c351c94e52a01571c34a18ddb5947b9e1f771d8c;hpb=f19fea582ace1d8f3dfe29c1096c48758079e56e diff --git a/src/uisupport/contextmenuactionprovider.cpp b/src/uisupport/contextmenuactionprovider.cpp index 03c2de60..02542332 100644 --- a/src/uisupport/contextmenuactionprovider.cpp +++ b/src/uisupport/contextmenuactionprovider.cpp @@ -62,7 +62,7 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM registerAction(NickCtcpVersion, tr("Version")); registerAction(NickCtcpTime, tr("Time")); registerAction(NickCtcpPing, tr("Ping")); - registerAction(NickCtcpFinger, tr("Finger")); + registerAction(NickCtcpClientinfo, tr("Client info")); registerAction(NickIgnoreCustom, tr("Custom...")); // these texts are only dummies! don't think about tr() here! @@ -77,6 +77,8 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM registerAction(NickOp, SmallIcon("irc-operator"), tr("Give Operator Status")); registerAction(NickDeop, SmallIcon("irc-remove-operator"), tr("Take Operator Status")); + registerAction(NickHalfop, SmallIcon("irc-voice"), tr("Give Half-Operator Status")); + registerAction(NickDehalfop, SmallIcon("irc-unvoice"), tr("Take Half-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")); @@ -106,13 +108,16 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM nickCtcpMenu->addAction(action(NickCtcpPing)); nickCtcpMenu->addAction(action(NickCtcpVersion)); nickCtcpMenu->addAction(action(NickCtcpTime)); - nickCtcpMenu->addAction(action(NickCtcpFinger)); + nickCtcpMenu->addAction(action(NickCtcpClientinfo)); _nickCtcpMenuAction = new Action(tr("CTCP"), 0); _nickCtcpMenuAction->setMenu(nickCtcpMenu); QMenu *nickModeMenu = new QMenu(); nickModeMenu->addAction(action(NickOp)); nickModeMenu->addAction(action(NickDeop)); + // this is where the halfops will be placed if available + nickModeMenu->addAction(action(NickHalfop)); + nickModeMenu->addAction(action(NickDehalfop)); nickModeMenu->addAction(action(NickVoice)); nickModeMenu->addAction(action(NickDevoice)); nickModeMenu->addSeparator(); @@ -125,6 +130,13 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM 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() { @@ -136,6 +148,8 @@ ContextMenuActionProvider::~ContextMenuActionProvider() { _nickModeMenuAction->deleteLater(); _nickIgnoreMenuAction->menu()->deleteLater(); _nickIgnoreMenuAction->deleteLater(); + qDeleteAll(_ignoreDescriptions); + _ignoreDescriptions.clear(); } void ContextMenuActionProvider::addActions(QMenu *menu, BufferId bufId, QObject *receiver, const char *method) { @@ -309,6 +323,16 @@ void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex IrcUser *ircUser = qobject_cast(index.data(NetworkModel::IrcUserRole).value()); if(ircUser) { + Network *network = ircUser->network(); + // only show entries for usermode +h if server supports it + if(network && network->prefixModes().contains('h')) { + action(NickHalfop)->setVisible(true); + action(NickDehalfop)->setVisible(true); + } + else { + action(NickHalfop)->setVisible(false); + action(NickDehalfop)->setVisible(false); + } // ignoreliststuff QString bufferName; BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value(); @@ -391,42 +415,60 @@ void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostma QString ident = userFromMask(hostmask); QString host = hostFromMask(hostmask); QString domain = host; - QRegExp domainRx = QRegExp("(\\.[^.]+\\.\\w+)$"); + 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(); - - ignoreMenu->addAction(tr("Add Ignore Rule"))->setEnabled(false); + // add "Add Ignore Rule" description + ignoreMenu->addAction(_ignoreDescriptions.at(0)); if(haveWhoData) { - action(NickIgnoreUser)->setText(QString("*!%1@%2").arg(ident, host)); - action(NickIgnoreHost)->setText(QString("*!*@%1").arg(host)); - action(NickIgnoreDomain)->setText(domain.at(0) == '.' ? QString("*!%1@*%2").arg(ident, domain) - : QString("*!%1@%2").arg(ident, domain)); + 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); - if(!ignoreMap.contains(action(NickIgnoreUser)->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)->text())) + if(!ignoreMap.contains(action(NickIgnoreHost)->property("ignoreRule").toString())) ignoreMenu->addAction(action(NickIgnoreHost)); - if(!ignoreMap.contains(action(NickIgnoreDomain)->text())) + // 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()) - ignoreMenu->addAction(tr("Existing Rules"))->setEnabled(false); + // 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); }