controlpanelplugins/themeplugin/src/cpthemeutil.cpp
author hgs
Wed, 29 Sep 2010 10:09:58 +0800
changeset 40 593f946f4fec
parent 22 a5692c68d772
permissions -rw-r--r--
201037_2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0""
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  
hgs
parents:
diff changeset
    15
 *   
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "cpthemeinfo.h"
hgs
parents:
diff changeset
    19
#include "cpthemeutil.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <QStringList>
hgs
parents:
diff changeset
    22
#include <QSettings>  
hgs
parents:
diff changeset
    23
#include <QFileInfoList>
hgs
parents:
diff changeset
    24
#include <QDir>
hgs
parents:
diff changeset
    25
#include <QList>
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include <hbicon.h>
hgs
parents:
diff changeset
    28
#include <hbinstance.h>
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    29
#include <restricted/hbthemeservices_r.h>
22
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
/*!
hgs
parents:
diff changeset
    32
 * This class provides utility function to get Theme information.  
hgs
parents:
diff changeset
    33
 */
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
#if defined(Q_OS_SYMBIAN)
hgs
parents:
diff changeset
    36
#include <e32std.h>
hgs
parents:
diff changeset
    37
#include <centralrepository.h>
hgs
parents:
diff changeset
    38
        static const TUid KServerUid3={0x20022E82};
hgs
parents:
diff changeset
    39
        static const TUint32 KDefaultThemeNameKey = 0x2;
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    40
  
22
hgs
parents:
diff changeset
    41
#endif
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
    //Location of theme preview and background icons.
hgs
parents:
diff changeset
    45
    static const QString KPreviewThumbnailNVG = "/scalable/qtg_graf_theme_preview_thumbnail.nvg";
hgs
parents:
diff changeset
    46
    static const QString KPreviewThumbnailSVG = "/scalable/qtg_graf_theme_preview_thumbnail.svg";
hgs
parents:
diff changeset
    47
    
hgs
parents:
diff changeset
    48
    static const QString KBackgroundPrtNVG    = "/scalable/qtg_graf_screen_bg_prt.nvg";
hgs
parents:
diff changeset
    49
    static const QString KBackgroundLscNVG    = "/scalable/qtg_graf_screen_bg_lsc.nvg";
hgs
parents:
diff changeset
    50
    static const QString KBackgroundPrtSVG    = "/scalable/qtg_graf_screen_bg_prt.svg";
hgs
parents:
diff changeset
    51
    static const QString KBackgroundLscSVG    = "/scalable/qtg_graf_screen_bg_lsc.svg";
hgs
parents:
diff changeset
    52
    
hgs
parents:
diff changeset
    53
    
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    56
22
hgs
parents:
diff changeset
    57
/*
hgs
parents:
diff changeset
    58
 * Builds a CpThemeInfo object given theme path and theme name.  It creates the name and 
hgs
parents:
diff changeset
    59
 * preview icons for the object.  Creates a new CpThemeInfo objects. Caller takes ownership.
hgs
parents:
diff changeset
    60
 * Returns NULL if can't build the object.
hgs
parents:
diff changeset
    61
 */
hgs
parents:
diff changeset
    62
CpThemeInfo* CpThemeUtil::buildThemeInfo(const QString& themePath, const QString& themeName)
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
    CpThemeInfo *themeInfo = new CpThemeInfo();
hgs
parents:
diff changeset
    65
    QString iconPath;
hgs
parents:
diff changeset
    66
    
hgs
parents:
diff changeset
    67
    QString name = themeName;
hgs
parents:
diff changeset
    68
    QString hidden = "";
hgs
parents:
diff changeset
    69
    
hgs
parents:
diff changeset
    70
    //first look into the index.theme file to get theme information.
hgs
parents:
diff changeset
    71
   
