Added coordinates to Messages, added Message type.
authorJussi Laitinen <jupe@l3l7588.ixonos.local>
Thu, 4 Nov 2010 13:46:21 +0000 (15:46 +0200)
committerJussi Laitinen <jupe@l3l7588.ixonos.local>
Thu, 4 Nov 2010 13:46:21 +0000 (15:46 +0200)
17 files changed:
src/coordinates/geocoordinate.cpp
src/coordinates/geocoordinate.h
src/engine/engine.cpp
src/situareservice/database.cpp
src/situareservice/message.cpp
src/situareservice/message.h
src/situareservice/situareservice.cpp
src/situareservice/situareservice.h
src/ui/mainwindow.cpp
src/ui/mainwindow.h
src/ui/meetpeoplepanel.h
src/ui/messagelistitem.cpp
src/ui/messagelistitem.h
src/ui/messagelistview.cpp
src/ui/messagelistview.h
src/ui/messagepanel.cpp
src/ui/messagepanel.h

index 65ebc13..6893a91 100644 (file)
@@ -104,7 +104,7 @@ bool GeoCoordinate::isNull() const
     return false;
 }
 
-bool GeoCoordinate::isValid()
+bool GeoCoordinate::isValid() const
 {
     qDebug() << __PRETTY_FUNCTION__;
 
index a57bf0f..ec5ed3a 100644 (file)
@@ -89,7 +89,7 @@ public:
     *
     * @return true if coordinate is valid, false otherwise
     */
-    bool isValid();
+    bool isValid() const;
 
     /**
     * @brief Returns the latitude value
index 9701f45..35fe815 100644 (file)
@@ -862,8 +862,8 @@ void SituareEngine::signalsFromSituareService()
     connect(m_situareService, SIGNAL(interestingPeopleReceived(QList<User>&)),
             m_ui, SIGNAL(interestingPeopleReceived(QList<User>&)));
 
-    connect(m_situareService, SIGNAL(messagesReceived(QList<Message>&)),
-            m_ui, SIGNAL(messagesReceived(QList<Message>&)));
+    connect(m_situareService, SIGNAL(messagesReceived(QList<Message>&, QList<Message> &)),
+            m_ui, SIGNAL(messagesReceived(QList<Message>&, QList<Message>&)));
 }
 
 void SituareEngine::startAutomaticUpdate()
@@ -888,8 +888,12 @@ void SituareEngine::updateWasSuccessful(SituareService::SuccessfulMethod success
     if (m_networkAccessManager->isConnected()) {
         if (successfulMethod == SituareService::SuccessfulUpdateLocation)
             m_situareService->fetchLocations();
-        else  if (successfulMethod == SituareService::SuccessfulRemoveMessage)
+        else  if ((successfulMethod == SituareService::SuccessfulRemoveMessage) ||
+                  (successfulMethod == SituareService::SuccessfulSendMessage))
             m_situareService->fetchMessages();
+        else if ((successfulMethod == SituareService::SuccessfulAddTags) ||
+                 (successfulMethod == SituareService::SuccessfulRemoveTags))
+            m_situareService->fetchLocations();
     } else {
         error(ErrorContext::NETWORK, QNetworkReply::UnknownNetworkError);
     }
index 1d4d630..82b78d3 100644 (file)
@@ -66,9 +66,10 @@ bool Database::createNotificationTable()
                              "id INTEGER PRIMARY KEY,"
                              "senderid INTEGER,"
                              "receiverid INTEGER,"
-                             "read INTEGER,"
                              "timestamp VARCHAR(20),"
                              "text TEXT,"
+                             "latitude REAL,"
+                             "longitude REAL,"
                              "FOREIGN KEY(senderid) REFERENCES user(id),"
                              "FOREIGN KEY(receiverid) REFERENCES user(id)"
                              ")");
@@ -198,11 +199,11 @@ QByteArray Database::getInterestingPeople(qulonglong userId,
 
     //People start
     QString result;
-    result.append("{\"people\": [");
+    result.append("{\"people\": {");
 
     QHash<QString, QString> tags;
 
-    //Get friends
+    //Get all
     QSqlQuery tagQuery(QString("SELECT usertag.userid, tag.name FROM usertag, tag WHERE "
                                "usertag.tagid IN (SELECT usertag.tagid FROM usertag WHERE "
                                "usertag.userid = '%1') AND usertag.userid != '%2' "
@@ -222,33 +223,64 @@ QByteArray Database::getInterestingPeople(qulonglong userId,
         }
     }
 
-    QStringList userIds;
+    QStringList friendIds;
     QHashIterator<QString, QString> i(tags);
     while (i.hasNext())
-        userIds.append(i.next().key());
+        friendIds.append(i.next().key());
 
-    QSqlQuery userQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
-                                "user.id IN (") + userIds.join(", ") + QString(") AND "
+    result.append("\"friends\": [");
+
+    //Get friends
+    //(SELECT friend.uid2 FROM friend WHERE friend.uid1 = 613374451
+    //UNION
+    //SELECT friend.uid1 FROM friend WHERE friend.uid2 = 613374451)
+
+    QSqlQuery friendQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
+                                "user.id IN (") + friendIds.join(", ") + QString(") AND "
                                 "user.latitude >= '%1' AND user.latitude < '%2' AND "
                                 "user.longitude >= '%3' AND user.longitude < '%4'")
                 .arg(southWestCoordinates.latitude()).arg(northEastCoordinates.latitude())
                 .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude()));
 
-    while (userQuery.next()) {
+    while (friendQuery.next()) {
         result.append("{");
-        result.append("\"uid\": \"" + userQuery.value(0).toString() + "\",");
-        result.append("\"name\": \"" + userQuery.value(1).toString() + "\",");
-        result.append("\"image_url\": \"" + userQuery.value(2).toString() + "\",");
-        result.append("\"tags\": [" + tags.value(userQuery.value(0).toString()) + "]");
+        result.append("\"uid\": \"" + friendQuery.value(0).toString() + "\",");
+        result.append("\"name\": \"" + friendQuery.value(1).toString() + "\",");
+        result.append("\"image_url\": \"" + friendQuery.value(2).toString() + "\",");
+        result.append("\"tags\": [" + tags.value(friendQuery.value(0).toString()) + "]");
         result.append("},");
     }
 
-    int lastComma = result.lastIndexOf(",");
-    if (lastComma != -1)
+    int friendLastComma = result.lastIndexOf(",");
+    if (friendLastComma != -1)
+        result.remove(result.lastIndexOf(","), 1);
+
+    result.append("],");
+
+    QSqlQuery othersQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
+                                "user.id IN (") + friendIds.join(", ") + QString(") AND "
+                                "user.latitude >= '%1' AND user.latitude < '%2' AND "
+                                "user.longitude >= '%3' AND user.longitude < '%4'")
+                .arg(southWestCoordinates.latitude()).arg(northEastCoordinates.latitude())
+                .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude()));
+
+    while (othersQuery.next()) {
+        result.append("{");
+        result.append("\"uid\": \"" + othersQuery.value(0).toString() + "\",");
+        result.append("\"name\": \"" + othersQuery.value(1).toString() + "\",");
+        result.append("\"image_url\": \"" + othersQuery.value(2).toString() + "\",");
+        result.append("\"tags\": [" + tags.value(othersQuery.value(0).toString()) + "]");
+        result.append("},");
+    }
+
+    int friendLastComma = result.lastIndexOf(",");
+    if (friendLastComma != -1)
         result.remove(result.lastIndexOf(","), 1);
 
+    result.append("]");
+
     //People end
-    result.append("]}");
+    result.append("}}");
 
     return result.toUtf8();
 }
@@ -257,22 +289,64 @@ QByteArray Database::getNotifications(qulonglong userId)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QSqlQuery query(QString("SELECT notification.id, notification.senderid, user.name, "
-                            "user.image_url, notification.timestamp, notification.text "
-                            "FROM notification, user WHERE notification.receiverid = '%1' "
-                            "AND notification.senderid = user.id").arg(userId));
-
     QString result;
-    result.append("{\"messages\": [");
+    result.append("{\"messages\": {");
+
+    //Received
+    QSqlQuery receivedQuery(QString("SELECT notification.id, notification.senderid, "
+                            "notification.receiverid, user.name, user.image_url, "
+                            "notification.timestamp, notification.text, "
+                            "notification.latitude, notification.longitude "
+                            "FROM notification, user WHERE notification.receiverid = '%1' AND "
+                            "notification.senderid = user.id "
+                            "ORDER BY notification.timestamp DESC")
+                    .arg(userId));
+
+    result.append("\"received\": [");
+
+    while (receivedQuery.next()) {
+        result.append("{");
+        result.append("\"id\": \"" + receivedQuery.value(0).toString() + "\",");
+        result.append("\"sender_id\": \"" + receivedQuery.value(1).toString() + "\",");
+        result.append("\"receiver_id\": \"" + receivedQuery.value(2).toString() + "\",");
+        result.append("\"sender_name\": \"" + receivedQuery.value(3).toString() + "\",");
+        result.append("\"image_url\": \"" + receivedQuery.value(4).toString() + "\",");
+        result.append("\"timestamp\": \"" + receivedQuery.value(5).toString() + "\",");
+        result.append("\"text\": \"" + receivedQuery.value(6).toString() + "\",");
+        result.append("\"latitude\": \"" + receivedQuery.value(7).toString() + "\",");
+        result.append("\"longitude\": \"" + receivedQuery.value(8).toString() + "\"");
+        result.append("},");
+    }
+
+    int receivedLastComma = result.lastIndexOf(",");
+    if (receivedLastComma != -1)
+        result.remove(result.lastIndexOf(","), 1);
+
+    result.append("],");
+
+    //Sent
+    QSqlQuery sentQuery(QString("SELECT notification.id, notification.senderid, "
+                                "notification.receiverid, user.name, user.image_url, "
+                                "notification.timestamp, notification.text, "
+                                "notification.latitude, notification.longitude "
+                                "FROM notification, user WHERE notification.senderid = '%1' AND "
+                                "notification.receiverid = user.id "
+                                "ORDER BY notification.timestamp DESC")
+                    .arg(userId));
 
-    while (query.next()) {
+    result.append("\"sent\": [");
+
+    while (sentQuery.next()) {
         result.append("{");
-        result.append("\"id\": \"" + query.value(0).toString() + "\",");
-        result.append("\"sender_id\": \"" + query.value(1).toString() + "\",");
-        result.append("\"sender_name\": \"" + query.value(2).toString() + "\",");
-        result.append("\"image_url\": \"" + query.value(3).toString() + "\",");
-        result.append("\"timestamp\": \"" + query.value(4).toString() + "\",");
-        result.append("\"text\": \"" + query.value(5).toString() + "\"");
+        result.append("\"id\": \"" + sentQuery.value(0).toString() + "\",");
+        result.append("\"sender_id\": \"" + sentQuery.value(1).toString() + "\",");
+        result.append("\"receiver_id\": \"" + sentQuery.value(2).toString() + "\",");
+        result.append("\"sender_name\": \"" + sentQuery.value(3).toString() + "\",");
+        result.append("\"image_url\": \"" + sentQuery.value(4).toString() + "\",");
+        result.append("\"timestamp\": \"" + sentQuery.value(5).toString() + "\",");
+        result.append("\"text\": \"" + sentQuery.value(6).toString() + "\",");
+        result.append("\"latitude\": \"" + sentQuery.value(7).toString() + "\",");
+        result.append("\"longitude\": \"" + sentQuery.value(8).toString() + "\"");
         result.append("},");
     }
 
@@ -280,7 +354,9 @@ QByteArray Database::getNotifications(qulonglong userId)
     if (lastComma != -1)
         result.remove(result.lastIndexOf(","), 1);
 
-    result.append("]}");
+    result.append("]");
+
+    result.append("}}");
 
     return result.toUtf8();
 }
@@ -321,7 +397,8 @@ bool Database::removeMessage(qulonglong userId, const QString &id)
     QSqlQuery removeMessageQuery;
 
     return removeMessageQuery.exec(QString("DELETE FROM notification WHERE "
-                                           "notification.receiverid = '%1' AND "
+                                           "(notification.receiverid = '%1' OR "
+                                           "notification.senderid = '%1') AND "
                                            "notification.id = '%2'").arg(userId).arg(id));
 }
 
@@ -343,8 +420,18 @@ bool Database::sendMessage(qulonglong senderId, qulonglong receiverId, const QSt
 
     QSqlQuery sendMessageQuery;
 
-    return sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
-            "NULL, '%1', '%2', strftime('%s','now'), '%3', '%4', '%5')")
+    bool returnValue;
+
+    if (coordinates.isValid()) {
+        returnValue = sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
+                                    "NULL, '%1', '%2', strftime('%s','now'), '%3', '%4', '%5')")
                             .arg(senderId).arg(receiverId).arg(message).arg(coordinates.latitude()).
                             arg(coordinates.longitude()));
+    } else {
+        returnValue = sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
+                                    "NULL, '%1', '%2', strftime('%s','now'), '%3', NULL, NULL)")
+                            .arg(senderId).arg(receiverId).arg(message));
+    }
+
+    return returnValue;
 }
index c257879..0c3923c 100644 (file)
@@ -2,18 +2,29 @@
 
 #include "message.h"
 
-Message::Message()
+Message::Message(const Type type)
     : m_timestamp(QDateTime()),
       m_id(QString()),
       m_image(QPixmap()),
+      m_receiverId(QString()),
       m_senderId(QString()),
       m_senderName(QString()),
       m_text(QString()),
-      m_title(QString())
+      m_title(QString()),
+      m_coordinates(GeoCoordinate()),
+      m_type(type)
 {
     qDebug() << __PRETTY_FUNCTION__;
 }
 
+const GeoCoordinate &Message::coordinates() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_coordinates;
+}
+
+
 const QString &Message::id() const
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -28,6 +39,13 @@ const QPixmap &Message::image() const
     return m_image;
 }
 
+const QString &Message::receiverId() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_receiverId;
+}
+
 const QString &Message::senderId() const
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -42,6 +60,12 @@ const QString &Message::senderName() const
     return m_senderName;
 }
 
+void Message::setCoordinates(const GeoCoordinate &coordinates)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_coordinates = coordinates;
+}
 
 void Message::setImage(const QPixmap &image)
 {
@@ -57,6 +81,13 @@ void Message::setId(const QString &id)
     m_id = id;
 }
 
+void Message::setReceiverId(const QString &receiverId)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_receiverId = receiverId;
+}
+
 void Message::setSenderId(const QString &senderId)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -92,6 +123,13 @@ void Message::setTitle(const QString &title)
     m_title = title;
 }
 
+void Message::setType(const Type type)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_type = type;
+}
+
 const QString &Message::text() const
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -112,3 +150,10 @@ const QString &Message::title() const
 
     return m_title;
 }
+
+const Message::Type &Message::type() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_type;
+}
index e6c606a..c8c2516 100644 (file)
@@ -27,6 +27,8 @@
 #include <QPixmap>
 #include <QString>
 
+#include "coordinates/geocoordinate.h"
+
 /**
  * @brief Container for a single message.
  *
 class Message
 {
 public:
+    enum Type{MessageTypeReceived, MessageTypeSent};
+
     /**
     * @brief Constructor
     *
     * Constructs empty Message object.
     */
-    Message();
+    Message(const Type type = Message::MessageTypeReceived);
 
 /*******************************************************************************
  * MEMBER FUNCTIONS AND SLOTS
  ******************************************************************************/
  public:
     /**
+    * @brief Returns message's coordinates
+    *
+    * @return message's coordinates as GeoCoordinate
+    */
+    const GeoCoordinate &coordinates() const;
+
+    /**
     * @brief Returns message's ID
     *
     * @return message's ID
@@ -61,6 +72,13 @@ public:
     const QPixmap &image() const;
 
     /**
+    * @brief Returns message receiver's ID
+    *
+    * @return message receiver's ID
+    */
+    const QString &receiverId() const;
+
+    /**
     * @brief Returns message sender's ID
     *
     * @return message sender's ID
@@ -75,6 +93,13 @@ public:
     const QString &senderName() const;
 
     /**
+    * @brief Sets message's coordinates
+    *
+    * @param coordinates message's coordinates
+    */
+    void setCoordinates(const GeoCoordinate &coordinates);
+
+    /**
     * @brief Sets message's image
     *
     * @param image message's image
@@ -89,6 +114,13 @@ public:
     void setId(const QString &id);
 
     /**
+    * @brief Sets message receiver's ID
+    *
+    * @param id message receiver's ID
+    */
+    void setReceiverId(const QString &receiverId);
+
+    /**
     * @brief Sets message's text
     *
     * @param text message's text
@@ -110,6 +142,13 @@ public:
     void setTitle(const QString &title);
 
     /**
+    * @brief Sets message's type
+    *
+    * @param type message's type
+    */
+    void setType(const Type type);
+
+    /**
     * @brief Sets message sender's ID
     *
     * @param id message sender's ID
@@ -144,17 +183,29 @@ public:
     */
     const QString &title() const;
 
+    /**
+    * @brief Returns message's type
+    *
+    * @return message's type
+    */
+    const Message::Type &type() const;
+
 /*******************************************************************************
  * DATA MEMBERS
  ******************************************************************************/
 private:
     QDateTime m_timestamp;          ///< message's timestamp
-    QPixmap m_image;                ///< message's image
     QString m_id;                   ///< message's ID
+    QPixmap m_image;                ///< message's image
+    QString m_receiverId;           ///< message receiver's ID
     QString m_senderId;             ///< message sender's ID
     QString m_senderName;           ///< message sender's name
     QString m_text;                 ///< message's text
     QString m_title;                ///< message's title
+
+    GeoCoordinate m_coordinates;    ///< message's coordinates
+
+    Type m_type;                    ///< message's type
 };
 
 Q_DECLARE_METATYPE(Message)
