diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/iconsets/roster/default/icondef.xml psi-0.10-test1/iconsets/roster/default/icondef.xml --- psi-0.10-test1-orig/iconsets/roster/default/icondef.xml 2005-08-21 17:44:29.000000000 +0000 +++ psi-0.10-test1/iconsets/roster/default/icondef.xml 2005-08-26 00:09:03.000000000 +0000 @@ -61,6 +61,11 @@ status/error perr.png + + + psi/statInd + indicator.png + diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/iris/xmpp-im/client.cpp psi-0.10-test1/iris/xmpp-im/client.cpp --- psi-0.10-test1-orig/iris/xmpp-im/client.cpp 2005-08-21 17:44:28.000000000 +0000 +++ psi-0.10-test1/iris/xmpp-im/client.cpp 2005-08-26 00:09:03.000000000 +0000 @@ -792,10 +792,27 @@ // unavailable? remove the resource if(!s.isAvailable()) { - if(found) { - (*rit).setStatus(s); - debug(QString("Client: Removing resource from [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); - resourceUnavailable(j, *rit); + Resource r; + if(!found) { + //if (!s.status().isEmpty()) { + r = Resource(j.resource(), s); + i->resourceList() += r; + debug(QString("Client: Adding resource to [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); + resourceAvailable(j, r); + } + else { + (*rit).setStatus(s); + r = *rit; + debug(QString("Client: Updating resource to [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); + resourceAvailable(j, r); + } + + rit = i->resourceList().find(j.resource()); + found = (rit == i->resourceList().end()) ? false: true; + + if(found) { + (*rit).setStatus(s); + debug(QString("Client: Removing resource from [%1]: name=[%2]\n").arg(i->jid().full()).arg(j.resource())); resourceUnavailable(j, *rit); i->resourceList().remove(rit); i->setLastUnavailableStatus(s); } diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/chatdlg.cpp psi-0.10-test1/src/chatdlg.cpp --- psi-0.10-test1-orig/src/chatdlg.cpp 2005-08-21 17:44:40.000000000 +0000 +++ psi-0.10-test1/src/chatdlg.cpp 2005-08-26 00:09:03.000000000 +0000 @@ -522,8 +522,10 @@ u = ul.first(); if(rname.isEmpty()) { // use priority - if(!u->isAvailable()) + if(!u->isAvailable()){ status = STATUS_OFFLINE; + statusString = u->lastUnavailableStatus().status(); + } else { const UserResource &r = *u->userResourceList().priority(); status = makeSTATUS(r.status()); diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/common.h psi-0.10-test1/src/common.h --- psi-0.10-test1-orig/src/common.h 2005-08-25 22:15:09.000000000 +0000 +++ psi-0.10-test1/src/common.h 2005-08-26 00:08:47.000000000 +0000 @@ -153,6 +153,7 @@ bool clNewHeadings; bool outlineHeadings; + bool clStIndicator; bool clIconsAtTop; bool clTransportStatus; diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/contactview.cpp psi-0.10-test1/src/contactview.cpp --- psi-0.10-test1-orig/src/contactview.cpp 2005-08-25 23:56:57.000000000 +0000 +++ psi-0.10-test1/src/contactview.cpp 2005-08-26 00:09:03.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -2496,7 +2497,7 @@ v_selected = false; v_active = false; - icon = lastIcon = 0; + icon = lastIcon = indIcon = 0; } ~Private() { @@ -2562,7 +2563,7 @@ bool alerting; bool animatingNick; - Icon *icon, *lastIcon; + Icon *icon, *lastIcon, *indIcon; int animateNickX, animateNickColor; // nick animation }; @@ -2869,6 +2870,12 @@ } } } + + if( d->indIcon ){ + const QPixmap &ipix = d->indIcon->pixmap(); + const int y = (option.clIconsAtTop) ? 2 + pxh - ipix.height() : (h - ipix.height())/2; + p->drawPixmap((pix->width() - ipix.width())/2, y, ipix); + } } else if ( d->type == Group ) { QColorGroup xcg = cg; @@ -3248,12 +3255,13 @@ void ContactViewItem::setIcon(const Icon *icon, bool alert) { + /* needed by status indicator :o| if ( d->lastIcon == icon ) { return; // cause less flicker. but still have to run calltree valgring skin on psi while online (mblsha). } else d->lastIcon = (Icon *)icon; - + */ if ( d->icon ) { disconnect(d->icon, 0, this, 0 ); d->icon->stop(); @@ -3275,11 +3283,29 @@ pix = d->icon->pixmap(); } - setPixmap(0, pix); + iconUpdated(pix); } void ContactViewItem::iconUpdated(const QPixmap &pix) { + // set status indicator icon + if(d->u){ + bool ind = false; + if(!d->u->userResourceList().isEmpty() && option.clStIndicator) { + UserResourceList srl = d->u->userResourceList(); + + for(UserResourceList::ConstIterator rit = srl.begin(); rit != srl.end(); ++rit) + if(!(*rit).status().status().isEmpty()) { ind = true; break; } + + } + else if(!d->u->lastUnavailableStatus().status().isEmpty() && option.clStIndicator) + ind = true; + + if(ind) + d->indIcon = is->indicatorPtr(d->u->jid()); + else + d->indIcon = 0; + } setPixmap(0, pix); } diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/options/opt_roster.cpp psi-0.10-test1/src/options/opt_roster.cpp --- psi-0.10-test1-orig/src/options/opt_roster.cpp 2005-08-25 22:15:09.000000000 +0000 +++ psi-0.10-test1/src/options/opt_roster.cpp 2005-08-26 00:09:03.000000000 +0000 @@ -38,6 +38,8 @@ " Check this option if you'd rather invoke with a single-click.")); QWhatsThis::add(d->ck_scrollTo, tr("Makes Psi scroll the main window automatically so you can see new incoming events.")); + QWhatsThis::add(d->ck_statusIndicator, + tr("Displays an indicator by the contact name if the contact entered a descriptive text status line.")); QWhatsThis::add(d->ck_useStatusLinebreak, tr("Use new lines characters in shown statuses (shown statuses will be a bit bigger with this).")); @@ -61,6 +63,7 @@ opt->rosterAnim = d->ck_rosterAnim->isChecked(); opt->singleclick = d->ck_singleclick->isChecked(); opt->scrollTo = d->ck_scrollTo->isChecked(); + opt->clStIndicator = d->ck_statusIndicator->isChecked(); opt->clIconsAtTop = d->ck_iconsAtTop->isChecked(); opt->useStatusLinebreak = d->ck_useStatusLinebreak->isChecked(); opt->clTransportStatus = d->ck_transportStatus->isChecked(); @@ -79,6 +82,7 @@ d->ck_rosterAnim->setChecked( opt->rosterAnim ); d->ck_singleclick->setChecked( opt->singleclick ); d->ck_scrollTo->setChecked( opt->scrollTo ); + d->ck_statusIndicator->setChecked( opt->clStIndicator ); d->ck_iconsAtTop->setChecked( opt->clIconsAtTop ); d->ck_useStatusLinebreak->setChecked( opt->useStatusLinebreak ); d->ck_transportStatus->setChecked( opt->clTransportStatus ); diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/options/opt_roster-ui.ui psi-0.10-test1/src/options/opt_roster-ui.ui --- psi-0.10-test1-orig/src/options/opt_roster-ui.ui 2005-08-25 22:15:09.000000000 +0000 +++ psi-0.10-test1/src/options/opt_roster-ui.ui 2005-08-26 00:09:03.000000000 +0000 @@ -49,6 +49,14 @@ Scroll roster to contact on event + + + ck_statusIndicator + + + Show indicator for text statuses + + ck_iconsAtTop diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/psiiconset.cpp psi-0.10-test1/src/psiiconset.cpp --- psi-0.10-test1-orig/src/psiiconset.cpp 2005-08-21 17:44:32.000000000 +0000 +++ psi-0.10-test1/src/psiiconset.cpp 2005-08-26 00:09:03.000000000 +0000 @@ -518,6 +518,19 @@ return Icon(); } +Icon *PsiIconset::indicatorPtr(const XMPP::Jid &jid) +{ + return d->jid2icon(jid, "psi/statInd"); +} + +Icon PsiIconset::indicator(const XMPP::Jid &jid) +{ + Icon *icon = indicatorPtr(jid); + if ( icon ) + return *icon; + return Icon(); +} + Icon *PsiIconset::statusPtr(const XMPP::Jid &jid, int s) { return d->jid2icon(jid, status2name(s)); diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/psiiconset.h psi-0.10-test1/src/psiiconset.h --- psi-0.10-test1-orig/src/psiiconset.h 2005-08-21 17:44:27.000000000 +0000 +++ psi-0.10-test1/src/psiiconset.h 2005-08-26 00:09:03.000000000 +0000 @@ -61,9 +61,11 @@ // JID-enabled status functions Icon *statusPtr(const XMPP::Jid &, int); Icon *statusPtr(const XMPP::Jid &, const XMPP::Status &); + Icon *indicatorPtr(const XMPP::Jid &); Icon status(const XMPP::Jid &, int); Icon status(const XMPP::Jid &, const XMPP::Status &); + Icon indicator(const XMPP::Jid &); // functions to get status icon by transport name Icon *transportStatusPtr(QString name, int); diff --exclude=Makefile --exclude='*orig' -Naur psi-0.10-test1-orig/src/psi_profiles.cpp psi-0.10-test1/src/psi_profiles.cpp --- psi-0.10-test1-orig/src/psi_profiles.cpp 2005-08-25 22:15:09.000000000 +0000 +++ psi-0.10-test1/src/psi_profiles.cpp 2005-08-26 00:09:03.000000000 +0000 @@ -434,6 +434,7 @@ prefs.font[fStatusMes] = font.toString(); } + prefs.clStIndicator = TRUE; prefs.clIconsAtTop = TRUE; // calculate the small font size @@ -913,6 +914,7 @@ tag.appendChild(textTag(doc, "rosterAnim", prefs.rosterAnim)); tag.appendChild(textTag(doc, "singleclick", prefs.singleclick)); tag.appendChild(textTag(doc, "scrollTo", prefs.scrollTo)); + tag.appendChild(textTag(doc, "statusIndicator", prefs.clStIndicator)); tag.appendChild(textTag(doc, "contactIconsAtTop", prefs.clIconsAtTop)); tag.appendChild(textTag(doc, "newHeadings", prefs.clNewHeadings)); } @@ -1512,6 +1514,7 @@ readBoolEntry(tag, "rosterAnim", &prefs.rosterAnim); readBoolEntry(tag, "singleclick", &prefs.singleclick); readBoolEntry(tag, "scrollTo", &prefs.scrollTo); + readBoolEntry(tag, "statusIndicator", &prefs.clStIndicator); readBoolEntry(tag, "contactIconsAtTop", &prefs.clIconsAtTop); readBoolEntry(tag, "newHeadings", &prefs.clNewHeadings); }