hgs
parents:
diff changeset
    72
    if(QFileInfo(themePath + "/index.theme").exists()) {
hgs
parents:
diff changeset
    73
        QSettings iniSetting(themePath + "/index.theme", QSettings::IniFormat);
hgs
parents:
diff changeset
    74
        iniSetting.beginGroup("Icon Theme");
hgs
parents:
diff changeset
    75
        name = iniSetting.value("Name").toString();
hgs
parents:
diff changeset
    76
        hidden = iniSetting.value("Hidden").toString();
hgs
parents:
diff changeset
    77
        iconPath = iniSetting.value("PreviewThumbnailPath").toString();
hgs
parents:
diff changeset
    78
        iniSetting.endGroup();
hgs
parents:
diff changeset
    79
       
hgs
parents:
diff changeset
    80
    }
hgs
parents:
diff changeset
    81
                       
hgs
parents:
diff changeset
    82
    if(name.isEmpty() || (hidden == "true") ||( hidden == "")) {
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    83
        delete themeInfo;
22
hgs
parents:
diff changeset
    84
        return NULL;
hgs
parents:
diff changeset
    85
    }
hgs
parents:
diff changeset
    86
   
hgs
parents:
diff changeset
    87
    themeInfo->setName(name);
hgs
parents:
diff changeset
    88
    themeInfo->setItemType(CpThemeInfo::ThemeListItemType_default);
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    89
    themeInfo->setItemData(themePath);
22
hgs
parents:
diff changeset
    90
          
hgs
parents:
diff changeset
    91
    //Get the icons. Logic is as follow:
hgs
parents:
diff changeset
    92
    /* 1. If the icon path is in index.theme and the icon exist, use it.
hgs
parents:
diff changeset
    93
     * 2. Otherwise look for the icon in the theme folder.
hgs
parents:
diff changeset
    94
     * 2. If preview icon doesn't exist, use background icon.
hgs
parents:
diff changeset
    95
     * 3. If no icon exist (background or preview),use default theme icon.
hgs
parents:
diff changeset
    96
     */