index bedce39..d00ddbc 100644 (file)
@@ -259,9 +259,8 @@ void SituareService::sendMessage(const QString &receiverId, const QString &messa
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    qWarning() << __PRETTY_FUNCTION__ << m_database->sendMessage(613374451,
-                                                                 receiverId.toULongLong(), message,
-                                                                 coordinates);
+    if (m_database->sendMessage(613374451, receiverId.toULongLong(), message, coordinates))
+        emit updateWasSuccessful(SituareService::SuccessfulSendMessage);
 }
 
 void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
@@ -375,13 +374,17 @@ void SituareService::parseMessagesData(const QByteArray &jsonReply)
         emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
         return;
     } else {
-        QList<Message> messages;
+        QVariant messages = result["messages"];
 
-        foreach (QVariant messageVariant, result["messages"].toList()) {
-            Message message;
+        QList<Message> received;
+        QList<Message> sent;
+
+        foreach (QVariant messageVariant, messages.toMap().value("received").toList()) {
+            Message message(Message::MessageTypeReceived);
             QMap<QString, QVariant> messageMap = messageVariant.toMap();
             message.setId(messageMap["id"].toString());
             message.setSenderId(messageMap["sender_id"].toString());
+            message.setReceiverId(messageMap["receiver_id"].toString());
             message.setSenderName(messageMap["sender_name"].toString());
             uint timestampSeconds = messageMap["timestamp"].toUInt();
             message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
@@ -389,12 +392,46 @@ void SituareService::parseMessagesData(const QByteArray &jsonReply)
             message.setImage(AvatarImage::create(
                     QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
 
-            messages.append(message);
+            bool latOk;
+            qreal latitude = messageMap["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = messageMap["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk)
+                message.setCoordinates(GeoCoordinate(latitude, longitude));
+
+            received.append(message);
 
             //emit fetchImage(message.id(), messageMap["image_url"].toString());
         }
 
-        emit messagesReceived(messages);
+        foreach (QVariant messageVariant, messages.toMap().value("sent").toList()) {
+            Message message(Message::MessageTypeSent);
+            QMap<QString, QVariant> messageMap = messageVariant.toMap();
+            message.setId(messageMap["id"].toString());
+            message.setSenderId(messageMap["sender_id"].toString());
+            message.setReceiverId(messageMap["receiver_id"].toString());
+            message.setSenderName(messageMap["sender_name"].toString());
+            uint timestampSeconds = messageMap["timestamp"].toUInt();
+            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
+            message.setText(messageMap["text"].toString());
+            message.setImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
+
+            bool latOk;
+            qreal latitude = messageMap["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = messageMap["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk)
+                message.setCoordinates(GeoCoordinate(latitude, longitude));
+
+            sent.append(message);
+
+            //emit fetchImage(message.id(), messageMap["image_url"].toString());
+        }
+
+        emit messagesReceived(received, sent);
     }
 }
 
@@ -614,7 +651,8 @@ void SituareService::removeTags(const QStringList &tags)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_database->removeTags(613374451, tags);
+    if (m_database->removeTags(613374451, tags))
+        emit updateWasSuccessful(SituareService::SuccessfulRemoveTags);
 }
 
 void SituareService::removeMessage(const QString &id)
@@ -629,8 +667,13 @@ void SituareService::addTags(const QStringList &tags)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    bool retVal = false;
+
     foreach (QString tag, tags)
-        m_database->addTag(613374451, tag);
+        retVal = m_database->addTag(613374451, tag);
+
+    if (retVal)
+        emit updateWasSuccessful(SituareService::SuccessfulAddTags);
 }
 
 void SituareService::searchPeopleByTag(const QString &tag)
