blob: a9d885d5aa634c9a13219071d8c7ae44b13f78ab [file] [log] [blame]
Edric Milaret83b248c2015-06-02 11:42:23 -04001/***************************************************************************
Nicolas Jagerd0b33752016-01-17 00:00:40 -05002 * Copyright (C) 2015-2016 by Savoir-faire Linux *
Edric Milaret83b248c2015-06-02 11:42:23 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "imdelegate.h"
20
Edric Milaret4e370992016-01-20 11:29:32 -050021#include <QApplication>
22
Edric Milaret83b248c2015-06-02 11:42:23 -040023#include "media/text.h"
24#include "media/textrecording.h"
25
Edric Milaret4e370992016-01-20 11:29:32 -050026#include "ringthemeutils.h"
Edric Milareta0ebd062016-01-13 12:18:23 -050027
Edric Milaret83b248c2015-06-02 11:42:23 -040028ImDelegate::ImDelegate(QObject *parent)
29 : QStyledItemDelegate(parent), showDate_(false), showAuthor_(false)
30{}
31
32void ImDelegate::setDisplayOptions(ImDelegate::DisplayOptions opt)
33{
Edric Milaret83b248c2015-06-02 11:42:23 -040034 showAuthor_ = opt & DisplayOptions::AUTHOR;
35 showDate_ = opt & DisplayOptions::DATE;
Edric Milareta0ebd062016-01-13 12:18:23 -050036 emit sizeHintChanged(QModelIndex());
Edric Milaret83b248c2015-06-02 11:42:23 -040037}
38
39void
Edric Milareta0ebd062016-01-13 12:18:23 -050040ImDelegate::formatMsg(const QModelIndex& index, QString& msg) const
41{
42 if (showAuthor_) {
43 auto author = index.data(
44 static_cast<int>(Media::TextRecording::Role::AuthorDisplayname)).toString();
45 msg = QString("(%1)\n%2").arg(author, msg);
46 }
47 if (showDate_) {
48 auto formattedDate = index.data(
49 static_cast<int>(Media::TextRecording::Role::FormattedDate)).toString();
50 msg = QString("%2\n%1").arg(formattedDate, msg);
51 }
52}
53
54void
55ImDelegate::paint(QPainter* painter,
56 const QStyleOptionViewItem& option,
57 const QModelIndex& index) const
Edric Milaret83b248c2015-06-02 11:42:23 -040058{
Edric Milareted0b2802015-10-01 15:10:02 -040059 QStyleOptionViewItem opt = option;
Edric Milaret83b248c2015-06-02 11:42:23 -040060 initStyleOption(&opt, index);
Edric Milaretda51e382016-01-15 15:47:14 -050061 painter->setRenderHint(QPainter::Antialiasing);
62
Nicolas Jagerd0b33752016-01-17 00:00:40 -050063 opt.font = fontMsg_;
64 painter->setFont(fontMsg_);
65
Edric Milaret83b248c2015-06-02 11:42:23 -040066 if (index.isValid()) {
Edric Milareta0ebd062016-01-13 12:18:23 -050067 auto msg = index.data(Qt::DisplayRole).toString();
Edric Milareted0b2802015-10-01 15:10:02 -040068 opt.text.clear();
Edric Milareta0ebd062016-01-13 12:18:23 -050069 QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
Edric Milaret83b248c2015-06-02 11:42:23 -040070 QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled
71 ? QPalette::Normal : QPalette::Disabled;
72 if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active))
73 cg = QPalette::Inactive;
Edric Milareta0ebd062016-01-13 12:18:23 -050074
75 auto dir = index.data(static_cast<int>(Media::TextRecording::Role::Direction))
Edric Milaret83b248c2015-06-02 11:42:23 -040076 .value<Media::Media::Direction>() == Media::Media::Direction::IN
77 ? Qt::AlignLeft : Qt::AlignRight;
78
Edric Milareta0ebd062016-01-13 12:18:23 -050079 formatMsg(index, msg);
80
81 QRect textRect = getBoundingRect(dir, msg, opt);
Nicolas Jagerd0b33752016-01-17 00:00:40 -050082
83 QRect bubbleRect(textRect.left() - padding_,
84 textRect.top() - padding_,
85 textRect.width() + 2 * padding_,
86 textRect.height() + 2 * padding_ );
87
Edric Milareta0ebd062016-01-13 12:18:23 -050088 opt.decorationSize = iconSize_;
Nicolas Jagerd0b33752016-01-17 00:00:40 -050089 opt.decorationPosition = (dir == Qt::AlignRight ?
90 QStyleOptionViewItem::Right : QStyleOptionViewItem::Left);
Edric Milareta0ebd062016-01-13 12:18:23 -050091 opt.decorationAlignment = Qt::AlignTop | Qt::AlignHCenter;
92 style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
Edric Milaretda51e382016-01-15 15:47:14 -050093
Edric Milaretda51e382016-01-15 15:47:14 -050094 QPainterPath path;
95 path.addRoundedRect(bubbleRect, padding_, padding_);
Nicolas Jagerd0b33752016-01-17 00:00:40 -050096
97 if (dir == Qt::AlignRight) {
Edric Milaret4e370992016-01-20 11:29:32 -050098 painter->fillPath(path, RingTheme::blue_);
Nicolas Jagerd0b33752016-01-17 00:00:40 -050099 painter->setPen(Qt::white);
100 }
101 else {
102 painter->fillPath(path, Qt::white);
103 painter->setPen(Qt::black);
104 }
Edric Milaretda51e382016-01-15 15:47:14 -0500105
Edric Milareta0ebd062016-01-13 12:18:23 -0500106 painter->drawText(textRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, msg);
Edric Milaret83b248c2015-06-02 11:42:23 -0400107 }
108}
109
Edric Milareta0ebd062016-01-13 12:18:23 -0500110QRect ImDelegate::getBoundingRect(const Qt::AlignmentFlag& dir, const QString& msg, const QStyleOptionViewItem &option) const
Edric Milaret83b248c2015-06-02 11:42:23 -0400111{
Edric Milareta0ebd062016-01-13 12:18:23 -0500112 QFont textFont = option.font;
113 QFontMetrics textFontMetrics(textFont);
114 QRect textRect;
115
116 if (dir == Qt::AlignRight) {
Nicolas Jagerd0b33752016-01-17 00:00:40 -0500117 textRect = textFontMetrics.boundingRect(option.rect.left() + 2 * padding_,
118 option.rect.top() + 2 * padding_,
119 option.rect.width() - iconSize_.width() - 4 * padding_,
Edric Milareta0ebd062016-01-13 12:18:23 -0500120 0,
121 dir|Qt::AlignTop|Qt::TextWordWrap,
122 msg);
123 } else {
124 textRect = textFontMetrics.boundingRect(option.rect.left() + iconSize_.width() + 2 * padding_,
Nicolas Jagerd0b33752016-01-17 00:00:40 -0500125 option.rect.top() + 2 * padding_,
126 option.rect.width() - iconSize_.width() - 4 * padding_ ,
Edric Milareta0ebd062016-01-13 12:18:23 -0500127 0,
128 dir|Qt::AlignTop|Qt::TextWordWrap,
129 msg);
130 }
131 return textRect;
132}
133
134QSize
135ImDelegate::sizeHint(const QStyleOptionViewItem& option,
136 const QModelIndex& index) const
137{
Nicolas Jagerd0b33752016-01-17 00:00:40 -0500138 QStyleOptionViewItem opt = option;
139 opt.font = fontMsg_;
140
Edric Milareta0ebd062016-01-13 12:18:23 -0500141 QString msg = index.data(Qt::DisplayRole).toString();
142
143 auto dir = index.data(
144 static_cast<int>(Media::TextRecording::Role::Direction))
145 .value<Media::Media::Direction>() == Media::Media::Direction::IN
146 ? Qt::AlignLeft : Qt::AlignRight;
147
148 formatMsg(index, msg);
149
Nicolas Jagerd0b33752016-01-17 00:00:40 -0500150 QRect boundingRect = getBoundingRect(dir, msg, opt);
Edric Milareta0ebd062016-01-13 12:18:23 -0500151
Nicolas Jagerd0b33752016-01-17 00:00:40 -0500152 QSize size(option.rect.width(), boundingRect.height() + padding_);
Edric Milareta0ebd062016-01-13 12:18:23 -0500153
154 /* Keep the minimum height needed. */
155 if(size.height() < iconSize_.height())
Nicolas Jagerd0b33752016-01-17 00:00:40 -0500156 size.setHeight(iconSize_.height() + padding_);
Edric Milareta0ebd062016-01-13 12:18:23 -0500157
158 return size;
Edric Milaret83b248c2015-06-02 11:42:23 -0400159}
160