source: trunk/src/gui/styles/qs60style_s60.cpp@ 626

Last change on this file since 626 was 561, checked in by Dmitry A. Kuminov, 16 years ago

trunk: Merged in qt 4.6.1 sources.

  • Property svn:eol-style set to native
File size: 60.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qs60style.h"
43#include "qs60style_p.h"
44#include "qpainter.h"
45#include "qstyleoption.h"
46#include "qstyle.h"
47#include "private/qt_s60_p.h"
48#include "private/qpixmap_s60_p.h"
49#include "private/qcore_symbian_p.h"
50#include "qapplication.h"
51
52#include <w32std.h>
53#include <aknsconstants.h>
54#include <aknconsts.h>
55#include <aknsitemid.h>
56#include <aknsutils.h>
57#include <aknsdrawutils.h>
58#include <aknsskininstance.h>
59#include <aknsbasicbackgroundcontrolcontext.h>
60#include <avkon.mbg>
61#include <AknFontAccess.h>
62#include <AknLayoutFont.h>
63#include <aknutils.h>
64#include <aknnavi.h>
65#include <gulicon.h>
66
67#if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
68
69QT_BEGIN_NAMESPACE
70
71enum TDrawType {
72 EDrawIcon,
73 EDrawGulIcon,
74 EDrawBackground,
75 ENoDraw
76};
77
78enum TSupportRelease {
79 ES60_None = 0x0000, //indicates that the commonstyle should draw the graphics
80 ES60_3_1 = 0x0001,
81 ES60_3_2 = 0x0002,
82 ES60_5_0 = 0x0004,
83 ES60_5_1 = 0x0008,
84 ES60_5_2 = 0x0010,
85 ES60_3_X = ES60_3_1 | ES60_3_2,
86 // Releases before Symbian Foundation
87 ES60_PreSF = ES60_3_1 | ES60_3_2 | ES60_5_0,
88 // Add all new releases here
89 ES60_All = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2
90};
91
92typedef struct {
93 const TAknsItemID &skinID;
94 TDrawType drawType;
95 int supportInfo;
96 int newMajorSkinId;
97 int newMinorSkinId;
98} partMapEntry;
99
100class QS60StyleModeSpecifics
101{
102public:
103 static QPixmap skinnedGraphics(QS60StyleEnums::SkinParts stylepart,
104 const QSize &size, QS60StylePrivate::SkinElementFlags flags);
105 static QPixmap skinnedGraphics(QS60StylePrivate::SkinFrameElements frameElement, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
106 static QPixmap colorSkinnedGraphics(const QS60StyleEnums::SkinParts &stylepart,
107 const QSize &size, QPainter *painter, QS60StylePrivate::SkinElementFlags flags);
108 static QColor colorValue(const TAknsItemID &colorGroup, int colorIndex);
109 static QPixmap fromFbsBitmap(CFbsBitmap *icon, CFbsBitmap *mask, QS60StylePrivate::SkinElementFlags flags, const TSize& targetSize);
110 static bool disabledPartGraphic(QS60StyleEnums::SkinParts &part);
111 static bool disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame);
112 static QPixmap generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
113 static QSize naviPaneSize();
114 static TAknsItemID partSpecificThemeId(int part);
115
116private:
117 static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,
118 const QSize &size, QS60StylePrivate::SkinElementFlags flags);
119 static QPixmap createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
120 static QPixmap colorSkinnedGraphicsLX(const QS60StyleEnums::SkinParts &stylepart,
121 const QSize &size, QPainter *painter, QS60StylePrivate::SkinElementFlags flags);
122 static void frameIdAndCenterId(QS60StylePrivate::SkinFrameElements frameElement, TAknsItemID &frameId, TAknsItemID &centerId);
123 static TRect innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect);
124 static void fallbackInfo(const QS60StyleEnums::SkinParts &stylePart, TInt &fallbackIndex);
125 static bool checkSupport(const int supportedRelease);
126 // Array to match the skin ID, fallback graphics and Qt widget graphics.
127 static const partMapEntry m_partMap[];
128};
129
130const partMapEntry QS60StyleModeSpecifics::m_partMap[] = {
131 /* SP_QgnGrafBarWait */ {KAknsIIDQgnGrafBarWaitAnim, EDrawIcon, ES60_All, -1,-1},
132 /* SP_QgnGrafBarFrameCenter */ {KAknsIIDQgnGrafBarFrameCenter, EDrawIcon, ES60_All, -1,-1},
133 /* SP_QgnGrafBarFrameSideL */ {KAknsIIDQgnGrafBarFrameSideL, EDrawIcon, ES60_All, -1,-1},
134 /* SP_QgnGrafBarFrameSideR */ {KAknsIIDQgnGrafBarFrameSideR, EDrawIcon, ES60_All, -1,-1},
135 /* SP_QgnGrafBarProgress */ {KAknsIIDQgnGrafBarProgress, EDrawIcon, ES60_All, -1,-1},
136 /* SP_QgnGrafScrollArrowDown */ {KAknsIIDQgnGrafScrollArrowDown, EDrawGulIcon, ES60_All, -1,-1},
137 /* SP_QgnGrafScrollArrowLeft */ {KAknsIIDQgnGrafScrollArrowLeft, EDrawGulIcon, ES60_All, -1,-1},
138 /* SP_QgnGrafScrollArrowRight */ {KAknsIIDQgnGrafScrollArrowRight, EDrawGulIcon, ES60_All, -1,-1},
139 /* SP_QgnGrafScrollArrowUp */ {KAknsIIDQgnGrafScrollArrowUp, EDrawGulIcon, ES60_All, -1,-1},
140 /* SP_QgnGrafTabActiveL */ {KAknsIIDQgnGrafTabActiveL, EDrawIcon, ES60_All, -1,-1},
141 /* SP_QgnGrafTabActiveM */ {KAknsIIDQgnGrafTabActiveM, EDrawIcon, ES60_All, -1,-1},
142 /* SP_QgnGrafTabActiveR */ {KAknsIIDQgnGrafTabActiveR, EDrawIcon, ES60_All, -1,-1},
143 /* SP_QgnGrafTabPassiveL */ {KAknsIIDQgnGrafTabPassiveL, EDrawIcon, ES60_All, -1,-1},
144 /* SP_QgnGrafTabPassiveM */ {KAknsIIDQgnGrafTabPassiveM, EDrawIcon, ES60_All, -1,-1},
145 /* SP_QgnGrafTabPassiveR */ {KAknsIIDQgnGrafTabPassiveR, EDrawIcon, ES60_All, -1,-1},
146
147 // In 3.1 there is no slider groove.
148 /* SP_QgnGrafNsliderEndLeft */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19cf /* KAknsIIDQgnGrafNsliderEndLeft */},
149 /* SP_QgnGrafNsliderEndRight */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19d0 /* KAknsIIDQgnGrafNsliderEndRight */},
150 /* SP_QgnGrafNsliderMiddle */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19d2 /* KAknsIIDQgnGrafNsliderMiddle */},
151 /* SP_QgnIndiCheckboxOff */ {KAknsIIDQgnIndiCheckboxOff, EDrawIcon, ES60_All, -1,-1},
152 /* SP_QgnIndiCheckboxOn */ {KAknsIIDQgnIndiCheckboxOn, EDrawIcon, ES60_All, -1,-1},
153
154 // Following 5 items (SP_QgnIndiHlColSuper - SP_QgnIndiHlLineStraight) are available starting from S60 release 3.2.
155 // In 3.1 CommonStyle drawing is used for these QTreeView elements, since no similar icons in AVKON UI.
156 /* SP_QgnIndiHlColSuper */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d5 /* KAknsIIDQgnIndiHlColSuper */},
157 /* SP_QgnIndiHlExpSuper */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d6 /* KAknsIIDQgnIndiHlExpSuper */},
158 /* SP_QgnIndiHlLineBranch */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d7 /* KAknsIIDQgnIndiHlLineBranch */},
159 /* SP_QgnIndiHlLineEnd */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d8 /* KAknsIIDQgnIndiHlLineEnd */},
160 /* SP_QgnIndiHlLineStraight */ {KAknsIIDNone, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x17d9 /* KAknsIIDQgnIndiHlLineStraight */},
161 /* SP_QgnIndiMarkedAdd */ {KAknsIIDQgnIndiMarkedAdd, EDrawIcon, ES60_All, -1,-1},
162 /* SP_QgnIndiNaviArrowLeft */ {KAknsIIDQgnIndiNaviArrowLeft, EDrawIcon, ES60_All, -1,-1},
163 /* SP_QgnIndiNaviArrowRight */ {KAknsIIDQgnIndiNaviArrowRight, EDrawIcon, ES60_All, -1,-1},
164 /* SP_QgnIndiRadiobuttOff */ {KAknsIIDQgnIndiRadiobuttOff, EDrawIcon, ES60_All, -1,-1},
165 /* SP_QgnIndiRadiobuttOn */ {KAknsIIDQgnIndiRadiobuttOn, EDrawIcon, ES60_All, -1,-1},
166
167 // In 3.1 there different slider graphic and no pressed state.
168 /* SP_QgnGrafNsliderMarker */ {KAknsIIDQgnIndiSliderEdit, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x19d1 /* KAknsIIDQgnGrafNsliderMarker */},
169 /* SP_QgnGrafNsliderMarkerSelected */ {KAknsIIDQgnIndiSliderEdit, EDrawIcon, ES60_3_1, EAknsMajorGeneric, 0x1a4a /* KAknsIIDQgnGrafNsliderMarkerSelected */},
170 /* SP_QgnIndiSubMenu */ {KAknsIIDQgnIndiSubmenu, EDrawIcon, ES60_All, -1,-1},
171 /* SP_QgnNoteErased */ {KAknsIIDQgnNoteErased, EDrawIcon, ES60_All, -1,-1},
172 /* SP_QgnNoteError */ {KAknsIIDQgnNoteError, EDrawIcon, ES60_All, -1,-1},
173 /* SP_QgnNoteInfo */ {KAknsIIDQgnNoteInfo, EDrawIcon, ES60_All, -1,-1},
174 /* SP_QgnNoteOk */ {KAknsIIDQgnNoteOk, EDrawIcon, ES60_All, -1,-1},
175 /* SP_QgnNoteQuery */ {KAknsIIDQgnNoteQuery, EDrawIcon, ES60_All, -1,-1},
176 /* SP_QgnNoteWarning */ {KAknsIIDQgnNoteWarning, EDrawIcon, ES60_All, -1,-1},
177 /* SP_QgnPropFileSmall */ {KAknsIIDQgnPropFileSmall, EDrawIcon, ES60_All, -1,-1},
178 /* SP_QgnPropFolderCurrent */ {KAknsIIDQgnPropFolderCurrent, EDrawIcon, ES60_All, -1,-1},
179 /* SP_QgnPropFolderSmall */ {KAknsIIDQgnPropFolderSmall, EDrawIcon, ES60_All, -1,-1},
180 /* SP_QgnPropFolderSmallNew */ {KAknsIIDQgnPropFolderSmallNew, EDrawIcon, ES60_All, -1,-1},
181 /* SP_QgnPropPhoneMemcLarge */ {KAknsIIDQgnPropPhoneMemcLarge, EDrawIcon, ES60_All, -1,-1},
182
183 // 3.1 & 3.2 do not have pressed state for scrollbar, so use normal scrollbar graphics instead.
184 /* SP_QsnCpScrollHandleBottomPressed*/ {KAknsIIDQsnCpScrollHandleBottom, EDrawIcon, ES60_3_X, EAknsMajorGeneric, 0x20f8}, /*KAknsIIDQsnCpScrollHandleBottomPressed*/
185 /* SP_QsnCpScrollHandleMiddlePressed*/ {KAknsIIDQsnCpScrollHandleMiddle, EDrawIcon, ES60_3_X, EAknsMajorGeneric, 0x20f9}, /*KAknsIIDQsnCpScrollHandleMiddlePressed*/
186 /* SP_QsnCpScrollHandleTopPressed*/ {KAknsIIDQsnCpScrollHandleTop, EDrawIcon, ES60_3_X, EAknsMajorGeneric, 0x20fa}, /*KAknsIIDQsnCpScrollHandleTopPressed*/
187
188 /* SP_QsnBgScreen */ {KAknsIIDQsnBgScreen, EDrawBackground, ES60_All, -1,-1},
189
190 /* SP_QsnCpScrollBgBottom */ {KAknsIIDQsnCpScrollBgBottom, EDrawIcon, ES60_All, -1,-1},
191 /* SP_QsnCpScrollBgMiddle */ {KAknsIIDQsnCpScrollBgMiddle, EDrawIcon, ES60_All, -1,-1},
192 /* SP_QsnCpScrollBgTop */ {KAknsIIDQsnCpScrollBgTop, EDrawIcon, ES60_All, -1,-1},
193
194 /* SP_QsnCpScrollHandleBottom */ {KAknsIIDQsnCpScrollHandleBottom, EDrawIcon, ES60_All, -1,-1},
195 /* SP_QsnCpScrollHandleMiddle */ {KAknsIIDQsnCpScrollHandleMiddle, EDrawIcon, ES60_All, -1,-1},
196 /* SP_QsnCpScrollHandleTop */ {KAknsIIDQsnCpScrollHandleTop, EDrawIcon, ES60_All, -1,-1},
197
198 /* SP_QsnFrButtonTbCornerTl */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_All, -1, -1},
199 /* SP_QsnFrButtonTbCornerTr */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_All, -1, -1},
200 /* SP_QsnFrButtonTbCornerBl */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_All, -1, -1},
201 /* SP_QsnFrButtonTbCornerBr */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_All, -1, -1},
202 /* SP_QsnFrButtonTbSideT */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_All, -1, -1},
203 /* SP_QsnFrButtonTbSideB */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_All, -1, -1},
204 /* SP_QsnFrButtonTbSideL */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_All, -1, -1},
205 /* SP_QsnFrButtonTbSideR */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_All, -1, -1},
206 /* SP_QsnFrButtonTbCenter */ {KAknsIIDQsnFrButtonTbCenter, EDrawIcon, ES60_All, -1, -1},
207
208 /* SP_QsnFrButtonTbCornerTlPressed */{KAknsIIDQsnFrButtonTbCornerTlPressed, ENoDraw, ES60_All, -1,-1},
209 /* SP_QsnFrButtonTbCornerTrPressed */{KAknsIIDQsnFrButtonTbCornerTrPressed, ENoDraw, ES60_All, -1,-1},
210 /* SP_QsnFrButtonTbCornerBlPressed */{KAknsIIDQsnFrButtonTbCornerBlPressed, ENoDraw, ES60_All, -1,-1},
211 /* SP_QsnFrButtonTbCornerBrPressed */{KAknsIIDQsnFrButtonTbCornerBrPressed, ENoDraw, ES60_All, -1,-1},
212 /* SP_QsnFrButtonTbSideTPressed */ {KAknsIIDQsnFrButtonTbSideTPressed, ENoDraw, ES60_All, -1,-1},
213 /* SP_QsnFrButtonTbSideBPressed */ {KAknsIIDQsnFrButtonTbSideBPressed, ENoDraw, ES60_All, -1,-1},
214 /* SP_QsnFrButtonTbSideLPressed */ {KAknsIIDQsnFrButtonTbSideLPressed, ENoDraw, ES60_All, -1,-1},
215 /* SP_QsnFrButtonTbSideRPressed */ {KAknsIIDQsnFrButtonTbSideRPressed, ENoDraw, ES60_All, -1,-1},
216 /* SP_QsnFrButtonTbCenterPressed */ {KAknsIIDQsnFrButtonTbCenterPressed, EDrawIcon, ES60_All, -1,-1},
217
218 /* SP_QsnFrCaleCornerTl */ {KAknsIIDQsnFrCaleCornerTl, ENoDraw, ES60_All, -1,-1},
219 /* SP_QsnFrCaleCornerTr */ {KAknsIIDQsnFrCaleCornerTr, ENoDraw, ES60_All, -1,-1},
220 /* SP_QsnFrCaleCornerBl */ {KAknsIIDQsnFrCaleCornerBl, ENoDraw, ES60_All, -1,-1},
221 /* SP_QsnFrCaleCornerBr */ {KAknsIIDQsnFrCaleCornerBr, ENoDraw, ES60_All, -1,-1},
222 /* SP_QsnFrCaleGSideT */ {KAknsIIDQsnFrCaleSideT, ENoDraw, ES60_All, -1,-1},
223 /* SP_QsnFrCaleGSideB */ {KAknsIIDQsnFrCaleSideB, ENoDraw, ES60_All, -1,-1},
224 /* SP_QsnFrCaleGSideL */ {KAknsIIDQsnFrCaleSideL, ENoDraw, ES60_All, -1,-1},
225 /* SP_QsnFrCaleGSideR */ {KAknsIIDQsnFrCaleSideR, ENoDraw, ES60_All, -1,-1},
226 /* SP_QsnFrCaleCenter */ {KAknsIIDQsnFrCaleCenter, ENoDraw, ES60_All, -1,-1},
227
228 /* SP_QsnFrCaleHeadingCornerTl */ {KAknsIIDQsnFrCaleHeadingCornerTl, ENoDraw, ES60_All, -1,-1},
229 /* SP_QsnFrCaleHeadingCornerTr */ {KAknsIIDQsnFrCaleHeadingCornerTr, ENoDraw, ES60_All, -1,-1},
230 /* SP_QsnFrCaleHeadingCornerBl */ {KAknsIIDQsnFrCaleHeadingCornerBl, ENoDraw, ES60_All, -1,-1},
231 /* SP_QsnFrCaleHeadingCornerBr */ {KAknsIIDQsnFrCaleHeadingCornerBr, ENoDraw, ES60_All, -1,-1},
232 /* SP_QsnFrCaleHeadingSideT */ {KAknsIIDQsnFrCaleHeadingSideT, ENoDraw, ES60_All, -1,-1},
233 /* SP_QsnFrCaleHeadingSideB */ {KAknsIIDQsnFrCaleHeadingSideB, ENoDraw, ES60_All, -1,-1},
234 /* SP_QsnFrCaleHeadingSideL */ {KAknsIIDQsnFrCaleHeadingSideL, ENoDraw, ES60_All, -1,-1},
235 /* SP_QsnFrCaleHeadingSideR */ {KAknsIIDQsnFrCaleHeadingSideR, ENoDraw, ES60_All, -1,-1},
236 /* SP_QsnFrCaleHeadingCenter */ {KAknsIIDQsnFrCaleHeadingCenter, ENoDraw, ES60_All, -1,-1},
237
238 /* SP_QsnFrInputCornerTl */ {KAknsIIDQsnFrInputCornerTl, ENoDraw, ES60_All, -1,-1},
239 /* SP_QsnFrInputCornerTr */ {KAknsIIDQsnFrInputCornerTr, ENoDraw, ES60_All, -1,-1},
240 /* SP_QsnFrInputCornerBl */ {KAknsIIDQsnFrInputCornerBl, ENoDraw, ES60_All, -1,-1},
241 /* SP_QsnFrInputCornerBr */ {KAknsIIDQsnFrInputCornerBr, ENoDraw, ES60_All, -1,-1},
242 /* SP_QsnFrInputSideT */ {KAknsIIDQsnFrInputSideT, ENoDraw, ES60_All, -1,-1},
243 /* SP_QsnFrInputSideB */ {KAknsIIDQsnFrInputSideB, ENoDraw, ES60_All, -1,-1},
244 /* SP_QsnFrInputSideL */ {KAknsIIDQsnFrInputSideL, ENoDraw, ES60_All, -1,-1},
245 /* SP_QsnFrInputSideR */ {KAknsIIDQsnFrInputSideR, ENoDraw, ES60_All, -1,-1},
246 /* SP_QsnFrInputCenter */ {KAknsIIDQsnFrInputCenter, ENoDraw, ES60_All, -1,-1},
247
248 /* SP_QsnFrListCornerTl */ {KAknsIIDQsnFrListCornerTl, ENoDraw, ES60_All, -1,-1},
249 /* SP_QsnFrListCornerTr */ {KAknsIIDQsnFrListCornerTr, ENoDraw, ES60_All, -1,-1},
250 /* SP_QsnFrListCornerBl */ {KAknsIIDQsnFrListCornerBl, ENoDraw, ES60_All, -1,-1},
251 /* SP_QsnFrListCornerBr */ {KAknsIIDQsnFrListCornerBr, ENoDraw, ES60_All, -1,-1},
252 /* SP_QsnFrListSideT */ {KAknsIIDQsnFrListSideT, ENoDraw, ES60_All, -1,-1},
253 /* SP_QsnFrListSideB */ {KAknsIIDQsnFrListSideB, ENoDraw, ES60_All, -1,-1},
254 /* SP_QsnFrListSideL */ {KAknsIIDQsnFrListSideL, ENoDraw, ES60_All, -1,-1},
255 /* SP_QsnFrListSideR */ {KAknsIIDQsnFrListSideR, ENoDraw, ES60_All, -1,-1},
256 /* SP_QsnFrListCenter */ {KAknsIIDQsnFrListCenter, ENoDraw, ES60_All, -1,-1},
257
258 /* SP_QsnFrPopupCornerTl */ {KAknsIIDQsnFrPopupCornerTl, ENoDraw, ES60_All, -1,-1},
259 /* SP_QsnFrPopupCornerTr */ {KAknsIIDQsnFrPopupCornerTr, ENoDraw, ES60_All, -1,-1},
260 /* SP_QsnFrPopupCornerBl */ {KAknsIIDQsnFrPopupCornerBl, ENoDraw, ES60_All, -1,-1},
261 /* SP_QsnFrPopupCornerBr */ {KAknsIIDQsnFrPopupCornerBr, ENoDraw, ES60_All, -1,-1},
262 /* SP_QsnFrPopupSideT */ {KAknsIIDQsnFrPopupSideT, ENoDraw, ES60_All, -1,-1},
263 /* SP_QsnFrPopupSideB */ {KAknsIIDQsnFrPopupSideB, ENoDraw, ES60_All, -1,-1},
264 /* SP_QsnFrPopupSideL */ {KAknsIIDQsnFrPopupSideL, ENoDraw, ES60_All, -1,-1},
265 /* SP_QsnFrPopupSideR */ {KAknsIIDQsnFrPopupSideR, ENoDraw, ES60_All, -1,-1},
266 /* SP_QsnFrPopupCenter */ {KAknsIIDQsnFrPopupCenter, ENoDraw, ES60_All, -1,-1},
267
268 // ToolTip graphics different in 3.1 vs. 3.2+.
269 /* SP_QsnFrPopupPreviewCornerTl */ {KAknsIIDQsnFrPopupCornerTl, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c5}, /* KAknsIIDQsnFrPopupPreviewCornerTl */
270 /* SP_QsnFrPopupPreviewCornerTr */ {KAknsIIDQsnFrPopupCornerTr, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c6},
271 /* SP_QsnFrPopupPreviewCornerBl */ {KAknsIIDQsnFrPopupCornerBl, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c3},
272 /* SP_QsnFrPopupPreviewCornerBr */ {KAknsIIDQsnFrPopupCornerBr, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c4},
273 /* SP_QsnFrPopupPreviewSideT */ {KAknsIIDQsnFrPopupSideT, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19ca},
274 /* SP_QsnFrPopupPreviewSideB */ {KAknsIIDQsnFrPopupSideB, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c7},
275 /* SP_QsnFrPopupPreviewSideL */ {KAknsIIDQsnFrPopupSideL, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c8},
276 /* SP_QsnFrPopupPreviewSideR */ {KAknsIIDQsnFrPopupSideR, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c9},
277 /* SP_QsnFrPopupPreviewCenter */ {KAknsIIDQsnFrPopupCenter, ENoDraw, ES60_3_1, EAknsMajorSkin, 0x19c2},
278
279 /* SP_QsnFrSetOptCornerTl */ {KAknsIIDQsnFrSetOptCornerTl, ENoDraw, ES60_All, -1,-1},
280 /* SP_QsnFrSetOptCornerTr */ {KAknsIIDQsnFrSetOptCornerTr, ENoDraw, ES60_All, -1,-1},
281 /* SP_QsnFrSetOptCornerBl */ {KAknsIIDQsnFrSetOptCornerBl, ENoDraw, ES60_All, -1,-1},
282 /* SP_QsnFrSetOptCornerBr */ {KAknsIIDQsnFrSetOptCornerBr, ENoDraw, ES60_All, -1,-1},
283 /* SP_QsnFrSetOptSideT */ {KAknsIIDQsnFrSetOptSideT, ENoDraw, ES60_All, -1,-1},
284 /* SP_QsnFrSetOptSideB */ {KAknsIIDQsnFrSetOptSideB, ENoDraw, ES60_All, -1,-1},
285 /* SP_QsnFrSetOptSideL */ {KAknsIIDQsnFrSetOptSideL, ENoDraw, ES60_All, -1,-1},
286 /* SP_QsnFrSetOptSideR */ {KAknsIIDQsnFrSetOptSideR, ENoDraw, ES60_All, -1,-1},
287 /* SP_QsnFrSetOptCenter */ {KAknsIIDQsnFrSetOptCenter, ENoDraw, ES60_All, -1,-1},
288
289 // No toolbar frame for 5.0+ releases.
290 /* SP_QsnFrPopupSubCornerTl */ {KAknsIIDQsnFrPopupSubCornerTl, ENoDraw, ES60_3_X, -1,-1},
291 /* SP_QsnFrPopupSubCornerTr */ {KAknsIIDQsnFrPopupSubCornerTr, ENoDraw, ES60_3_X, -1,-1},
292 /* SP_QsnFrPopupSubCornerBl */ {KAknsIIDQsnFrPopupSubCornerBl, ENoDraw, ES60_3_X, -1,-1},
293 /* SP_QsnFrPopupSubCornerBr */ {KAknsIIDQsnFrPopupSubCornerBr, ENoDraw, ES60_3_X, -1,-1},
294 /* SP_QsnFrPopupSubSideT */ {KAknsIIDQsnFrPopupSubSideT, ENoDraw, ES60_3_X, -1,-1},
295 /* SP_QsnFrPopupSubSideB */ {KAknsIIDQsnFrPopupSubSideB, ENoDraw, ES60_3_X, -1,-1},
296 /* SP_QsnFrPopupSubSideL */ {KAknsIIDQsnFrPopupSubSideL, ENoDraw, ES60_3_X, -1,-1},
297 /* SP_QsnFrPopupSubSideR */ {KAknsIIDQsnFrPopupSubSideR, ENoDraw, ES60_3_X, -1,-1},
298 /* SP_QsnFrPopupSubCenter */ {KAknsIIDQsnFrPopupCenterSubmenu, ENoDraw, ES60_3_X, -1,-1},
299
300 // Toolbar graphics is different in 3.1/3.2 vs. 5.0
301 /* SP_QsnFrSctrlButtonCornerTl */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2301}, /* KAknsIIDQgnFrSctrlButtonCornerTl*/
302 /* SP_QsnFrSctrlButtonCornerTr */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2302},
303 /* SP_QsnFrSctrlButtonCornerBl */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2303},
304 /* SP_QsnFrSctrlButtonCornerBr */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2304},
305 /* SP_QsnFrSctrlButtonSideT */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2305},
306 /* SP_QsnFrSctrlButtonSideB */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2306},
307 /* SP_QsnFrSctrlButtonSideL */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2307},
308 /* SP_QsnFrSctrlButtonSideR */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2308},
309 /* SP_QsnFrSctrlButtonCenter */ {KAknsIIDQsnFrButtonTbCenter, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2309}, /*KAknsIIDQgnFrSctrlButtonCenter*/
310
311 // No pressed state for toolbar button in 3.1/3.2.
312 /* SP_QsnFrSctrlButtonCornerTlPressed */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2621}, /*KAknsIIDQsnFrSctrlButtonCornerTlPressed*/
313 /* SP_QsnFrSctrlButtonCornerTrPressed */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2622},
314 /* SP_QsnFrSctrlButtonCornerBlPressed */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2623},
315 /* SP_QsnFrSctrlButtonCornerBrPressed */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2624},
316 /* SP_QsnFrSctrlButtonSideTPressed */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2625},
317 /* SP_QsnFrSctrlButtonSideBPressed */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2626},
318 /* SP_QsnFrSctrlButtonSideLPressed */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2627},
319 /* SP_QsnFrSctrlButtonSideRPressed */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2628},
320 /* SP_QsnFrSctrlButtonCenterPressed */ {KAknsIIDQsnFrButtonTbCenter, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x2629},
321
322 // No inactive button graphics in 3.1/3.2
323 /* SP_QsnFrButtonCornerTlInactive */ {KAknsIIDQsnFrButtonTbCornerTl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b1}, /*KAknsIIDQsnFrButtonCornerTlInactive*/
324 /* SP_QsnFrButtonCornerTrInactive */ {KAknsIIDQsnFrButtonTbCornerTr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b2},
325 /* SP_QsnFrButtonCornerBlInactive */ {KAknsIIDQsnFrButtonTbCornerBl, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b3},
326 /* SP_QsnFrButtonCornerTrInactive */ {KAknsIIDQsnFrButtonTbCornerBr, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b4},
327 /* SP_QsnFrButtonSideTInactive */ {KAknsIIDQsnFrButtonTbSideT, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b5},
328 /* SP_QsnFrButtonSideBInactive */ {KAknsIIDQsnFrButtonTbSideB, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b6},
329 /* SP_QsnFrButtonSideLInactive */ {KAknsIIDQsnFrButtonTbSideL, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b7},
330 /* SP_QsnFrButtonSideRInactive */ {KAknsIIDQsnFrButtonTbSideR, ENoDraw, ES60_3_X, EAknsMajorSkin, 0x21b8},
331 /* SP_QsnFrButtonCenterInactive */ {KAknsIIDQsnFrButtonTbCenter, EDrawIcon, ES60_3_X, EAknsMajorSkin, 0x21b9},
332
333};
334
335QPixmap QS60StyleModeSpecifics::skinnedGraphics(
336 QS60StyleEnums::SkinParts stylepart, const QSize &size,
337 QS60StylePrivate::SkinElementFlags flags)
338{
339 QPixmap themedImage;
340 TRAPD( error, QT_TRYCATCH_LEAVING({
341 const QPixmap skinnedImage = createSkinnedGraphicsLX(stylepart, size, flags);
342 themedImage = skinnedImage;
343 }));
344 if (error)
345 return themedImage = QPixmap();
346 return themedImage;
347}
348
349QPixmap QS60StyleModeSpecifics::skinnedGraphics(
350 QS60StylePrivate::SkinFrameElements frame, const QSize &size, QS60StylePrivate::SkinElementFlags flags)
351{
352 QPixmap themedImage;
353 TRAPD( error, QT_TRYCATCH_LEAVING({
354 const QPixmap skinnedImage = createSkinnedGraphicsLX(frame, size, flags);
355 themedImage = skinnedImage;
356 }));
357 if (error)
358 return themedImage = QPixmap();
359 return themedImage;
360}
361
362QPixmap QS60StyleModeSpecifics::colorSkinnedGraphics(
363 const QS60StyleEnums::SkinParts &stylepart, const QSize &size, QPainter *painter,
364 QS60StylePrivate::SkinElementFlags flags)
365{
366 QPixmap colorGraphics;
367 TRAPD(error, QT_TRYCATCH_LEAVING(colorGraphics = colorSkinnedGraphicsLX(stylepart, size, painter, flags)));
368 return error ? QPixmap() : colorGraphics;
369}
370
371void QS60StyleModeSpecifics::fallbackInfo(const QS60StyleEnums::SkinParts &stylePart, TInt &fallbackIndex)
372{
373 switch(stylePart) {
374 case QS60StyleEnums::SP_QgnGrafBarWait:
375 fallbackIndex = EMbmAvkonQgn_graf_bar_wait_1;
376 break;
377 case QS60StyleEnums::SP_QgnGrafBarFrameCenter:
378 fallbackIndex = EMbmAvkonQgn_graf_bar_frame_center;
379 break;
380 case QS60StyleEnums::SP_QgnGrafBarFrameSideL:
381 fallbackIndex = EMbmAvkonQgn_graf_bar_frame_side_l;
382 break;
383 case QS60StyleEnums::SP_QgnGrafBarFrameSideR:
384 fallbackIndex = EMbmAvkonQgn_graf_bar_frame_side_r;
385 break;
386 case QS60StyleEnums::SP_QgnGrafBarProgress:
387 fallbackIndex = EMbmAvkonQgn_graf_bar_progress;
388 break;
389 case QS60StyleEnums::SP_QgnGrafTabActiveL:
390 fallbackIndex = EMbmAvkonQgn_graf_tab_active_l;
391 break;
392 case QS60StyleEnums::SP_QgnGrafTabActiveM:
393 fallbackIndex = EMbmAvkonQgn_graf_tab_active_m;
394 break;
395 case QS60StyleEnums::SP_QgnGrafTabActiveR:
396 fallbackIndex = EMbmAvkonQgn_graf_tab_active_r;
397 break;
398 case QS60StyleEnums::SP_QgnGrafTabPassiveL:
399 fallbackIndex = EMbmAvkonQgn_graf_tab_passive_l;
400 break;
401 case QS60StyleEnums::SP_QgnGrafTabPassiveM:
402 fallbackIndex = EMbmAvkonQgn_graf_tab_passive_m;
403 break;
404 case QS60StyleEnums::SP_QgnGrafTabPassiveR:
405 fallbackIndex = EMbmAvkonQgn_graf_tab_passive_r;
406 break;
407 case QS60StyleEnums::SP_QgnIndiCheckboxOff:
408 fallbackIndex = EMbmAvkonQgn_indi_checkbox_off;
409 break;
410 case QS60StyleEnums::SP_QgnIndiCheckboxOn:
411 fallbackIndex = EMbmAvkonQgn_indi_checkbox_on;
412 break;
413 case QS60StyleEnums::SP_QgnIndiHlColSuper:
414 fallbackIndex = 0x4456; /* EMbmAvkonQgn_indi_hl_col_super */
415 break;
416 case QS60StyleEnums::SP_QgnIndiHlExpSuper:
417 fallbackIndex = 0x4458; /* EMbmAvkonQgn_indi_hl_exp_super */
418 break;
419 case QS60StyleEnums::SP_QgnIndiHlLineBranch:
420 fallbackIndex = 0x445A; /* EMbmAvkonQgn_indi_hl_line_branch */
421 break;
422 case QS60StyleEnums::SP_QgnIndiHlLineEnd:
423 fallbackIndex = 0x445C; /* EMbmAvkonQgn_indi_hl_line_end */
424 break;
425 case QS60StyleEnums::SP_QgnIndiHlLineStraight:
426 fallbackIndex = 0x445E; /* EMbmAvkonQgn_indi_hl_line_straight */
427 break;
428 case QS60StyleEnums::SP_QgnIndiMarkedAdd:
429 fallbackIndex = EMbmAvkonQgn_indi_marked_add;
430 break;
431 case QS60StyleEnums::SP_QgnIndiNaviArrowLeft:
432 fallbackIndex = EMbmAvkonQgn_indi_navi_arrow_left;
433 break;
434 case QS60StyleEnums::SP_QgnIndiNaviArrowRight:
435 fallbackIndex = EMbmAvkonQgn_indi_navi_arrow_right;
436 break;
437 case QS60StyleEnums::SP_QgnIndiRadiobuttOff:
438 fallbackIndex = EMbmAvkonQgn_indi_radiobutt_off;
439 break;
440 case QS60StyleEnums::SP_QgnIndiRadiobuttOn:
441 fallbackIndex = EMbmAvkonQgn_indi_radiobutt_on;
442 break;
443 case QS60StyleEnums::SP_QgnGrafNsliderMarker:
444 fallbackIndex = 17572; /* EMbmAvkonQgn_graf_nslider_marker */
445 break;
446 case QS60StyleEnums::SP_QgnGrafNsliderMarkerSelected:
447 fallbackIndex = 17574; /* EMbmAvkonQgn_graf_nslider_marker_selected */
448 break;
449 case QS60StyleEnums::SP_QgnIndiSubMenu:
450 fallbackIndex = EMbmAvkonQgn_indi_submenu;
451 break;
452 case QS60StyleEnums::SP_QgnNoteErased:
453 fallbackIndex = EMbmAvkonQgn_note_erased;
454 break;
455 case QS60StyleEnums::SP_QgnNoteError:
456 fallbackIndex = EMbmAvkonQgn_note_error;
457 break;
458 case QS60StyleEnums::SP_QgnNoteInfo:
459 fallbackIndex = EMbmAvkonQgn_note_info;
460 break;
461 case QS60StyleEnums::SP_QgnNoteOk:
462 fallbackIndex = EMbmAvkonQgn_note_ok;
463 break;
464 case QS60StyleEnums::SP_QgnNoteQuery:
465 fallbackIndex = EMbmAvkonQgn_note_query;
466 break;
467 case QS60StyleEnums::SP_QgnNoteWarning:
468 fallbackIndex = EMbmAvkonQgn_note_warning;
469 break;
470 case QS60StyleEnums::SP_QgnPropFileSmall:
471 fallbackIndex = EMbmAvkonQgn_prop_file_small;
472 break;
473 case QS60StyleEnums::SP_QgnPropFolderCurrent:
474 fallbackIndex = EMbmAvkonQgn_prop_folder_current;
475 break;
476 case QS60StyleEnums::SP_QgnPropFolderSmall:
477 fallbackIndex = EMbmAvkonQgn_prop_folder_small;
478 break;
479 case QS60StyleEnums::SP_QgnPropFolderSmallNew:
480 fallbackIndex = EMbmAvkonQgn_prop_folder_small_new;
481 break;
482 case QS60StyleEnums::SP_QgnPropPhoneMemcLarge:
483 fallbackIndex = EMbmAvkonQgn_prop_phone_memc_large;
484 break;
485 default:
486 fallbackIndex = -1;
487 break;
488 }
489}
490
491QPixmap QS60StyleModeSpecifics::colorSkinnedGraphicsLX(
492 const QS60StyleEnums::SkinParts &stylepart,
493 const QSize &size, QPainter *painter, QS60StylePrivate::SkinElementFlags flags)
494{
495 // this function can throw both exceptions and leaves. There are no cleanup dependencies between Qt and Symbian parts.
496 const int stylepartIndex = (int)stylepart;
497 const TAknsItemID skinId = m_partMap[stylepartIndex].skinID;
498
499 TInt fallbackGraphicID = -1;
500 HBufC* iconFile = HBufC::NewLC( KMaxFileName );
501 fallbackInfo(stylepart, fallbackGraphicID);
502
503 TAknsItemID colorGroup = KAknsIIDQsnIconColors;
504 TRgb defaultColor = KRgbBlack;
505 int colorIndex = -1; //set a bogus value to color index to ensure that painter color is used
506 //to color the icon
507 if (painter) {
508 QRgb widgetColor = painter->pen().color().rgb();
509 defaultColor = TRgb(qRed(widgetColor), qGreen(widgetColor), qBlue(widgetColor));
510 }
511
512 const bool rotatedBy90or270 =
513 (flags & (QS60StylePrivate::SF_PointEast | QS60StylePrivate::SF_PointWest));
514 const TSize targetSize =
515 rotatedBy90or270?TSize(size.height(), size.width()):TSize(size.width(), size.height());
516 CFbsBitmap *icon = 0;
517 CFbsBitmap *iconMask = 0;
518 const TInt fallbackGraphicsMaskID =
519 fallbackGraphicID == KErrNotFound?KErrNotFound:fallbackGraphicID+1; //masks are auto-generated as next in mif files
520 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
521 AknsUtils::CreateColorIconLC(
522 skinInstance,
523 skinId,
524 colorGroup,
525 colorIndex,
526 icon,
527 iconMask,
528 AknIconUtils::AvkonIconFileName(),
529 fallbackGraphicID,
530 fallbackGraphicsMaskID,
531 defaultColor);
532
533 QPixmap result = fromFbsBitmap(icon, iconMask, flags, targetSize);
534 CleanupStack::PopAndDestroy(3); //icon, iconMask, iconFile
535 return result;
536}
537
538QColor QS60StyleModeSpecifics::colorValue(const TAknsItemID &colorGroup, int colorIndex)
539{
540 TRgb skinnedColor;
541 MAknsSkinInstance* skin = AknsUtils::SkinInstance();
542 AknsUtils::GetCachedColor(skin, skinnedColor, colorGroup, colorIndex);
543 return QColor(skinnedColor.Red(),skinnedColor.Green(),skinnedColor.Blue());
544}
545
546struct QAutoFbsBitmapHeapLock
547{
548 QAutoFbsBitmapHeapLock(CFbsBitmap* aBmp) : mBmp(aBmp) { mBmp->LockHeap(); }
549 ~QAutoFbsBitmapHeapLock() { mBmp->UnlockHeap(); }
550 CFbsBitmap* mBmp;
551};
552
553QPixmap QS60StyleModeSpecifics::fromFbsBitmap(CFbsBitmap *icon, CFbsBitmap *mask, QS60StylePrivate::SkinElementFlags flags, const TSize &targetSize)
554{
555 Q_ASSERT(icon);
556
557 AknIconUtils::DisableCompression(icon);
558 TInt error = AknIconUtils::SetSize(icon, targetSize, EAspectRatioNotPreserved);
559
560 if (mask && !error) {
561 AknIconUtils::DisableCompression(mask);
562 error = AknIconUtils::SetSize(mask, targetSize, EAspectRatioNotPreserved);
563 }
564 if (error)
565 return QPixmap();
566
567 QPixmap pixmap = QPixmap::fromSymbianCFbsBitmap(icon);
568 if (mask)
569 pixmap.setAlphaChannel(QPixmap::fromSymbianCFbsBitmap(mask));
570
571 if ((flags & QS60StylePrivate::SF_PointEast) ||
572 (flags & QS60StylePrivate::SF_PointSouth) ||
573 (flags & QS60StylePrivate::SF_PointWest)) {
574 QImage iconImage = pixmap.toImage();
575 QTransform imageTransform;
576 if (flags & QS60StylePrivate::SF_PointEast) {
577 imageTransform.rotate(90);
578 } else if (flags & QS60StylePrivate::SF_PointSouth) {
579 imageTransform.rotate(180);
580 iconImage = iconImage.transformed(imageTransform);
581 } else if (flags & QS60StylePrivate::SF_PointWest) {
582 imageTransform.rotate(270);
583 }
584 if (imageTransform.isRotating())
585 iconImage = iconImage.transformed(imageTransform);
586
587 pixmap = QPixmap::fromImage(iconImage);
588 }
589 return pixmap;
590}
591
592bool QS60StylePrivate::isTouchSupported()
593{
594 return bool(AknLayoutUtils::PenEnabled());
595}
596
597bool QS60StylePrivate::isToolBarBackground()
598{
599 return (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || QSysInfo::s60Version() == QSysInfo::SV_S60_3_2);
600}
601
602bool QS60StylePrivate::hasSliderGrooveGraphic()
603{
604 return QSysInfo::s60Version() != QSysInfo::SV_S60_3_1;
605}
606
607QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
608{
609 CCoeControl *control = targetWidget->effectiveWinId();
610 TPoint pos(0,0);
611 if (control) {
612 // FIXME properly: S60 3.1 has a bug that CCoeControl::PositionRelativeToScreen sometimes
613 // freezes the device, possibly in cases where we run out of memory.
614 // We use CCoeControl::Position instead in S60 3.1, which returns same values
615 // in most cases.
616 if (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1)
617 pos = control->Position();
618 else
619 pos = control->PositionRelativeToScreen();
620 }
621 return QPoint(pos.iX, pos.iY);
622}
623
624QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(
625 QS60StyleEnums::SkinParts part, const QSize &size,
626 QS60StylePrivate::SkinElementFlags flags)
627{
628 // this function can throw both exceptions and leaves. There are no cleanup dependencies between Qt and Symbian parts.
629 if (!size.isValid())
630 return QPixmap();
631
632 // Check release support and change part, if necessary.
633 const TAknsItemID skinId = partSpecificThemeId((int)part);
634 const int stylepartIndex = (int)part;
635 const TDrawType drawType = m_partMap[stylepartIndex].drawType;
636 Q_ASSERT(drawType != ENoDraw);
637 const bool rotatedBy90or270 =
638 (flags & (QS60StylePrivate::SF_PointEast | QS60StylePrivate::SF_PointWest));
639 const TSize targetSize =
640 rotatedBy90or270 ? TSize(size.height(), size.width()) : qt_QSize2TSize(size);
641
642 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
643
644 QPixmap result;
645
646 switch (drawType) {
647 case EDrawGulIcon: {
648 CGulIcon* icon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(), skinId, EFalse );
649 if (icon)
650 result = fromFbsBitmap(icon->Bitmap(), icon->Mask(), flags, targetSize);
651 delete icon;
652 break;
653 }
654 case EDrawIcon: {
655 TInt fallbackGraphicID = -1;
656 fallbackInfo(part, fallbackGraphicID);
657
658 CFbsBitmap *icon = 0;
659 CFbsBitmap *iconMask = 0;
660 const TInt fallbackGraphicsMaskID =
661 fallbackGraphicID == KErrNotFound?KErrNotFound:fallbackGraphicID+1; //masks are auto-generated as next in mif files
662
663 AknsUtils::CreateIconL(
664 skinInstance,
665 skinId,
666 icon,
667 iconMask,
668 AknIconUtils::AvkonIconFileName(),
669 fallbackGraphicID ,
670 fallbackGraphicsMaskID);
671
672 result = fromFbsBitmap(icon, iconMask, flags, targetSize);
673 delete icon;
674 delete iconMask;
675 break;
676 }
677 case EDrawBackground: {
678 // QS60WindowSurface::unlockBitmapHeap();
679 CFbsBitmap *background = new (ELeave) CFbsBitmap(); //offscreen
680 CleanupStack::PushL(background);
681 User::LeaveIfError(background->Create(targetSize, EColor16MA));
682
683 CFbsBitmapDevice *dev = CFbsBitmapDevice::NewL(background);
684 CleanupStack::PushL(dev);
685 CFbsBitGc *gc = NULL;
686 User::LeaveIfError(dev->CreateContext(gc));
687 CleanupStack::PushL(gc);
688
689 CAknsBasicBackgroundControlContext *bgContext = CAknsBasicBackgroundControlContext::NewL(
690 skinId,
691 targetSize,
692 EFalse);
693 CleanupStack::PushL(bgContext);
694
695 const TBool drawn = AknsDrawUtils::DrawBackground(
696 skinInstance,
697 bgContext,
698 NULL,
699 *gc,
700 TPoint(),
701 targetSize,
702 KAknsDrawParamDefault | KAknsDrawParamRGBOnly);
703
704 if (drawn)
705 result = fromFbsBitmap(background, NULL, flags, targetSize);
706 // if drawing fails in skin server, just ignore the background (probably OOM occured)
707
708 CleanupStack::PopAndDestroy(4, background); //background, dev, gc, bgContext
709 // QS60WindowSurface::lockBitmapHeap();
710 break;
711 }
712 }
713 if (!result)
714 result = QPixmap();
715
716 return result;
717}
718
719QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement,
720 const QSize &size, QS60StylePrivate::SkinElementFlags flags)
721{
722 // this function can throw both exceptions and leaves. There are no cleanup dependencies between Qt and Symbian parts.
723 if (!size.isValid())
724 return QPixmap();
725
726 const bool rotatedBy90or270 =
727 (flags & (QS60StylePrivate::SF_PointEast | QS60StylePrivate::SF_PointWest));
728 const TSize targetSize =
729 rotatedBy90or270 ? TSize(size.height(), size.width()) : qt_QSize2TSize(size);
730
731 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
732 QPixmap result;
733
734// QS60WindowSurface::unlockBitmapHeap();
735 static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
736 static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
737
738 CFbsBitmap *frame = new (ELeave) CFbsBitmap(); //offscreen
739 CleanupStack::PushL(frame);
740 User::LeaveIfError(frame->Create(targetSize, displayMode));
741
742 CFbsBitmapDevice* bitmapDev = CFbsBitmapDevice::NewL(frame);
743 CleanupStack::PushL(bitmapDev);
744 CFbsBitGc* bitmapGc = NULL;
745 User::LeaveIfError(bitmapDev->CreateContext(bitmapGc));
746 CleanupStack::PushL(bitmapGc);
747
748#ifndef Q_SYMBIAN_HAS_EXTENDED_BITMAP_TYPE
749 frame->LockHeap();
750 memset(frame->DataAddress(), 0, frame->SizeInPixels().iWidth * frame->SizeInPixels().iHeight * 4); // 4: argb bytes
751 frame->UnlockHeap();
752#endif
753
754 const TRect outerRect(TPoint(0, 0), targetSize);
755 const TRect innerRect = innerRectFromElement(frameElement, outerRect);
756
757 TAknsItemID frameSkinID, centerSkinID;
758 frameSkinID = centerSkinID = partSpecificThemeId(QS60StylePrivate::m_frameElementsData[frameElement].center);
759 frameIdAndCenterId(frameElement, frameSkinID, centerSkinID);
760
761 TBool drawn = AknsDrawUtils::DrawFrame(
762 skinInstance,
763 *bitmapGc,
764 outerRect,
765 innerRect,
766 frameSkinID,
767 centerSkinID,
768 drawParam );
769
770 if (S60->supportsPremultipliedAlpha) {
771 if (drawn) {
772 result = fromFbsBitmap(frame, NULL, flags, targetSize);
773 } else {
774 // Drawing might fail due to OOM (we can do nothing about that),
775 // or due to skin item not being available.
776 // If the latter occurs, lets try switch to non-release specific items (if available)
777 // and re-try the drawing.
778 frameSkinID = centerSkinID = m_partMap[(int)QS60StylePrivate::m_frameElementsData[frameElement].center].skinID;
779 frameIdAndCenterId(frameElement, frameSkinID, centerSkinID);
780 drawn = AknsDrawUtils::DrawFrame( skinInstance,
781 *bitmapGc, outerRect, innerRect,
782 frameSkinID, centerSkinID,
783 drawParam );
784 // in case drawing fails, even after using default graphics, ignore the error
785 if (drawn)
786 result = fromFbsBitmap(frame, NULL, flags, targetSize);
787 }
788 } else {
789 TDisplayMode maskDepth = EGray2;
790 // Query the skin item for possible frame graphics mask details.
791 if (skinInstance) {
792 CAknsMaskedBitmapItemData* skinMaskedBmp = static_cast<CAknsMaskedBitmapItemData*>(
793 skinInstance->GetCachedItemData(frameSkinID,EAknsITMaskedBitmap));
794 if (skinMaskedBmp && skinMaskedBmp->Mask())
795 maskDepth = skinMaskedBmp->Mask()->DisplayMode();
796 }
797 if (maskDepth != ENone) {
798 CFbsBitmap *frameMask = new (ELeave) CFbsBitmap(); //offscreen
799 CleanupStack::PushL(frameMask);
800 User::LeaveIfError(frameMask->Create(targetSize, maskDepth));
801
802 CFbsBitmapDevice* maskBitmapDevice = CFbsBitmapDevice::NewL(frameMask);
803 CleanupStack::PushL(maskBitmapDevice);
804 CFbsBitGc* maskBitGc = NULL;
805 User::LeaveIfError(maskBitmapDevice->CreateContext(maskBitGc));
806 CleanupStack::PushL(maskBitGc);
807
808 if (drawn) {
809 //ensure that the mask is really transparent
810 maskBitGc->Activate( maskBitmapDevice );
811 maskBitGc->SetPenStyle(CGraphicsContext::ENullPen);
812 maskBitGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
813 maskBitGc->SetBrushColor(KRgbWhite);
814 maskBitGc->Clear();
815 maskBitGc->SetBrushStyle(CGraphicsContext::ENullBrush);
816
817 drawn = AknsDrawUtils::DrawFrame(skinInstance,
818 *maskBitGc, outerRect, innerRect,
819 frameSkinID, centerSkinID,
820 KAknsSDMAlphaOnly |KAknsDrawParamNoClearUnderImage);
821 if (drawn)
822 result = fromFbsBitmap(frame, frameMask, flags, targetSize);
823 }
824 CleanupStack::PopAndDestroy(3, frameMask);
825 }
826 }
827 CleanupStack::PopAndDestroy(3, frame); //frame, bitmapDev, bitmapGc
828 return result;
829}
830
831void QS60StyleModeSpecifics::frameIdAndCenterId(QS60StylePrivate::SkinFrameElements frameElement, TAknsItemID &frameId, TAknsItemID &centerId)
832{
833// There are some major mix-ups in skin declarations for some frames.
834// First, the frames are not declared in sequence.
835// Second, the parts use different major than the frame-master.
836
837 switch(frameElement) {
838 case QS60StylePrivate::SF_ToolTip:
839 if (QSysInfo::s60Version()!=QSysInfo::SV_S60_3_1) {
840 centerId.Set(EAknsMajorGeneric, 0x19c2);
841 frameId.Set(EAknsMajorSkin, 0x5300);
842 } else {
843 centerId.Set(KAknsIIDQsnFrPopupCenter);
844 frameId.iMinor = centerId.iMinor - 9;
845 }
846 break;
847 case QS60StylePrivate::SF_ToolBar:
848 if (QSysInfo::s60Version()==QSysInfo::SV_S60_3_1 || QSysInfo::s60Version()==QSysInfo::SV_S60_3_2) {
849 centerId.Set(KAknsIIDQsnFrPopupCenterSubmenu);
850 frameId.Set(KAknsIIDQsnFrPopupSub);
851 }
852 break;
853 case QS60StylePrivate::SF_PanelBackground:
854 // remove center piece for panel graphics, so that only border is drawn
855 centerId.Set(KAknsIIDNone);
856 frameId.Set(KAknsIIDQsnFrSetOpt);
857 break;
858 default:
859 // center should be correct here
860 frameId.iMinor = centerId.iMinor - 9;
861 break;
862 }
863}
864
865TRect QS60StyleModeSpecifics::innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect)
866{
867 TInt widthShrink = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth);
868 TInt heightShrink = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerHeight);
869 switch(frameElement) {
870 case QS60StylePrivate::SF_PanelBackground:
871 // panel should have slightly slimmer border to enable thin line of background graphics between closest component
872 widthShrink = widthShrink-2;
873 heightShrink = heightShrink-2;
874 break;
875 case QS60StylePrivate::SF_ToolTip:
876 widthShrink = widthShrink>>1;
877 heightShrink = heightShrink>>1;
878 break;
879 case QS60StylePrivate::SF_ListHighlight:
880 widthShrink = widthShrink-2;
881 heightShrink = heightShrink-2;
882 break;
883 default:
884 break;
885 }
886 TRect innerRect(outerRect);
887 innerRect.Shrink(widthShrink, heightShrink);
888 return innerRect;
889}
890
891bool QS60StyleModeSpecifics::checkSupport(const int supportedRelease)
892{
893 const QSysInfo::S60Version currentRelease = QSysInfo::s60Version();
894 return ( (currentRelease == QSysInfo::SV_S60_3_1 && supportedRelease & ES60_3_1) ||
895 (currentRelease == QSysInfo::SV_S60_3_2 && supportedRelease & ES60_3_2) ||
896 (currentRelease == QSysInfo::SV_S60_5_0 && supportedRelease & ES60_5_0) ||
897 (currentRelease == QSysInfo::SV_S60_5_1 && supportedRelease & ES60_5_1) ||
898 (currentRelease == QSysInfo::SV_S60_5_2 && supportedRelease & ES60_5_2));
899}
900
901TAknsItemID QS60StyleModeSpecifics::partSpecificThemeId(int part)
902{
903 TAknsItemID newSkinId;
904 if (!checkSupport(m_partMap[(int)part].supportInfo))
905 newSkinId.Set(m_partMap[(int)part].newMajorSkinId, m_partMap[(int)part].newMinorSkinId);
906 else
907 newSkinId.Set(m_partMap[(int)part].skinID);
908 return newSkinId;
909}
910
911QFont QS60StylePrivate::s60Font_specific(
912 QS60StyleEnums::FontCategories fontCategory, int pointSize)
913{
914 TAknFontCategory aknFontCategory = EAknFontCategoryUndefined;
915 switch (fontCategory) {
916 case QS60StyleEnums::FC_Primary:
917 aknFontCategory = EAknFontCategoryPrimary;
918 break;
919 case QS60StyleEnums::FC_Secondary:
920 aknFontCategory = EAknFontCategorySecondary;
921 break;
922 case QS60StyleEnums::FC_Title:
923 aknFontCategory = EAknFontCategoryTitle;
924 break;
925 case QS60StyleEnums::FC_PrimarySmall:
926 aknFontCategory = EAknFontCategoryPrimarySmall;
927 break;
928 case QS60StyleEnums::FC_Digital:
929 aknFontCategory = EAknFontCategoryDigital;
930 break;
931 case QS60StyleEnums::FC_Undefined:
932 default:
933 break;
934 }
935
936 // Create AVKON font according the given parameters
937 CWsScreenDevice* dev = CCoeEnv::Static()->ScreenDevice();
938 TAknFontSpecification spec(aknFontCategory, TFontSpec(), NULL);
939 if (pointSize > 0) {
940 const TInt pixelSize = dev->VerticalTwipsToPixels(pointSize * KTwipsPerPoint);
941 spec.SetTextPaneHeight(pixelSize + 4); // TODO: Is 4 a reasonable top+bottom margin?
942 }
943
944 QFont result;
945 TRAPD( error, QT_TRYCATCH_LEAVING({
946 const CAknLayoutFont* aknFont =
947 AknFontAccess::CreateLayoutFontFromSpecificationL(*dev, spec);
948
949 result = qt_TFontSpec2QFontL(aknFont->DoFontSpecInTwips());
950 if (result.pointSize() != pointSize)
951 result.setPointSize(pointSize); // Correct the font size returned by CreateLayoutFontFromSpecificationL()
952
953 delete aknFont;
954 }));
955 if (error) result = QFont();
956 return result;
957}
958
959void QS60StylePrivate::setActiveLayout()
960{
961 const QSize activeScreenSize(screenSize());
962 int activeLayoutIndex = -1;
963 const short screenHeight = (short)activeScreenSize.height();
964 const short screenWidth = (short)activeScreenSize.width();
965 for (int i=0; i<m_numberOfLayouts; i++) {
966 if (screenHeight==m_layoutHeaders[i].height &&
967 screenWidth==m_layoutHeaders[i].width) {
968 activeLayoutIndex = i;
969 break;
970 }
971 }
972
973 //not found, lets try with either of dimensions
974 if (activeLayoutIndex==-1){
975 const QSysInfo::S60Version currentRelease = QSysInfo::s60Version();
976 const bool landscape = screenHeight < screenWidth;
977
978 activeLayoutIndex = (currentRelease == QSysInfo::SV_S60_3_1 || currentRelease == QSysInfo::SV_S60_3_2) ? 0 : 2;
979 activeLayoutIndex += (!landscape) ? 1 : 0;
980 }
981
982 m_pmPointer = data[activeLayoutIndex];
983}
984
985QS60StylePrivate::QS60StylePrivate()
986{
987 // No need to set active layout, if dynamic metrics API is available
988 setActiveLayout();
989}
990
991QColor QS60StylePrivate::s60Color(QS60StyleEnums::ColorLists list,
992 int index, const QStyleOption *option)
993{
994 static const TAknsItemID *idMap[] = {
995 &KAknsIIDQsnHighlightColors,
996 &KAknsIIDQsnIconColors,
997 &KAknsIIDQsnLineColors,
998 &KAknsIIDQsnOtherColors,
999 &KAknsIIDQsnParentColors,
1000 &KAknsIIDQsnTextColors
1001 };
1002 Q_ASSERT((int)list <= (int)sizeof(idMap)/sizeof(idMap[0]));
1003 const QColor color = QS60StyleModeSpecifics::colorValue(*idMap[(int) list], index - 1);
1004 return option ? QS60StylePrivate::stateColor(color, option) : color;
1005}
1006
1007// In some cases, the AVKON UI themegraphic is already in 'disabled state'.
1008// If so, return true for these parts.
1009bool QS60StyleModeSpecifics::disabledPartGraphic(QS60StyleEnums::SkinParts &part)
1010{
1011 bool disabledGraphic = false;
1012 switch(part){
1013 // inactive button graphics are available from 5.0 onwards
1014 case QS60StyleEnums::SP_QsnFrButtonCornerTlInactive:
1015 case QS60StyleEnums::SP_QsnFrButtonCornerTrInactive:
1016 case QS60StyleEnums::SP_QsnFrButtonCornerBlInactive:
1017 case QS60StyleEnums::SP_QsnFrButtonCornerBrInactive:
1018 case QS60StyleEnums::SP_QsnFrButtonSideTInactive:
1019 case QS60StyleEnums::SP_QsnFrButtonSideBInactive:
1020 case QS60StyleEnums::SP_QsnFrButtonSideLInactive:
1021 case QS60StyleEnums::SP_QsnFrButtonSideRInactive:
1022 case QS60StyleEnums::SP_QsnFrButtonCenterInactive:
1023 if (!(QSysInfo::s60Version()==QSysInfo::SV_S60_3_1 ||
1024 QSysInfo::s60Version()==QSysInfo::SV_S60_3_2))
1025 disabledGraphic = true;
1026 break;
1027 default:
1028 break;
1029 }
1030 return disabledGraphic;
1031}
1032
1033// In some cases, the AVKON UI themegraphic is already in 'disabled state'.
1034// If so, return true for these frames.
1035bool QS60StyleModeSpecifics::disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame)
1036{
1037 bool disabledGraphic = false;
1038 switch(frame){
1039 // inactive button graphics are available from 5.0 onwards
1040 case QS60StylePrivate::SF_ButtonInactive:
1041 if (!(QSysInfo::s60Version()==QSysInfo::SV_S60_3_1 ||
1042 QSysInfo::s60Version()==QSysInfo::SV_S60_3_2))
1043 disabledGraphic = true;
1044 break;
1045 default:
1046 break;
1047 }
1048 return disabledGraphic;
1049}
1050
1051QPixmap QS60StyleModeSpecifics::generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part,
1052 const QSize &size, QS60StylePrivate::SkinElementFlags flags)
1053{
1054 if (!QS60StylePrivate::isTouchSupported())
1055 return QPixmap();
1056
1057 QS60StyleEnums::SkinParts updatedPart = part;
1058 switch(part){
1059 // AVKON UI has a abnormal handling for scrollbar graphics. It is possible that the root
1060 // skin does not contain mandatory graphics for scrollbar pressed states. Therefore, AVKON UI
1061 // creates dynamically these graphics by modifying the normal state scrollbar graphics slightly.
1062 // S60Style needs to work similarly. Therefore if skingraphics call provides to be a miss
1063 // (i.e. result is not valid), style needs to draw normal graphics instead and apply some
1064 // modifications (similar to generatedIconPixmap()) to the result.
1065 case QS60StyleEnums::SP_QsnCpScrollHandleBottomPressed:
1066 updatedPart = QS60StyleEnums::SP_QsnCpScrollHandleBottom;
1067 break;
1068 case QS60StyleEnums::SP_QsnCpScrollHandleMiddlePressed:
1069 updatedPart = QS60StyleEnums::SP_QsnCpScrollHandleMiddle;
1070 break;
1071 case QS60StyleEnums::SP_QsnCpScrollHandleTopPressed:
1072 updatedPart = QS60StyleEnums::SP_QsnCpScrollHandleTop;
1073 break;
1074 default:
1075 break;
1076 }
1077 if (part==updatedPart) {
1078 return QPixmap();
1079 } else {
1080 QPixmap result = skinnedGraphics(updatedPart, size, flags);
1081 QStyleOption opt;
1082 QPalette *themePalette = QS60StylePrivate::themePalette();
1083 if (themePalette)
1084 opt.palette = *themePalette;
1085
1086 // For now, always generate new icon based on "selected". In the future possibly, expand
1087 // this to consist other possibilities as well.
1088 result = QApplication::style()->generatedIconPixmap(QIcon::Selected, result, &opt);
1089 return result;
1090 }
1091}
1092
1093QPixmap QS60StylePrivate::part(QS60StyleEnums::SkinParts part,
1094 const QSize &size, QPainter *painter, SkinElementFlags flags)
1095{
1096 QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
1097
1098 QPixmap result = (flags & SF_ColorSkinned)?
1099 QS60StyleModeSpecifics::colorSkinnedGraphics(part, size, painter, flags)
1100 : QS60StyleModeSpecifics::skinnedGraphics(part, size, flags);
1101
1102 lock.relock();
1103
1104 if (flags & SF_StateDisabled && !QS60StyleModeSpecifics::disabledPartGraphic(part)) {
1105 QStyleOption opt;
1106 QPalette *themePalette = QS60StylePrivate::themePalette();
1107 if (themePalette)
1108 opt.palette = *themePalette;
1109 result = QApplication::style()->generatedIconPixmap(QIcon::Disabled, result, &opt);
1110 }
1111
1112 if (!result)
1113 result = QS60StyleModeSpecifics::generateMissingThemeGraphic(part, size, flags);
1114
1115 return result;
1116}
1117
1118QPixmap QS60StylePrivate::frame(SkinFrameElements frame, const QSize &size, SkinElementFlags flags)
1119{
1120 QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
1121 QPixmap result = QS60StyleModeSpecifics::skinnedGraphics(frame, size, flags);
1122 lock.relock();
1123
1124 if (flags & SF_StateDisabled && !QS60StyleModeSpecifics::disabledFrameGraphic(frame)) {
1125 QStyleOption opt;
1126 QPalette *themePalette = QS60StylePrivate::themePalette();
1127 if (themePalette)
1128 opt.palette = *themePalette;
1129 result = QApplication::style()->generatedIconPixmap(QIcon::Disabled, result, &opt);
1130 }
1131 return result;
1132}
1133
1134QPixmap QS60StylePrivate::backgroundTexture()
1135{
1136 bool createNewBackground = false;
1137 if (!m_background) {
1138 createNewBackground = true;
1139 } else {
1140 //if background brush does not match screensize, re-create it
1141 if (m_background->width() != S60->screenWidthInPixels ||
1142 m_background->height() != S60->screenHeightInPixels) {
1143 delete m_background;
1144 createNewBackground = true;
1145 }
1146 }
1147
1148 if (createNewBackground) {
1149 QPixmap background = part(QS60StyleEnums::SP_QsnBgScreen,
1150 QSize(S60->screenWidthInPixels, S60->screenHeightInPixels), 0, SkinElementFlags());
1151 m_background = new QPixmap(background);
1152 }
1153 return *m_background;
1154}
1155
1156QSize QS60StylePrivate::screenSize()
1157{
1158 return QSize(S60->screenWidthInPixels, S60->screenHeightInPixels);
1159}
1160
1161QS60Style::QS60Style()
1162 : QCommonStyle(*new QS60StylePrivate)
1163{
1164}
1165
1166#ifdef Q_WS_S60
1167void QS60StylePrivate::handleDynamicLayoutVariantSwitch()
1168{
1169 clearCaches(QS60StylePrivate::CC_LayoutChange);
1170 setBackgroundTexture(qApp);
1171 setActiveLayout();
1172 refreshUI();
1173 foreach (QWidget *widget, QApplication::allWidgets())
1174 widget->ensurePolished();
1175}
1176
1177void QS60StylePrivate::handleSkinChange()
1178{
1179 clearCaches(QS60StylePrivate::CC_ThemeChange);
1180 setThemePalette(qApp);
1181 foreach (QWidget *topLevelWidget, QApplication::allWidgets()){
1182 QEvent e(QEvent::StyleChange);
1183 QApplication::sendEvent(topLevelWidget, &e);
1184 setThemePalette(topLevelWidget);
1185 topLevelWidget->ensurePolished();
1186 }
1187}
1188
1189QSize QS60StylePrivate::naviPaneSize()
1190{
1191 return QS60StyleModeSpecifics::naviPaneSize();
1192}
1193
1194QSize QS60StyleModeSpecifics::naviPaneSize()
1195{
1196 CAknNavigationControlContainer* naviContainer;
1197 if (S60->statusPane()) {
1198 TRAPD(err, naviContainer = static_cast<CAknNavigationControlContainer*>
1199 (S60->statusPane()->ControlL(TUid::Uid(EEikStatusPaneUidNavi))));
1200 if (err==KErrNone)
1201 return QSize(naviContainer->Size().iWidth, naviContainer->Size().iHeight);
1202 }
1203 return QSize(0,0);
1204}
1205
1206#endif // Q_WS_S60
1207
1208QT_END_NAMESPACE
1209
1210#endif // QT_NO_STYLE_S60 || QT_PLUGIN
Note: See TracBrowser for help on using the repository browser.