/***************************************************************************
- * Copyright (C) 2005-2015 by the Quassel Project *
+ * Copyright (C) 2005-2020 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 <QIcon>
+#include "contextmenuactionprovider.h"
+
#include <QInputDialog>
+#include <QMap>
#include <QMenu>
#include <QMessageBox>
-#include <QMap>
-
-#include "contextmenuactionprovider.h"
#include "buffermodel.h"
#include "buffersettings.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, QIcon::fromTheme("network-connect"), tr("Connect"));
- registerAction(NetworkDisconnect, QIcon::fromTheme("network-disconnect"), tr("Disconnect"));
+ registerAction(NetworkConnect, icon::get("network-connect"), tr("Connect"));
+ registerAction(NetworkDisconnect, icon::get("network-disconnect"), tr("Disconnect"));
- registerAction(BufferJoin, QIcon::fromTheme("irc-join-channel"), tr("Join"));
- registerAction(BufferPart, QIcon::fromTheme("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(HideApplyToAll, tr("Set as Default..."));
registerAction(HideUseDefaults, tr("Use Defaults..."));
- registerAction(JoinChannel, QIcon::fromTheme("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"));
registerAction(NickIgnoreToggleEnabled3, "Enable", true);
registerAction(NickIgnoreToggleEnabled4, "Enable", true);
- registerAction(NickOp, QIcon::fromTheme("irc-operator"), tr("Give Operator Status"));
- registerAction(NickDeop, QIcon::fromTheme("irc-remove-operator"), tr("Take Operator Status"));
- registerAction(NickHalfop, QIcon::fromTheme("irc-voice"), tr("Give Half-Operator Status"));
- registerAction(NickDehalfop, QIcon::fromTheme("irc-unvoice"), tr("Take Half-Operator Status"));
- registerAction(NickVoice, QIcon::fromTheme("irc-voice"), tr("Give Voice"));
- registerAction(NickDevoice, QIcon::fromTheme("irc-unvoice"), tr("Take Voice"));
- registerAction(NickKick, QIcon::fromTheme("im-kick-user"), tr("Kick From Channel"));
- registerAction(NickBan, QIcon::fromTheme("im-ban-user"), tr("Ban From Channel"));
- registerAction(NickKickBan, QIcon::fromTheme("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->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
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();
_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;
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
}
}
-
-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 Network* network = 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();
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>();
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();
//}
}
}
-
-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)
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();
+ Network* network = ircUser->network();
// only show entries for usermode +h if server supports it
if (network && network->prefixModes().contains('h')) {
action(NickHalfop)->setVisible(true);
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
}
}
}
-
-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);
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());
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());
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);
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();
+ 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)$");
+ QRegExp domainRx = QRegExp(R"((\.[^.]+\.\w+\D)$)");
if (domainRx.indexIn(host) != -1)
domain = domainRx.cap(1);
// we can't rely on who-data
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);
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);
+ Action* act = action(type);
act->setText(ruleIter.key());
act->setProperty("ignoreRule", ruleIter.key());
act->setChecked(ruleIter.value());