src: Yearly copyright bump
[quassel.git] / src / uisupport / contextmenuactionprovider.cpp
index d14a689..e5837f6 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2012 by the Quassel Project                        *
+ *   Copyright (C) 2005-2019 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
+#include "contextmenuactionprovider.h"
+
 #include <QInputDialog>
+#include <QMap>
 #include <QMenu>
 #include <QMessageBox>
-#include <QMap>
-
-#include "contextmenuactionprovider.h"
 
 #include "buffermodel.h"
 #include "buffersettings.h"
-#include "iconloader.h"
-#include "clientidentity.h"
-#include "network.h"
-#include "util.h"
 #include "client.h"
 #include "clientignorelistmanager.h"
+#include "icon.h"
+#include "network.h"
+#include "util.h"
 
-ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkModelController(parent)
+ContextMenuActionProvider::ContextMenuActionProvider(QObject* parent)
+    : NetworkModelController(parent)
 {
-    registerAction(NetworkConnect, SmallIcon("network-connect"), tr("Connect"));
-    registerAction(NetworkDisconnect, SmallIcon("network-disconnect"), tr("Disconnect"));
+    registerAction(NetworkConnect, icon::get("network-connect"), tr("Connect"));
+    registerAction(NetworkDisconnect, icon::get("network-disconnect"), tr("Disconnect"));
 
-    registerAction(BufferJoin, SmallIcon("irc-join-channel"), tr("Join"));
-    registerAction(BufferPart, SmallIcon("irc-close-channel"), tr("Part"));
+    registerAction(BufferJoin, icon::get("irc-join-channel"), tr("Join"));
+    registerAction(BufferPart, icon::get("irc-close-channel"), tr("Part"));
     registerAction(BufferRemove, tr("Delete Chat(s)..."));
     registerAction(BufferSwitchTo, tr("Go to Chat"));
 
+    registerAction(HideJoinPartQuit, tr("Joins/Parts/Quits"));
     registerAction(HideJoin, tr("Joins"), true);
     registerAction(HidePart, tr("Parts"), true);
     registerAction(HideQuit, tr("Quits"), true);
@@ -54,7 +55,7 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM
     registerAction(HideApplyToAll, tr("Set as Default..."));
     registerAction(HideUseDefaults, tr("Use Defaults..."));
 
-    registerAction(JoinChannel, SmallIcon("irc-join-channel"), tr("Join Channel..."));
+    registerAction(JoinChannel, icon::get("irc-join-channel"), tr("Join Channel..."));
 
     registerAction(NickQuery, tr("Start Query"));
     registerAction(NickSwitchTo, tr("Show Query"));
@@ -76,22 +77,25 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM
     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(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"));
-    registerAction(NickBan, SmallIcon("im-ban-user"), tr("Ban From Channel"));
-    registerAction(NickKickBan, SmallIcon("im-ban-kick-user"), tr("Kick && Ban"));
+    registerAction(NickOp, icon::get("irc-operator"), tr("Give Operator Status"));
+    registerAction(NickDeop, icon::get("irc-remove-operator"), tr("Take Operator Status"));
+    registerAction(NickHalfop, icon::get("irc-voice"), tr("Give Half-Operator Status"));
+    registerAction(NickDehalfop, icon::get("irc-unvoice"), tr("Take Half-Operator Status"));
+    registerAction(NickVoice, icon::get("irc-voice"), tr("Give Voice"));
+    registerAction(NickDevoice, icon::get("irc-unvoice"), tr("Take Voice"));
+    registerAction(NickKick, icon::get("im-kick-user"), tr("Kick From Channel"));
+    registerAction(NickBan, icon::get("im-ban-user"), tr("Ban From Channel"));
+    registerAction(NickKickBan, icon::get("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(ShowNetworkConfig, tr("Configure"));
     registerAction(ShowIgnoreList, tr("Show Ignore List"));
 
-    QMenu *hideEventsMenu = new QMenu();
+    auto* hideEventsMenu = new QMenu();
+    hideEventsMenu->addAction(action(HideJoinPartQuit));
+    hideEventsMenu->addSeparator();
     hideEventsMenu->addAction(action(HideJoin));
     hideEventsMenu->addAction(action(HidePart));
     hideEventsMenu->addAction(action(HideQuit));
@@ -102,18 +106,18 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM
     hideEventsMenu->addSeparator();
     hideEventsMenu->addAction(action(HideApplyToAll));
     hideEventsMenu->addAction(action(HideUseDefaults));
-    _hideEventsMenuAction = new Action(tr("Hide Events"), 0);
+    _hideEventsMenuAction = new Action(tr("Hide Events"), nullptr);
     _hideEventsMenuAction->setMenu(hideEventsMenu);
 
-    QMenu *nickCtcpMenu = new QMenu();
+    auto* nickCtcpMenu = new QMenu();
     nickCtcpMenu->addAction(action(NickCtcpPing));
     nickCtcpMenu->addAction(action(NickCtcpVersion));
     nickCtcpMenu->addAction(action(NickCtcpTime));
     nickCtcpMenu->addAction(action(NickCtcpClientinfo));
-    _nickCtcpMenuAction = new Action(tr("CTCP"), 0);
+    _nickCtcpMenuAction = new Action(tr("CTCP"), nullptr);
     _nickCtcpMenuAction->setMenu(nickCtcpMenu);
 
-    QMenu *nickModeMenu = new QMenu();
+    auto* nickModeMenu = new QMenu();
     nickModeMenu->addAction(action(NickOp));
     nickModeMenu->addAction(action(NickDeop));
     // this is where the halfops will be placed if available
@@ -125,22 +129,21 @@ ContextMenuActionProvider::ContextMenuActionProvider(QObject *parent) : NetworkM
     nickModeMenu->addAction(action(NickKick));
     nickModeMenu->addAction(action(NickBan));
     nickModeMenu->addAction(action(NickKickBan));
-    _nickModeMenuAction = new Action(tr("Actions"), 0);
+    _nickModeMenuAction = new Action(tr("Actions"), nullptr);
     _nickModeMenuAction->setMenu(nickModeMenu);
 
-    QMenu *ignoreMenu = new QMenu();
-    _nickIgnoreMenuAction = new Action(tr("Ignore"), 0);
+    auto* ignoreMenu = new QMenu();
+    _nickIgnoreMenuAction = new Action(tr("Ignore"), nullptr);
     _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);
+    foreach (QAction* act, _ignoreDescriptions)
+        act->setEnabled(false);
 }
 
-
 ContextMenuActionProvider::~ContextMenuActionProvider()
 {
     _hideEventsMenuAction->menu()->deleteLater();
@@ -155,51 +158,44 @@ ContextMenuActionProvider::~ContextMenuActionProvider()
     _ignoreDescriptions.clear();
 }
 
-
-void ContextMenuActionProvider::addActions(QMenu *menu, BufferId bufId, QObject *receiver, const char *method)
+void ContextMenuActionProvider::addActions(QMenu* menu, BufferId bufId, ActionSlot slot)
 {
     if (!bufId.isValid())
         return;
-    addActions(menu, Client::networkModel()->bufferIndex(bufId), receiver, method);
+    addActions(menu, Client::networkModel()->bufferIndex(bufId), std::move(slot));
 }
 
-
-void ContextMenuActionProvider::addActions(QMenu *menu, const QModelIndex &index, QObject *receiver, const char *method, bool isCustomBufferView)
+void ContextMenuActionProvider::addActions(QMenu* menu, const QModelIndex& index, ActionSlot slot, bool isCustomBufferView)
 {
     if (!index.isValid())
         return;
-    addActions(menu, QList<QModelIndex>() << index, 0, QString(), receiver, method, isCustomBufferView);
+    addActions(menu, QList<QModelIndex>() << index, nullptr, QString(), std::move(slot), isCustomBufferView);
 }
 
-
-void ContextMenuActionProvider::addActions(QMenu *menu, MessageFilter *filter, BufferId msgBuffer, QObject *receiver, const char *slot)
+void ContextMenuActionProvider::addActions(QMenu* menu, MessageFilter* filter, BufferId msgBuffer, ActionSlot slot)
 {
-    addActions(menu, filter, msgBuffer, QString(), receiver, slot);
+    addActions(menu, filter, msgBuffer, QString(), std::move(slot));
 }
 
-
-void ContextMenuActionProvider::addActions(QMenu *menu, MessageFilter *filter, BufferId msgBuffer, const QString &chanOrNick, QObject *receiver, const char *method)
+void ContextMenuActionProvider::addActions(QMenu* menu, MessageFilter* filter, BufferId msgBuffer, const QString& chanOrNick, ActionSlot slot)
 {
     if (!filter)
         return;
-    addActions(menu, QList<QModelIndex>() << Client::networkModel()->bufferIndex(msgBuffer), filter, chanOrNick, receiver, method, false);
+    addActions(menu, QList<QModelIndex>() << Client::networkModel()->bufferIndex(msgBuffer), filter, chanOrNick, std::move(slot), false);
 }
 
-
-void ContextMenuActionProvider::addActions(QMenu *menu, const QList<QModelIndex> &indexList, QObject *receiver,  const char *method, bool isCustomBufferView)
+void ContextMenuActionProvider::addActions(QMenu* menu, const QList<QModelIndex>& indexList, ActionSlot slot, bool isCustomBufferView)
 {
-    addActions(menu, indexList, 0, QString(), receiver, method, isCustomBufferView);
+    addActions(menu, indexList, nullptr, QString(), std::move(slot), isCustomBufferView);
 }
 
-
 // add a list of actions sensible for the current item(s)
-void ContextMenuActionProvider::addActions(QMenu *menu,
-    const QList<QModelIndex> &indexList_,
-    MessageFilter *filter_,
-    const QString &contextItem_,
-    QObject *receiver_,
-    const char *method_,
-    bool isCustomBufferView)
+void ContextMenuActionProvider::addActions(QMenu* menu,
+                                           const QList<QModelIndex>& indexList_,
+                                           MessageFilter* filter_,
+                                           const QString& contextItem_,
+                                           ActionSlot actionSlot,
+                                           bool isCustomBufferView)
 {
     if (!indexList_.count())
         return;
@@ -207,7 +203,7 @@ void ContextMenuActionProvider::addActions(QMenu *menu,
     setIndexList(indexList_);
     setMessageFilter(filter_);
     setContextItem(contextItem_);
-    setSlot(receiver_, method_);
+    setSlot(std::move(actionSlot));
 
     if (!messageFilter()) {
         // this means we are in a BufferView (or NickView) rather than a ChatView
@@ -271,17 +267,18 @@ void ContextMenuActionProvider::addActions(QMenu *menu,
     }
 }
 
-
-void ContextMenuActionProvider::addNetworkItemActions(QMenu *menu, const QModelIndex &index)
+void ContextMenuActionProvider::addNetworkItemActions(QMenu* menu, const QModelIndex& index)
 {
     NetworkId networkId = index.data(NetworkModel::NetworkIdRole).value<NetworkId>();
     if (!networkId.isValid())
         return;
-    const Network *network = Client::network(networkId);
+    const Networknetwork = Client::network(networkId);
     Q_CHECK_PTR(network);
     if (!network)
         return;
 
+    addAction(ShowNetworkConfig, menu, index);
+    menu->addSeparator();
     addAction(NetworkConnect, menu, network->connectionState() == Network::Disconnected);
     addAction(NetworkDisconnect, menu, network->connectionState() != Network::Disconnected);
     menu->addSeparator();
@@ -289,8 +286,7 @@ void ContextMenuActionProvider::addNetworkItemActions(QMenu *menu, const QModelI
     addAction(JoinChannel, menu, index, ActiveState);
 }
 
-
-void ContextMenuActionProvider::addBufferItemActions(QMenu *menu, const QModelIndex &index, bool isCustomBufferView)
+void ContextMenuActionProvider::addBufferItemActions(QMenu* menu, const QModelIndex& index, bool isCustomBufferView)
 {
     BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
 
@@ -307,10 +303,9 @@ void ContextMenuActionProvider::addBufferItemActions(QMenu *menu, const QModelIn
         addAction(BufferRemove, menu, index, InactiveState);
         break;
 
-    case BufferInfo::QueryBuffer:
-    {
-        //IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
-        //if(ircUser) {
+    case BufferInfo::QueryBuffer: {
+        // IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
+        // if(ircUser) {
         addIrcUserActions(menu, index);
         menu->addSeparator();
         //}
@@ -328,8 +323,7 @@ void ContextMenuActionProvider::addBufferItemActions(QMenu *menu, const QModelIn
     }
 }
 
-
-void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex &index)
+void ContextMenuActionProvider::addIrcUserActions(QMenu* menu, const QModelIndex& index)
 {
     // this can be called: a) as a nicklist context menu (index has IrcUserItemType)
     //                     b) as a query buffer context menu (index has BufferItemType and is a QueryBufferItem)
@@ -343,9 +337,9 @@ void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex
         addAction(_nickModeMenuAction, menu, itemType == NetworkModel::IrcUserItemType);
         addAction(_nickCtcpMenuAction, menu);
 
-        IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
+        auto* ircUser = qobject_cast<IrcUser*>(index.data(NetworkModel::IrcUserRole).value<QObject*>());
         if (ircUser) {
-            Network *network = ircUser->network();
+            Networknetwork = ircUser->network();
             // only show entries for usermode +h if server supports it
             if (network && network->prefixModes().contains('h')) {
                 action(NickHalfop)->setVisible(true);
@@ -360,7 +354,9 @@ void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex
             BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
             if (bufferInfo.type() == BufferInfo::ChannelBuffer)
                 bufferName = bufferInfo.bufferName();
-            QMap<QString, bool> ignoreMap = Client::ignoreListManager()->matchingRulesForHostmask(ircUser->hostmask(), ircUser->network()->networkName(), bufferName);
+            QMap<QString, bool> ignoreMap = Client::ignoreListManager()->matchingRulesForHostmask(ircUser->hostmask(),
+                                                                                                  ircUser->network()->networkName(),
+                                                                                                  bufferName);
             addIgnoreMenu(menu, ircUser->hostmask(), ignoreMap);
             // end of ignoreliststuff
         }
@@ -376,26 +372,22 @@ void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex
     }
 }
 
-
-Action *ContextMenuActionProvider::addAction(ActionType type, QMenu *menu, const QModelIndex &index, ItemActiveStates requiredActiveState)
+Action* ContextMenuActionProvider::addAction(ActionType type, QMenu* menu, const QModelIndex& index, ItemActiveStates requiredActiveState)
 {
     return addAction(action(type), menu, checkRequirements(index, requiredActiveState));
 }
 
-
-Action *ContextMenuActionProvider::addAction(Action *action, QMenu *menu, const QModelIndex &index, ItemActiveStates requiredActiveState)
+Action* ContextMenuActionProvider::addAction(Action* action, QMenu* menu, const QModelIndex& index, ItemActiveStates requiredActiveState)
 {
     return addAction(action, menu, checkRequirements(index, requiredActiveState));
 }
 
-
-Action *ContextMenuActionProvider::addAction(ActionType type, QMenu *menu, bool condition)
+Action* ContextMenuActionProvider::addAction(ActionType type, QMenu* menu, bool condition)
 {
     return addAction(action(type), menu, condition);
 }
 
-
-Action *ContextMenuActionProvider::addAction(Action *action, QMenu *menu, bool condition)
+Action* ContextMenuActionProvider::addAction(Action* action, QMenu* menu, bool condition)
 {
     if (condition) {
         menu->addAction(action);
@@ -407,8 +399,7 @@ Action *ContextMenuActionProvider::addAction(Action *action, QMenu *menu, bool c
     return action;
 }
 
-
-void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, BufferId bufferId)
+void ContextMenuActionProvider::addHideEventsMenu(QMenu* menu, BufferId bufferId)
 {
     if (BufferSettings(bufferId).hasFilter())
         addHideEventsMenu(menu, BufferSettings(bufferId).messageFilter());
@@ -416,8 +407,7 @@ void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, BufferId bufferId
         addHideEventsMenu(menu);
 }
 
-
-void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, MessageFilter *msgFilter)
+void ContextMenuActionProvider::addHideEventsMenu(QMenu* menu, MessageFilter* msgFilter)
 {
     if (BufferSettings(msgFilter->idString()).hasFilter())
         addHideEventsMenu(menu, BufferSettings(msgFilter->idString()).messageFilter());
@@ -425,8 +415,7 @@ void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, MessageFilter *ms
         addHideEventsMenu(menu);
 }
 
-
-void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, int filter)
+void ContextMenuActionProvider::addHideEventsMenu(QMenu* menu, int filter)
 {
     action(HideApplyToAll)->setEnabled(filter != -1);
     action(HideUseDefaults)->setEnabled(filter != -1);
@@ -444,16 +433,15 @@ void ContextMenuActionProvider::addHideEventsMenu(QMenu *menu, int filter)
     menu->addAction(_hideEventsMenuAction);
 }
 
-
-void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostmask, const QMap<QString, bool> &ignoreMap)
+void ContextMenuActionProvider::addIgnoreMenu(QMenu* menu, const QString& hostmask, const QMap<QString, bool>& ignoreMap)
 {
-    QMenu *ignoreMenu = _nickIgnoreMenuAction->menu();
+    QMenuignoreMenu = _nickIgnoreMenuAction->menu();
     ignoreMenu->clear();
     QString nick = nickFromMask(hostmask);
     QString ident = userFromMask(hostmask);
     QString host = hostFromMask(hostmask);
     QString domain = host;
-    QRegExp domainRx = QRegExp("(\\.[^.]+\\.\\w+\\D)$");
+    QRegExp domainRx = QRegExp(R"((\.[^.]+\.\w+\D)$)");
     if (domainRx.indexIn(host) != -1)
         domain = domainRx.cap(1);
     // we can't rely on who-data
@@ -473,8 +461,7 @@ void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostma
         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);
+        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);
@@ -503,15 +490,15 @@ void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostma
             ignoreMenu->addAction(_ignoreDescriptions.at(1));
         while (ruleIter != ignoreMap.constEnd()) {
             if (counter < 5) {
-                ActionType type = static_cast<ActionType>(NickIgnoreToggleEnabled0 + counter*0x100000);
-                Action *act = action(type);
+                auto type = static_cast<ActionType>(NickIgnoreToggleEnabled0 + counter * 0x100000);
+                Actionact = action(type);
                 act->setText(ruleIter.key());
                 act->setProperty("ignoreRule", ruleIter.key());
                 act->setChecked(ruleIter.value());
                 ignoreMenu->addAction(act);
             }
             counter++;
-            ruleIter++;
+            ++ruleIter;
         }
         if (counter)
             ignoreMenu->addSeparator();