index 3227bc5..6923c7b 100644 (file)
@@ -314,7 +314,7 @@ signals:
     *
     * @param messages list of messages sent to user
     */
-    void messagesReceived(QList<Message> &messages);
+    void messagesReceived(QList<Message> &received, QList<Message> &sent);
 
     /**
     * @brief Signals when address data is retrieved
index f57a7a4..5311205 100644 (file)
@@ -370,8 +370,8 @@ void MainWindow::buildMessagePanel()
 
     m_messagePanel = new MessagePanel(this);
 
-    connect(this, SIGNAL(messagesReceived(QList<Message>&)),
-            m_messagePanel, SLOT(populateMessageListView(QList<Message>&)));
+    connect(this, SIGNAL(messagesReceived(QList<Message>&, QList<Message>&)),
+            m_messagePanel, SLOT(populateMessageListView(QList<Message>&, QList<Message>&)));
 
     connect(m_messagePanel, SIGNAL(requestMessages()),
             this, SIGNAL(requestMessages()));
@@ -381,6 +381,12 @@ void MainWindow::buildMessagePanel()
 
     connect(m_messagePanel, SIGNAL(requestRemoveMessage(QString)),
             this, SIGNAL(requestRemoveMessage(QString)));
+
+    connect(m_messagePanel, SIGNAL(findFriend(GeoCoordinate)),
+            this, SIGNAL(centerToCoordinates(GeoCoordinate)));
+
+    connect(m_messagePanel, SIGNAL(requestMessageDialog(QPair<QString, QString>)),
+            this, SIGNAL(requestMessageDialog(QPair<QString, QString>)));
 }
 
 void MainWindow::buildOsmLicense()
index 287f7f0..bee4a6a 100644 (file)
@@ -625,7 +625,7 @@ signals:
     *
     * @param messages list of messages sent to user
     */
