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"