diff -r 3fec62e6e7fc -r 90fe62538f66 controlpanelplugins/themeplugin/src/cpthemecontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/controlpanelplugins/themeplugin/src/cpthemecontrol.cpp Tue Aug 31 15:15:28 2010 +0300 @@ -0,0 +1,317 @@ +/* + * 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: + * + */ + +/*! + \class CpThemeControl + \brief CpThemeControl creates and controls views for Theme Changer plugin and handles + user interaction to preview and change the themes. + + This class also connects to the theme server using the HbThemeChanger and sets the theme + based on user interaction with the views. + + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "cpthemechanger.h" + +#include "cpthemecontrol.h" +#include "cpthemelistview.h" +#include "cpthemeinfo.h" +#include "cpthemelistmodel.h" + +#include +#include + +//time out time before showing a processing dialog. +static const int KThemeChangeTimeOutMilliSeconds = 2000; + +/*! + Helper function to fetch the main window. +*/ +static HbMainWindow *mainWindow() +{ + QList< HbMainWindow* > mainWindows = hbInstance->allMainWindows(); + if (!mainWindows.isEmpty()) { + return mainWindows.front(); + } + return 0; +} + +/*! + constructor. +*/ +CpThemeControl::CpThemeControl(): mThemeListView(0), + mThemeChanger(0), + mListModel(0), + mThemeChangeFinished(false), + mWaitDialog(0) +{ + mThemeChanger = new CpThemeChanger(); + + QTranslator *translator = new QTranslator(this); + QString lang = QLocale::system().name(); + QString path = "Z:/resource/qt/translations/"; + translator->load("control_panel_" + lang, path); + qApp->installTranslator(translator); + + connect(mThemeChanger,SIGNAL(themeChangeFinished()), this, SLOT(themeChangeFinished())); + +} + + +/*! + destorys the list view and theme changer objects. +*/ +CpThemeControl::~CpThemeControl() +{ + delete mThemeListView; + mThemeListView = 0; + + delete mThemeChanger; + mThemeChanger = 0; + + delete mWaitDialog; + mWaitDialog = 0; +} + +/*! + Creates the theme list view. Gets the themes, creates a model and sets the list model. +*/ +void CpThemeControl::createThemeList() +{ + + mThemeListView = new CpThemeListView(); + + if(!mListModel) { + mListModel = new CpThemeListModel(this); + } + + // Set the model for theme list. + mThemeListView->setModel(mListModel); + + setActiveThemeIndex(); + + //connect to signal for selecting a list item. + connect(mThemeListView,SIGNAL(newThemeSelected(QModelIndex)), + this,SLOT(newThemeSelected(QModelIndex))); + + connect(mThemeListView, SIGNAL(oviClicked()), this, SLOT(getOviTheme())); + + //handle signal for list view closing. (e.g Back softkey pressed) + connect(mThemeListView,SIGNAL(aboutToClose()), + this,SLOT(themeListClosed())); +} + +/*! + returns the instance of themelist view. Used by control panel to set + the view. +*/ +CpBaseSettingView* CpThemeControl::themeListView() +{ + //If the view was removed before by control panel app, create it again. + if(!mThemeListView) { + createThemeList(); + } + + return mThemeListView; +} + +/*! + returns the name of the current theme. +*/ +QString CpThemeControl::currentThemeName() const +{ + QString name = ""; + if(mThemeChanger->currentTheme()) { + name = mThemeChanger->currentTheme()->name(); + } + return name; +} + +/*! + returns the repersenatative icon of the current theme. +*/ +HbIcon CpThemeControl::currentThemeIcon() const +{ + HbIcon icon; + if(mThemeChanger->currentTheme()) { + icon = mThemeChanger->currentTheme()->icon(); + } + return icon; +} + +/*! + Slot called when a list item of the theme list is selected. +*/ +void CpThemeControl::newThemeSelected(const QModelIndex& index) +{ + if(!index.isValid()) { + return; + } + + CpThemeInfo themeInfo; + QVariant data; + + //reset the current index to active theme, so that the selection remains on current + //theme even though another list item is selected. + setActiveThemeIndex(); + + //get the theme name. + data = index.data(Qt::DisplayRole); + if(data.isValid()) { + themeInfo.setName(data.toString()); + } + + //get theme path + data = index.data(CpThemeListModel::ItemDataRole); + if(data.isValid()) { + themeInfo.setItemData(data.toString()); + } + + applyTheme(themeInfo); + +} + +void CpThemeControl::getOviTheme() +{ + QString url = QString("http://lr.ovi.mobi/store/themes"); + // Launch the URL in the browser and + // continue to Preview if not successful + QDesktopServices::openUrl(QUrl(url, QUrl::TolerantMode)); + +} + +/*! + Slot called when a Select key is pressed in theme preview view. +*/ +void CpThemeControl::applyTheme(const CpThemeInfo& theme) +{ + QThread::currentThread()->setPriority(QThread::HighPriority); + + if(mThemeChanger->changeTheme(theme)) { + + //Start a timer. If theme change takes more than 1 seconds, + //we will show a dialog (mWaitDialog) until theme change + //is done (themeChangeFinished is called). + QTimer::singleShot(KThemeChangeTimeOutMilliSeconds, this, SLOT(themeWaitTimeout())); + + mThemeChangeFinished = false; + } else { + //theme change failed, go back to control panel. + setActiveThemeIndex(); + } + +} + +/*! + Slot for when the theme list view is closed. Ownership of the theme list was given to + control panel, so the class won't delete it. + +*/ +void CpThemeControl::themeListClosed() +{ + mThemeListView = 0; +} + +/*! + asks the theme list view to close. +*/ +void CpThemeControl::triggerThemeListClose() +{ + mThemeListView->closeView(); +} + +void CpThemeControl::themeChangeTimeout() +{ + //Theme change is finished and idle timer has timed out, + //so revert back the application priority to normal + //and go back to control panel view. + if(mWaitDialog && mWaitDialog->isVisible()) { + mWaitDialog->hide(); + } + setActiveThemeIndex(); + QThread::currentThread()->setPriority(QThread::NormalPriority); +} + +void CpThemeControl::themeWaitTimeout() +{ + //If after this timeOut, theme change is still in progress, + //show a processing dialog. + if(!mThemeChangeFinished){ + if(!mWaitDialog) { + mWaitDialog = new HbDialog(); + mWaitDialog->setDismissPolicy(HbPopup::NoDismiss); + mWaitDialog->setModal(false); + mWaitDialog->setTimeout(HbPopup::NoTimeout); + // Create and set HbLabel as content widget. + QString processingText = hbTrId("txt_common_info_processing") + QString("..."); + HbLabel *label = new HbLabel(processingText); + label->setAlignment(Qt::AlignCenter); + mWaitDialog->setContentWidget(label); + } + // as we do not need any signals, calling show() instead of open() + mWaitDialog->show(); + } +} + +void CpThemeControl::themeChangeFinished() +{ + //Theme change is done. Start an idle timer to let the UI + //finish remaining tasks. + QTimer::singleShot(0, this, SLOT(themeChangeTimeout())); + mThemeChangeFinished = true; + + if(mThemeChanger->currentTheme()) { + emit themeUpdated(mThemeChanger->currentTheme()->name(), mThemeChanger->currentTheme()->icon()); + } + +} + +/*! + * Private function that sets the current index of theme list view to indicate + * the active theme. + */ +void CpThemeControl::setActiveThemeIndex() +{ + //Get the index of current theme. + CpThemeListModel* themeListModel = dynamic_cast(mListModel); + const CpThemeInfo* currentTheme = mThemeChanger->currentTheme(); + if(themeListModel && currentTheme) { + QModelIndex sourceIndex = mListModel->index(themeListModel->indexOf(*currentTheme),0); + //set current index. + mThemeListView->themeList()->setCurrentIndex(sourceIndex, QItemSelectionModel::SelectCurrent); + } + else { + mThemeListView->themeList()->setCurrentIndex(QModelIndex(), QItemSelectionModel::Clear); + } +} + + + + + +