[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