-    void messagesReceived(QList<Message> &messages);
+    void messagesReceived(QList<Message> &received, QList<Message> &sent);
 
     /**
      * @brief Signal for refreshing user data.
index 6be7c45..77a7ae8 100644 (file)
@@ -122,6 +122,7 @@ signals:
 
     /**
     * @brief Requests message dialog.
+    *
     * @param receiver receiver facebook ID and name
     */
     void requestMessageDialog(const QPair<QString, QString> &receiver);
index 82bebb1..4690585 100644 (file)
@@ -17,6 +17,13 @@ MessageListItem::~MessageListItem()
     qDebug() << __PRETTY_FUNCTION__;
 }
 
+GeoCoordinate MessageListItem::coordinates() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_coordinates;
+}
+
 const QString &MessageListItem::id() const
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -24,17 +31,31 @@ const QString &MessageListItem::id() const
     return m_id;
 }
 
+const QString &MessageListItem::receiverId() const
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    return m_receiverId;
+}
+
 void MessageListItem::setMessageData(const Message &message)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     m_id = message.id();
 
+    if (message.type() == Message::MessageTypeReceived)
+        m_receiverId = message.senderId();
+    else
+        m_receiverId = message.receiverId();
+
     setTitle(message.senderName());
 
     if (!message.image().isNull())
         setImage(message.image());
 
