diff -r f979ecb2b13e -r c198609911f9 alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertwidget_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertwidget_p.cpp Fri Apr 16 14:57:40 2010 +0300 @@ -0,0 +1,538 @@ +/* +* 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: +* +*/ +// alarmalertwidget_p.cpp + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "alarmalertwidget_p.h" +#include "alarmalert.h" + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::AlarmAlertDialogPrivate +// rest of the details are commented in the header +// --------------------------------------------------------- +// +AlarmAlertDialogPrivate::AlarmAlertDialogPrivate(const QVariantMap ¶meters): + mClosedByClient(false), + mIsSilenceButton(false) +{ + // Extract all the parameters sent by the client + parseAndFetchParams(parameters); + + // Set the dismiss policy and timeout property + setDismissPolicy(HbPopup::NoDismiss); + setTimeout(HbPopup::NoTimeout); + + // Initialize the user response + mUserResponse = Other; + + /*if (isScreenLocked()) { + setupSwipeUI(); + } else { + setupNormalUI(); + }*/ + // Load the translation file and install the editor specific translator + mTranslator = new QTranslator; + QString lang = QLocale::system().name(); + QString path = "Z:/resource/qt/translations/"; + bool loaded = mTranslator->load("alarmui_en_GB",":/translations"); + // TODO: Load the appropriate .qm file based on locale + //bool loaded = mTranslator->load("alarmui_" + lang, path); + HbApplication::instance()->installTranslator(mTranslator); + + setupNormalUI(); + + // Find the content widget and set it to self + QGraphicsWidget *contentWidget = mDocLoader->findWidget("content"); + Q_ASSERT_X(contentWidget, "alarmalertwidget_p.cpp", "Unable to find content widget"); + setContentWidget(contentWidget); + + // Resize the dialog to accomodate the content widget + setPreferredSize(contentWidget->minimumSize()); + + // TODO: Gestures not working. Integrate once support is available from Qt + grabGesture(Qt::SwipeGesture); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::~AlarmAlertDialogPrivate +// rest of the details are commented in the header +// --------------------------------------------------------- +// +AlarmAlertDialogPrivate::~AlarmAlertDialogPrivate() +{ + // Cleanup + if (mDocLoader) { + delete mDocLoader; + } + + // Cancel any ongoing animations + HbEffect::cancel(mSlider, "slideDownPortrait", false, false, false); + HbEffect::cancel(mSlider, "slideDownLandscape", false, false, false); + + // Remove the effect + HbEffect::remove(mSlider); + + // Remove the translator + HbApplication::instance()->removeTranslator(mTranslator); + if (mTranslator) { + delete mTranslator; + mTranslator = 0; + } +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::setDeviceDialogParameters +// rest of the details are commented in the header +// --------------------------------------------------------- +// +bool AlarmAlertDialogPrivate::setDeviceDialogParameters(const QVariantMap ¶meters) +{ + Q_UNUSED(parameters); + + //TODO: Handle parameters to be set + return 0; +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::deviceDialogError +// rest of the details are commented in the header +// --------------------------------------------------------- +// +int AlarmAlertDialogPrivate::deviceDialogError() const +{ + // TODO: Return any errors that might have occured + return 0; +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::AlarmAlertDialogPrivate +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::closeDeviceDialog(bool byClient) +{ + Q_UNUSED(byClient); + mClosedByClient = byClient; + close(); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::deviceDialogWidget +// rest of the details are commented in the header +// --------------------------------------------------------- +// +HbDialog *AlarmAlertDialogPrivate::deviceDialogWidget() const +{ + return const_cast (this); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::showEvent +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::showEvent(QShowEvent *event) +{ + HbDialog::showEvent(event); + QVariantMap param; + param.insert(alarmCommand, mUserResponse); + //emit deviceDialogData(param); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::closeEvent +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::closeEvent(QCloseEvent *event) +{ + // Forward the call to the base class + HbDialog::closeEvent(event); + + // Do not notify the client back if the close was initiated by client itself + if(!mClosedByClient) { + // Package the user response and send it + QVariantMap param; + param.insert(alarmCommand, mUserResponse); + emit deviceDialogData(param); + } + // This signal has to be emitted so that the dialog can be cleaned up later + emit deviceDialogClosed(); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::animationComplete +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::animationComplete(const HbEffect::EffectStatus &status) +{ + Q_UNUSED(status); + + // Restart the animation effects + if (Qt::Vertical == hbInstance->orientation()) { + HbEffect::start(mSlider, "slideDownPortrait", this, "animationComplete"); + } else { + HbEffect::start(mSlider, "slideDownLandscape", this, "animationComplete"); + } +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::sceneEvent +// rest of the details are commented in the header +// --------------------------------------------------------- +// +bool AlarmAlertDialogPrivate::sceneEvent(QEvent *event) +{ + // TODO: Need to handle gestures once they are available + if (event->type() == QEvent::Gesture) { + QGestureEvent *gestureEvent = + static_cast(event); + if (const QGesture *gesture = gestureEvent->gesture(Qt::SwipeGesture)) { + if (Qt::GestureFinished == gesture->state()) { + event->accept(); + close(); + return true; + } + event->accept(); + return true; + } + } + return HbWidget::sceneEvent(event); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::handleOrientationChange +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::handleOrientationChange () +{ + // TODO: Need to change this as per the UI concept + // Might need to disable orientation changes + bool loadSuccess(false); + if (Qt::Vertical == hbInstance->orientation()) { + mDocLoader->load(":/xml/alarmalert.docml", "portrait", &loadSuccess); + Q_ASSERT_X(loadSuccess, "alarmalertwidget_p.cpp", "Unable to load portrait section"); + } else { + mDocLoader->load(":/xml/alarmalert.docml", "landscape", &loadSuccess); + Q_ASSERT_X(loadSuccess, "alarmalertwidget_p.cpp", "Unable to load landscape section"); + } +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::snoozed +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::snoozed() +{ + mUserResponse = Snooze; + close(); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::silenced +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::silenced() +{ + if (mIsSilenceButton) { + mUserResponse = Silence; + mSnoozeButton->setText(hbTrId("txt_calendar_button_alarm_snooze")); + mIsSilenceButton = false; + QVariantMap param; + param.insert(alarmCommand, mUserResponse); + emit deviceDialogData(param); + }else { + mUserResponse = Snooze; + close(); + } + + + +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::dismissed +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::dismissed() +{ + mUserResponse = Stop; + close(); +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::parseAndFetchParams +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::parseAndFetchParams(const QVariantMap ¶meters) +{ + // Iterate thru the list and extract all relevant parameters + QVariantMap::const_iterator iter = parameters.constBegin(); + int count = parameters.size(); + while (iter != parameters.constEnd()) { + QString key(iter.key()); + if (alarmSubject == key) { + mSubject = iter.value().toString(); + } else if (alarmLocation == key) { + mLocation = iter.value().toString(); + } else if (alarmDateTime == key) { + mAlarmTime = iter.value().toDateTime(); + } else if (alarmType == key) { + mIsClockAlarm = iter.value().toBool(); + } else if (alarmCanSnooze == key) { + mCanSnooze = iter.value().toBool(); + } else if (alarmRingingType == key) { + mIsSilent = iter.value().toBool(); + } else { + break; + } + iter++; + } +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::setupSwipeUI +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::setupSwipeUI() +{ + // Connect to orientation change signals + QList windowList = hbInstance->allMainWindows(); + mMainWindow = windowList.at(0); + Q_ASSERT_X(mMainWindow, "alarmalertwidget_p.cpp", "Unable to get the main window"); + connect(mMainWindow, SIGNAL(aboutToChangeOrientation()), this, SLOT(handleOrientationChange())); + + // Load the docml file to get the content widget for the dialog + mDocLoader = new HbDocumentLoader(); + bool loadSuccess = false; + mDocLoader->load(alarmSwipeUIDocml, &loadSuccess); + Q_ASSERT_X(loadSuccess, "alarmalertwidget_p.cpp", "Unable to load docml"); + + // Get the reference to the slider widget + mSlider = mDocLoader->findWidget("sliderIcon"); + Q_ASSERT_X(mSlider, "alarmalertwidget_p.cpp", "Unable to find slider widget"); + + mAlarmDescription = qobject_cast (mDocLoader->findWidget("alarmDescription")); + Q_ASSERT_X(mAlarmDescription, "alarmalertwidget_p.cpp", "Unable to find alarm description label"); + mAlarmDescription->setPlainText(mSubject); + + mAlarmDateTime = qobject_cast (mDocLoader->findWidget("alarmTime")); + Q_ASSERT_X(mAlarmDateTime, "alarmalertwidget_p.cpp", "Unable to find alarm time label"); + + mAlarmIcon = qobject_cast (mDocLoader->findWidget("alarmIcon")); + Q_ASSERT_X(mAlarmIcon, "alarmalertwidget_p.cpp", "Unable to find alarm icon"); + + if (!mIsClockAlarm) { + mAlarmIcon->setIcon(HbIcon(":/image/calendarAlarm")); + } + + // Set the time to the time label + HbExtendedLocale locale; + mAlarmDateTime->setPlainText(locale.format(mAlarmTime.time(), r_qtn_time_usual)); + + // Add the required effects. + HbEffect::add(mSlider, + QString(":/effect/animate_portrait.fxml"), + "slideDownPortrait"); + HbEffect::add(mSlider, + QString(":/effect/animate_landscape.fxml"), + "slideDownLandscape"); + + // Based on the orientation, load the appropriate sections and animations + if (Qt::Vertical == hbInstance->orientation()) { + mDocLoader->load(":/xml/alarmalert.docml", "portrait", &loadSuccess); + Q_ASSERT_X(loadSuccess, "alarmalertwidget_p.cpp", "Unable to load portrait section"); + + HbEffect::start(mSlider, "slideDownPortrait", this, "animationComplete"); + } else { + mDocLoader->load(":/xml/alarmalert.docml", "landscape", &loadSuccess); + Q_ASSERT_X(loadSuccess, "alarmalertwidget_p.cpp", "Unable to load landscape section"); + + HbEffect::start(mSlider, "slideDownLandscape", this, "animationComplete"); + } + + // Get the reference to the snooze button + HbPushButton *snoozeButton = qobject_cast (mDocLoader->findWidget("snoozeButton")); + Q_ASSERT_X(snoozeButton, "alarmalertwidget_p.cpp", "Unable to find snooze button"); + connect(snoozeButton, SIGNAL(clicked()), this, SLOT(snoozed())); + + if (!mCanSnooze) { + snoozeButton->hide(); + } +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::setupNormalUI +// rest of the details are commented in the header +// --------------------------------------------------------- +// + +void AlarmAlertDialogPrivate::setupNormalUI() +{ + // Load the docml file to get the content widget for the dialog + mDocLoader = new HbDocumentLoader(); + bool loadSuccess = false; + mDocLoader->load(alarmNormalUIDocml, &loadSuccess); + Q_ASSERT_X(loadSuccess, "alarmalertwidget_p.cpp", "Unable to load docml"); + + mAlarmDescription = qobject_cast (mDocLoader->findWidget("alarmDescription")); + Q_ASSERT_X(mAlarmDescription, "alarmalertwidget_p.cpp", "Unable to find alarm description label"); + mAlarmDescription->setPlainText(mSubject); + + mAlarmDateTime = qobject_cast (mDocLoader->findWidget("alarmTime")); + Q_ASSERT_X(mAlarmDateTime, "alarmalertwidget_p.cpp", "Unable to find alarm time label"); + + mAlarmIcon = qobject_cast (mDocLoader->findWidget("alarmIcon")); + Q_ASSERT_X(mAlarmIcon, "alarmalertwidget_p.cpp", "Unable to find alarm icon"); + + if (!mIsClockAlarm) { + mAlarmIcon->setIcon(HbIcon(":/image/calendarAlarm")); + } + + // Set the time to the time label + HbExtendedLocale locale = HbExtendedLocale::system(); + mAlarmDateTime->setPlainText( + hbTrId("txt_calendar_info_alarm_start_time").arg( + locale.format(mAlarmTime.time(), r_qtn_time_usual))); + + // TODO: Based on the orientation, load the appropriate sections and animations + if (Qt::Vertical == hbInstance->orientation()) { + } else { + } + + + + // Get the reference to the stop button + HbPushButton *stopButton = qobject_cast (mDocLoader->findWidget("stopButton")); + Q_ASSERT_X(stopButton, "alarmalertwidget_p.cpp", "Unable to find stop button"); + connect(stopButton, SIGNAL(clicked()), this, SLOT(dismissed())); + + if (mIsClockAlarm) { + handleClockAlarms(); + }else { + handleCalendarAlarms(); + } + + QList windowList = hbInstance->allMainWindows(); + mMainWindow = windowList.at(0); + QRectF screenRect = mMainWindow->rect(); + setPreferredPos(QPointF(screenRect.width()/2, screenRect.height()/2), HbPopup::Center); +} + + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::handleClockAlarms +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::handleClockAlarms() +{ + // Get the reference to the snooze button + HbPushButton *snoozeButton = qobject_cast (mDocLoader->findWidget("snoozeButton")); + Q_ASSERT_X(snoozeButton, "alarmalertwidget_p.cpp", "Unable to find snooze button"); + connect(snoozeButton, SIGNAL(clicked()), this, SLOT(snoozed())); + + if (!mCanSnooze) { + snoozeButton->hide(); + } +} + + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::handleCalendarAlarms +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::handleCalendarAlarms() +{ + mSnoozeButton = qobject_cast (mDocLoader->findWidget("snoozeButton")); + Q_ASSERT_X(mSnoozeButton, "alarmalertwidget_p.cpp", "Unable to find snooze button"); + connect(mSnoozeButton, SIGNAL(clicked()), this, SLOT(silenced())); + if(!mIsSilent) { + mSnoozeButton->setText(hbTrId("txt_calendar_button_alarm_silence")); + mIsSilenceButton = true; + } + // Hide the snooze button if the alarm cannot be snoozed + if (!mCanSnooze) { + mSnoozeButton->hide(); + } +} + + + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::isScreenLocked +// rest of the details are commented in the header +// --------------------------------------------------------- +// +bool AlarmAlertDialogPrivate::isScreenLocked() +{ + // TODO: Replace with actual API which gets the screen lock status + return false; +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::mousePressEvent +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + // TODO: Must be removed once gestures are available + mTapPoint = event->pos(); + qDebug() << "Tap event"; +} + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::mouseMoveEvent +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + // TODO: THIS IS A HACK!!! + // Must be removed once gestures are available + QPointF curPos = event->pos(); + if (curPos.y() - mTapPoint.y() > 40) { + qDebug() << "Sufficient drag"; + if (mUserResponse == Other) { + dismissed(); + } + } +}