#include <QPaintEvent>
#include <QLabel>
#include <QPixmap>
+#include <QFormLayout>
+#include <QSpacerItem>
+#include <QStylePainter>
+#include <math.h>
#include "friendlistitem.h"
+#include "../user/user.h"
+#include "avatarimage.h"
+#include "imagebutton.h"
-const int BACKGROUND_TOP_WIDTH = 368;
-const int BACKGROUND_TOP_HEIGHT = 20;
-const int BACKGROUND_MIDDLE_X = 0;
-const int BACKGROUND_MIDDLE_Y = BACKGROUND_TOP_HEIGHT;
-const int BACKGROUND_MIDDLE_WIDTH = 368;
-const int BACKGROUND_MIDDLE_HEIGHT = 106;
-const int BACKGROUND_BOTTOM_X = 0;
-const int BACKGROUND_BOTTOM_Y = BACKGROUND_MIDDLE_Y + BACKGROUND_MIDDLE_HEIGHT;
-const int BACKGROUND_BOTTOM_WIDTH = 368;
-const int BACKGROUND_BOTTOM_HEIGHT = 15;
-const int IMAGE_X = 9;
-const int IMAGE_Y = 0;
-const int IMAGE_WIDTH = 60;
-const int IMAGE_HEIGHT = 60;
-const int CLOCK_X = 75;
-const int CLOCK_Y = 53;
-const int ENVELOPE_X = 75;
-const int ENVELOPE_Y = 77;
-const int COMPASS_X = 75;
-const int COMPASS_Y = 101;
-const int ICON_WIDTH = 24;
-const int ICON_HEIGHT = 24;
-
-const QString BACKGROUND_TOP_PATH = QString(":/resources/list_item_top.png");
-const QString BACKGROUND_MIDDLE_PATH = QString(":/resources/list_item_middle.png");
-const QString BACKGROUND_BOTTOM_PATH = QString(":/resources/list_item_bottom.png");
-const QString CLOCK_PATH = QString(":/resources/clock.png");
-const QString ENVELOPE_PATH = QString(":/resources/envelope.png");
-const QString COMPASS_PATH = QString(":/resources/compass.png");
-
-FriendListItem::FriendListItem()
+FriendListItem::FriendListItem(QWidget *parent)
+ : QWidget(parent)
+ , m_expanded(false)
+ , m_user(0)
{
+ qDebug() << __PRETTY_FUNCTION__;
+
QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setContentsMargins(MARGIN, 0, MARGIN*2, MARGIN*2);
+ layout->setSpacing(0);
+ setLayout(layout);
- QWidget *childWidget = new QWidget(this);
- QPalette palette = childWidget->palette();
- palette.setColor(QPalette::Foreground, QColor::fromRgb(152,152,152));
- childWidget->setPalette(palette);
- QFont font = QFont("Nokia Sans", 13, QFont::Normal);
- childWidget->setFont(font);
+ QHBoxLayout *topLayout = new QHBoxLayout();
+ topLayout->setMargin(0);
+ topLayout->setSpacing(0);
- QGridLayout *infoLayout = new QGridLayout(this);
- infoLayout->setSpacing(0);
+ QHBoxLayout *bottomLayout = new QHBoxLayout();
+ bottomLayout->setMargin(0);
+ bottomLayout->setSpacing(0);
+
+ QFormLayout *infoLayout = new QFormLayout();
infoLayout->setMargin(0);
- childWidget->setLayout(infoLayout);
+ infoLayout->setSpacing(0);
+ infoLayout->setLabelAlignment(Qt::AlignTop);
+
+ QLabel *clockLabel = new QLabel();
+ clockLabel->setPixmap(QPixmap(":/res/images/clock.png"));
+ clockLabel->setContentsMargins(0, 0, MARGIN, 0);
+ clockLabel->setFixedSize(ICON_WIDTH + MARGIN, ICON_HEIGHT);
+ QLabel *envelopeLabel = new QLabel();
+ envelopeLabel->setPixmap(QPixmap(":/res/images/envelope.png"));
+ envelopeLabel->setContentsMargins(0, 0, MARGIN, 0);
+ envelopeLabel->setFixedSize(ICON_WIDTH + MARGIN, ICON_HEIGHT);
+ QLabel *compassLabel = new QLabel();
+ compassLabel->setPixmap(QPixmap(":/res/images/compass.png"));
+ compassLabel->setContentsMargins(0, 0, MARGIN, 0);
+ compassLabel->setFixedSize(ICON_WIDTH + MARGIN, ICON_HEIGHT);
+
+ m_imageLabel = new QLabel();
+ m_imageLabel->setFixedSize(IMAGE_WIDTH, IMAGE_HEIGHT);
+
+ m_nameLabel = new QLabel();
+ m_nameLabel->setFixedHeight(IMAGE_HEIGHT);
+
+ m_distanceLabel = new QLabel();
+ m_distanceLabel->setFixedHeight(IMAGE_HEIGHT);
+
+ m_findButton = new ImageButton(this, ":/res/images/show_position.png",
+ ":/res/images/show_position_s.png");
+
+ m_updatedLabel = new QLabel();
+ m_updatedLabel->setWordWrap(true);
+ m_statusTextLabel = new QLabel();
+ m_statusTextLabel->setWordWrap(true);
+ m_locationLabel = new QLabel();
+ m_locationLabel->setWordWrap(true);
+
+ infoLayout->addRow(envelopeLabel, m_statusTextLabel);
+ infoLayout->addRow(compassLabel, m_locationLabel);
+ infoLayout->addRow(clockLabel, m_updatedLabel);
- QLabel *clockLabel = new QLabel(this);
- clockLabel->setPixmap(QPixmap(CLOCK_PATH));
- QLabel *envelopeLabel = new QLabel(this);
- envelopeLabel->setPixmap(QPixmap(ENVELOPE_PATH));
- QLabel *compassLabel = new QLabel(this);
- compassLabel->setPixmap(QPixmap(COMPASS_PATH));
+ topLayout->addWidget(m_imageLabel);
+ topLayout->addWidget(m_nameLabel, 1);
+ topLayout->addWidget(m_distanceLabel);
- updatedLabel = new QLabel("22 min ago", this);
- statusTextLabel = new QLabel("Just testing Situare...", this);
- locationLabel = new QLabel("Some address 10, 1234 City", this);
+ bottomLayout->addWidget(m_findButton, 0, Qt::AlignTop);
+ bottomLayout->addLayout(infoLayout);
- infoLayout->setColumnStretch(1, 1);
- infoLayout->setColumnMinimumWidth(0, 28);
+ layout->addLayout(topLayout, 0);
+ layout->addLayout(bottomLayout, 1);
- infoLayout->addWidget(clockLabel, 0, 0);
- infoLayout->addWidget(updatedLabel, 0, 1);
- infoLayout->addWidget(envelopeLabel, 1, 0);
- infoLayout->addWidget(statusTextLabel, 1, 1);
- infoLayout->addWidget(compassLabel, 2, 0);
- infoLayout->addWidget(locationLabel, 2, 1);
+ setMinimumSize(ITEM_MIN_WIDTH, ITEM_MIN_HEIGHT);
+ setMaximumSize(ITEM_MIN_WIDTH, ITEM_MAX_HEIGHT);
- childWidget->setGeometry(75, 53, 250, 70);
+ setFont(NOKIA_FONT_SMALL);
+ m_nameLabel->setFont(NOKIA_FONT_NORMAL);
+ QPalette itemPalette = palette();
+ itemPalette.setColor(QPalette::Foreground, COLOR_GRAY);
+ setPalette(itemPalette);
+ QPalette namePalette = m_nameLabel->palette();
+ namePalette.setColor(QPalette::Foreground, Qt::white);
+ m_nameLabel->setPalette(namePalette);
- this->setMinimumSize(368, 141);
+ m_backgroundTopImage.load(":/res/images/list_item_top.png");
+ m_backgroundMiddleImage.load(":/res/images/list_item_middle.png");
+ m_backgroundBottomImage.load(":/res/images/list_item_bottom.png");
+
+ connect(m_findButton, SIGNAL(clicked()),
+ this, SLOT(findButtonClicked()));
}
-void FriendListItem::paintEvent(QPaintEvent *)
+void FriendListItem::setData(User *user)
{
- QPainter painter(this);
+ qDebug() << __PRETTY_FUNCTION__;
+
+ m_user = user;
- QRect itemRect = QRect(0, 0, 368, 141);
+ m_imageLabel->setPixmap(AvatarImage::create(m_user->profileImage()));
- //Draw background
- QRect topRect = QRect(itemRect.left(), itemRect.top(), BACKGROUND_TOP_WIDTH,
- BACKGROUND_TOP_HEIGHT);
- painter.drawPixmap(topRect, QPixmap(BACKGROUND_TOP_PATH));
+ QString unit;
+ double value;
+ user->distance(value, unit);
+ m_distanceLabel->setText(QString::number(value) + " " + unit);
- QRect middleRect = QRect(topRect.left(), topRect.bottom() + 1, BACKGROUND_MIDDLE_WIDTH,
- BACKGROUND_MIDDLE_HEIGHT);
- painter.drawPixmap(middleRect, QPixmap(BACKGROUND_MIDDLE_PATH));
+ shortenTexts();
+ setText(false);
+}
+
+void FriendListItem::shortenTexts()
+{
+ qDebug() << __PRETTY_FUNCTION__;
- QRect bottomRect = QRect(topRect.left(), middleRect.bottom() + 1, BACKGROUND_BOTTOM_WIDTH,
+ QFontMetrics nameLabelMetrics = m_nameLabel->fontMetrics();
+ QFontMetrics otherLabelsMetrics = m_updatedLabel->fontMetrics();
+
+ QString name = m_user->name();
+ QString updated = m_user->timestamp();
+ QString statusText = m_user->note();
+ QString location = m_user->address();
+
+ int nameIndex = name.indexOf('\n');
+ int updatedIndex = updated.indexOf('\n');
+ int statusTextIndex = statusText.indexOf('\n');
+ int locationIndex = location.indexOf('\n');
+
+ if (nameIndex > 0) {
+ name.truncate(nameIndex);
+ name.append("...");
+ }
+ if (updatedIndex > 0) {
+ updated.truncate(updatedIndex);
+ updated.append("...");
+ }
+ if (statusTextIndex > 0) {
+ statusText.truncate(statusTextIndex);
+ statusText.append("...");
+ }
+ if (locationIndex > 0) {
+ location.truncate(locationIndex);
+ location.append("...");
+ }
+
+ int distanceLabelWidth = otherLabelsMetrics.width(m_distanceLabel->text());
+ m_shortenedName = nameLabelMetrics.elidedText(name, Qt::ElideRight, NAME_LABEL_MAX_WIDTH
+ - distanceLabelWidth);
+ m_shortenedUpdated = otherLabelsMetrics.elidedText(updated, Qt::ElideRight, LABEL_MAX_WIDTH);
+ m_shortenedStatusText = otherLabelsMetrics.elidedText(statusText, Qt::ElideRight,
+ LABEL_MAX_WIDTH);
+ m_shortenedLocation = otherLabelsMetrics.elidedText(location, Qt::ElideRight, LABEL_MAX_WIDTH);
+}
+
+void FriendListItem::setText(bool expanded)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ if (expanded) {
+ setUpdatesEnabled(false);
+ m_nameLabel->setText(m_shortenedName);
+ m_updatedLabel->setText(m_user->timestamp());
+ m_statusTextLabel->setText(m_user->note());
+ m_locationLabel->setText(m_user->address());
+ setUpdatesEnabled(true);
+ }
+ else {
+ setUpdatesEnabled(false);
+ m_nameLabel->setText(m_shortenedName);
+ m_updatedLabel->setText(m_shortenedUpdated);
+ m_statusTextLabel->setText(m_shortenedStatusText);
+ m_locationLabel->setText(m_shortenedLocation);
+ setUpdatesEnabled(true);
+ }
+}
+
+void FriendListItem::mousePressEvent(QMouseEvent *event)
+{
+ qDebug() << __PRETTY_FUNCTION__ << " " << event->pos();
+
+ m_mousePosition = event->pos();
+}
+
+void FriendListItem::mouseReleaseEvent(QMouseEvent *event)
+{
+ qDebug() << __PRETTY_FUNCTION__ << " " << event->pos();
+
+ if ((abs(m_mousePosition.y() - event->pos().y()) <= MOUSE_PRESS_AREA_WIDTH) &&
+ (abs(m_mousePosition.x() - event->pos().x()) <= MOUSE_PRESS_AREA_HEIGHT)) {
+ if (m_expanded) {
+ setText(false);
+ m_expanded = false;
+ }
+ else {
+ setText(true);
+ m_expanded = true;
+ }
+ }
+}
+
+void FriendListItem::paintEvent(QPaintEvent *event)
+{
+ qDebug() << __PRETTY_FUNCTION__ << " " << event->rect();
+
+ QPainter painter(this);
+
+ QRect topRect = QRect(0, 0, ITEM_MIN_WIDTH, BACKGROUND_TOP_HEIGHT);
+ QRect middleRect = QRect(0, topRect.bottom(), ITEM_MIN_WIDTH,
+ height() - BACKGROUND_TOP_HEIGHT - BACKGROUND_BOTTOM_HEIGHT);
+ QRect bottomRect = QRect(topRect.left(), middleRect.bottom(), ITEM_MIN_WIDTH,
BACKGROUND_BOTTOM_HEIGHT);
- painter.drawPixmap(bottomRect, QPixmap(BACKGROUND_BOTTOM_PATH));
-
- //Draw image
- QString image = QString(":/resources/dummy_Avatar.png");
- QRect imageRect = QRect(itemRect.left() + IMAGE_X, itemRect.top() + IMAGE_Y,
- IMAGE_WIDTH, IMAGE_HEIGHT);
- painter.drawPixmap(imageRect, QPixmap(image));
-
- //Draw name
- QRect nameRect = QRect(itemRect.left() + IMAGE_WIDTH + 11, itemRect.top() + 15, itemRect.width(),
- itemRect.height());
- QString name = QString("This is friend item");
- QPen whitePen(QColor(Qt::white), 1, Qt::SolidLine);
- painter.setPen(whitePen);
- painter.setFont(QFont( "Nokia Sans", 18, QFont::Normal));
- painter.drawText(nameRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, name, &nameRect);
+
+ painter.drawPixmap(topRect, m_backgroundTopImage);
+ painter.drawPixmap(middleRect, m_backgroundMiddleImage);
+ painter.drawPixmap(bottomRect, m_backgroundBottomImage);
+}
+
+void FriendListItem::findButtonClicked()
+{
+ emit findFriend(m_user->coordinates());
}