hgs
parents:
diff changeset
    97
    if(iconPath.isEmpty() || !QFileInfo(themePath + iconPath).exists()){
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    98
        //Set thumbnail
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
    99
        HbIcon themeIcon = getPreviewIcon(themePath);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   100
        if(themeIcon.isNull()){
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   101
            QString defaultThemePath = defaultTheme();
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   102
            if(!defaultThemePath.isEmpty()) {
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   103
                themeIcon = getPreviewIcon(defaultThemePath);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   104
            }
22
hgs
parents:
diff changeset
   105
        }
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   106
        themeInfo->setIcon(themeIcon);
22
hgs
parents:
diff changeset
   107
    } else {
hgs
parents:
diff changeset
   108
        themeInfo->setIcon(HbIcon(themePath + iconPath));
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
          
hgs
parents:
diff changeset
   111
    return themeInfo;
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   115
/*!
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   116
 * given a path to the theme, returns the preview icon or just a Null icon
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   117
 * if it doesn't exist.
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   118
 */
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   119
HbIcon CpThemeUtil::getPreviewIcon(const QString& themePath)
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   120
{
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   121
    HbIcon themeIcon;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   122
    if(QFileInfo(themePath + KPreviewThumbnailNVG).exists()){
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   123
        themeIcon = HbIcon(themePath + KPreviewThumbnailNVG);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   124
    }else if(QFileInfo(themePath + KPreviewThumbnailSVG).exists()){
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   125
        themeIcon = HbIcon(themePath + KPreviewThumbnailSVG);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   126
    }else if(QFileInfo(themePath + KBackgroundPrtNVG).exists()){
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   127
        themeIcon = HbIcon(themePath + KBackgroundPrtNVG);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   128
    }else if(QFileInfo(themePath + KBackgroundPrtSVG).exists()){
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   129
        themeIcon = HbIcon(themePath + KBackgroundPrtSVG);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   130
    }
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   131
    return themeIcon;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   132
    
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   133
}
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   134
22
hgs
parents:
diff changeset
   135
/*! Creates a list of CpThemeInfo objects representing theme information.
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   136
 *  
22
hgs
parents:
diff changeset
   137
 */
hgs
parents:
diff changeset
   138
QList<CpThemeInfo> CpThemeUtil::buildThemeList()
hgs
parents:
diff changeset
   139
{
hgs
parents:
diff changeset
   140
    QList<CpThemeInfo> themeList; 
hgs
parents:
diff changeset
   141
    
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   142
    QList<QPair<QString, QString> > mThemesPathList = availableThemes();
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   143
    QPair<QString, QString>pair;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   144
    foreach (pair, mThemesPathList) {
22
hgs
parents:
diff changeset
   145
        QDir themeDir;
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   146
        QString name = pair.first;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   147
        QString path = pair.second;
22
hgs
parents:
diff changeset
   148
        themeDir.setPath( path ) ;
hgs
parents:
diff changeset
   149
        CpThemeInfo* themeInfo;
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   150
        if(themeDir.exists("index.theme") &&
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   151
          (themeDir.exists("scalable") || themeDir.exists("pixmap") )) {
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   152
            themeInfo = buildThemeInfo(path, name);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   153
            if(themeInfo && !themeInfo->name().isEmpty()) {
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   154
                themeList.append(*themeInfo);
22
hgs
parents:
diff changeset
   155
            }
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
    }
hgs
parents:
diff changeset
   158
    qSort( themeList );
hgs
parents:
diff changeset
   159
    return themeList;
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*!
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   163
 * Returns the default theme path. 
22
hgs
parents:
diff changeset
   164
 */
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   165
QString CpThemeUtil::defaultTheme()
22
hgs
parents:
diff changeset
   166
{
hgs
parents:
diff changeset
   167
    //static because default theme doesn't change.
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   168
    static QString defaultThemePath("");
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   169
    
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   170
    if(defaultThemePath.isEmpty()) {
22
hgs
parents:
diff changeset
   171
       
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
#ifdef Q_OS_SYMBIAN
hgs
parents:
diff changeset
   174
        CRepository *repository = 0;
hgs
parents:
diff changeset
   175
        TRAP_IGNORE(repository = CRepository::NewL(KServerUid3));
hgs
parents:
diff changeset
   176
        if (repository) {
hgs
parents:
diff changeset
   177
            TBuf<256> value;
hgs
parents:
diff changeset
   178
            if (KErrNone == repository->Get((TUint32)KDefaultThemeNameKey, value)) {
hgs
parents:
diff changeset
   179
                QString qvalue((QChar*)value.Ptr(), value.Length());
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   180
                defaultThemePath = qvalue.trimmed();
22
hgs
parents:
diff changeset
   181
            }
hgs
parents:
diff changeset
   182
            value.Zero();
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   183
           delete repository;
22
hgs
parents:
diff changeset
   184
        }
hgs
parents:
diff changeset
   185
          
hgs
parents:
diff changeset
   186
#endif
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   187
        
22
hgs
parents:
diff changeset
   188
    }
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   189
    return defaultThemePath;
22
hgs
parents:
diff changeset
   190
}
hgs
parents:
diff changeset
   191
40
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   192
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   193
const QStringList CpThemeUtil::themeDirectories(const QList<CpThemeInfo>& themeInfoList)
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   194
{
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   195
    QStringList themeDirs;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   196
    
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   197
    foreach(const CpThemeInfo& themeInfo, themeInfoList) {
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   198
        QDir themePath(themeInfo.itemData());
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   199
        QString topDir;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   200
        if(themePath.cdUp()) {
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   201
            topDir = themePath.path();
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   202
            if(!themeDirs.contains(topDir)) {
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   203
                themeDirs.append(topDir);
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   204
            }
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   205
        }
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   206
    }
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   207
    return themeDirs;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   208
}
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   209
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   210
const QList< QPair< QString, QString > > CpThemeUtil::availableThemes( )
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   211
{
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   212
    
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   213
    QList<QPair<QString, QString> > result = HbThemeServices::availableThemes();
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   214
    return result;
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   215
    
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   216
}
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   217
593f946f4fec 201037_2
hgs
parents: 22
diff changeset
   218