Index: src/irc/nicklistview.h =================================================================== --- src/irc/nicklistview.h (revision 921948) +++ src/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 #include +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,38 @@ 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; + KAction* m_addNotifyAction; + KAction* m_addressbookSubAction; + KAction* m_sendMailAction; }; #endif Index: src/irc/nicklistview.cpp =================================================================== --- src/irc/nicklistview.cpp (revision 921948) +++ src/irc/nicklistview.cpp (working copy) @@ -26,6 +26,8 @@ #include #include #include +#include +#include NickListView::NickListView(QWidget* parent, Channel *chan) : K3ListView(parent) @@ -45,46 +47,48 @@ setDropHighlighter(true); setDropVisualizer(false); + m_actionGroup = new QActionGroup(this); + connect(m_actionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotActionTriggered(QAction*))); + 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(); @@ -99,14 +103,15 @@ newitem = popup->insertItem(SmallIcon("arrow-right-double"),i18n("Send &File..."),Konversation::DccSend); popup->setWhatsThis(newitem, "Send a file to this person. If you are having problem sending files, or they are sending slowly, see the Konversation Handbook and DCC preferences page."); } - popup->insertItem(SmallIconSet("mail-send"),i18n("&Send Email..."), Konversation::SendEmail); + m_sendMailAction = createAction(kickban,i18n("&Send Email..."),Konversation::SendEmail); + m_sendMailAction->setIcon(KIcon("mail-send")); popup->addSeparator(); if (addressbook) - popup->insertItem(i18n("Addressbook Associations"), addressbook, Konversation::AddressbookSub); + m_addressbookSubAction = createAction(kickban,i18n("Addressbook Associations"),Konversation::AddressbookSub); - popup->insertItem(i18n("Add to Watched Nicks"), Konversation::AddNotify); + m_addNotifyAction = createAction(kickban,i18n("Add to Watched Nicks"),Konversation::AddNotify); connect (popup, SIGNAL(activated(int)), this, SIGNAL(popupCommand(int))); connect (modes, SIGNAL(activated(int)), this, SIGNAL(popupCommand(int))); @@ -116,7 +121,7 @@ } else { - kWarning() << "NickListView::NickListView(): Could not create popup!" << endl; + kWarning() << "Could not create popup!" ; } setShadeSortColumn(false); @@ -332,4 +337,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(QAction* action) +{ + popupCommand(action->data().value()); +} + // #include "./irc/nicklistview.moc"