diff -r fa1df4b99609 -r ebe688cedc25 messagingapp/msgui/unifiedviewer/src/univiewerpixmapwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiedviewer/src/univiewerpixmapwidget.cpp Tue Aug 31 15:11:31 2010 +0300 @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2009 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: This widget displays the pixmap content in viewer. + * + */ + +#include "univiewerpixmapwidget.h" + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include + +// USER INCLUDES +#include "univiewerutils.h" +#include "unidatamodelplugininterface.h" + +// LOCAL CONSTANTS +#define LOC_OPEN hbTrId("txt_common_menu_open") +#define LOC_SAVE hbTrId("txt_common_menu_save") + +static const char PIXMAP_ICON[] = "qtg_small_image"; +static const char CORRUPTED_PIXMAP_ICON[] = "qtg_large_corrupted"; +static const char VIDEO_MIMETYPE[] = "video"; + +static const int WIDTH_RATIO = 4; +static const int HEIGHT_RATIO = 3; + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::UniViewerPixmapWidget +// @see header file +//--------------------------------------------------------------- +UniViewerPixmapWidget::UniViewerPixmapWidget(QGraphicsItem *parent) : + HbIconItem(parent), mInfo(0), mViewerUtils(0), mThumbnailManager(0) +{ + this->grabGesture(Qt::TapGesture); + init(); +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::~UniViewerPixmapWidget +// @see header file +//--------------------------------------------------------------- +UniViewerPixmapWidget::~UniViewerPixmapWidget() +{ + if (mInfo) { + delete mInfo; + mInfo = NULL; + } +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::populate +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::populate(UniMessageInfo *info) +{ + mMimeType = info->mimetype(); + mPixmapPath = info->path(); + + /** + * Create a copy of info for video content. + * mInfo will be deleted in the destructor. + */ + if (mMimeType.contains(VIDEO_MIMETYPE)) { + mInfo = new UniMessageInfo(*info); + } + + if (info->isProtected()) { + if (mMimeType.contains(VIDEO_MIMETYPE)) { + emit thumbnailFound(false, mInfo); + } + else { + this->setIconName(PIXMAP_ICON); + } + } + else if (info->isCorrupted()) { + if (mMimeType.contains(VIDEO_MIMETYPE)) { + emit thumbnailFound(false, mInfo); + } + else { + this->setIconName(CORRUPTED_PIXMAP_ICON); + } + } + else { + if (mMimeType.contains(VIDEO_MIMETYPE)) { + mThumbnailManager->getThumbnail(mPixmapPath); + this->ungrabGesture(Qt::TapGesture); + } + else { + QPixmap pixmap(mPixmapPath); + this->setIcon(HbIcon(pixmap)); + } + } +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::gestureEvent +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::gestureEvent(QGestureEvent *event) +{ + HbTapGesture *tapGesture = qobject_cast (event->gesture(Qt::TapGesture)); + if (tapGesture) { + switch (tapGesture->state()) { + case Qt::GestureStarted: + { + // Trigger haptic feedback. + HbInstantFeedback::play(HbFeedback::Basic); + break; + } + case Qt::GestureUpdated: + { + if (HbTapGesture::TapAndHold == tapGesture->tapStyleHint()) { + // Handle longtap. + handleLongTap(tapGesture->scenePosition()); + } + break; + } + case Qt::GestureFinished: + { + HbInstantFeedback::play(HbFeedback::Basic); + if (HbTapGesture::Tap == tapGesture->tapStyleHint()) { + // Handle short tap + handleShortTap(); + } + break; + } + case Qt::GestureCanceled: + { + HbInstantFeedback::play(HbFeedback::Basic); + break; + } + } + } + else { + HbIconItem::gestureEvent(event); + } +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::handleOpen +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::handleOpen() +{ + this->ungrabGesture(Qt::TapGesture); + + if (!mViewerUtils) { + mViewerUtils = new UniViewerUtils(this); + } + mViewerUtils->launchContentViewer(mMimeType, mPixmapPath); + + //fire timer to regrab gesture after some delay. + QTimer::singleShot(300,this,SLOT(regrabGesture())); +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::handleSave +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::handleSave() +{ +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::regrabGesture +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::regrabGesture() +{ + this->grabGesture(Qt::TapGesture); +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::thumbnailReady +// @see header +//--------------------------------------------------------------- +void UniViewerPixmapWidget::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) +{ + Q_UNUSED(data) + Q_UNUSED(id) + this->grabGesture(Qt::TapGesture); + if (error) { + emit thumbnailFound(false, mInfo); + } + else { + this->setIcon(HbIcon(pixmap)); + this->hide(); + emit thumbnailFound(true, NULL); + } +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::init +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::init() +{ + mThumbnailManager = new ThumbnailManager(this); + mThumbnailManager->setMode(ThumbnailManager::CropToAspectRatio); + mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); + mThumbnailManager->setThumbnailSize(getThumbnailSize()); + + connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), this, + SLOT(thumbnailReady(QPixmap, void*, int, int))); +} + +//---------------------------------------------------------------------------- +// UniViewerPixmapWidget::handleShortTap +// @see header file +//---------------------------------------------------------------------------- +void UniViewerPixmapWidget::handleShortTap() +{ + emit shortTap(mPixmapPath); + + // Open the media. + handleOpen(); +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::handleLongTap +// @see header file +//--------------------------------------------------------------- +void UniViewerPixmapWidget::handleLongTap(const QPointF &position) +{ + emit longTap(position); + + HbMenu* menu = new HbMenu; + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->addAction(LOC_OPEN, this, SLOT(handleOpen())); + menu->addAction(LOC_SAVE, this, SLOT(handleSave())); + menu->setPreferredPos(position); + menu->show(); +} + +//--------------------------------------------------------------- +// UniViewerPixmapWidget::getThumbnailSize +// @see header file +//--------------------------------------------------------------- +QSize UniViewerPixmapWidget::getThumbnailSize() +{ + QSize thumbnailSize(1, 1); + HbWidget *parent = qobject_cast(this->parentWidget()); + + if (parent) { + qreal thumbnailWidth = 0.0; + qreal thumbnailHeight = 0.0; + parent->style()->parameter("hb-param-screen-short-edge", thumbnailWidth); + thumbnailHeight = (thumbnailWidth * HEIGHT_RATIO) / WIDTH_RATIO; + thumbnailSize.setHeight(qRound(thumbnailHeight)); + thumbnailSize.setWidth(qRound(thumbnailWidth)); + } + return thumbnailSize; +} + +// EOF