2009/7/5 Matt Rogers <ma...@kde.org>:
> On Sunday 05 July 2009 03:56:45 pm Raphael Kubo da Costa wrote:
>> 2009/7/5 Roman Jarosz <kedge...@gmail.com>:
>> > SVN commit 991636 by rjarosz:
>> >
>> > Bring back online/offline notifications .... were lost during model/view
>> > merge. BUG: 190658
>> >
>> >
>> >
>> > M +105 -2 kopetemetacontact.cpp
>> > M +2 -0 kopetemetacontact.h
>> > M +1 -0 kopetemetacontact_p.h
>>
>> Shouldn't this be backported despite some string additions, since it's
>> fixing a somewhat serious bug?
>>
>> > --- trunk/KDE/kdenetwork/kopete/libkopete/kopetemetacontact.cpp
>> > #991635:991636 @@ -21,6 +21,7 @@
>> > #include "kopetemetacontact.h"
>> > #include "kopetemetacontact_p.h"
>> >
>> > +#include <QTextDocument>
>> >
>> > #include <kabc/addressbook.h>
>> > #include <kabc/addressee.h>
>> > @@ -29,6 +30,7 @@
>> > #include <klocale.h>
>> > #include <kmessagebox.h>
>> > #include <kdeversion.h>
>> > +#include <knotification.h>
>> >
>> > #include "kabcpersistence.h"
>> > #include "kopetecontactlist.h"
>> > @@ -40,6 +42,8 @@
>> > #include "kopetegroup.h"
>> > #include "kopeteglobal.h"
>> > #include "kopeteuiglobal.h"
>> > +#include "kopetebehaviorsettings.h"
>> > +#include "kopeteemoticons.h"
>> >
>> > namespace Kopete {
>> >
>> > @@ -151,7 +155,6 @@
>> > }
>> > }
>> >
>> > -
>> > void MetaContact::removeContact(Contact *c, bool deleted)
>> > {
>> > if( !d->contacts.contains( c ) )
>> > @@ -433,7 +436,7 @@
>> > {
>> > Contact *c = it.next();
>> > unsigned long int i = c->idleTime();
>> > - if( c->isOnline() && i < time || time == 0 )
>> > + if( (c->isOnline() && i < time) || time == 0 )
>> > {
>> > time = i;
>> > }
>> > @@ -577,6 +580,9 @@
>> > {
>> > updateOnlineStatus();
>> > emit contactStatusChanged( c, status );
>> > +
>> > + if ( c != c->account()->myself() )
>> > + onlineStatusNotification( c );
>> > }
>> >
>> > void MetaContact::setDisplayName( const QString &name )
>> > @@ -1228,8 +1234,105 @@
>> > return d->contacts;
>> > }
>> >
>> > +void MetaContact::onlineStatusNotification( Kopete::Contact * c )
>> > +{
>> > + // comparing the status of the previous and new preferred contact
>> > is the determining factor in deciding to notify +
>> > Kopete::OnlineStatus newNotifyOnlineStatus;
>> >
>> > + Kopete::Contact * pc = preferredContact();
>> > + if ( pc )
>> > + newNotifyOnlineStatus = pc->onlineStatus();
>> > + else // the last child contact has gone offline or otherwise
>> > unreachable, so take the changed contact's online status +
>> > newNotifyOnlineStatus = c->onlineStatus();
>> >
>> > + // ensure we are not suppressing notifications, because
>> > connecting or disconnected + if (
>> > !c->account()->suppressStatusNotification() &&
>> > c->account()->isConnected() + &&
>> > c->account()->myself()->onlineStatus().status() !=
>> > OnlineStatus::Connecting + &&
>> > (Kopete::BehaviorSettings::self()->enableEventsWhileAway() ||
>> > !c->account()->isAway()) ) + {
>> > + // figure out what's happened
>> > + enum ChangeType { noChange, noEvent, signedIn,
>> > changedStatus, signedOut }; + ChangeType t = noChange;
>> > +
>> > + // first, exclude changes due to blocking or subscription
>> > changes at the protocol level + if (
>> > d->notifyOnlineStatus.status() == Kopete::OnlineStatus::Unknown ||
>> > newNotifyOnlineStatus.status() == Kopete::OnlineStatus::Unknown ) +
>> > {
>> > + t = noEvent; // This means the contact's changed
>> > from or to unknown - due to a protocol state change, not a contact state
>> > change + }
>> > + else
>> > + { // we're dealing with a genuine contact state change
>> > + if ( d->notifyOnlineStatus.status() ==
>> > Kopete::OnlineStatus::Offline ) + {
>> > + if ( newNotifyOnlineStatus.status() !=
>> > Kopete::OnlineStatus::Offline ) + {
>> > + t = signedIn; // contact has
>> > gone from offline to something else, it's a sign-in +
>> > }
>> > + }
>> > + else if ( d->notifyOnlineStatus.status() ==
>> > Kopete::OnlineStatus::Online + ||
>> > d->notifyOnlineStatus.status() == Kopete::OnlineStatus::Away +
>> > || d->notifyOnlineStatus.status() ==
>> > Kopete::OnlineStatus::Invisible) + {
>> > + if ( newNotifyOnlineStatus.status() ==
>> > Kopete::OnlineStatus::Offline ) + {
>> > + t = signedOut; // contact has
>> > gone from an online state to an offline state, it's a sign out +
>> > }
>> > + else if ( d->notifyOnlineStatus >
>> > newNotifyOnlineStatus || d->notifyOnlineStatus < newNotifyOnlineStatus )
>> > // operator!= is useless because it's an identity operator, not an
>> > equivalence operator + {
>> > + // contact has changed online
>> > states, it's a status change, + //
>> > and the preferredContact changed status, or there is a new
>> > preferredContacat + // so it's
>> > worth notifying + t =
>> > changedStatus;
>> > + }
>> > + }
>> > + else if ( d->notifyOnlineStatus !=
>> > newNotifyOnlineStatus ) + {
>> > + // catch-all for any other status change
>> > we don't know about + t = noEvent;
>> > + }
>> > + }
>> > +
>> > + // now issue the appropriate notification
>> > + KNotification *notify = 0;
>> > + switch ( t )
>> > + {
>> > + case noEvent:
>> > + case noChange:
>> > + break;
>> > + case signedIn:
>> > + notify = new KNotification(
>> > QString("kopete_contact_online"), Kopete::UI::Global::mainWidget() ); +
>> > notify->setActions( QStringList( i18nc("@action",
>> > "Chat") ) ); + break;
>> > + case changedStatus:
>> > + notify = new KNotification(
>> > QString("kopete_contact_status_change"), Kopete::UI::Global::mainWidget()
>> > ); + notify->setActions( QStringList(
>> > i18nc("@action", "Chat") ) ); + break;
>> > + case signedOut:
>> > + notify = new KNotification(
>> > QString("kopete_contact_offline"), Kopete::UI::Global::mainWidget() ); +
>> > break;
>> > + }
>> > +
>> > + if( notify )
>> > + {
>> > + QString text = i18n( "<qt><i>%1</i> is now
>> > %2.</qt>", +
>> > Kopete::Emoticons::parseEmoticons( Qt::escape( displayName() ) ), +
>> > Qt::escape(
>> > c->onlineStatus().description() ) ); +
>> > + notify->setText( text );
>> > + notify->setPixmap( QPixmap::fromImage(
>> > picture().image() ) ); + connect( notify,
>> > SIGNAL(activated(unsigned int)) , this, SLOT(execute()) ); +
>> > + notify->addContext( qMakePair(
>> > QString::fromLatin1("contact"), metaContactId().toString() ) ); +
>> > foreach( Kopete::Group *g , groups() )
>> > + {
>> > + notify->addContext( qMakePair(
>> > QString::fromLatin1("group") , QString::number( g->groupId() ) ) ); +
>> > }
>> > + notify->sendEvent();
>> > + }
>> > + }
>> > + d->notifyOnlineStatus = newNotifyOnlineStatus;
>> > +}
>> > +
>> > +
>> > } //END namespace Kopete
>> >
>> > #include "kopetemetacontact.moc"
>> > --- trunk/KDE/kdenetwork/kopete/libkopete/kopetemetacontact.h
>> > #991635:991636 @@ -606,6 +606,8 @@
>> > //QString nameFromContact( Kopete::Contact *c) const;
>> > //QString nameFromKABC( const QString &id ) const;
>> >
>> > + void onlineStatusNotification( Kopete::Contact * c );
>> > +
>> > private:
>> > class Private;
>> > Private * const d;
>> > --- trunk/KDE/kdenetwork/kopete/libkopete/kopetemetacontact_p.h
>> > #991635:991636 @@ -61,6 +61,7 @@
>> >
>> > OnlineStatus::StatusType onlineStatus;
>> > bool photoSyncedWithKABC;
>> > + OnlineStatus notifyOnlineStatus;
>> >
>> > // Used to set contact source at load.
>> > QString nameSourcePID, nameSourceAID, nameSourceCID;
>
> Only if the translators agree
Have they been contacted? Who should do that?
_______________________________________________
kopete-devel mailing list
kopete-devel@kde.org
https://mail.kde.org/mailman/listinfo/kopete-devel