[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdenetwork/kopete/kopete/contactlist
From:       Roman Jarosz <kedgedev () centrum ! cz>
Date:       2008-10-31 23:59:59
Message-ID: 1225497599.159589.20603.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 878367 by rjarosz:

Fix idle notification in contact list.
This patch adds code which detects next idle change time and at that time updates the icons and text.
It also cleans some unnecessary UI updates.



 M  +94 -15    kopetemetacontactlvi.cpp  
 M  +3 -1      kopetemetacontactlvi.h  


--- trunk/KDE/kdenetwork/kopete/kopete/contactlist/kopetemetacontactlvi.cpp #878366:878367
@@ -177,8 +177,13 @@
 	int currentIconMode;
 
 	QList<Kopete::MessageEvent*> events;
+
+	QTimer *idleTimer;
+	QSet<Kopete::Contact*> idleContacts;
 };
 
+const unsigned int IDLE_INTERVAL = 10 * 60;
+
 KopeteMetaContactLVI::KopeteMetaContactLVI( Kopete::MetaContact *contact, KopeteGroupViewItem *parent )
 : ListView::Item( parent, contact )
 //: QObject( contact, "MetaContactLVI" ), K3ListViewItem( parent )
@@ -225,6 +230,8 @@
 {
 	d = new Private;
 
+	d->idleTimer = 0;
+
 	d->toolTipSource.reset( new ListView::MetaContactToolTipSource( m_metaContact ) );
 
 	m_oldStatus = m_metaContact->status();
@@ -239,7 +246,7 @@
 		SLOT( slotPhotoChanged() ) );
 
 	connect( m_metaContact, SIGNAL( onlineStatusChanged( Kopete::MetaContact *, \
                Kopete::OnlineStatus::StatusType ) ),
-		this, SLOT(slotIdleStateChanged(  ) ) );
+		SLOT(updateIdleState()) );
 
 	connect( m_metaContact, SIGNAL( contactStatusChanged( Kopete::Contact *, const Kopete::OnlineStatus & ) \
),  SLOT( slotContactStatusChanged( Kopete::Contact * ) ) );
@@ -257,7 +264,7 @@
 		SLOT( slotUpdateMetaContact() ) );
 
 	connect( m_metaContact, SIGNAL( contactIdleStateChanged( Kopete::Contact * ) ),
-		SLOT( slotIdleStateChanged( Kopete::Contact * ) ) );
+		SLOT(idleStateChanged()) );
 
 	connect( Kopete::AppearanceSettings::self(), SIGNAL( contactListAppearanceChanged() ),
 			 SLOT( slotConfigChanged() ) );
@@ -272,13 +279,14 @@
 	//if ( !mBlinkIcon )
 	//	mBlinkIcon = new QPixmap( KGlobal::iconLoader()->loadIcon( QLatin1String( "mail-unread" ), \
KIconLoader::Small ) );  
-	slotConfigChanged();  // this calls slotIdleStateChanged(), which sets up the constituent components, \
                spacing, fonts and indirectly, the contact icon
-	slotDisplayNameChanged();
-	updateContactIcons();
+	slotConfigChanged();  // this calls updateIdleState(), which sets up the constituent components, \
spacing, fonts and indirectly, the contact icon  }
 
 KopeteMetaContactLVI::~KopeteMetaContactLVI()
 {
+	if ( d->idleTimer )
+		d->idleTimer->stop();
+
 	delete d;
 	//if ( m_parentGroup )
 	//	m_parentGroup->refreshDisplayName();
@@ -509,7 +517,7 @@
 
 void KopeteMetaContactLVI::slotUpdateMetaContact()
 {
-	slotIdleStateChanged( 0 );
+	updateIdleState();
 	updateVisibility();
 
 	if ( m_parentGroup )
@@ -722,7 +730,7 @@
 
 	updateVisibility();
 	updateContactIcons();
-	slotIdleStateChanged( 0 );
+	updateIdleState();
 	if(d->nameText)
 		d->nameText->redraw();
 	if(d->extraText)
@@ -807,15 +815,18 @@
 	// update the display name
 	slotDisplayNameChanged();
 	slotPhotoChanged();
-	slotIdleStateChanged( 0 );
 
 	// finally, re-add all contacts so their icons appear. remove them first for consistency.
 	QList<Kopete::Contact*> contacts = m_metaContact->contacts();
 	for ( QList<Kopete::Contact*>::iterator it = contacts.begin(); it != contacts.end(); ++it )
 	{
-		slotContactRemoved( *it );
-		slotContactAdded( *it );
+		if ( Component *comp = contactComponent( *it ) )
+			delete comp;
+		
+		// Update status message
+		slotContactPropertyChanged( (*it), QLatin1String("statusMessage"), QVariant(), (*it)->property( \
QLatin1String("statusMessage") ).value() );  }
+
 	m_oldStatusIcon=d->metaContactIcon ? d->metaContactIcon->pixmap() : QPixmap();
 	if( mBlinkTimer->isActive() )
 		m_originalBlinkIcon=m_oldStatusIcon;
@@ -884,8 +895,12 @@
 			const QVariant &, const QVariant & ) ) );
 	connect( c->account() , SIGNAL( colorChanged(const QColor& ) ) , this, SLOT( updateContactIcons() ) );
 
-	updateContactIcon( c );
+	if ( IDLE_INTERVAL <= c->idleTime() )
+		d->idleContacts.insert( c );
 
+	updateIdleState( c );
+	resetIdleTimeout();
+
 	slotContactPropertyChanged( c, QLatin1String("statusMessage"),
 		QVariant(), c->property( QLatin1String("statusMessage") ).value() );
 }
@@ -903,6 +918,10 @@
 
 	slotContactPropertyChanged( c, QLatin1String("statusMessage"),
 		c->property( QLatin1String("statusMessage") ).value(), QVariant() );
+	
+	d->idleContacts.remove( c );
+	updateIdleState();
+	resetIdleTimeout();
 }
 
 void KopeteMetaContactLVI::updateContactIcons()
@@ -1003,9 +1022,71 @@
 	return true;
 }
 
-void KopeteMetaContactLVI::slotIdleStateChanged( Kopete::Contact *c )
+void KopeteMetaContactLVI::resetIdleTimeout()
 {
-	bool doWeHaveToGrayThatContact = Kopete::AppearanceSettings::self()->greyIdleMetaContacts() && ( \
m_metaContact->idleTime() >= 10 * 60 ); +	unsigned long int firstIdleTimeout = 0;
+
+	// Find nearest change interval
+	QList<Kopete::Contact*> contacts = m_metaContact->contacts();
+	for ( QList<Kopete::Contact*>::iterator it = contacts.begin(); it != contacts.end(); ++it )
+	{
+		unsigned long int idleTime = (*it)->idleTime();
+		if ( 0 < idleTime && idleTime < IDLE_INTERVAL && (firstIdleTimeout > idleTime || firstIdleTimeout == \
0) ) +			firstIdleTimeout = idleTime;
+	}
+
+	if ( firstIdleTimeout > 0 )
+	{
+		// Setup timer which will update contact icon
+		if ( !d->idleTimer )
+		{
+			d->idleTimer = new QTimer( this );
+			connect( d->idleTimer, SIGNAL(timeout()), this, SLOT(idleStateChanged()) );
+		}
+		d->idleTimer->start( 1000 * (IDLE_INTERVAL - firstIdleTimeout) );
+	}
+	else if ( d->idleTimer )
+	{
+		d->idleTimer->stop();
+		d->idleTimer->deleteLater();
+		d->idleTimer = 0;
+	}
+}
+
+void KopeteMetaContactLVI::idleStateChanged()
+{
+	bool idleUpdated = false;
+
+	QList<Kopete::Contact*> contacts = m_metaContact->contacts();
+	for ( QList<Kopete::Contact*>::iterator it = contacts.begin(); it != contacts.end(); ++it )
+	{
+		unsigned long int idleTime = (*it)->idleTime();
+		bool isIdleOld = d->idleContacts.contains( *it );
+		bool isIdleNew = (IDLE_INTERVAL <= idleTime);
+
+		// Update contact if idle state has changed
+		if ( isIdleOld != isIdleNew )
+		{
+			if ( isIdleNew )
+				d->idleContacts.insert(*it);
+			else
+				d->idleContacts.remove(*it);
+
+			updateContactIcon( *it );
+			idleUpdated = true;
+		}
+	}
+
+	// If we have updated a contact then metaContact timeout has changed too.
+	if ( idleUpdated )
+		updateIdleState();
+
+	resetIdleTimeout();
+}
+
+void KopeteMetaContactLVI::updateIdleState( Kopete::Contact *c )
+{
+	bool doWeHaveToGrayThatContact = Kopete::AppearanceSettings::self()->greyIdleMetaContacts() && ( \
m_metaContact->idleTime() >= IDLE_INTERVAL );  if ( doWeHaveToGrayThatContact )
 	{
 		d->nameText->setColor( Kopete::AppearanceSettings::self()->idleContactColor() );
@@ -1038,8 +1119,6 @@
 	// if none was supplied, we only need to update the MC appearance
 	if ( c )
 		updateContactIcon( c );
-	else
-		return;
 }
 
 void KopeteMetaContactLVI::catchEvent( Kopete::MessageEvent *event )
--- trunk/KDE/kdenetwork/kopete/kopete/contactlist/kopetemetacontactlvi.h #878366:878367
@@ -139,7 +139,9 @@
 	void slotPhotoChanged();
 
 	void slotAddToNewGroup();
-	void slotIdleStateChanged( Kopete::Contact * =0L);
+	void resetIdleTimeout();
+	void idleStateChanged();
+	void updateIdleState( Kopete::Contact* = 0L );
 
 	void slotConfigChanged();
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic