rendered paste bodyIndex: irc/nicklistview.h===================================================================--- irc/nicklistview.h (revision 921833)+++ irc/nicklistview.h (working copy)@@ -19,10 +19,14 @@ #include "../linkaddressbook/nicklisttooltip.h" #include "images.h" #include "common.h"+#include "application.h" // for PopupIDs... #include <k3listview.h> #include <KMenu> +class QActionGroup;+class QMenu;+class KAction; class QContextMenuEvent; class QTimer; @@ -40,8 +44,8 @@ void setWhatsThis(); virtual void setSorting(int column, bool ascending);-- public slots:+ + public slots: /** When this is called, resort is guaranteed to be called within a hard-coded time (a few seconds). * This prevents lots of calls to resort. */@@ -56,8 +60,11 @@ signals: /* Will be connected to Channel::popupCommand(int) */ void popupCommand(int id);-- protected:+ + protected slots:+ void slotActionTriggered(KAction* action);+ + protected: void contextMenuEvent(QContextMenuEvent* ce); virtual bool acceptDrag (QDropEvent* event) const; void insertAssociationSubMenu();@@ -72,5 +79,35 @@ int m_column; bool m_ascending;++ private:+ // TODO use a more specific enum for just our actions?+ KAction* createAction(QMenu* menu, const QString& text, Konversation::PopupIDs);++ QActionGroup* m_actionGroup;+ KAction* m_whoisAction;+ KAction* m_versionAction;+ KAction* m_pingAction;+ KAction* m_giveOpAction;+ KAction* m_takeOpAction;+ KAction* m_giveHalfOpAction;+ KAction* m_takeHalfOpAction;+ KAction* m_giveVoiceAction;+ KAction* m_takeVoiceAction;+ KAction* m_modeAction;+ KAction* m_ignoreAction;+ KAction* m_unIgnoreAction;+ KAction* m_kickAction;+ KAction* m_kickBanAction;+ KAction* m_banNickAction;+ KAction* m_banHostAction;+ KAction* m_banDomainAction;+ KAction* m_banUserHostAction;+ KAction* m_banUserDomainAction;+ KAction* m_kickBanHostAction;+ KAction* m_kickBanDomainAction;+ KAction* m_kickBanUserHostAction;+ KAction* m_kickBanUserDomainAction;+ KAction* m_kickBanSubAction; }; #endifIndex: irc/nicklistview.cpp===================================================================--- irc/nicklistview.cpp (revision 921833)+++ irc/nicklistview.cpp (working copy)@@ -26,6 +26,7 @@ #include <q3dragobject.h> #include <kauthorized.h> #include <Q3MimeSourceFactory>+#include <qactiongroup.h> NickListView::NickListView(QWidget* parent, Channel *chan) : K3ListView(parent)@@ -45,46 +46,48 @@ setDropHighlighter(true); setDropVisualizer(false); + m_actionGroup = new QActionGroup(this);+ connect(m_actionGroup, SIGNAL(triggered(KAction*)), this, SLOT(slotActionTriggered(KAction*)));+ if (popup) {- popup->insertItem(i18n("&Whois"),Konversation::Whois);- popup->insertItem(i18n("&Version"),Konversation::Version);- popup->insertItem(i18n("&Ping"),Konversation::Ping);+ m_whoisAction = createAction(popup,i18n("&Whois"),Konversation::Whois);+ m_versionAction = createAction(popup,i18n("&Version"),Konversation::Version);+ m_pingAction = createAction(popup,i18n("&Ping"),Konversation::Ping); popup->addSeparator(); if (modes) {- modes->insertItem(i18n("Give Op"),Konversation::GiveOp);- modes->insertItem(i18n("Take Op"),Konversation::TakeOp);- modes->insertItem(i18n("Give HalfOp"),Konversation::GiveHalfOp);- modes->insertItem(i18n("Take HalfOp"),Konversation::TakeHalfOp);- modes->insertItem(i18n("Give Voice"),Konversation::GiveVoice);- modes->insertItem(i18n("Take Voice"),Konversation::TakeVoice);- popup->insertItem(i18n("Modes"),modes,Konversation::ModesSub);+ m_giveOpAction = createAction(modes,i18n("Give Op"),Konversation::GiveOp);+ m_takeOpAction = createAction(modes,i18n("Take Op"),Konversation::TakeOp);+ m_giveHalfOpAction = createAction(modes,i18n("Give HalfOp"),Konversation::GiveHalfOp);+ m_takeHalfOpAction = createAction(modes,i18n("Take HalfOp"),Konversation::TakeHalfOp);+ m_giveVoiceAction = createAction(modes,i18n("Give Voice"),Konversation::GiveVoice);+ m_takeVoiceAction = createAction(modes,i18n("Take Voice"),Konversation::TakeVoice);+ m_modeAction = createAction(modes,i18n("Modes"),Konversation::ModesSub); } if (kickban) {-- kickban->insertItem(i18n("Kick"),Konversation::Kick);- kickban->insertItem(i18n("Kickban"),Konversation::KickBan);- kickban->insertItem(i18n("Ban Nickname"),Konversation::BanNick);+ m_kickAction = createAction(kickban,i18n("Kick"),Konversation::Kick);+ m_kickBanAction = createAction(kickban,i18n("Kickban"),Konversation::KickBan);+ m_banNickAction = createAction(kickban,i18n("Ban Nickname"),Konversation::BanNick); kickban->addSeparator();- kickban->insertItem(i18n("Ban *!*@*.host"),Konversation::BanHost);- kickban->insertItem(i18n("Ban *!*@domain"),Konversation::BanDomain);- kickban->insertItem(i18n("Ban *!user@*.host"),Konversation::BanUserHost);- kickban->insertItem(i18n("Ban *!user@domain"),Konversation::BanUserDomain);+ m_banHostAction = createAction(kickban,i18n("Ban *!*@*.host"),Konversation::BanHost);+ m_banDomainAction = createAction(kickban,i18n("Ban *!*@domain"),Konversation::BanDomain);+ m_banUserHostAction = createAction(kickban,i18n("Ban *!user@*.host"),Konversation::BanUserHost);+ m_banUserDomainAction = createAction(kickban,i18n("Ban *!user@domain"),Konversation::BanUserDomain); kickban->addSeparator();- kickban->insertItem(i18n("Kickban *!*@*.host"),Konversation::KickBanHost);- kickban->insertItem(i18n("Kickban *!*@domain"),Konversation::KickBanDomain);- kickban->insertItem(i18n("Kickban *!user@*.host"),Konversation::KickBanUserHost);- kickban->insertItem(i18n("Kickban *!user@domain"),Konversation::KickBanUserDomain);- popup->insertItem(i18n("Kick / Ban"),kickban,Konversation::KickBanSub);+ m_kickBanHostAction = createAction(kickban,i18n("Kickban *!*@*.host"),Konversation::KickBanHost);+ m_kickBanDomainAction = createAction(kickban,i18n("Kickban *!*@domain"),Konversation::KickBanDomain);+ m_kickBanUserHostAction = createAction(kickban,i18n("Kickban *!user@*.host"),Konversation::KickBanUserHost);+ m_kickBanUserDomainAction = createAction(kickban,i18n("Kickban *!user@domain"),Konversation::KickBanUserDomain);+ m_kickBanSubAction = createAction(kickban,i18n("Kick / Ban"),Konversation::KickBanSub); } - popup->insertItem(i18n("Ignore"), Konversation::IgnoreNick);- popup->insertItem(i18n("Unignore"), Konversation::UnignoreNick);+ m_ignoreAction = createAction(popup,i18n("Ignore"),Konversation::IgnoreNick);+ m_unIgnoreAction = createAction(popup,i18n("Unignore"),Konversation::UnignoreNick); popup->addSeparator(); @@ -332,4 +335,20 @@ return false; } +Q_DECLARE_METATYPE(Konversation::PopupIDs)++KAction* NickListView::createAction(QMenu* menu, const QString& text, Konversation::PopupIDs id)+{+ KAction* action = new KAction(text, menu);+ menu->addAction(action);+ action->setData(QVariant::fromValue(id));+ m_actionGroup->addAction(action);+ return action;+}++void NickListView::slotActionTriggered(KAction* action)+{+ popup(action->data().value<Konversation::PopupIDs>());+}+ // #include "./irc/nicklistview.moc"