emailuis/nmhswidget/src/nmhswidget.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:23:15 +0300
changeset 20 ecc8def7944a
parent 18 578830873419
child 23 2dc6caa42ec3
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: 
 *
 */
#include <QDebug>
#include <QtGui>
#include <QGraphicsLinearLayout>
#include <hbcolorscheme.h>
#include "nmcommon.h"
#include "nmhswidget.h"
#include "nmhswidgetemailengine.h"
#include "nmmessageenvelope.h"
#include "nmhswidgettitlerow.h"
#include "nmhswidgetemailrow.h"
#include "nmhswidgetconsts.h"

NmHsWidget::NmHsWidget(QGraphicsItem *parent, Qt::WindowFlags flags)
    : HbWidget(parent, flags), 
      mEngine(0),
      mRowLayout(0),
      mTitleRow( new NmHsWidgetTitleRow() ),
      mAccountId(0)
{
    qDebug() << "NmHsWidget::NmHsWidget IN -->>";

    this->setContentsMargins( KNmHsWidgetContentsMargin, KNmHsWidgetContentsMargin,
            KNmHsWidgetContentsMargin, KNmHsWidgetContentsMargin);
    //Setup layout
    mRowLayout = new QGraphicsLinearLayout(Qt::Vertical);
    mRowLayout->setContentsMargins(KNmHsWidgetContentsMargin, KNmHsWidgetContentsMargin,
            KNmHsWidgetContentsMargin, KNmHsWidgetContentsMargin);
    mRowLayout->setSpacing(KNmHsWidgetContentsMargin);
    mRowLayout->addItem(mTitleRow);
    setLayout(mRowLayout);
    
    qDebug() << "NmHsWidget::NmHsWidget OUT <<--";
}

/*!
    Destructor
*/
NmHsWidget::~NmHsWidget()
{
    qDebug() << "NmHsWidget::~NmHsWidget IN -->>";
    if(mEngine)
        {
        delete mEngine;
        mEngine = NULL;
        }
    qDebug() << "NmHsWidget::~NmHsWidget OUT <<--";
}

/*!
    \fn void NmHsWidget::onShow()

    Shows the widget
*/
void NmHsWidget::onShow()
{
    qDebug() << "NmHsWidget::onShow IN -->>";
    if (mEngine)
        {
        mEngine->activate();
        }
    qDebug() << "NmHsWidget::onShow OUT <<--";
}


/*!
    \fn void NmHsWidget::onHide()

    Hides the widget
*/
void NmHsWidget::onHide()
{
    qDebug() << "NmHsWidget::onHide IN -->>";
    if (mEngine)
        {
        mEngine->suspend();
        }
    qDebug() << "NmHsWidget::onHide OUT <<--";
}


/*!
    Initializes the widget.
*/
void NmHsWidget::onInitialize()
{
    qDebug() << "NmHsWidget::onInitialize IN -->>";

    mEngine = new NmHsWidgetEmailEngine( mAccountId ); 
    mTitleRow->updateAccountName(mEngine->accountName());
    updateMailData();
    mTitleRow->updateUnreadCount(mEngine->unreadCount());
    
    //Get signals about changes in mail data
    connect(mEngine, SIGNAL( mailDataChanged() )
            ,this, SLOT( updateMailData() ) );
    
    //Get Signals about changes in unread count
    connect(mEngine, SIGNAL( unreadCountChanged(const int&) )
            ,mTitleRow, SLOT( updateUnreadCount(const int&) ) );
    
    //Get signals about account name changes
    connect(mEngine, SIGNAL( accountNameChanged(const QString&) )
            ,mTitleRow, SLOT( updateAccountName(const QString&) ) );

    qDebug() << "NmHsWidget::onInitialize OUT <<--";  
}

/*!
    Uninitializes the widget.
*/
void NmHsWidget::onUninitialize()
{
    qDebug() << "NmHsWidget::onUninitialize IN -->>";
    
    qDebug() << "NmHsWidget::onUninitialize OUT <<--";
}

/*!
    Paints widget
*/
void NmHsWidget::paint(QPainter *painter, 
                          const QStyleOptionGraphicsItem *option, 
                          QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);
    //----- backgroud ----------------
    painter->setOpacity(KNmHsWidgetBackgroundOpacity);
    QColor backgroundColor(HbColorScheme::color(KBackgroundColorAttribute));
    // frame is not wanted to be drawn, thus pen color is same as backround color
    painter->setPen(QPen(backgroundColor, 0));
    painter->setBrush(backgroundColor);
    painter->drawRoundedRect(rect(), KNmHsWidgetShoulderRadius, 
            KNmHsWidgetShoulderRadius);
    painter->setOpacity(1); //set opacity back to default
}

