2 Situare - A location system for Facebook
3 Copyright (C) 2010 Ixonos Plc. Authors:
5 Jussi Laitinen - jussi.laitinen@ixonos.com
7 Situare is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 version 2 as published by the Free Software Foundation.
11 Situare is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Situare; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
22 #include <QVBoxLayout>
23 #include <QPushButton>
26 #include <QPaintEvent>
29 #include <QFormLayout>
30 #include <QSpacerItem>
31 #include <QStylePainter>
34 #include "friendlistitem.h"
35 #include "../user/user.h"
36 #include "imagebutton.h"
37 #include "../common.h"
39 const int ITEM_WIDTH = 368;
40 const int ICON_HEIGHT = 24; ///< Icon height
41 const int ICON_WIDTH = 24; ///< Icon width
42 const int IMAGE_HEIGHT = 64; ///< Friend image height
43 const int IMAGE_WIDTH = 64; ///< Friend image width
44 const int ITEM_MIN_HEIGHT = 141; ///< Minimum height for item
45 const int MARGIN = 5; ///< Icon margin
46 const int MOUSE_PRESS_AREA_WIDTH = 20; ///< Area width for item height toggling
47 const int MOUSE_PRESS_AREA_HEIGHT = 20; ///< Area height for item height toggling
50 * @var NAME_LABEL_MAX_WIDTH
52 * @brief Name label's maximum width
54 const int NAME_LABEL_MAX_WIDTH = ITEM_WIDTH - 3*MARGIN - IMAGE_WIDTH;
57 * @var LABEL_MAX_WIDTH
59 * @brief All label's maximum width
61 const int LABEL_MAX_WIDTH = ITEM_WIDTH - 3 * MARGIN - IMAGE_WIDTH - MARGIN - ICON_WIDTH - MARGIN;
63 const int WALK_DISTANCE = 5; ///< Walk distance limit for distance icon
64 const int CAR_DISTANCE = 500; ///< Car distance limit for distance icon
65 const int AEROPLANE_DISTANCE = 5000;///< Aeroplane distance limit for distance icon
67 FriendListItem::FriendListItem()
71 qDebug() << __PRETTY_FUNCTION__;
73 setData(Qt::SizeHintRole, QSize(ITEM_WIDTH, ITEM_MIN_HEIGHT));
76 void FriendListItem::calculateTextRects()
78 QPixmap p = QPixmap(10, 10);
80 painter.setFont(NOKIA_FONT_SMALL);
81 QFontMetrics smallFontMetrics = painter.fontMetrics();
83 QRect distanceRect = smallFontMetrics.boundingRect(m_distanceText);
84 QRect statusTextRect = smallFontMetrics.boundingRect(m_user->note());
85 QRect updatedRect = smallFontMetrics.boundingRect(m_user->timestamp());
86 QRect locationRect = smallFontMetrics.boundingRect(m_user->address());
89 qDebug() << m_shortenedStatusText;
91 int statusTextFactor = statusTextRect.width() / LABEL_MAX_WIDTH;
93 m_statusTextRect = QRect(0, 0, LABEL_MAX_WIDTH, 24 * statusTextFactor);
94 int updatedFactor = updatedRect.width() / LABEL_MAX_WIDTH;
96 m_updatedRect = QRect(0, 0, LABEL_MAX_WIDTH, 24 * updatedFactor);
97 int locationFactor = locationRect.width() / LABEL_MAX_WIDTH;
99 m_locationRect = QRect(0, 0, LABEL_MAX_WIDTH, 24 * locationFactor);
101 qDebug() << statusTextRect;
102 qDebug() << updatedRect;
103 qDebug() << locationRect;
105 qDebug() << m_statusTextRect;
106 qDebug() << m_updatedRect;
107 qDebug() << m_locationRect;
109 qWarning() << statusTextRect.width() << statusTextRect.height();
110 qWarning() << m_statusTextRect.width() << m_statusTextRect.height();
112 m_expandedHeight = ITEM_MIN_HEIGHT + ((statusTextFactor + updatedFactor + locationFactor - 3) *
115 setData(Qt::SizeHintRole + 1, distanceRect);
118 QPointF FriendListItem::coordinates()
120 qWarning() << __PRETTY_FUNCTION__;
122 return m_user->coordinates();
125 void FriendListItem::setId(const QString &id)
127 qDebug() << __PRETTY_FUNCTION__;
132 QString FriendListItem::id() const
134 return ListItem::id();
137 void FriendListItem::setUserData(User *user)
139 qDebug() << __PRETTY_FUNCTION__;
144 setId(m_user->userId());
146 if (!m_user->profileImage().isNull())
147 setData(Qt::DecorationRole, m_user->profileImage());
151 m_user->distance(value, unit);
152 m_distanceText = QString::number(value) + " " + unit;
153 setData(Qt::UserRole + 3, m_distanceText);
154 setDistanceIcon(value, unit);
157 calculateTextRects();
162 void FriendListItem::setDistanceIcon(double value, const QString &unit)
164 QPixmap distanceImage;
166 if ((unit == "m") || (value < WALK_DISTANCE))
167 distanceImage.load(":/res/images/walk_icon_gray.png");
168 else if (value < CAR_DISTANCE)
169 distanceImage.load(":/res/images/car_icon_gray.png");
170 else if (value < AEROPLANE_DISTANCE)
171 distanceImage.load(":/res/images/aeroplane_icon_gray.png");
173 distanceImage.load(":/res/images/rocket_icon_gray.png");
175 qDebug() << __PRETTY_FUNCTION__ << distanceImage.isNull();
177 setData(Qt::UserRole + 4, distanceImage);
180 void FriendListItem::shortenTexts()
182 qDebug() << __PRETTY_FUNCTION__;
184 QPixmap p = QPixmap(10, 10);
186 QPainter painter(&p);
187 painter.setFont(NOKIA_FONT_NORMAL);
188 QFontMetrics nameLabelMetrics = painter.fontMetrics();
189 painter.setFont(NOKIA_FONT_SMALL);
190 QFontMetrics otherLabelsMetrics = painter.fontMetrics();
192 QString name = m_user->name();
193 QString updated = m_user->timestamp();
194 QString statusText = m_user->note();
195 QString location = m_user->address();
197 int nameIndex = name.indexOf('\n');
198 int updatedIndex = updated.indexOf('\n');
199 int statusTextIndex = statusText.indexOf('\n');
200 int locationIndex = location.indexOf('\n');
203 name.truncate(nameIndex);
206 if (updatedIndex > 0) {
207 updated.truncate(updatedIndex);
208 updated.append("...");
210 if (statusTextIndex > 0) {
211 statusText.truncate(statusTextIndex);
212 statusText.append("...");
214 if (locationIndex > 0) {
215 location.truncate(locationIndex);
216 location.append("...");
219 int distanceLabelWidth = otherLabelsMetrics.width(m_distanceText) + 5;
220 m_shortenedName = nameLabelMetrics.elidedText(name, Qt::ElideRight, NAME_LABEL_MAX_WIDTH
221 - distanceLabelWidth);
222 m_shortenedStatusText = otherLabelsMetrics.elidedText(statusText, Qt::ElideRight,
224 m_shortenedUpdated = otherLabelsMetrics.elidedText(updated, Qt::ElideRight, LABEL_MAX_WIDTH);
225 m_shortenedLocation = otherLabelsMetrics.elidedText(location, Qt::ElideRight, LABEL_MAX_WIDTH);
227 setData(Qt::SizeHintRole + 4, QRect(0, 0, distanceLabelWidth, 24));
229 qWarning() << m_shortenedStatusText;
232 QString FriendListItem::elideText(int width, const QString &text)
234 QFontMetrics otherLabelsMetrics = QFontMetrics(NOKIA_FONT_SMALL);
238 for (int i = 0; i < text.size(); ++i) {
239 QChar c = text.at(i);
241 widthSum += otherLabelsMetrics.width(c);
243 if (widthSum > width) {
253 void FriendListItem::setText(bool expanded)
255 qDebug() << __PRETTY_FUNCTION__;
257 setData(Qt::DisplayRole, m_shortenedName);
260 setData(Qt::UserRole, m_user->note());
261 setData(Qt::UserRole + 1, m_user->timestamp());
262 setData(Qt::UserRole + 2, m_user->address());
264 setData(Qt::SizeHintRole + 2, m_statusTextRect);
265 setData(Qt::SizeHintRole + 3, m_updatedRect);
266 setData(Qt::SizeHintRole + 4, m_locationRect);
269 setData(Qt::UserRole, m_shortenedStatusText);
270 setData(Qt::UserRole + 1, m_shortenedUpdated);
271 setData(Qt::UserRole + 2, m_shortenedLocation);
273 setData(Qt::SizeHintRole + 2, QRect(0, 0, LABEL_MAX_WIDTH, ICON_HEIGHT));
274 setData(Qt::SizeHintRole + 3, QRect(0, 0, LABEL_MAX_WIDTH, ICON_HEIGHT));
275 setData(Qt::SizeHintRole + 4, QRect(0, 0, LABEL_MAX_WIDTH, ICON_HEIGHT));
279 void FriendListItem::toggleHeight()
284 setData(Qt::SizeHintRole, QSize(ITEM_WIDTH, ITEM_MIN_HEIGHT));
289 setData(Qt::SizeHintRole, QSize(ITEM_WIDTH, m_expandedHeight));
293 void FriendListItem::setExpanded(bool expanded)
295 m_expanded = expanded;
299 setData(Qt::SizeHintRole, QSize(ITEM_WIDTH, m_expandedHeight));
303 setData(Qt::SizeHintRole, QSize(ITEM_WIDTH, ITEM_MIN_HEIGHT));