+    m_coordinates = message.coordinates();
+
     clearSubItems();
     QPixmap icon;
     icon.load(":/res/images/chat.png");
index 32af476..aee3447 100644 (file)
@@ -22,6 +22,7 @@
 #ifndef MESSAGELISTITEM_H
 #define MESSAGELISTITEM_H
 
+#include "coordinates/geocoordinate.h"
 #include "extendedlistitem.h"
 
 class Message;
@@ -51,6 +52,13 @@ public:
 ******************************************************************************/
 public:
     /**
+    * @brief Returns item's coordinates.
+    *
+    * @return item's coordinates
+    */
+    GeoCoordinate coordinates() const;
+
+    /**
     * @brief Returns message's ID.
     *
     * @return message's ID
@@ -58,6 +66,13 @@ public:
     const QString &id() const;
 
     /**
+    * @brief Returns message receiver's ID.
+    *
+    * @return message receiver's ID
+    */
+    const QString &receiverId() const;
+
+    /**
     * @brief Set message data for this item.
     *
     * @param message Messagedata
@@ -68,7 +83,10 @@ public:
 * DATA MEMBERS
 ******************************************************************************/
 private:
-    QString m_id;   ///< message's ID
+    QString m_id;                   ///< message's ID
+    QString m_receiverId;           ///< message reveiver's ID
+
+    GeoCoordinate m_coordinates;    ///< message's coordinates
 };
 
 #endif // MESSAGELISTITEM_H
