diff --git a/src/kaboutapplicationpersonlistdelegate_p.cpp b/src/kaboutapplicationpersonlistdelegate_p.cpp index 155734d..678f914 100644 --- a/src/kaboutapplicationpersonlistdelegate_p.cpp +++ b/src/kaboutapplicationpersonlistdelegate_p.cpp @@ -1,306 +1,306 @@ /* This file is part of the KDE libraries Copyright (C) 2010 Teo Mrnjavac This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ #include "kaboutapplicationpersonlistdelegate_p.h" #include "kaboutapplicationpersonmodel_p.h" #include "kaboutapplicationpersonlistview_p.h" #include "ktoolbar.h" #include #include #include #include #include #include #include namespace KDEPrivate { enum { AVATAR_HEIGHT = 50, AVATAR_WIDTH = 50, MAIN_LINKS_HEIGHT = 32, SOCIAL_LINKS_HEIGHT = 26, MAX_SOCIAL_LINKS = 9 }; KAboutApplicationPersonListDelegate::KAboutApplicationPersonListDelegate( QAbstractItemView *itemView, QObject *parent) : KWidgetItemDelegate(itemView, parent) { } QList< QWidget *> KAboutApplicationPersonListDelegate::createItemWidgets(const QModelIndex &index) const { Q_UNUSED(index); QList< QWidget *> list; QLabel *textLabel = new QLabel(itemView()); list.append(textLabel); KToolBar *mainLinks = new KToolBar(itemView(), false, false); - QAction *emailAction = new QAction(QIcon::fromTheme(QStringLiteral("internet-mail")), + QAction *emailAction = new QAction(QIcon::fromTheme(QStringLiteral("mail-send")), i18nc("Action to send an email to a contributor", "Email contributor"), mainLinks); emailAction->setVisible(false); mainLinks->addAction(emailAction); - QAction *homepageAction = new QAction(QIcon::fromTheme(QStringLiteral("applications-internet")), + QAction *homepageAction = new QAction(QIcon::fromTheme(QStringLiteral("internet-services")), i18n("Visit contributor's homepage"), mainLinks); homepageAction->setVisible(false); mainLinks->addAction(homepageAction); QAction *visitProfileAction = new QAction(QIcon::fromTheme(QStringLiteral("get-hot-new-stuff")), QString(), mainLinks); visitProfileAction->setVisible(false); mainLinks->addAction(visitProfileAction); list.append(mainLinks); KToolBar *socialLinks = new KToolBar(itemView(), false, false); for (int i = 0; i < MAX_SOCIAL_LINKS; ++i) { QAction *action = new QAction(QIcon::fromTheme(QStringLiteral("applications-internet")), QString(), socialLinks); action->setVisible(false); socialLinks->addAction(action); } list.append(socialLinks); connect(mainLinks, &QToolBar::actionTriggered, this, &KAboutApplicationPersonListDelegate::launchUrl); connect(socialLinks, &QToolBar::actionTriggered, this, &KAboutApplicationPersonListDelegate::launchUrl); return list; } void KAboutApplicationPersonListDelegate::updateItemWidgets(const QList widgets, const QStyleOptionViewItem &option, const QPersistentModelIndex &index) const { const int margin = option.fontMetrics.height() / 2; KAboutApplicationPersonProfile profile = index.data().value< KAboutApplicationPersonProfile >(); QRect wRect = widgetsRect(option, index); //Let's fill in the text first... QLabel *label = qobject_cast< QLabel * >(widgets.at(TextLabel)); label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QString text = buildTextForProfile(profile); label->move(wRect.left(), wRect.top()); label->resize(wRect.width(), heightForString(text, wRect.width() - margin, option) + margin); label->setWordWrap(true); label->setContentsMargins(0, 0, 0, 0); label->setAlignment(Qt::AlignBottom | Qt::AlignLeft); label->setForegroundRole(QPalette::WindowText); label->setText(text); //And now we fill in the main links (email + homepage + OCS profile)... KToolBar *mainLinks = qobject_cast< KToolBar * >(widgets.at(MainLinks)); mainLinks->setIconSize(QSize(22, 22)); mainLinks->setContentsMargins(0, 0, 0, 0); mainLinks->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QAction *action; if (!profile.email().isEmpty()) { action = mainLinks->actions().at(EmailAction); action->setToolTip(i18nc("Action to send an email to a contributor", "Email contributor\n%1", profile.email())); action->setData(QStringLiteral("mailto:%1").arg(profile.email())); action->setVisible(true); } if (!profile.homepage().isEmpty()) { action = mainLinks->actions().at(HomepageAction); action->setToolTip(i18n("Visit contributor's homepage\n%1", profile.homepage().toString())); action->setData(profile.homepage().toString()); action->setVisible(true); } if (!profile.ocsProfileUrl().isEmpty()) { action = mainLinks->actions().at(VisitProfileAction); KAboutApplicationPersonModel *model = qobject_cast< KAboutApplicationPersonModel * >(itemView()->model()); action->setToolTip(i18n("Visit contributor's profile on %1\n%2", model->providerName(), profile.ocsProfileUrl())); action->setData(profile.ocsProfileUrl()); action->setVisible(true); } mainLinks->resize(QSize(mainLinks->sizeHint().width(), MAIN_LINKS_HEIGHT)); mainLinks->move(wRect.left(), wRect.top() + label->height()); //Finally, the social links... KToolBar *socialLinks = qobject_cast< KToolBar * >(widgets.at(SocialLinks)); socialLinks->setIconSize(QSize(16, 16)); socialLinks->setContentsMargins(0, 0, 0, 0); socialLinks->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); int currentSocialLinkAction = 0; Q_FOREACH (KAboutApplicationPersonProfileOcsLink link, profile.ocsLinks()) { if (!profile.homepage().isEmpty() && profile.homepage() == link.url()) { continue; //We skip it if it's the same as the homepage from KAboutData } action = socialLinks->actions().at(currentSocialLinkAction); if (link.type() == KAboutApplicationPersonProfileOcsLink::Other) { action->setToolTip(i18n("Visit contributor's page\n%1", link.url().toString())); } else if (link.type() == KAboutApplicationPersonProfileOcsLink::Blog) { action->setToolTip(i18n("Visit contributor's blog\n%1", link.url().toString())); } else if (link.type() == KAboutApplicationPersonProfileOcsLink::Homepage) { action->setToolTip(i18n("Visit contributor's homepage\n%1", link.url().toString())); } else { action->setToolTip(i18n("Visit contributor's profile on %1\n%2", link.prettyType(), link.url().toString())); } action->setIcon(link.icon()); action->setData(link.url().toString()); action->setVisible(true); ++currentSocialLinkAction; if (currentSocialLinkAction > MAX_SOCIAL_LINKS - 1) { break; } } socialLinks->resize(QSize(socialLinks->sizeHint().width(), SOCIAL_LINKS_HEIGHT)); socialLinks->move(wRect.left() + mainLinks->width(), wRect.top() + label->height() + (MAIN_LINKS_HEIGHT - SOCIAL_LINKS_HEIGHT) / 2); itemView()->reset(); } QSize KAboutApplicationPersonListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { KAboutApplicationPersonProfile profile = index.data().value< KAboutApplicationPersonProfile >(); bool hasAvatar = !profile.avatar().isNull(); int margin = option.fontMetrics.height() / 2; int height = hasAvatar ? qMax(widgetsRect(option, index).height(), AVATAR_HEIGHT + 2 * margin) : widgetsRect(option, index).height(); QSize metrics(option.fontMetrics.height() * 7, height); return metrics; } void KAboutApplicationPersonListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { int margin = option.fontMetrics.height() / 2; QStyle *style = QApplication::style(); style->drawPrimitive(QStyle::PE_Widget, &option, painter, nullptr); const KAboutApplicationPersonModel *model = qobject_cast< const KAboutApplicationPersonModel * >(index.model()); if (model->hasAvatarPixmaps()) { int height = qMax(widgetsRect(option, index).height(), AVATAR_HEIGHT + 2 * margin); QPoint point(option.rect.left() + 2 * margin, option.rect.top() + ((height - AVATAR_HEIGHT) / 2)); KAboutApplicationPersonProfile profile = index.data().value< KAboutApplicationPersonProfile >(); if (!profile.avatar().isNull()) { QPixmap pixmap = profile.avatar(); point.setX((AVATAR_WIDTH - pixmap.width()) / 2 + 5); point.setY(option.rect.top() + ((height - pixmap.height()) / 2)); painter->drawPixmap(point, pixmap); QPoint framePoint(point.x() - 5, point.y() - 5); QPixmap framePixmap(QStringLiteral(":/kxmlgui5/thumb_frame.png")); painter->drawPixmap(framePoint, framePixmap.scaled(pixmap.width() + 10, pixmap.height() + 10)); } } } void KAboutApplicationPersonListDelegate::launchUrl(QAction *action) const { QString url = action->data().toString(); if (!url.isEmpty()) { QDesktopServices::openUrl(QUrl(url)); } } int KAboutApplicationPersonListDelegate::heightForString(const QString &string, int lineWidth, const QStyleOptionViewItem &option) const { QFontMetrics fm = option.fontMetrics; QRect boundingRect = fm.boundingRect(0, 0, lineWidth, 9999, Qt::AlignLeft | Qt::AlignBottom | Qt::TextWordWrap, string); return boundingRect.height(); } QString KAboutApplicationPersonListDelegate::buildTextForProfile(const KAboutApplicationPersonProfile &profile) const { QString text; text += QStringLiteral(""); text += i18nc("@item Contributor name in about dialog.", "%1", profile.name()); text += QStringLiteral(""); if (!profile.task().isEmpty()) { text += QStringLiteral("\n
"); text += profile.task(); text += QStringLiteral(""); } if (!profile.location().isEmpty()) { text += QStringLiteral("\n
"); text += profile.location(); } return text; } QRect KAboutApplicationPersonListDelegate::widgetsRect(const QStyleOptionViewItem &option, const QPersistentModelIndex &index) const { KAboutApplicationPersonProfile profile = index.data().value< KAboutApplicationPersonProfile >(); int margin = option.fontMetrics.height() / 2; QRect widgetsRect; if (qobject_cast< const KAboutApplicationPersonModel * >(index.model())->hasAvatarPixmaps()) { widgetsRect = QRect(option.rect.left() + AVATAR_WIDTH + 3 * margin, margin / 2, option.rect.width() - AVATAR_WIDTH - 4 * margin, 0); } else { widgetsRect = QRect(option.rect.left() + margin, margin / 2, option.rect.width() - 2 * margin, 0); } int textHeight = heightForString(buildTextForProfile(profile), widgetsRect.width() - margin, option); widgetsRect.setHeight(textHeight + MAIN_LINKS_HEIGHT + 1.5 * margin); return widgetsRect; } } //namespace KDEPrivate diff --git a/src/kaboutapplicationpersonmodel_p.cpp b/src/kaboutapplicationpersonmodel_p.cpp index 66b9050..a2e7edd 100644 --- a/src/kaboutapplicationpersonmodel_p.cpp +++ b/src/kaboutapplicationpersonmodel_p.cpp @@ -1,404 +1,404 @@ /* This file is part of the KDE libraries Copyright (C) 2010 Teo Mrnjavac This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ #include "kaboutapplicationpersonmodel_p.h" #include "debug.h" #if HAVE_ATTICA #include #endif //HAVE_ATTICA #include #include #include #include namespace KDEPrivate { KAboutApplicationPersonModel::KAboutApplicationPersonModel(const QList< KAboutPerson > &personList, const QString &providerUrl, QObject *parent) : QAbstractListModel(parent) , m_personList(personList) , m_hasAvatarPixmaps(false) , m_providerUrl(providerUrl) { if (m_providerUrl.isEmpty()) { m_providerUrl = QStringLiteral("https://api.kde-look.org/ocs/v1/"); } bool hasOcsUsernames = false; for (QList< KAboutPerson >::const_iterator it = personList.constBegin(); it != personList.constEnd(); ++it) { KAboutPerson person = *it; if (!person.ocsUsername().isEmpty()) { hasOcsUsernames = true; } KAboutApplicationPersonProfile profile = KAboutApplicationPersonProfile(person.name(), person.task(), person.emailAddress(), person.ocsUsername()); profile.setHomepage(QUrl(person.webAddress())); m_profileList.append(profile); } - m_ocsLinkIcons.insert(KAboutApplicationPersonProfileOcsLink::Other, QIcon::fromTheme(QStringLiteral("applications-internet")).pixmap(16)); - m_ocsLinkIcons.insert(KAboutApplicationPersonProfileOcsLink::Blog, QIcon::fromTheme(QStringLiteral("applications-internet")).pixmap(16)); - m_ocsLinkIcons.insert(KAboutApplicationPersonProfileOcsLink::Homepage, QIcon::fromTheme(QStringLiteral("applications-internet")).pixmap(16)); + m_ocsLinkIcons.insert(KAboutApplicationPersonProfileOcsLink::Other, QIcon::fromTheme(QStringLiteral("internet-services")).pixmap(16)); + m_ocsLinkIcons.insert(KAboutApplicationPersonProfileOcsLink::Blog, QIcon::fromTheme(QStringLiteral("internet-services")).pixmap(16)); + m_ocsLinkIcons.insert(KAboutApplicationPersonProfileOcsLink::Homepage, QIcon::fromTheme(QStringLiteral("internet-servicesinternet-services")).pixmap(16)); #if HAVE_ATTICA connect(&m_providerManager, SIGNAL(defaultProvidersLoaded()), SLOT(onProvidersLoaded())); if (hasOcsUsernames) { m_providerManager.loadDefaultProviders(); } #endif //HAVE_ATTICA } int KAboutApplicationPersonModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent) return m_personList.count(); } QVariant KAboutApplicationPersonModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { qCWarning(DEBUG_KXMLGUI) << "ERROR: invalid index"; return QVariant(); } if (index.row() >= rowCount()) { qCWarning(DEBUG_KXMLGUI) << "ERROR: index out of bounds"; return QVariant(); } if (role == Qt::DisplayRole) { // qCDebug(DEBUG_KXMLGUI) << "Spitting data for name " << m_profileList.at( index.row() ).name(); QVariant var; var.setValue(m_profileList.at(index.row())); return var; } else { return QVariant(); } } Qt::ItemFlags KAboutApplicationPersonModel::flags(const QModelIndex &index) const { if (index.isValid()) { return Qt::ItemIsEnabled; } return QAbstractListModel::flags(index) | Qt::ItemIsEditable; } void KAboutApplicationPersonModel::onProvidersLoaded() //SLOT { #if HAVE_ATTICA if (!m_providerManager.providers().isEmpty()) { m_provider = m_providerManager.providerByUrl(QUrl(m_providerUrl)); if (!m_provider.isValid()) { // qCDebug(DEBUG_KXMLGUI) << "OCS Provider error: could not find opendesktop.org provider."; return; } m_providerName = m_provider.name(); int i = 0; for (QList< KAboutApplicationPersonProfile >::const_iterator it = m_profileList.constBegin(); it != m_profileList.constEnd(); ++it) { KAboutApplicationPersonProfile profile = *it; if (!profile.ocsUsername().isEmpty()) { Attica::ItemJob< Attica::Person > *job = m_provider.requestPerson(profile.ocsUsername()); connect(job, SIGNAL(finished(Attica::BaseJob*)), this, SLOT(onPersonJobFinished(Attica::BaseJob*))); job->setProperty("personProfile", i); job->start(); } ++i; } } #endif //HAVE_ATTICA } void KAboutApplicationPersonModel::onPersonJobFinished(Attica::BaseJob *job) //SLOT { #if ! HAVE_ATTICA Q_UNUSED(job) #endif //HAVE_ATTICA #if HAVE_ATTICA Attica::ItemJob< Attica::Person > *personJob = static_cast< Attica::ItemJob< Attica::Person > * >(job); if (personJob->metadata().error() == Attica::Metadata::NoError) { Attica::Person p = personJob->result(); int personProfileListIndex = personJob->property("personProfile").toInt(); KAboutApplicationPersonProfile profile = m_profileList.value(personProfileListIndex); //Let's set up OCS links... QList< KAboutApplicationPersonProfileOcsLink > ocsLinks; for (int i = 2; i <= 10; ++i) { //OCS supports 10 total homepages as of 2/oct/2009 //This starts at 2 because the first homepage is //just "homepage" in the OCS API and is exposed by //Attica simply through Person::homepage() QString atticaType = p.extendedAttribute(QStringLiteral("homepagetype%1").arg(i)); QString url = p.extendedAttribute(QStringLiteral("homepage%1").arg(i)); if (url.isEmpty()) { continue; } KAboutApplicationPersonProfileOcsLink::Type type = KAboutApplicationPersonProfileOcsLink::typeFromAttica(atticaType); ocsLinks.append(KAboutApplicationPersonProfileOcsLink(type, QUrl(url))); if (!m_ocsLinkIcons.contains(type) && !m_ocsLinkIconUrls.contains(type)) { m_ocsLinkIconUrls.insert(type, p.extendedAttribute(QStringLiteral("homepageicon%1").arg(i))); } } if (profile.homepage().isEmpty()) { if (!p.homepage().isEmpty()) { profile.setHomepage(QUrl(p.homepage())); } else { if (!ocsLinks.isEmpty()) { QList< KAboutApplicationPersonProfileOcsLink >::iterator toUse = ocsLinks.begin(); for (QList< KAboutApplicationPersonProfileOcsLink >::iterator it = ocsLinks.begin(); it != ocsLinks.end(); ++it) { KAboutApplicationPersonProfileOcsLink link = *it; if (link.type() == KAboutApplicationPersonProfileOcsLink::Blog || link.type() == KAboutApplicationPersonProfileOcsLink::Homepage || link.type() == KAboutApplicationPersonProfileOcsLink::Other) { toUse = it; break; } } profile.setHomepage(toUse->url()); ocsLinks.erase(toUse); } } } else { KAboutApplicationPersonProfileOcsLink::Type type = KAboutApplicationPersonProfileOcsLink::typeFromAttica(p.extendedAttribute(QStringLiteral("homepagetype"))); ocsLinks.insert(0, KAboutApplicationPersonProfileOcsLink(type, QUrl(p.homepage()))); //we prepend the main homepage if (!m_ocsLinkIcons.contains(type) && !m_ocsLinkIconUrls.contains(type)) { m_ocsLinkIconUrls.insert(type, p.extendedAttribute(QStringLiteral("homepageicon"))); } } profile.setOcsLinks(ocsLinks); if (!(p.city().isEmpty() && p.country().isEmpty())) { if (!p.city().isEmpty()) { profile.setLocation(i18nc("City, Country", "%1, %2", p.city(), p.country())); } else { profile.setLocation(p.country()); } } profile.setOcsProfileUrl(p.extendedAttribute(QStringLiteral("profilepage"))); m_profileList.replace(personProfileListIndex, profile); 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 // and QNAM otherwise. - Teo 30/10/2010 QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onAvatarJobFinished(QNetworkReply*))); manager->get(QNetworkRequest(p.avatarUrl())); manager->setProperty("personProfile", personProfileListIndex); } } //else qCDebug(DEBUG_KXMLGUI) << "Could not fetch OCS person info."; #endif //HAVE_ATTICA } void KAboutApplicationPersonModel::onAvatarJobFinished(QNetworkReply *reply) //SLOT { #if ! HAVE_ATTICA Q_UNUSED(reply) #endif //HAVE_ATTICA #if HAVE_ATTICA QNetworkAccessManager *manager = reply->manager(); int personProfileListIndex = manager->property("personProfile").toInt(); if (reply->error() != QNetworkReply::NoError) { //qCDebug(DEBUG_KXMLGUI) << "Could not fetch OCS person avatar."; emit dataChanged(index(personProfileListIndex), index(personProfileListIndex)); return; } QByteArray data = reply->readAll(); QPixmap pixmap; pixmap.loadFromData(data); KAboutApplicationPersonProfile profile = m_profileList.value(personProfileListIndex); if (!pixmap.isNull()) { profile.setAvatar(pixmap); m_hasAvatarPixmaps = true; } m_profileList.replace(personProfileListIndex, profile); reply->deleteLater(); fetchOcsLinkIcons(personProfileListIndex); #endif //HAVE_ATTICA } void KAboutApplicationPersonModel::fetchOcsLinkIcons(int personProfileListIndex) { 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; for (int i = 0; i < NUM_ATTICA_LINK_TYPES; ++i) { if (atticaType == QLatin1String(s_personOcsLinkAtticaTypes[i])) { index = i; break; } } if (index == -1) { return Other; } else { return static_cast< Type >(index); } } QString KAboutApplicationPersonProfileOcsLink::prettyType() const { //This can't be static like the other lists because of i18n switch (m_type) { case Other: return i18nc("A generic social network or homepage link of an unlisted type.", "Other"); case Blog: return i18nc("A type of link.", "Blog"); case Delicious: return QStringLiteral("Delicious"); case Digg: return QStringLiteral("Digg"); case Facebook: return QStringLiteral("Facebook"); case Homepage: return i18nc("A type of link.", "Homepage"); case Identica: return QStringLiteral("Identi.ca"); case LibreFm: return QStringLiteral("Libre.fm"); case LinkedIn: return QStringLiteral("LinkedIn"); case MySpace: return QStringLiteral("MySpace"); case Reddit: return QStringLiteral("Reddit"); case StackOverflow: return QStringLiteral("Stack Overflow"); case Twitter: return QStringLiteral("Twitter"); case Wikipedia: return QStringLiteral("Wikipedia"); case Xing: return QStringLiteral("Xing"); case YouTube: return QStringLiteral("YouTube"); case NUM_ATTICA_LINK_TYPES: // silence compiler warning break; } 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) { //qCDebug(DEBUG_KXMLGUI) << "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