Warning, file /frameworks/kpeople/src/widgets/persondetailsview.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2011 Martin Klapetek <mklapetek@kde.org>
0003     SPDX-FileCopyrightText: 2013 David Edmundson <davidedmundsonk@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 
0008 #include "persondetailsview.h"
0009 
0010 #include "kpeople_widgets_debug.h"
0011 
0012 #include "abstractfieldwidgetfactory.h"
0013 #include "emaildetailswidget.h"
0014 #include "global.h"
0015 
0016 #include <KPluginFactory>
0017 #include <KPluginMetaData>
0018 
0019 #include <QFormLayout>
0020 #include <QIcon>
0021 #include <QLabel>
0022 #include <QList>
0023 #include <QVBoxLayout>
0024 
0025 #include "ui_person-details-presentation.h"
0026 
0027 namespace KPeople
0028 {
0029 class PersonDetailsViewPrivate
0030 {
0031 public:
0032     PersonData *m_person;
0033     Ui::PersonDetailsPresentation *m_personDetailsPresentation;
0034     QWidget *m_mainWidget;
0035     QList<AbstractFieldWidgetFactory *> m_plugins;
0036 };
0037 }
0038 
0039 using namespace KPeople;
0040 
0041 class CoreFieldsPlugin : public AbstractFieldWidgetFactory
0042 {
0043 public:
0044     CoreFieldsPlugin(const QString &field);
0045     ~CoreFieldsPlugin() override;
0046     QString label() const override;
0047     int sortWeight() const override;
0048     QWidget *createDetailsWidget(const PersonData &person, QWidget *parent) const override;
0049 
0050 private:
0051     QString m_field;
0052 };
0053 
0054 CoreFieldsPlugin::CoreFieldsPlugin(const QString &field)
0055     : m_field(field)
0056 {
0057 }
0058 
0059 CoreFieldsPlugin::~CoreFieldsPlugin()
0060 {
0061 }
0062 
0063 QString CoreFieldsPlugin::label() const
0064 {
0065 #ifdef __GNUC__
0066 #warning fixme, should be made user-visible somehow
0067 #endif
0068     return m_field;
0069 }
0070 
0071 int CoreFieldsPlugin::sortWeight() const
0072 {
0073     return 1;
0074 }
0075 
0076 QWidget *CoreFieldsPlugin::createDetailsWidget(const PersonData &person, QWidget *parent) const
0077 {
0078     //  we have a plugin specific for e-mails.
0079     if (m_field == QLatin1String("email")) {
0080         return nullptr;
0081     }
0082 
0083     QString text = person.contactCustomProperty(m_field).toString();
0084     if (text.isEmpty()) {
0085         return nullptr;
0086     }
0087     return new QLabel(text, parent);
0088 }
0089 
0090 PersonDetailsView::PersonDetailsView(QWidget *parent)
0091     : QWidget(parent)
0092     , d_ptr(new PersonDetailsViewPrivate())
0093 {
0094     Q_D(PersonDetailsView);
0095 
0096     auto *layout = new QVBoxLayout(this);
0097     d->m_mainWidget = new QWidget(this);
0098     d->m_person = nullptr;
0099 
0100     QWidget *details = new QWidget();
0101     d->m_personDetailsPresentation = new Ui::PersonDetailsPresentation();
0102     d->m_personDetailsPresentation->setupUi(details);
0103     layout->addWidget(details);
0104     layout->addWidget(d->m_mainWidget);
0105     layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Fixed, QSizePolicy::Expanding));
0106 
0107     // create plugins
0108 #ifdef __GNUC__
0109 #warning figure out a way to list properties
0110 #endif
0111     const QStringList fields{QStringLiteral("name"), QStringLiteral("all-email")};
0112     for (const QString &field : fields) {
0113         d->m_plugins << new CoreFieldsPlugin(field);
0114     }
0115 
0116     d->m_plugins << new EmailFieldsPlugin();
0117 
0118     // load every KPeopleWidgets Plugin
0119     const QVector<KPluginMetaData> personPluginList = KPluginMetaData::findPlugins(QStringLiteral("kpeople/widgets"));
0120 
0121     for (const KPluginMetaData &data : personPluginList) {
0122         auto fieldWidgetFactoryResult = KPluginFactory::instantiatePlugin<AbstractFieldWidgetFactory>(data);
0123         Q_ASSERT_X(fieldWidgetFactoryResult, Q_FUNC_INFO, qPrintable(fieldWidgetFactoryResult.errorText));
0124         d->m_plugins << fieldWidgetFactoryResult.plugin;
0125     }
0126 
0127     // TODO Sort plugins
0128 }
0129 
0130 PersonDetailsView::~PersonDetailsView()
0131 {
0132     delete d_ptr;
0133 }
0134 
0135 void PersonDetailsView::setPerson(PersonData *person)
0136 {
0137     Q_D(PersonDetailsView);
0138     if (d->m_person) {
0139         disconnect(d->m_person, SIGNAL(dataChanged()), this, SLOT(reload()));
0140     }
0141 
0142     d->m_person = person;
0143     connect(d->m_person, SIGNAL(dataChanged()), this, SLOT(reload()));
0144     reload();
0145 }
0146 
0147 // void PersonDetailsView::setPersonsModel(PersonsModel *model)
0148 // {
0149 //     Q_D(PersonDetailsView);
0150 //     Q_FOREACH (AbstractPersonDetailsWidget *detailsWidget, d->m_detailWidgets) {
0151 //         detailsWidget->setPersonsModel(model);
0152 //     }
0153 // }
0154 
0155 void PersonDetailsView::reload()
0156 {
0157     Q_D(PersonDetailsView);
0158 
0159     // replace the entire main widget
0160     int layoutIndex = layout()->indexOf(d->m_mainWidget);
0161     layout()->takeAt(layoutIndex);
0162     d->m_mainWidget->deleteLater();
0163     d->m_mainWidget = new QWidget(this);
0164     dynamic_cast<QVBoxLayout *>(layout())->insertWidget(layoutIndex, d->m_mainWidget);
0165 
0166     QFormLayout *layout = new QFormLayout(d->m_mainWidget);
0167     layout->setSpacing(4);
0168 
0169     // update header information
0170     // FIXME - possibly split this out into a new class with a nice setPerson method
0171 
0172     QPixmap avatar = d->m_person->photo();
0173 
0174     d->m_personDetailsPresentation->avatarPixmapLabel->setPixmap(avatar.scaled(96, 96, Qt::KeepAspectRatio)); // FIXME
0175     d->m_personDetailsPresentation->presencePixmapLabel->setPixmap(QIcon::fromTheme(d->m_person->presenceIconName()).pixmap(32, 32)); // FIXME
0176     d->m_personDetailsPresentation->nameLabel->setText(d->m_person->name());
0177 
0178     for (AbstractFieldWidgetFactory *widgetFactory : std::as_const(d->m_plugins)) {
0179         const QString label = widgetFactory->label() + QLatin1Char(':');
0180         QWidget *widget = widgetFactory->createDetailsWidget(d->m_person->personUri(), this);
0181 
0182         if (widget) {
0183             QFont font = widget->font();
0184             font.setBold(true);
0185             widget->setFont(font);
0186             QLabel *widgetLabel = new QLabel(label, this);
0187             layout->addRow(widgetLabel, widget);
0188         }
0189     }
0190 }
0191 
0192 #include "moc_persondetailsview.cpp"