index 04d91b0..a2baf98 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <QDebug>
 
+#include "coordinates/geocoordinate.h"
 #include "messagelistitem.h"
 
 #include "messagelistview.h"
@@ -37,8 +38,8 @@ bool MessageListView::listItemClicked(ListItem *item)
 
     MessageListItem *messageItem = dynamic_cast<MessageListItem*>(item);
 
-    if (messageItem && selected)
-        ;//emit messageItemClicked(messageItem->messageSenderId());
+    if (messageItem && selected && messageItem->coordinates().isValid())
+        emit messageItemClicked(messageItem->coordinates());
 
     return selected;
 }
index 116047f..b74b00a 100644 (file)
@@ -41,6 +41,9 @@ public:
     */
     MessageListView(QWidget *parent = 0);
 
+/******************************************************************************
+* MEMBER FUNCTIONS AND SLOTS
+******************************************************************************/
 public slots:
     /**
     * @brief Slot for list item clicked.
@@ -49,6 +52,17 @@ public slots:
     * @return true if item was selected, false otherwise
     */
     bool listItemClicked(ListItem *item);
+
+/******************************************************************************
+* SIGNALS
+******************************************************************************/
+signals:
+    /**
+    * @brief Signal is emitted when message item is clicked.
+    *
+    * @param coordinates item's coordinates
+    */
+    void messageItemClicked(const GeoCoordinate &coordinates);
 };
 
 #endif // MESSAGELISTVIEW_H
