Add halfop support
[quassel.git] / src / uisupport / contextmenuactionprovider.cpp
index 03c2de6..0254233 100644 (file)
@@ -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<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
     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<BufferInfo>();
@@ -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<QString, bool>::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<ActionType>(NickIgnoreToggleEnabled0 + counter*0x100000);
         Action *act = action(type);
         act->setText(ruleIter.key());
+        act->setProperty("ignoreRule", ruleIter.key());
         act->setChecked(ruleIter.value());
         ignoreMenu->addAction(act);
       }