diff --git a/RingWinClient.pro b/RingWinClient.pro index 2d33702661696aff0cf947119b6167fd80d3ae81..af89b7f0532eb47d5f6a7454b1999f0bd7e7ea97 100644 --- a/RingWinClient.pro +++ b/RingWinClient.pro @@ -46,7 +46,8 @@ SOURCES += main.cpp\ instantmessagingwidget.cpp \ accountstatedelegate.cpp \ videoview.cpp \ - videooverlay.cpp + videooverlay.cpp \ + imdelegate.cpp HEADERS += mainwindow.h \ callwidget.h \ @@ -68,7 +69,8 @@ HEADERS += mainwindow.h \ instantmessagingwidget.h \ accountstatedelegate.h \ videoview.h \ - videooverlay.h + videooverlay.h \ + imdelegate.h FORMS += mainwindow.ui \ callwidget.ui \ diff --git a/callwidget.cpp b/callwidget.cpp index 86429036801c6727d354c4bf5ebb1cf07bb82e65..738b5fb3b422b4b9888f89b9142f7b585f6f5301 100644 --- a/callwidget.cpp +++ b/callwidget.cpp @@ -25,15 +25,15 @@ #include "personmodel.h" #include "fallbackpersoncollection.h" #include "categorizedcontactmodel.h" -#include "windowscontactbackend.h" -#include "historydelegate.h" -#include "contactdelegate.h" #include "localhistorycollection.h" #include "media/text.h" #include "media/recording.h" #include "media/textrecording.h" #include "wizarddialog.h" +#include "windowscontactbackend.h" +#include "historydelegate.h" +#include "contactdelegate.h" CallWidget::CallWidget(QWidget *parent) : NavWidget(Main ,parent), diff --git a/imdelegate.cpp b/imdelegate.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9ba05a7ece1acfbb0b8e89e600ec7971a3470d4e --- /dev/null +++ b/imdelegate.cpp @@ -0,0 +1,87 @@ +/*************************************************************************** + * 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 "imdelegate.h" + +#include "media/text.h" +#include "media/textrecording.h" + +ImDelegate::ImDelegate(QObject *parent) + : QStyledItemDelegate(parent), showDate_(false), showAuthor_(false) +{} + +void ImDelegate::setDisplayOptions(ImDelegate::DisplayOptions opt) +{ + qDebug() << opt; + showAuthor_ = opt & DisplayOptions::AUTHOR; + showDate_ = opt & DisplayOptions::DATE; +} + +void +ImDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QStyleOptionViewItemV4 opt = option; + initStyleOption(&opt, index); + + if (index.isValid()) { + + auto msg = 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); + auto 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); + auto dir = index.model()->data( + index, + static_cast<int>(Media::TextRecording::Role::Direction)) + .value<Media::Media::Direction>() == Media::Media::Direction::IN + ? Qt::AlignLeft : Qt::AlignRight; + + if (showAuthor_) { + auto author = index.model()-> + data(index, + static_cast<int>(Media::TextRecording::Role::AuthorDisplayname)).toString(); + msg = QString("(%1) %2").arg(author, msg); + } + if (showDate_) { + auto formattedDate = index.model()-> + data(index, + static_cast<int>(Media::TextRecording::Role::FormattedDate)).toString(); + msg = QString("[%1] %2").arg(formattedDate, msg); + } + painter->drawText(QRect(rect.left(), rect.top(), rect.width(), rect.height()), + dir, msg); + } +} + +QSize +ImDelegate::sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QSize result = QStyledItemDelegate::sizeHint(option, index); + result.setHeight(result.height()); + return result; +} + diff --git a/imdelegate.h b/imdelegate.h new file mode 100644 index 0000000000000000000000000000000000000000..00986112a365e328d22176f4f84bdeb3941765d0 --- /dev/null +++ b/imdelegate.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * 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 IMDELEGATE_H +#define IMDELEGATE_H + +#include <QObject> +#include <QApplication> +#include <QPainter> +#include <QStyledItemDelegate> +#include <QSettings> + +class ImDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + explicit ImDelegate(QObject *parent = 0); + enum DisplayOptions { + AUTHOR = 1, + DATE + }; + + void setDisplayOptions(DisplayOptions opt); +protected: + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; +private: + bool showDate_; + bool showAuthor_; +}; + +#endif // IMDELEGATE_H diff --git a/instantmessagingwidget.cpp b/instantmessagingwidget.cpp index 5efe79f415dabafdc84c59c2ed23731c8e550b19..fc6c3f69b64b2e9a85c90c3c7f5a41223a1dbda7 100644 --- a/instantmessagingwidget.cpp +++ b/instantmessagingwidget.cpp @@ -26,6 +26,8 @@ #include "media/text.h" #include "media/textrecording.h" +#include "imdelegate.h" + InstantMessagingWidget::InstantMessagingWidget(QWidget *parent) : QWidget(parent), ui(new Ui::InstantMessagingWidget) @@ -35,17 +37,34 @@ InstantMessagingWidget::InstantMessagingWidget(QWidget *parent) : ui->messageInput->hide(); ui->messageOutput->hide(); + imDelegate_ = new ImDelegate(); + ui->messageOutput->setItemDelegate(imDelegate_); ui->messageOutput->setContextMenuPolicy(Qt::ActionsContextMenu); auto copyAction = new QAction("Copy", this); ui->messageOutput->addAction(copyAction); connect(copyAction, &QAction::triggered, [=]() { copyToClipboard(); }); + auto displayDate = new QAction("Display date", this); + displayDate->setCheckable(true); + ui->messageOutput->addAction(displayDate); + auto displayAuthor = new QAction("Display author", this); + displayAuthor->setCheckable(true); + ui->messageOutput->addAction(displayAuthor); + auto lamdba = [=](){ + int opts = 0; + displayAuthor->isChecked() ? opts |= ImDelegate::DisplayOptions::AUTHOR : opts; + displayDate->isChecked() ? opts |= ImDelegate::DisplayOptions::DATE : opts; + imDelegate_->setDisplayOptions(static_cast<ImDelegate::DisplayOptions>(opts)); + }; + connect(displayAuthor, &QAction::triggered, lamdba); + connect(displayDate, &QAction::triggered, lamdba); } InstantMessagingWidget::~InstantMessagingWidget() { delete ui; + delete imDelegate_; } void diff --git a/instantmessagingwidget.h b/instantmessagingwidget.h index ed95a73dcab97cb77ae7e32df6979e044f70df2e..caad594ab4362b0f871f3459c6cc9420c3376491 100644 --- a/instantmessagingwidget.h +++ b/instantmessagingwidget.h @@ -21,10 +21,13 @@ #include <QWidget> #include <QKeyEvent> +#include <QSettings> #include "call.h" #include "media/media.h" +#include "imdelegate.h" + namespace Ui { class InstantMessagingWidget; } @@ -50,6 +53,8 @@ private slots: private: Ui::InstantMessagingWidget *ui; + ImDelegate* imDelegate_; + QSettings settings_; void copyToClipboard(); };