diff --git a/RingWinClient.pro b/RingWinClient.pro index 6186cbaca876dd6b7174aa896919d007d1f17fe8..3ce82f2d8c0d9387ca14d01d07f7cd855e760c17 100644 --- a/RingWinClient.pro +++ b/RingWinClient.pro @@ -42,7 +42,8 @@ SOURCES += main.cpp\ utils.cpp \ wizarddialog.cpp \ windowscontactbackend.cpp \ - historydelegate.cpp + historydelegate.cpp \ + contactdelegate.cpp HEADERS += mainwindow.h \ callwidget.h \ @@ -60,7 +61,8 @@ HEADERS += mainwindow.h \ utils.h \ wizarddialog.h \ windowscontactbackend.h \ - historydelegate.h + historydelegate.h \ + contactdelegate.h FORMS += mainwindow.ui \ callwidget.ui \ diff --git a/callwidget.cpp b/callwidget.cpp index b61b80c68304391ee1bec5990b2cf033fa2bd7cb..ff6072473b5dcc045f1f200395e832c3bea3bc4a 100644 --- a/callwidget.cpp +++ b/callwidget.cpp @@ -30,6 +30,7 @@ #include "categorizedcontactmodel.h" #include "windowscontactbackend.h" #include "historydelegate.h" +#include "contactdelegate.h" #include "wizarddialog.h" @@ -84,6 +85,7 @@ CallWidget::CallWidget(QWidget *parent) : CategorizedContactModel::instance()->setSortAlphabetical(false); ui->contactView->setModel(CategorizedContactModel::instance()); + ui->contactView->setItemDelegate(new ContactDelegate()); ui->speakerSlider->setValue(Audio::Settings::instance()->playbackVolume()); ui->micSlider->setValue(Audio::Settings::instance()->captureVolume()); diff --git a/contactdelegate.cpp b/contactdelegate.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e95b4fd75f3f70a08e820a6f227f9807a4f2d1f7 --- /dev/null +++ b/contactdelegate.cpp @@ -0,0 +1,102 @@ +/*************************************************************************** + * Copyright (C) 2015 by Savoir-Faire Linux * + * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>* + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + **************************************************************************/ + +#include "contactdelegate.h" + +#include "person.h" +#include "contactmethod.h" + +ContactDelegate::ContactDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ +} + + +void +ContactDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QStyleOptionViewItemV4 opt = option; + initStyleOption(&opt, index); + + if (index.column() == 0) { + QString name = index.model()->data(index, Qt::DisplayRole).toString(); + opt.text = ""; + QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); + style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); + QRect rect = opt.rect; + QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? + QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active)) + cg = QPalette::Inactive; + painter->setPen(opt.palette.color(cg, QPalette::Text)); + painter->setOpacity(1.0); + painter->drawText(QRect(rect.left()+sizeImage_+5, rect.top(), + rect.width(), rect.height()/2), + opt.displayAlignment, name); + + QVariant var_c = index.child(0,0).data( + static_cast<int>(Person::Role::Object)); + if (var_c.isValid()) { + Person *c = var_c.value<Person *>(); + QVariant var_p = c->photo(); + painter->drawRect(QRect(rect.left(), rect.top(), + sizeImage_+1, sizeImage_+1)); + if (var_p.isValid()) { + painter->drawImage(QRect(rect.left()+1, rect.top()+1, + sizeImage_, sizeImage_), + var_p.value<QImage>()); + } else { + QImage defaultImage(":images/account.png"); + painter->drawImage(QRect(rect.left(), rect.top(), + sizeImage_, sizeImage_), + defaultImage); + } + switch (c->phoneNumbers().size()) { + case 0: + break; + case 1: + { + QString number; + QVariant var_n = + c->phoneNumbers().first()->roleData(Qt::DisplayRole); + if (var_n.isValid()) + number = var_n.value<QString>(); + + painter->drawText(QRect(rect.left()+sizeImage_+5, + rect.top() + rect.height()/2, + rect.width(), rect.height()/2), + opt.displayAlignment, number); + break; + } + default: + /* more than one, for now don't show any of the contact methods */ + break; + } + } + } +} + +QSize +ContactDelegate::sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QSize result = QStyledItemDelegate::sizeHint(option, index); + result.setHeight((result.height()*2)+2); + return result; +} diff --git a/contactdelegate.h b/contactdelegate.h new file mode 100644 index 0000000000000000000000000000000000000000..30d857ae74ab5d152e065ae69968430d1b47d1a5 --- /dev/null +++ b/contactdelegate.h @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2015 by Savoir-Faire Linux * + * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>* + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + **************************************************************************/ + +#ifndef CONTACTDELEGATE_H +#define CONTACTDELEGATE_H + +#include <QObject> +#include <QString> +#include <QPainter> +#include <QApplication> +#include <QStyledItemDelegate> + +class ContactDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + explicit ContactDelegate(QObject *parent = 0); + +protected: + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + +private: + constexpr static int sizeImage_ = 49; +}; + +#endif // CONTACTDELEGATE_H diff --git a/images/account.png b/images/account.png new file mode 100644 index 0000000000000000000000000000000000000000..086b752bb34604e3f576a285d1172f55229f2898 Binary files /dev/null and b/images/account.png differ diff --git a/images/sort-variant.png b/images/sort-variant.png new file mode 100644 index 0000000000000000000000000000000000000000..1f926cc16ebe28805c7862f30048fbcbc3a8d2b6 Binary files /dev/null and b/images/sort-variant.png differ diff --git a/windowscontactbackend.cpp b/windowscontactbackend.cpp index 95a76809a49a0cf892d607e395357045de1b797d..f8adb26ef91bd5c3f7576bd051b8e9d496a54213 100644 --- a/windowscontactbackend.cpp +++ b/windowscontactbackend.cpp @@ -134,11 +134,12 @@ WindowsContactBackend::loadRun() else if (name == "Photo") { //FIXME: It seems to be possible to have multiple photo... reader.readNext(); - if (reader.name().toString() == "Value") { + if (reader.name().toString() == "Url") { QString photoValue = reader.readElementText(); - QByteArray byteArray; - byteArray.append(photoValue); - p->setPhoto(byteArray); + QImage photo; + photo.load(photoValue); + p->setPhoto(photo.scaled(sizePhoto_,sizePhoto_, Qt::KeepAspectRatio, + Qt::SmoothTransformation)); } } else if (name == "EmailAddress") { diff --git a/windowscontactbackend.h b/windowscontactbackend.h index a2a3550b63a6b318cf330205bc7b3b8e09816b22..c804a064fde1dd2c185474946ce32fad4103b434 100644 --- a/windowscontactbackend.h +++ b/windowscontactbackend.h @@ -24,6 +24,7 @@ #include <QDir> #include <QXmlStreamReader> #include <QtConcurrent/QtConcurrent> +#include <QImage> #include "person.h" #include "collectioninterface.h" @@ -49,6 +50,7 @@ private: bool loadRun(); private: CollectionMediator<Person>* mediator_; + constexpr static int sizePhoto_ = 50; }; class WindowsContactEditor : public CollectionEditor<Person>