diff --exclude='*orig' -Naur psi-0.10-orig/src/contactview.cpp psi-0.10/src/contactview.cpp --- psi-0.10-orig/src/contactview.cpp 2006-01-14 01:19:11.000000000 +0000 +++ psi-0.10/src/contactview.cpp 2006-01-14 01:28:50.000000000 +0000 @@ -45,6 +45,8 @@ #include"alerticon.h" #include"avatars.h" #include"jiddrag.h" +#include"statusdlg.h" +#include"xmpp_tasks.h" using std::for_each; using XMPP::Jid; @@ -981,6 +983,7 @@ QPopupMenu pm; pm.insertItem(IconsetFactory::iconPixmap("psi/sendMessage"), tr("Send message to group"), 0); + pm.insertItem(tr("Sen&d status to group"), 24); if(!option.lockdown.roster) { // disable if it's not a user group if(!online || i->groupType() != ContactViewItem::gUser || gname == ContactView::tr("Hidden")) { @@ -1049,6 +1052,12 @@ if(i->groupType() == ContactViewItem::gAgents) d->cv->setShowAgents(false); } + else if(x == 24 && online) { + StatusSetDlg *w = new StatusSetDlg(d->pa->psi(), makeStatus(STATUS_ONLINE, d->pa->psi()->lastStatusString)); + w->setJidList(contactListFromCVGroup(i)); + connect(w, SIGNAL(setJidList(const JidList &, const Status &)), SLOT(setStatusFromDialog(const JidList &, const Status &))); + w->show(); + } } else if(i->type() == ContactViewItem::Contact) { bool self = false; @@ -1330,6 +1339,8 @@ pm.insertItem(IconsetFactory::iconPixmap("psi/gpg-no"), tr("Unassign Open&PGP key"), 22); } + pm.insertItem(tr("Sen&d Status"), 24); + d->cv->qa_vcard->addTo( &pm ); if(!isPrivate) { @@ -1459,6 +1470,12 @@ if(online) actionSendFile(u->jid()); } + else if(x == 24 && online) { + StatusSetDlg *w = new StatusSetDlg(d->pa->psi(), makeStatus(STATUS_ONLINE, d->pa->psi()->lastStatusString)); + w->setJid(u->jid()); + connect(w, SIGNAL(setJid(const Jid &, const Status &)), SLOT(setStatusFromDialog(const Jid &, const Status &))); + w->show(); + } else if(x >= base_sendto && x < base_openurl) { int n = x - base_sendto; int res = n / 2; @@ -2442,6 +2459,22 @@ i->contactProfile()->scRemove(i); } +void ContactProfile::setStatusFromDialog(const Jid &j, const Status &s) +{ + JT_Presence *p = new JT_Presence(d->pa->client()->rootTask()); + p->pres(j, s); + p->go(true); +} + +void ContactProfile::setStatusFromDialog(const JidList &j, const Status &s) +{ + for(QValueList::ConstIterator it = j.begin(); it != j.end(); ++it) { + JT_Presence *p = new JT_Presence(d->pa->client()->rootTask()); + p->pres((*it), s); + p->go(true); + } +} + QDragObject *ContactView::dragObject() { ContactViewItem *i = (ContactViewItem *)selectedItem(); diff --exclude='*orig' -Naur psi-0.10-orig/src/contactview.h psi-0.10/src/contactview.h --- psi-0.10-orig/src/contactview.h 2006-01-14 01:19:09.000000000 +0000 +++ psi-0.10/src/contactview.h 2006-01-14 01:28:06.000000000 +0000 @@ -29,6 +29,7 @@ #include #include"xmpp.h" #include"common.h" +#include"im.h" class IconAction; class UserListItem; @@ -118,6 +119,9 @@ private slots: void updateGroups(); +public slots: + void setStatusFromDialog(const Jid &j, const Status &s); + void setStatusFromDialog(const JidList &j, const Status &s); public: class Entry; diff --exclude='*orig' -Naur psi-0.10-orig/src/psicon.h psi-0.10/src/psicon.h --- psi-0.10-orig/src/psicon.h 2006-01-14 01:19:13.000000000 +0000 +++ psi-0.10/src/psicon.h 2006-01-14 01:28:06.000000000 +0000 @@ -148,6 +148,8 @@ IconSelectPopup *iconSelectPopup() const; void processEvent(PsiEvent *); + QString lastStatusString; + signals: void quit(int); void accountAdded(PsiAccount *); diff --exclude='*orig' -Naur psi-0.10-orig/src/statusdlg.cpp psi-0.10/src/statusdlg.cpp --- psi-0.10-orig/src/statusdlg.cpp 2006-01-14 01:19:13.000000000 +0000 +++ psi-0.10/src/statusdlg.cpp 2006-01-14 01:28:06.000000000 +0000 @@ -82,6 +82,9 @@ ChatView *te; QComboBox *cb_type, *cb_preset; QCheckBox *save; + Jid j; + JidList jl; + setStatusEnum setStatusMode; int timeout; QTimer* timer; QString prefix; @@ -99,8 +102,9 @@ d->timeout = option.statusTimeout; d->prefix = tr("Set Status: All accounts"); + d->setStatusMode = setStatusForAccount; - init(); + init(); } StatusSetDlg::StatusSetDlg(PsiAccount *pa, const Status &s) @@ -115,8 +119,21 @@ d->timeout = option.statusTimeout; d->prefix = tr("Set Status: %1").arg(pa->name()); + d->setStatusMode = setStatusForAccount; - init(); + init(); +} + +void StatusSetDlg::setJid(const Jid &j) +{ + d->j = j; + d->setStatusMode = setStatusForJid; +} + +void StatusSetDlg::setJidList(const JidList &jl) +{ + d->jl = jl; + d->setStatusMode = setStatusForJidList; } void StatusSetDlg::init() @@ -317,8 +334,18 @@ // trim if((int)option.recentStatus.size() > option.recentStatusLimit) option.recentStatus.pop_back(); - - set(makeStatus(type, str)); + + switch(d->setStatusMode) { + case setStatusForAccount: + set(makeStatus(type, str)); + break; + case setStatusForJid: + setJid(d->j, makeStatus(type, str)); + break; + case setStatusForJidList: + setJidList(d->jl, makeStatus(type, str)); + break; + } close(); } diff --exclude='*orig' -Naur psi-0.10-orig/src/statusdlg.h psi-0.10/src/statusdlg.h --- psi-0.10-orig/src/statusdlg.h 2006-01-14 01:19:13.000000000 +0000 +++ psi-0.10/src/statusdlg.h 2006-01-14 01:28:06.000000000 +0000 @@ -23,9 +23,12 @@ #include #include"im.h" +#include"contactview.h" using namespace XMPP; +enum setStatusEnum {setStatusForAccount = 0, setStatusForJid, setStatusForJidList}; + class PsiCon; class PsiAccount; class UserListItem; @@ -43,6 +46,8 @@ public: StatusSetDlg(PsiCon *, const Status &); StatusSetDlg(PsiAccount *, const Status &); + void setJid(const Jid &); + void setJidList(const JidList &); ~StatusSetDlg(); protected: @@ -52,6 +57,8 @@ signals: void set(const Status &); + void setJid(const Jid &, const Status &); + void setJidList(const JidList &, const Status &); void cancelled(); private slots: