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

List:       kde-commits
Subject:    KDE/kdelibs/kdeui/dialogs
From:       Teo Mrnjavac <teo () kde ! org>
Date:       2010-12-23 14:10:14
Message-ID: 20101223141014.4E8BB3E1F3 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1208860 by mrnjavac:

Fetch a person's OCS social network link icons through Attica.

 M  +103 -7    kaboutapplicationpersonmodel_p.cpp  
 M  +39 -19    kaboutapplicationpersonmodel_p.h  


--- trunk/KDE/kdelibs/kdeui/dialogs/kaboutapplicationpersonmodel_p.cpp \
#1208859:1208860 @@ -57,6 +57,11 @@
         profile.setHomepage( person.webAddress() );
         m_profileList.append( profile );
     }
+
+    m_ocsLinkIcons.insert( KAboutApplicationPersonProfileOcsLink::Other, KIcon( \
"applications-internet").pixmap( 16 ) ); +    m_ocsLinkIcons.insert( \
KAboutApplicationPersonProfileOcsLink::Blog, KIcon( "applications-internet" ).pixmap( \
16 ) ); +    m_ocsLinkIcons.insert( KAboutApplicationPersonProfileOcsLink::Homepage, \
KIcon( "applications-internet" ).pixmap( 16 ) ); +
 #ifdef HAVE_ATTICA
     connect( &m_providerManager, SIGNAL( defaultProvidersLoaded() ),
              SLOT( onProvidersLoaded() ) );
@@ -157,7 +162,10 @@
             KAboutApplicationPersonProfileOcsLink::Type type =
                     KAboutApplicationPersonProfileOcsLink::typeFromAttica( \
                atticaType );
             ocsLinks.append( KAboutApplicationPersonProfileOcsLink( type, KUrl( url \
) ) ); +            if( !m_ocsLinkIcons.contains( type ) && \
!m_ocsLinkIconUrls.contains( type ) ) { +                m_ocsLinkIconUrls.insert( \
type, p.extendedAttribute( QString( "homepageicon%1" ).arg( i ) ) );  }
+        }
 
         if( profile.homepage().isEmpty() ) {
             if( !p.homepage().isEmpty() )
@@ -181,12 +189,15 @@
             }
         }
         else
-            ocsLinks.insert( 0, KAboutApplicationPersonProfileOcsLink(
-                    KAboutApplicationPersonProfileOcsLink::typeFromAttica(
-                            p.extendedAttribute( "homepagetype" ) ),
-                    KUrl( p.homepage() ) ) );   //we prepend the main homepage
+        {
+            KAboutApplicationPersonProfileOcsLink::Type type =
+                KAboutApplicationPersonProfileOcsLink::typeFromAttica( \
p.extendedAttribute( "homepagetype" ) ); +            ocsLinks.insert( 0, \
KAboutApplicationPersonProfileOcsLink( type, KUrl( p.homepage() ) ) );   //we prepend \
the main homepage +            if( !m_ocsLinkIcons.contains( type ) && \
!m_ocsLinkIconUrls.contains( type ) ) { +                m_ocsLinkIconUrls.insert( \
type, p.extendedAttribute( "homepageicon" ) ); +            }
+        }
 
-
         profile.setOcsLinks( ocsLinks );
 
         if( !( p.city().isEmpty() && p.country().isEmpty() ) ) {
@@ -202,6 +213,7 @@
 
         if( p.avatarUrl().isEmpty() ) {
             emit dataChanged( index( personProfileListIndex ), index( \
personProfileListIndex ) ); +            fetchOcsLinkIcons( personProfileListIndex );
         }
         else {
             //TODO: Create a PixmapFromUrlJob in Attica which would use KIO::get if \
available @@ -245,12 +257,37 @@
 
     m_profileList.replace( personProfileListIndex, profile );
 
-    emit dataChanged( index( personProfileListIndex ), index( personProfileListIndex \
                ) );
-    emit layoutChanged();
     reply->deleteLater();
+
+    fetchOcsLinkIcons( personProfileListIndex );
 #endif //HAVE_ATTICA
 }
 
+void KAboutApplicationPersonModel::fetchOcsLinkIcons( int personProfileListIndex )
+{
+    KAboutApplicationPersonProfile profile = m_profileList.value( \
personProfileListIndex ); +    QList< KAboutApplicationPersonProfileOcsLink > \
ocsLinks = profile.ocsLinks(); +
+    KAboutApplicationPersonIconsJob *job =
+            new KAboutApplicationPersonIconsJob( this, personProfileListIndex );
+    connect( job, SIGNAL( finished( KAboutApplicationPersonIconsJob * ) ),
+             this, SLOT( onOcsLinksJobFinished( KAboutApplicationPersonIconsJob * ) \
) ); +    job->start();
+}
+
+void KAboutApplicationPersonModel::onOcsLinksJobFinished( \
KAboutApplicationPersonIconsJob *job )   //SLOT +{
+    int personProfileListIndex = job->personProfileListIndex();
+    KAboutApplicationPersonProfile profile = m_profileList.value( \
personProfileListIndex ); +
+    profile.setOcsLinks( job->ocsLinks() );
+
+    m_profileList.replace( personProfileListIndex, profile );
+
+    emit dataChanged( index( personProfileListIndex ), index( personProfileListIndex \
) ); +    emit layoutChanged();
+}
+
 KAboutApplicationPersonProfileOcsLink::Type \
KAboutApplicationPersonProfileOcsLink::typeFromAttica( const QString &atticaType )  {
     int index = -1;
@@ -306,6 +343,65 @@
     return QString();
 }
 
+KAboutApplicationPersonIconsJob::KAboutApplicationPersonIconsJob( \
KAboutApplicationPersonModel *model, +                                                \
int personProfileListIndex ) +    : QObject( model )
+    , m_personProfileListIndex( personProfileListIndex )
+    , m_model( model )
+{
+    m_manager = new QNetworkAccessManager( this );
+    connect( m_manager, SIGNAL( finished( QNetworkReply* ) ),
+             this, SLOT( onJobFinished( QNetworkReply* ) ) );
+
+    m_ocsLinks = model->m_profileList.value( personProfileListIndex ).ocsLinks();
+}
+
+void KAboutApplicationPersonIconsJob::start()
+{
+    getIcons( 0 );
+}
+
+void KAboutApplicationPersonIconsJob::getIcons( int i )
+{
+    for( QList< KAboutApplicationPersonProfileOcsLink >::iterator it = \
m_ocsLinks.begin() + i; +         it != m_ocsLinks.end(); ++it ) {
+        if( m_model->m_ocsLinkIcons.contains( it->type() ) ) {
+            it->setIcon( m_model->m_ocsLinkIcons.value( it->type() ) );
+        }
+        else if( m_model->m_ocsLinkIconUrls.contains( it->type() ) )
+        {
+            QNetworkReply *reply =
+                m_manager->get( QNetworkRequest( QUrl( \
m_model->m_ocsLinkIconUrls.value( it->type() ) ) ) ); +            \
reply->setProperty( "linkIndex", i ); +            return;
+        }
+        ++i;
+    }
+    emit finished( this );
+}
+
+void KAboutApplicationPersonIconsJob::onJobFinished( QNetworkReply *reply ) //SLOT
+{
+    int i = reply->property( "linkIndex" ).toInt();
+    KAboutApplicationPersonProfileOcsLink::Type type = m_ocsLinks.at( i ).type();
+
+    if( reply->error() != QNetworkReply::NoError ) {
+        kDebug() << "Could not fetch OCS link icon.";
+        reply->deleteLater();
+        getIcons( i + 1 );
+        return;
+    }
+    QByteArray data = reply->readAll();
+    QPixmap pixmap;
+    pixmap.loadFromData( data );
+
+    if( !pixmap.isNull() && !m_model->m_ocsLinkIcons.contains( type ) ) {
+        m_model->m_ocsLinkIcons.insert( type, pixmap );
+    }
+    reply->deleteLater();
+    getIcons( i );
+}
+
 } //namespace KDEPrivate
 
 #include "kaboutapplicationpersonmodel_p.moc"
--- trunk/KDE/kdelibs/kdeui/dialogs/kaboutapplicationpersonmodel_p.h #1208859:1208860
@@ -42,6 +42,7 @@
 {
 
 class KAboutApplicationPersonProfile;
+class KAboutApplicationPersonIconsJob;
 
 class KAboutApplicationPersonModel : public QAbstractListModel
 {
@@ -65,11 +66,17 @@
     void onProvidersLoaded();
     void onPersonJobFinished( Attica::BaseJob *job );
     void onAvatarJobFinished( QNetworkReply *reply );
+    void onOcsLinksJobFinished( KAboutApplicationPersonIconsJob *job );
 
 private:
+    void fetchOcsLinkIcons( int personProfileListIndex );
+
     QList< KAboutPerson > m_personList;
     QList< KAboutApplicationPersonProfile > m_profileList;
 
+    QMap< int, QString > m_ocsLinkIconUrls;
+    QMap< int, QPixmap > m_ocsLinkIcons;
+
     bool m_hasAvatarPixmaps;
 
 #ifdef HAVE_ATTICA
@@ -78,6 +85,8 @@
 #endif //HAVE_ATTICA
     QString m_providerUrl;
     QString m_providerName;
+
+    friend class KAboutApplicationPersonIconsJob;
 };
 
 //This list must be in sync with the one in \
KAboutApplicationPersonProfileOcsLink::prettyType() @@ -99,24 +108,6 @@
     { "Xing" },
     { "YouTube" } };
 
-static const char s_profileOcsLinkIconNames[][28] = {
-    { "applications-internet" }, //TODO: These are dummy icons, order real ones!
-    { "accessories-text-editor" },
-    { "align-horizontal-bottom-out" },
-    { "align-horizontal-center" },
-    { "align-horizontal-left-out" },
-    { "go-home" },
-    { "align-horizontal-right-out" },
-    { "align-horizontal-right" },
-    { "align-horizontal-left" },
-    { "align-horizontal-top-out" },
-    { "align-vertical-bottom-out" },
-    { "align-vertical-bottom" },
-    { "align-vertical-center" },
-    { "align-vertical-top-out" },
-    { "align-vertical-top" },
-    { "media-playback-start" } };
-
 class KAboutApplicationPersonProfileOcsLink
 {
 public:
@@ -146,11 +137,11 @@
     KAboutApplicationPersonProfileOcsLink( Type type, const KUrl &url )
         : m_type( type )
         , m_url( url )
-        , m_icon( KIcon( s_profileOcsLinkIconNames[ type ] ) )
     {}
 
     Type type() const { return m_type; }
     QString prettyType() const;
+    void setIcon( const QIcon &icon ) { m_icon = icon; }
     const QIcon &icon() const { return m_icon; }
     const KUrl & url() const { return m_url; }
 
@@ -211,6 +202,35 @@
     QList< KAboutApplicationPersonProfileOcsLink > m_ocsLinks;
 };
 
+class KAboutApplicationPersonIconsJob : public QObject
+{
+    Q_OBJECT
+public:
+    KAboutApplicationPersonIconsJob( KAboutApplicationPersonModel *model,
+                                    int personProfileListIndex );
+
+    void start();
+
+    int personProfileListIndex() const { return m_personProfileListIndex; }
+
+    const QList< KAboutApplicationPersonProfileOcsLink > & ocsLinks() const { return \
m_ocsLinks; } +
+signals:
+    void finished( KAboutApplicationPersonIconsJob *job);
+
+private Q_SLOTS:
+    void onJobFinished( QNetworkReply *reply );
+
+private:
+    void getIcons( int i );
+
+    int m_personProfileListIndex;
+    KAboutApplicationPersonModel *m_model;
+    QList< KAboutApplicationPersonProfileOcsLink > m_ocsLinks;
+
+    QNetworkAccessManager *m_manager;
+};
+
 } //namespace KDEPrivate
 
 Q_DECLARE_METATYPE( KDEPrivate::KAboutApplicationPersonProfile )


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

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