index 0f77666..518513f 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "extendedlistitemdelegate.h"
 #include "imagebutton.h"
+#include "headerlistitemdelegate.h"
 #include "messagelistitem.h"
 #include "messagelistview.h"
 #include "panelcommon.h"
@@ -53,6 +54,12 @@ MessagePanel::MessagePanel(QWidget *parent)
     connect(refreshMessagesButton, SIGNAL(clicked()),
             this, SIGNAL(requestMessages()));
 
+    ImageButton *messageButton = new ImageButton(":/res/images/chat_btn.png",
+                                                 ":/res/images/chat_btn_s.png",
+                                                 ":/res/images/chat_btn_d.png", this);
+    connect(messageButton, SIGNAL(clicked()),
+            this, SLOT(messageButtonPressed()));
+
     ImageButton *deleteMessageButton = new ImageButton(":res/images/message_remove_btn.png",
                                           ":res/images/message_remove_btn_s.png",
                                           ":res/images/message_remove_btn_d.png", this);
@@ -60,11 +67,17 @@ MessagePanel::MessagePanel(QWidget *parent)
             this, SLOT(removeMessage()));
 
     m_messageListView = new MessageListView(this);
-    m_messageListView->setItemDelegate(new ExtendedListItemDelegate(this));
+    m_messageListItemDelegate = new ExtendedListItemDelegate(this);
+    m_headerListItemDelegate = new HeaderListItemDelegate(this);
+    initItemDelegates();
+
     listViewLayout->addWidget(m_messageListView);
     connect(m_messageListView, SIGNAL(listItemSelectionChanged()),
             this, SLOT(onListItemSelectionChanged()));
+    connect(m_messageListView, SIGNAL(messageItemClicked(GeoCoordinate)),
+            this, SIGNAL(findFriend(GeoCoordinate)));
 
+    m_itemButtonsLayout->addWidget(messageButton);
     m_itemButtonsLayout->addWidget(deleteMessageButton);
 
     m_genericButtonsLayout->addWidget(refreshMessagesButton);
@@ -96,16 +109,60 @@ void MessagePanel::hideEvent(QHideEvent *event)
     m_messageListView->clearItemSelection();
 }
 