/*!
    updateMailData slot
*/
void NmHsWidget::updateMailData()
{
    qDebug() << "NmHsWidget::updateData IN -->>";
    QList<NmMessageEnvelope> envelopes;
    int count = mEngine->getEnvelopes(envelopes, 2);
    //TODO: needs error check for -1 ?
    updateMailRowsList(count);
    
    for(int i=0; i<envelopes.count(); i++)
        {
        qDebug() << "env:" << QString::number(i) << "dispName: " << envelopes[i].sender().displayName();
        qDebug() << "env:" << QString::number(i) << "dispName: " << envelopes[i].sender().address();
        qDebug() << "env:" << QString::number(i) << "subject:" << envelopes[i].subject();
        qDebug() << "env:" << QString::number(i) << "isRead: " << envelopes[i].isRead();
        qDebug() << "env:" << QString::number(i) << "date: " << envelopes[i].sentTime();
        qDebug() << "env:" << QString::number(i) << "priority: " << envelopes[i].priority();
        qDebug() << "env:" << QString::number(i) << "attachments: " << envelopes[i].hasAttachments();
        mMailRows[i]->updateMailData( envelopes[i] );
        }
    qDebug() << "NmHsWidget::updateData OUT <<--"; 
}

/*!
    Sets monitored account id from given string
    Needed for home screen framework thich supports only QString type properties
*/
void NmHsWidget::setAccountId(const QString &text)
{
    qDebug() << "NmHsWidget::setAccountId IN -->>"; 
    bool ok;
    quint64 id = text.toULongLong(&ok);
    if (!ok)
        {
        // TODO: assert here if conversion failed?
        qDebug() << "NmHsWidget::setAccountId: invalid account ID data!!!"; 
        mAccountId.setId(0);
        }
    else
        {
        mAccountId.setId(id);
        }
    qDebug() << "NmHsWidget::setAccountId OUT <<--"; 
}

/*!
    Returns monitored account id as a string
    Needed for home screen framework which supports only QString type properties
*/
QString NmHsWidget::accountId() const
{
    qDebug() << "NmHsWidget::accountId()"; 
    return QString::number(mAccountId.id());
}

/*!
    Updates list to include correct amount of mail row widgets
*/
void NmHsWidget::updateMailRowsList(int mailCount)
{
    qDebug() << "NmHsWidget::updateMailRowsList IN -->>";
    qDebug() << "NmHsWidget - mMailRows.count() == " <<  mMailRows.count();
    qDebug() << "NmHsWidget - ordered count == " <<  mailCount;
    while (mMailRows.count() != mailCount)
        {
        //more mails to show than rows
        if (mMailRows.count() < mailCount)
            {
            qDebug() << "NmHsWidget - add new mail row";
            NmHsWidgetEmailRow *row = new NmHsWidgetEmailRow();
            mMailRows.append(row);
            mRowLayout->addItem(row);            
            }
        //too many rows
        else if (mMailRows.count() > mailCount)
            {
            qDebug() << "NmHsWidget - remove mail row";
            mRowLayout->removeItem(mMailRows.last());
            delete mMailRows.takeLast();
            }
        }
    __ASSERT_ALWAYS( mMailRows.count() == mailCount, User::Panic(_L("Invalid"), 500) );
    qDebug() << "NmHsWidget::updateMailRowsList OUT <<--";
}

/*!
    mousePressEvent(QGraphicsSceneMouseEvent *event)
*/
void NmHsWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug() << "NmHsWidget::mousePressEvent IN -->>";

    if (mTitleRow->rect().contains(event->pos()))
        {
        mEngine->launchMailAppInboxView();
        }
    else
        {
        for (int i=0; i < mMailRows.count(); i++)
            {
            QRectF tmpRect = mMailRows.at(i)->geometry(); // rect();
            if (tmpRect.contains(event->pos()))
                {
                mEngine->launchMailAppMailViewer(mMailRows.at(i)->messageId());
                break;
                }
            }
        }
    qDebug() << "NmHsWidget::mousePressEvent OUT <<--";
}