diff -r 0818dd463d41 -r 924385140d98 coreapplicationuis/devicepowermenuplugin/src/hbdevicepowermenuwidegt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/coreapplicationuis/devicepowermenuplugin/src/hbdevicepowermenuwidegt.cpp Tue Aug 31 15:24:25 2010 +0300 @@ -0,0 +1,438 @@ +/* + * 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 "hbdevicepowermenuwidegt_p.h" +#include "hbdevicepowermenupluginerrors_p.h" +#include + +//resuorces +QString POWER_MENU_DOCML(":/xml/powermenu.docml"); +QString VOLUME_DECREASE_ICON(":/images/decrement.svg"); +QString VOLUME_INCREASE_ICON(":/images/increment.svg"); +QString VOLUME_UNMUTE_ICON(":/images/unmuted.svg"); +QString VOLUME_MUTE_ICON(":/images/muted.svg"); +//For Localization +QString LOCALE_PATH("/resource/qt/translations/"); +QString TS_FILE("power_menu"); + +//Widget names +QString MAIN_DLG("maindialog"); +QString PWR_SILENCE("Silence"); +QString PWR_VOLUME("Volume"); +QString PWR_VIBARTE("Vibrate"); +QString PWR_OFFLINE("Offline"); +QString PWR_POWEROFF("PowerOff"); +QString PWR_CONTAINER("container_1"); + +//DO not modify these strings +QString KVolumeLevel("VolumeLevel"); +QString KSilenceLatchOn("SilenceLatchOn"); //Used to latch silencebutton +QString KVibrationEnable("VibrationEnable"); +QString KOfflineEnable("OfflineEnable"); +QString KCypherOff("CypherOff"); //used to poweroffButtonEnabled/Disabled +QString KShutDown("ShutDown"); + +//Used for Orientation of PowerMenu +qreal KVerticalX = 175; +//width of PowerMenu +qreal KPMWidth = 360; + +/** + * Constructor + */ +HbDevicePowerMenuWidget::HbDevicePowerMenuWidget(const QVariantMap ¶meters) + :mDeviceDialogError(NoError), + mVolumeLevel(0), + mShowVolume(false), + mVibrationChecked(true), + mOfflineChecked(true), + mSilencelatched(true), + mCypherOff(true), + mDialogWidget(NULL), + mSilenceButton(NULL), + mVolumeSlider(NULL), + mVibarte(NULL), + mOffline(NULL), + mPowerOffButton(NULL), + mLoader(NULL), + mHbTranslator(NULL) + { + // mMainWindow(NULL), + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::Constructor:Begin") ) ); + if (preConstructDialog()) + { + //Translator loaded succesfully then olny construct widgets + constructDialog(parameters); + } + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::Constructor:End") ) ); + } + +/** + * Destructor + */ +HbDevicePowerMenuWidget::~HbDevicePowerMenuWidget() + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::Destructor()") ) ); + cleanupMemory(); + } + +/** + * Implementation of HbDeviceDialogInterface method + * sets parameters of custom widget + */ +bool HbDevicePowerMenuWidget::setDeviceDialogParameters(const QVariantMap ¶meters) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setDeviceDialogParameters:Begin") ) ); + if(parameters.contains(KVolumeLevel)) + { + mVolumeLevel = parameters.value(KVolumeLevel).toInt(); + } + if(parameters.contains(KSilenceLatchOn)) + { + mSilencelatched = parameters.value(KSilenceLatchOn).toBool(); + //If SilenceMode is Enabled then MasterVolume control is Disabled + mShowVolume = mSilencelatched? false:true; + } + if(parameters.contains(KVibrationEnable)) + { + mVibrationChecked = parameters.value(KVibrationEnable).toBool(); + } + if(parameters.contains(KOfflineEnable)) + { + mOfflineChecked = parameters.value(KOfflineEnable).toBool(); + } + if(parameters.contains(KCypherOff)) + { + mCypherOff = parameters.value(KCypherOff).toBool(); + } + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setDeviceDialogParameters:End") ) ); + return true; + } + +/** + * Returns error code + */ +int HbDevicePowerMenuWidget::deviceDialogError() const + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::deviceDialogError") ) ); + return mDeviceDialogError; + } + +/** + * Close DeviceDialog + */ +void HbDevicePowerMenuWidget::closeDeviceDialog(bool byClient) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closeDeviceDialog:Begin") ) ); + Q_UNUSED(byClient); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closeDeviceDialog:End") ) ); + mDialogWidget->close(); + } + +/** + * Implementation of HbDeviceDialogInterface method + */ +HbPopup* HbDevicePowerMenuWidget::deviceDialogWidget() const + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::deviceDialogWidget") ) ); + return mDialogWidget; + } + +/** + * Implementation of HbDeviceDialogInterface method + * to get signals from action events + */ +QObject* HbDevicePowerMenuWidget::signalSender() const + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::signalSender") ) ); + return const_cast(this); + } + +/** + * Before loading docml and widgets Translator must be loaded + */ +bool HbDevicePowerMenuWidget::preConstructDialog() + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::preConstructDialog:Begin") ) ); + //Translator + mHbTranslator = new HbTranslator(LOCALE_PATH,TS_FILE); + if(!mHbTranslator) + { + //Translator is failed to create + mDeviceDialogError = UnknownDeviceDialogError; + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::preConstructDialog:MemoryAllocation Failed") ) ); + return false; + } + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::preConstructDialog:End") ) ); + return true; + } + +/** + * Constrcuts customized widget dialog by loading the UI from docml and + * initializes all parameters and attributes. + * Throws bad-memory on Un-succesful memory allocations + */ +void HbDevicePowerMenuWidget::constructDialog(const QVariantMap ¶meters) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:Begin") ) ); + bool dialogLoaded(false); + //Docml loader + mLoader = new HbDocumentLoader(); + if(!mLoader) + { + //Document Loader failed to create + mDeviceDialogError = UnknownDeviceDialogError; + cleanupMemory(); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:mLoader::MemoryAllocation Failed") ) ); + return; + } + mLoader->load(POWER_MENU_DOCML, &dialogLoaded); + Q_ASSERT_X(dialogLoaded, "HbDevicePowerMenuWidget", "Invalid xml file"); + //Widgets + if (dialogLoaded) + { + //Dialog loaded succesfully from docml + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:dialogLoaded:Begin") ) ); + + //Initialize Parameters received + setDeviceDialogParameters(parameters); + mDialogWidget = qobject_cast (mLoader->findWidget(MAIN_DLG)); + //Find the handles for all widget items + mSilenceButton = qobject_cast (mLoader->findWidget(PWR_SILENCE)); + mVolumeSlider = qobject_cast (mLoader->findWidget(PWR_VOLUME)); + mVibarte = qobject_cast (mLoader->findWidget(PWR_VIBARTE)); + mOffline = qobject_cast (mLoader->findWidget(PWR_OFFLINE)); + mPowerOffButton = qobject_cast (mLoader->findWidget(PWR_POWEROFF)); + QGraphicsWidget *widget(NULL); + widget = mLoader->findWidget(PWR_CONTAINER); + if (!(IsValidHandles()&&(widget))) + { + //Atleast, One of the Handles are not allocated memory + mDeviceDialogError = UnknownDeviceDialogError; + cleanupMemory(); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:Widgets::MemoryAllocation Failed") ) ); + return; + } + //Sets Speaker icon + setSpeakerIcon(); + //Customize slider to VolumeSlider + customizeVolumeSlider(); + mDialogWidget->setContentWidget(widget); + //SetWidget Attributes + //1. Volume + mVolumeSlider->setSliderPosition(mVolumeLevel); + mVolumeSlider->setEnabled(mShowVolume); + //This will avoid IPC calls while dragging the Slider + mVolumeSlider->setTracking(false); + bool ok = connect(mVolumeSlider,SIGNAL(valueChanged(int)) , this , SLOT(handleVolumeChanged(int))); + Q_ASSERT_X(ok, "VolumeSlider", "Invalid IncrementDecrement Change"); + + //2.Silence Mode + mSilenceButton->setDown(mSilencelatched); + ok = connect(mSilenceButton,SIGNAL(clicked(bool)) , this , SLOT(handleSilenceMode(bool))); + Q_ASSERT_X(ok, "SilenceButton", "Invalid Clicked"); + + //3.Master Vibration + mVibarte->setChecked(mVibrationChecked); + ok = connect(mVibarte,SIGNAL(stateChanged(int)) , this , SLOT(handleVibrationToggled(int))); + Q_ASSERT_X(ok, "Vibrator", "Invalid Vibrator Toggeld"); + + //4.Offline + mOffline->setChecked(mOfflineChecked); + ok = connect(mOffline,SIGNAL(stateChanged(int)) , this , SLOT(handleOfflineToggled(int))); + Q_ASSERT_X(ok, "Vibrator", "Invalid Offline Toggeld"); + + //5.Power off + mPowerOffButton->setEnabled(mCypherOff); + ok = connect(mPowerOffButton,SIGNAL(clicked(bool)) , this , SLOT(handlePowerOff(bool))); + Q_ASSERT_X(ok, "PowerOffButton", "Invalid Clicked"); + + //Dialog dismiss only with Tap outside + mDialogWidget->setTimeout(HbPopup::NoTimeout); + mDialogWidget->setDismissPolicy(HbPopup::TapOutside); + mDialogWidget->setPreferredWidth(KPMWidth); + + connect(mDialogWidget,SIGNAL(aboutToClose()),this, SLOT(closedialog())); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:dialogLoaded:End") ) ); + } + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:End") ) ); + } + +/** + * Checks whether all Hadles for widgets DialogWidget, + * SilenceButton, Vibrate, Offline and Poweroff Button allocated memory. + * Returns True, if all Handles allocated memory. + * Flase, atleast one of them NOT allocated memory. + */ +bool HbDevicePowerMenuWidget::IsValidHandles() + { + if((!mDialogWidget) || (!mSilenceButton) || (!mVolumeSlider)||(!mVibarte) || (!mOffline) || (!mPowerOffButton)) + { + return false; + } + else{ + //All handles are allocated memory + return true; + } + } + +/** + * Sets Mute/Unmute icon for Volume slider + * Mute/Unmute icon to display the current status of Silence Mode. + * Mute icon dispalyed when Device in Silence mode. + * Unmute icon dispalyed when Device Non-Silence mode. + */ +void HbDevicePowerMenuWidget::setSpeakerIcon() + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setSpeakerIcon:Begin") ) ); + QString speakerIcon= ( mSilencelatched )? VOLUME_MUTE_ICON : VOLUME_UNMUTE_ICON ; + mVolumeSlider->setElementIcon(HbSlider:: IconElement,HbIcon(speakerIcon)); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setSpeakerIcon:End") ) ); + } + + +/** + * Customizes the slider to Vloume Slider + */ +void HbDevicePowerMenuWidget::customizeVolumeSlider() + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::customizeVolumeSlider:Begin") ) ); + //Construct Volume Slider from the HbSlider + mVolumeSlider->setSliderElements(QList() + << HbSlider::DecreaseElement + << HbSlider::TrackElement + << HbSlider::IncreaseElement + << HbSlider::IconElement ); + + // To set DecreaseIcon and IncreseIcon + mVolumeSlider->setElementIcon(HbSlider::DecreaseElement, HbIcon(VOLUME_DECREASE_ICON)); + mVolumeSlider->setElementIcon(HbSlider:: IncreaseElement, HbIcon(VOLUME_INCREASE_ICON)); + //set Range of volume + mVolumeSlider->setRange(1,10); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::customizeVolumeSlider:End") ) ); + } + +/** + * Slot + * Widget is about to Close. + */ +void HbDevicePowerMenuWidget::closedialog() + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closedialog:Begin") ) ); + emit deviceDialogClosed(); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closedialog:Begin") ) ); + } + +/** + * Slot + */ +void HbDevicePowerMenuWidget::handleVolumeChanged(int aVolume) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVolumeChanged:Begin") ) ); + mVolumeLevel = aVolume; + //inform the client may be through data changed etc. + QVariantMap mDataToSend; + QVariant volume(mVolumeLevel); + mDataToSend.insert(KVolumeLevel, volume); + emit deviceDialogData(mDataToSend); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVolumeChanged:Begin") ) ); + } + +/** + * Slot + * Switch between the states to latch down and latch up. + * In case of Silence mode, The Silence button id latched down and Disables Volume control. + * In case of Non-Silence mode, The Silence button id latched Up and enables Volume control. + */ +void HbDevicePowerMenuWidget::handleSilenceMode(bool aState) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleSilenceMode:Begin") ) ); + Q_UNUSED(aState); + mShowVolume = !(mShowVolume); + mSilencelatched = !(mSilencelatched); + mSilenceButton->setDown(mSilencelatched); + mVolumeSlider->setEnabled(mShowVolume); + setSpeakerIcon(); + //inform the client may be through data changed etc. + QVariantMap mDataToSend; + QVariant silence(mSilencelatched); + mDataToSend.insert(KSilenceLatchOn, silence); + emit deviceDialogData(mDataToSend); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleSilenceMode:End") ) ); + } + +/** + * Slot + */ +void HbDevicePowerMenuWidget::handlePowerOff(bool aState) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handlePowerOff:Begin") ) ); + Q_UNUSED(aState); + QVariantMap mDataToSend; + QVariant shutdown(true); + mDataToSend.insert(KShutDown, shutdown); + emit deviceDialogData(mDataToSend); + emit deviceDialogClosed(); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handlePowerOff:End") ) ); + } + +/** + * Slot + */ +void HbDevicePowerMenuWidget::handleOfflineToggled(int aOfflineToggel) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleOfflineToggled:Begin") ) ); + mOfflineChecked = aOfflineToggel; + QVariantMap mDataToSend; + QVariant offline(mOfflineChecked); + mDataToSend.insert(KOfflineEnable, offline); + emit deviceDialogData(mDataToSend); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleOfflineToggled:End") ) ); + } + +/** + * Slot + */ +void HbDevicePowerMenuWidget::handleVibrationToggled(int aVibrationToggel) + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVibrationToggled:Begin") ) ); + mVibrationChecked = aVibrationToggel; + QVariantMap mDataToSend; + QVariant vibration(mVibrationChecked); + mDataToSend.insert(KVibrationEnable, vibration); + emit deviceDialogData(mDataToSend); + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVibrationToggled:End") ) ); + } + +/** + * Cleans up memory allocations + */ +void HbDevicePowerMenuWidget::cleanupMemory() + { + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::cleanupMemory:Begin") ) ); + if(mLoader) + { + delete mLoader; + } + if(mHbTranslator) + { + delete mHbTranslator; + } + TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::cleanupMemory:End") ) ); + } +