-void MessagePanel::populateMessageListView(QList<Message> &messages)
+void MessagePanel::initItemDelegates()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_messageListView->setItemDelegate(m_messageListItemDelegate);
+    delete m_headerListItemDelegate;
+    m_headerListItemDelegate = new HeaderListItemDelegate(this);
+
+}
+
+void MessagePanel::messageButtonPressed()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    MessageListItem *messageItem = dynamic_cast<MessageListItem*>(
+            m_messageListView->selectedItem());
+
+    if (messageItem)
+        emit requestMessageDialog(QPair<QString, QString>(messageItem->receiverId(),
+                                                          messageItem->title()));
+}
+
+void MessagePanel::populateMessageListView(QList<Message> &received, QList<Message> &sent)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     m_messageListView->clearList();
+    initItemDelegates();
+
+    if (received.count() > 0) {
+        m_messageListView->setItemDelegateForRow(0, m_headerListItemDelegate);
+        ExtendedListItem *receivedHeaderItem = new ExtendedListItem(0, QListWidgetItem::UserType);
+        receivedHeaderItem->setTitle(tr("Received:"));
+        m_messageListView->addListItem(QString("receivedHeader"), receivedHeaderItem);
+
+        foreach (Message message, received) {
+            MessageListItem *item = new MessageListItem();
+            item->setMessageData(message);
+            m_messageListView->addListItem(message.id(), item);
+        }
+    }
 
-    foreach (Message message, messages) {
-        MessageListItem *item = new MessageListItem();
-        item->setMessageData(message);
-        m_messageListView->addListItem(message.id(), item);
+    if (sent.count() > 0) {
+        m_messageListView->setItemDelegateForRow(m_messageListView->count(),
+                                                 m_headerListItemDelegate);
+        ExtendedListItem *sentHeaderItem = new ExtendedListItem(0, QListWidgetItem::UserType);
+        sentHeaderItem->setTitle(tr("Sent:"));
+        m_messageListView->addListItem(QString("sentHeader"), sentHeaderItem);
+
+        foreach (Message message, sent) {
+            MessageListItem *item = new MessageListItem();
+            item->setMessageData(message);
+            m_messageListView->addListItem(message.id(), item);
+        }
     }
 }
 
index cded9c7..5f4ce61 100644 (file)
@@ -25,6 +25,8 @@
 #include "panelbase.h"
 
 class ExtendedListItemDelegate;
+class GeoCoordinate;
+class HeaderListItemDelegate;
 class ImageButton;
 class Message;
 class MessageListView;
@@ -71,18 +73,26 @@ private slots:
     void anyPanelClosed();
 
     /**
-    * @brief Removes message.
+    * @brief Called when message button is pressed.
     *
-    * Removes selected message from list view and emits removeMessage signal.
+    * Calls requestMessageDialog with message receiver's ID and name
     */
-    void removeMessage();
+    void messageButtonPressed();
 
     /**
     * @brief Populates message list view.
     *
-    * @param locations list of Message objects
+    * @param received list of received Message objects
+    * @param sent list of sent Message objects
+    */
+    void populateMessageListView(QList<Message> &received, QList<Message> &sent);
+
+    /**
+    * @brief Removes message.
+    *
+    * Removes selected message from list view and emits removeMessage signal.
     */
-    void populateMessageListView(QList<Message> &messages);
+    void removeMessage();
 
     /**
     * @brief Sets person's image.
@@ -92,11 +102,31 @@ private slots:
     */
     void setImage(const QString &id, const QPixmap &image);
 
+private:
+    /**
+    * @brief Inits item delegates for message list view.
+    */
+    void initItemDelegates();
+
 /*******************************************************************************
  * SIGNALS
  ******************************************************************************/
 signals:
     /**
+     * @brief Signal for friend finding
+     *
+     * @param coordinates Target coordinate
+     */
+    void findFriend(const GeoCoordinate &coordinates);
+
+    /**
+    * @brief Requests message dialog.
+    *
+    * @param receiver receiver facebook ID and name
+    */
+    void requestMessageDialog(const QPair<QString, QString> &receiver);
+
+    /**
     * @brief Requests messages sent to the user.
     */
     void requestMessages();
@@ -113,6 +143,9 @@ signals:
  ******************************************************************************/
 private:
     MessageListView *m_messageListView;    ///< Message list view
+
+    ExtendedListItemDelegate *m_messageListItemDelegate;    ///< Message list item delegate
+    HeaderListItemDelegate *m_headerListItemDelegate;       ///< Header list item delegate
 };
 
 #endif // NOTIFICATIONPANEL_H