|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the utility applications of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
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 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 #include "pixel_metrics.h" |
|
43 |
|
44 #include <AknLayout2ScalableDef.h> |
|
45 #include <AknLayoutScalable_Avkon.cdl.h> |
|
46 #include <AknLayoutScalable_Apps.cdl.h> |
|
47 #include <AknUtils.h> |
|
48 |
|
49 // Version number for dynamic calculations. These are to be exported to static data, |
|
50 // so that we can keep dynamic and static values inline. |
|
51 // Please adjust version data if correcting dynamic PM calculations. |
|
52 const TInt KPMMajorVersion = 1; |
|
53 const TInt KPMMinorVersion = 14; |
|
54 |
|
55 TPixelMetricsVersion PixelMetrics::Version() |
|
56 { |
|
57 TPixelMetricsVersion version; |
|
58 version.majorVersion = KPMMajorVersion; |
|
59 version.minorVersion = KPMMinorVersion; |
|
60 return version; |
|
61 } |
|
62 |
|
63 TInt PixelMetrics::PixelMetricValue(QStyle::PixelMetric metric) |
|
64 { |
|
65 TInt value = -909; |
|
66 // Main pane |
|
67 TRect mainPaneRect; |
|
68 AknLayoutUtils::LayoutMetricsRect( |
|
69 AknLayoutUtils::EMainPane, |
|
70 mainPaneRect ); |
|
71 // Screen |
|
72 TRect screenRect; |
|
73 AknLayoutUtils::LayoutMetricsRect( |
|
74 AknLayoutUtils::EApplicationWindow, |
|
75 screenRect ); |
|
76 // Navi pane |
|
77 TRect naviPaneRect; |
|
78 AknLayoutUtils::LayoutMetricsRect( |
|
79 AknLayoutUtils::ENaviPane, |
|
80 naviPaneRect ); |
|
81 |
|
82 TAknLayoutRect appWindow; |
|
83 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) ); |
|
84 |
|
85 TInt variety = 0; |
|
86 TBool landscape = EFalse; |
|
87 if ( screenRect.iBr.iX > screenRect.iBr.iY ) |
|
88 { |
|
89 // in landscape another variety is used |
|
90 landscape = ETrue; |
|
91 } |
|
92 switch (metric) |
|
93 { |
|
94 case QStyle::PM_DockWidgetHandleExtent: |
|
95 // what's this??? Not in S60 |
|
96 break; |
|
97 case QStyle::PM_CheckListControllerSize: |
|
98 case QStyle::PM_CheckListButtonSize: |
|
99 { |
|
100 // hierarchical menu - checkbox / radiobutton |
|
101 // Area (width/height) of the checkbox/radio button in a Q3CheckListItem. |
|
102 TAknLayoutRect listScrollPane; |
|
103 listScrollPane.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_gen_pane(0)); |
|
104 TAknLayoutRect listGenPane; |
|
105 listGenPane.LayoutRect( listScrollPane.Rect(), AknLayoutScalable_Avkon::list_gen_pane(0)); |
|
106 TAknLayoutRect listHierarchyPane; |
|
107 listHierarchyPane.LayoutRect( listGenPane.Rect(), AknLayoutScalable_Avkon::list_single_graphic_hl_pane(0)); |
|
108 |
|
109 TAknLayoutRect listHierarchyControllerPane; |
|
110 listHierarchyPane.LayoutRect( listHierarchyPane.Rect(), AknLayoutScalable_Avkon::list_single_graphic_hl_pane_g3(0)); |
|
111 TAknLayoutRect listHierarchyPropertyPane; |
|
112 listHierarchyPropertyPane.LayoutRect( listHierarchyPane.Rect(), AknLayoutScalable_Avkon::list_single_graphic_hl_pane_g2(0)); |
|
113 |
|
114 if (metric==QStyle::PM_CheckListControllerSize)value = Max( listHierarchyPane.Rect().Width(), listHierarchyPane.Rect().Width()); |
|
115 else value = Max( listHierarchyPropertyPane.Rect().Width(), listHierarchyPropertyPane.Rect().Width()); |
|
116 } |
|
117 break; |
|
118 case QStyle::PM_DialogButtonsSeparator: //Distance between buttons in a dialog buttons widget. |
|
119 case QStyle::PM_DialogButtonsButtonWidth: // Minimum width of a button in a dialog buttons widget. |
|
120 case QStyle::PM_DialogButtonsButtonHeight:// Minimum height of a button in a dialog buttons widget. |
|
121 { |
|
122 TAknLayoutRect appWindow; |
|
123 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) ); |
|
124 variety = 0; |
|
125 if ( landscape ) |
|
126 { |
|
127 variety = 2; |
|
128 } |
|
129 TAknLayoutRect areaBottomRect; |
|
130 areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) ); |
|
131 |
|
132 TAknLayoutRect controlPaneRect; |
|
133 controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() ); |
|
134 TAknLayoutText controlPaneLSKText; |
|
135 TAknLayoutText controlPaneRSKText; |
|
136 TAknLayoutText controlPaneMSKText; |
|
137 variety = 0; |
|
138 if (AknLayoutUtils::MSKEnabled()) |
|
139 { |
|
140 variety = 3; |
|
141 controlPaneMSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t3(variety)); //MSK text area |
|
142 } |
|
143 controlPaneLSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t1(variety)); //LSK text area |
|
144 controlPaneRSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t2(variety)); //RSK text area |
|
145 |
|
146 /* |
|
147 * |
|
148 ================================================================================== |
|
149 | A | LSK_rect | B | MSK_rect | C | RSK_rect | D | |
|
150 ================================================================================== |
|
151 where A is left padding (between control pane and LSK rect) |
|
152 B is mid-left padding (between LSK and MSK rects) |
|
153 C is mid-right padding (between MSK and RSK rects) |
|
154 D is right padding (between RSK and control pane) |
|
155 |
|
156 ==> Since all these can be separate, lets take Max of {A..D} for PM value |
|
157 */ |
|
158 |
|
159 TInt itemSpacingA = 0; |
|
160 TInt itemSpacingB = 0; |
|
161 TInt itemSpacingC = 0; |
|
162 TInt itemSpacingMax = 0; |
|
163 if ( !AknLayoutUtils::MSKEnabled() ) |
|
164 { |
|
165 itemSpacingA = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX; |
|
166 itemSpacingB = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX; |
|
167 if (!landscape) |
|
168 { |
|
169 // use mid-gap only in portrait |
|
170 itemSpacingC = controlPaneRSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX; |
|
171 } |
|
172 itemSpacingMax = Max(itemSpacingA, Max( itemSpacingB, itemSpacingC)); |
|
173 // no itemspacing4 if no MSK |
|
174 } |
|
175 else |
|
176 { |
|
177 TInt itemSpacingD = 0; |
|
178 itemSpacingA = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX; |
|
179 itemSpacingB = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX; |
|
180 if ( !(AknLayoutUtils::PenEnabled() || landscape) ) // no MSK in touch, nor in landscape |
|
181 { |
|
182 itemSpacingC = controlPaneRSKText.TextRect().iTl.iX - controlPaneMSKText.TextRect().iBr.iX; |
|
183 itemSpacingD = controlPaneMSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX; |
|
184 } |
|
185 itemSpacingMax = Max(itemSpacingA, Max( itemSpacingB, Max( itemSpacingC, itemSpacingD ))); |
|
186 } |
|
187 if (metric==QStyle::PM_DialogButtonsSeparator) value = itemSpacingMax; |
|
188 else if (metric==QStyle::PM_DialogButtonsButtonWidth) |
|
189 { |
|
190 value = Max( controlPaneLSKText.TextRect().Width(), controlPaneRSKText.TextRect().Width()); |
|
191 if (AknLayoutUtils::MSKEnabled()) |
|
192 { |
|
193 value = Max(value, controlPaneMSKText.TextRect().Width()); |
|
194 } |
|
195 } |
|
196 else if (metric==QStyle::PM_DialogButtonsButtonHeight) |
|
197 { |
|
198 value = Max( controlPaneLSKText.TextRect().Height(), controlPaneRSKText.TextRect().Height()); |
|
199 if (AknLayoutUtils::MSKEnabled()) |
|
200 { |
|
201 value = Max(value, controlPaneMSKText.TextRect().Height()); |
|
202 } |
|
203 } |
|
204 } |
|
205 break; |
|
206 case QStyle::PM_DockWidgetTitleMargin: // not in S60, lets use the same margin as in button |
|
207 case QStyle::PM_DockWidgetTitleBarButtonMargin: // not in S60, lets use the same margin as in button |
|
208 case QStyle::PM_ButtonMargin: |
|
209 { |
|
210 TRect myRect(TSize( 80, 20)); // this arbitrary size - user can set it - button border does not seem to have any scalability in it |
|
211 TAknLayoutRect buttonRect; |
|
212 TAknLayoutRect buttonBordersRect; |
|
213 TAknLayoutText buttonText; |
|
214 |
|
215 buttonRect.LayoutRect( myRect, AknLayoutScalable_Avkon::eswt_ctrl_button_pane()); |
|
216 buttonBordersRect.LayoutRect( buttonRect.Rect(), AknLayoutScalable_Avkon::common_borders_pane_copy2(0)); //with text |
|
217 buttonText.LayoutText( buttonRect.Rect(), AknLayoutScalable_Avkon::control_button_pane_t1() ); |
|
218 |
|
219 // Its better to use left-right margins, since font deployment can create funny top / bottom margins |
|
220 TInt leftMargin = buttonText.TextRect().iTl.iX - buttonBordersRect.Rect().iTl.iX; |
|
221 TInt rightMargin = buttonBordersRect.Rect().iBr.iX - buttonText.TextRect().iBr.iX; |
|
222 value = (TInt) ((leftMargin+rightMargin)/2); |
|
223 } |
|
224 break; |
|
225 case QStyle::PM_ButtonDefaultIndicator: |
|
226 { |
|
227 // no default button indicators in S60 |
|
228 value = 0; |
|
229 } |
|
230 break; |
|
231 case QStyle::PM_MdiSubWindowFrameWidth: |
|
232 case QStyle::PM_ComboBoxFrameWidth: |
|
233 case QStyle::PM_SpinBoxFrameWidth: |
|
234 value = 0; |
|
235 break; |
|
236 case QStyle::PM_ToolBarFrameWidth: |
|
237 case QStyle::PM_DefaultFrameWidth: |
|
238 { |
|
239 TAknLayoutRect highLightPaneRect; |
|
240 TAknLayoutRect centerPaneRect; |
|
241 TRect rectParent( mainPaneRect ); |
|
242 highLightPaneRect.LayoutRect( rectParent, AknLayoutScalable_Avkon::toolbar_button_pane(0).LayoutLine()); |
|
243 centerPaneRect.LayoutRect(rectParent, AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine()); |
|
244 |
|
245 value = highLightPaneRect.Rect().iBr.iX - centerPaneRect.Rect().iBr.iX; |
|
246 } |
|
247 break; |
|
248 case QStyle::PM_RadioButtonLabelSpacing: |
|
249 { |
|
250 /* |
|
251 * |
|
252 =================================================================================== |
|
253 | A | iconLayoutRect |B| itemText | C | |
|
254 =================================================================================== |
|
255 mirrored: |
|
256 =================================================================================== |
|
257 | C | itemText |B| iconLayoutRect | A | |
|
258 =================================================================================== |
|
259 where A is left padding |
|
260 B is gap between icon and text |
|
261 C is right padding |
|
262 */ |
|
263 |
|
264 TRect rectParent( mainPaneRect ); |
|
265 TAknLayoutRect layoutRect; |
|
266 layoutRect.LayoutRect( rectParent,AknLayoutScalable_Avkon::list_choice_list_pane(1).LayoutLine() ); // w/ scrollbar |
|
267 TAknLayoutText itemText; |
|
268 itemText.LayoutText( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1) ); |
|
269 TAknLayoutRect iconLayoutRect; |
|
270 iconLayoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_g1().LayoutLine() ); |
|
271 |
|
272 if ( !AknLayoutUtils::LayoutMirrored() ) |
|
273 { |
|
274 value = itemText.TextRect().iTl.iX - iconLayoutRect.Rect().iBr.iX; |
|
275 } |
|
276 else |
|
277 { |
|
278 value = iconLayoutRect.Rect().iTl.iX - itemText.TextRect().iBr.iX; |
|
279 } |
|
280 } |
|
281 |
|
282 break; |
|
283 case QStyle::PM_CheckBoxLabelSpacing: |
|
284 { |
|
285 /* |
|
286 * |
|
287 =================================================================================== |
|
288 | A | iconLayoutRect |B| itemText | C | |
|
289 =================================================================================== |
|
290 mirrored: |
|
291 =================================================================================== |
|
292 | C | itemText |B| iconLayoutRect | A | |
|
293 =================================================================================== |
|
294 where A is left padding |
|
295 B is gap between icon and text |
|
296 C is right padding |
|
297 */ |
|
298 |
|
299 TRect rectParent( mainPaneRect ); |
|
300 TAknLayoutRect layoutRect; |
|
301 layoutRect.LayoutRect( rectParent, AknLayoutScalable_Avkon::listscroll_gen_pane(0).LayoutLine() ); |
|
302 |
|
303 TAknLayoutRect layoutRect2; |
|
304 layoutRect2.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Avkon::list_gen_pane(0).LayoutLine() ); |
|
305 TAknLayoutRect layoutRect3; |
|
306 layoutRect3.LayoutRect( layoutRect2.Rect(), AknLayoutScalable_Avkon::list_single_graphic_pane(0).LayoutLine() ); |
|
307 |
|
308 TAknLayoutText itemText; |
|
309 itemText.LayoutText( layoutRect3.Rect(), AknLayoutScalable_Avkon::list_single_graphic_pane_t1(0) ); |
|
310 TAknLayoutRect iconLayoutRect; |
|
311 iconLayoutRect.LayoutRect( layoutRect3.Rect(), AknLayoutScalable_Avkon::list_single_graphic_pane_g1(0).LayoutLine() ); |
|
312 |
|
313 if ( !AknLayoutUtils::LayoutMirrored() ) |
|
314 { |
|
315 value = itemText.TextRect().iTl.iX - iconLayoutRect.Rect().iBr.iX; |
|
316 } |
|
317 else |
|
318 { |
|
319 value = iconLayoutRect.Rect().iTl.iX - itemText.TextRect().iBr.iX; |
|
320 } |
|
321 } |
|
322 break; |
|
323 case QStyle::PM_ToolTipLabelFrameWidth: |
|
324 { |
|
325 /* |
|
326 * |
|
327 |===================================================================================| |
|
328 | info popup note B | |
|
329 | ============================================================================== | |
|
330 | A | hintText | D| |
|
331 | ============================================================================== | |
|
332 | C | |
|
333 |===================================================================================| |
|
334 where A is left padding |
|
335 B is top padding |
|
336 C is bottom padding |
|
337 D is right padding |
|
338 we'll provide the average of top and bottom padding as PM_ToolTipLabelFrameWidth |
|
339 */ |
|
340 |
|
341 // Set pop-up to contain only one line of text |
|
342 TInt index = 0; |
|
343 if ( landscape ) |
|
344 { |
|
345 // in landscape another variety is used |
|
346 index += 5; |
|
347 } |
|
348 // Get parameter and table limits for popup preview text window |
|
349 TAknLayoutScalableParameterLimits limits = |
|
350 AknLayoutScalable_Avkon::popup_preview_text_window_ParamLimits(); |
|
351 |
|
352 TAknLayoutScalableTableLimits tableLimits = |
|
353 AknLayoutScalable_Avkon::popup_preview_text_window_t_Limits(); |
|
354 |
|
355 TInt windowVariety = Min( Max( index, limits.FirstVariety() ), limits.LastVariety() ); |
|
356 |
|
357 TAknLayoutScalableParameterLimits tParamLimits = |
|
358 AknLayoutScalable_Avkon:: popup_preview_text_window_t_ParamLimits( |
|
359 tableLimits.FirstIndex() ); |
|
360 |
|
361 TInt lineVariety = Min( Max( index, tParamLimits.FirstVariety() ), tParamLimits.LastVariety() ); |
|
362 |
|
363 TAknWindowLineLayout lineLayout = AknLayoutScalable_Avkon::popup_preview_text_window(windowVariety).LayoutLine(); |
|
364 |
|
365 // rect for the whole info popup |
|
366 TAknLayoutRect layoutRect; |
|
367 layoutRect.LayoutRect(screenRect, lineLayout); |
|
368 TRect rectPopupWindow = layoutRect.Rect(); |
|
369 |
|
370 TAknTextComponentLayout popupTextLayout = |
|
371 AknLayoutScalable_Avkon::popup_preview_text_window_t( |
|
372 tableLimits.FirstIndex(), lineVariety ); |
|
373 |
|
374 // rect for the whole the text inside the popup |
|
375 TAknLayoutText layoutText; |
|
376 layoutText.LayoutText( rectPopupWindow, popupTextLayout ); |
|
377 |
|
378 // Each margin has different value in S60 - let's take average of top & bottom |
|
379 TInt topMargin = layoutText.TextRect().iTl.iY - layoutRect.Rect().iTl.iY; |
|
380 TInt bottomMargin = layoutRect.Rect().iBr.iY - layoutText.TextRect().iBr.iY; |
|
381 TInt averageMargin = (TInt)(topMargin+bottomMargin)/2; |
|
382 value = averageMargin; |
|
383 } |
|
384 break; |
|
385 case QStyle::PM_ListViewIconSize: |
|
386 { |
|
387 // todo: there are lots and lots of views with different sized icons - which one to use? |
|
388 // todo: this is probably not a good default icon size, as this fetches A column icon size |
|
389 // todo: preferably use settings item with graphic instead |
|
390 TAknLayoutRect iconRect; |
|
391 iconRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::list_double_graphic_pane_g1_cp2(0).LayoutLine()); |
|
392 //icon areas are usually squares - lets take bigger of two dimensions |
|
393 value = Max( iconRect.Rect().Width(), iconRect.Rect().Height() ); |
|
394 } |
|
395 break; |
|
396 |
|
397 case QStyle::PM_LargeIconSize: // lets use AS icon as a base for large icon |
|
398 case QStyle::PM_IconViewIconSize: |
|
399 { |
|
400 // Lets assume that we'd take these from grid (3x4) layout |
|
401 TAknLayoutRect appPaneRect; |
|
402 TAknLayoutRect gridAppRect; |
|
403 TAknLayoutRect cellAppRect; |
|
404 TInt varietyGrid = 2; //Let's use the 3x4 grid as a base. |
|
405 TInt varietyCell = 1; //Let's use the 3x4 grid as a base. |
|
406 if ( landscape ) |
|
407 { |
|
408 varietyGrid = 3; |
|
409 varietyCell = 2; |
|
410 } |
|
411 appPaneRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_app_pane(1).LayoutLine()); //3x4 grid |
|
412 gridAppRect.LayoutRect( appPaneRect.Rect(), AknLayoutScalable_Avkon::grid_app_pane(varietyGrid).LayoutLine()); |
|
413 cellAppRect.LayoutRect( gridAppRect.Rect(), AknLayoutScalable_Avkon::cell_app_pane(varietyCell, 0, 0).LayoutLine()); |
|
414 TAknLayoutRect cellGraphRect; |
|
415 TAknWindowComponentLayout appIcon = AknLayoutScalable_Avkon::cell_app_pane_g1(0); // no mark, no highlight |
|
416 cellGraphRect.LayoutRect( gridAppRect.Rect(), appIcon); |
|
417 //icon areas are usually squares - if not, lets take larger |
|
418 value = Max( cellGraphRect.Rect().Width(), cellGraphRect.Rect().Height()); |
|
419 } |
|
420 break; |
|
421 case QStyle::PM_TabBarIconSize: |
|
422 { |
|
423 TAknLayoutRect naviNaviRect; |
|
424 naviNaviRect.LayoutRect( naviPaneRect, AknLayoutScalable_Avkon::navi_navi_tabs_pane().LayoutLine()); // two tabs |
|
425 TAknLayoutRect tabRect; |
|
426 tabRect.LayoutRect( naviNaviRect.Rect(), AknLayoutScalable_Avkon::navi_tabs_3_pane().LayoutLine()); //active tab on left |
|
427 TAknLayoutRect activeTabRect; |
|
428 activeTabRect.LayoutRect( tabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane(0).LayoutLine()); //active tab |
|
429 TAknLayoutRect activeTabGraphicRect; |
|
430 |
|
431 activeTabGraphicRect.LayoutRect( activeTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane_g1().LayoutLine()); //active tab graphic |
|
432 value = Min(activeTabGraphicRect.Rect().Width(), activeTabGraphicRect.Rect().Height()); |
|
433 } |
|
434 break; |
|
435 case QStyle::PM_MessageBoxIconSize: |
|
436 { |
|
437 TAknLayoutRect noteRect; |
|
438 noteRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_note_image_window(0).LayoutLine()); //note with image |
|
439 TAknLayoutRect noteImageRect; |
|
440 noteImageRect.LayoutRect( noteRect.Rect(), AknLayoutScalable_Avkon::popup_note_image_window_g2(2).LayoutLine()); //note with image |
|
441 value = noteImageRect.Rect().Width(); |
|
442 } |
|
443 break; |
|
444 case QStyle::PM_TextCursorWidth: |
|
445 { |
|
446 TAknLayoutRect miscGraphicsRect; |
|
447 miscGraphicsRect.LayoutRect( screenRect, AknLayoutScalable_Avkon::misc_graphics()); |
|
448 miscGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::misc_graphics()); |
|
449 TAknLayoutRect textsGraphicsRect; |
|
450 textsGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::texts_graphics()); |
|
451 TAknLayoutRect cursorGraphicsRect; |
|
452 cursorGraphicsRect.LayoutRect( textsGraphicsRect.Rect(), AknLayoutScalable_Avkon::cursor_graphics_pane()); |
|
453 TAknLayoutRect cursorPrimaryRect; |
|
454 cursorPrimaryRect.LayoutRect( cursorGraphicsRect.Rect(), AknLayoutScalable_Avkon::cursor_primary_pane()); |
|
455 TAknLayoutRect cursorRect; |
|
456 cursorRect.LayoutRect( cursorPrimaryRect.Rect(), AknLayoutScalable_Avkon::cursor_digital_pane_g1()); |
|
457 value = cursorRect.Rect().Width(); |
|
458 } |
|
459 break; |
|
460 case QStyle::PM_SliderLength: |
|
461 { |
|
462 TAknLayoutRect settingRect; |
|
463 settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() ); |
|
464 TAknLayoutRect settingContentRect; |
|
465 settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() ); |
|
466 TAknLayoutRect sliderRect; |
|
467 sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() ); |
|
468 TAknLayoutRect sliderSettingRect; |
|
469 sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() ); |
|
470 TAknLayoutRect sliderGraph2Rect; |
|
471 sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() ); |
|
472 value = sliderGraph2Rect.Rect().Width(); |
|
473 } |
|
474 break; |
|
475 case QStyle::PM_SliderThickness: |
|
476 { |
|
477 TAknLayoutRect settingRect; |
|
478 settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() ); |
|
479 TAknLayoutRect settingContentRect; |
|
480 settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() ); |
|
481 TAknLayoutRect sliderRect; |
|
482 sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() ); |
|
483 TAknLayoutRect sliderSettingRect; |
|
484 sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() ); |
|
485 TAknLayoutRect sliderGraph2Rect; |
|
486 sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() ); |
|
487 value = (TInt)(sliderGraph2Rect.Rect().Height()*1.5); // add assumed tickmark height |
|
488 } |
|
489 break; |
|
490 case QStyle::PM_SliderTickmarkOffset: |
|
491 { |
|
492 TAknLayoutRect settingRect; |
|
493 settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() ); |
|
494 TAknLayoutRect settingContentRect; |
|
495 settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() ); |
|
496 TAknLayoutRect sliderRect; |
|
497 sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() ); |
|
498 TAknLayoutRect sliderSettingRect; |
|
499 sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() ); |
|
500 TAknLayoutRect sliderGraph2Rect; |
|
501 sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() ); |
|
502 value = (TInt)(sliderGraph2Rect.Rect().Height()*0.5); // no tickmarks in S60, lets assume they are half the size of slider indicator |
|
503 } |
|
504 break; |
|
505 case QStyle::PM_SliderControlThickness: |
|
506 { |
|
507 TAknLayoutRect settingRect; |
|
508 settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() ); |
|
509 TAknLayoutRect settingContentRect; |
|
510 settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() ); |
|
511 TAknLayoutRect sliderRect; |
|
512 sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() ); |
|
513 TAknLayoutRect sliderSettingRect; |
|
514 sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() ); |
|
515 TAknLayoutRect sliderGraph2Rect; |
|
516 sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() ); |
|
517 value = sliderGraph2Rect.Rect().Height(); |
|
518 } |
|
519 break; |
|
520 case QStyle::PM_SliderSpaceAvailable: |
|
521 { |
|
522 TAknLayoutRect settingRect; |
|
523 settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() ); |
|
524 TAknLayoutRect settingContentRect; |
|
525 settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() ); |
|
526 TAknLayoutRect sliderRect; |
|
527 sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() ); |
|
528 TAknLayoutRect sliderSettingRect; |
|
529 sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() ); |
|
530 value = sliderSettingRect.Rect().Width(); |
|
531 } |
|
532 break; |
|
533 case QStyle::PM_MenuBarItemSpacing: |
|
534 { |
|
535 TAknLayoutRect appWindow; |
|
536 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) ); |
|
537 |
|
538 variety = 0; |
|
539 if ( landscape ) |
|
540 { |
|
541 variety = 2; |
|
542 } |
|
543 TAknLayoutRect areaBottomRect; |
|
544 areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) ); |
|
545 |
|
546 TAknLayoutRect controlPaneRect; |
|
547 controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() ); |
|
548 TAknLayoutText controlPaneLSKText; |
|
549 TAknLayoutText controlPaneRSKText; |
|
550 TAknLayoutText controlPaneMSKText; |
|
551 variety = 0; |
|
552 if (AknLayoutUtils::MSKEnabled()) |
|
553 { |
|
554 variety = 3; |
|
555 controlPaneMSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t3(variety)); //MSK text area |
|
556 } |
|
557 controlPaneLSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t1(variety)); //LSK text area |
|
558 controlPaneRSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t2(variety)); //RSK text area |
|
559 |
|
560 /* |
|
561 * |
|
562 ================================================================================== |
|
563 | A | LSK_rect | B | MSK_rect | C | RSK_rect | D | |
|
564 ================================================================================== |
|
565 where A is left padding (between control pane and LSK rect) |
|
566 B is mid-left padding (between LSK and MSK rects) |
|
567 C is mid-right padding (between MSK and RSK rects) |
|
568 D is right padding (between RSK and control pane) |
|
569 |
|
570 ==> Since all these can be separate, lets take Max of {A..D} for PM value |
|
571 */ |
|
572 |
|
573 TInt itemSpacing1 = 0; |
|
574 TInt itemSpacing2 = 0; |
|
575 TInt itemSpacing3 = 0; |
|
576 TInt itemSpacing4 = 0; |
|
577 TInt itemSpacingMax = 0; |
|
578 if ( !AknLayoutUtils::MSKEnabled() ) |
|
579 { |
|
580 itemSpacing1 = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX; |
|
581 itemSpacing2 = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX; |
|
582 if ( !landscape ) |
|
583 { |
|
584 // use mid gap only in portrait |
|
585 itemSpacing3 = controlPaneRSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX; |
|
586 } |
|
587 itemSpacingMax = Max(itemSpacing1, Max( itemSpacing2, itemSpacing3)); |
|
588 // no itemspacing4 if no MSK |
|
589 } |
|
590 else |
|
591 { |
|
592 itemSpacing1 = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX; |
|
593 itemSpacing2 = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX; |
|
594 if ( !(AknLayoutUtils::PenEnabled() || landscape) ) // no MSK in touch, nor in landscape |
|
595 { |
|
596 itemSpacing3 = controlPaneRSKText.TextRect().iTl.iX - controlPaneMSKText.TextRect().iBr.iX; |
|
597 itemSpacing4 = controlPaneMSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX; |
|
598 } |
|
599 itemSpacingMax = Max(itemSpacing1, Max( itemSpacing2, Max( itemSpacing3, itemSpacing4 ))); |
|
600 } |
|
601 value = itemSpacingMax; |
|
602 } |
|
603 break; |
|
604 case QStyle::PM_MenuBarHMargin: |
|
605 { |
|
606 TAknLayoutRect appWindow; |
|
607 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) ); |
|
608 |
|
609 variety = 0; |
|
610 if ( landscape ) |
|
611 { |
|
612 variety = 6; |
|
613 } |
|
614 TAknLayoutRect areaBottomRect; |
|
615 areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) ); |
|
616 |
|
617 // variety 7 if thin status pane, 1 if no status pane, 3 if small status pane and with main pane, 4 otherwise (idle has bunch of own varieties) |
|
618 TAknLayoutRect controlPaneRect; |
|
619 controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() ); |
|
620 value = areaBottomRect.Rect().Height() - controlPaneRect.Rect().Height(); |
|
621 } |
|
622 break; |
|
623 case QStyle::PM_MenuBarVMargin: |
|
624 { |
|
625 TAknLayoutRect appWindow; |
|
626 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) ); |
|
627 |
|
628 variety = 0; |
|
629 if ( landscape ) |
|
630 { |
|
631 variety = 6; |
|
632 } |
|
633 TAknLayoutText controlPaneLSKText; |
|
634 TAknLayoutRect areaBottomRect; |
|
635 areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) ); |
|
636 // variety 7 if thin status pane, 1 if no status pane, 3 if small status pane and with main pane, 4 otherwise (idle has bunch of own varieties) |
|
637 TAknLayoutRect controlPaneRect; |
|
638 controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() ); |
|
639 |
|
640 variety = 0; |
|
641 if (AknLayoutUtils::MSKEnabled()) |
|
642 { |
|
643 variety = 3; |
|
644 } |
|
645 controlPaneLSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t1(variety)); //LSK text area |
|
646 |
|
647 value = controlPaneRect.Rect().Height() - controlPaneLSKText.TextRect().Height(); |
|
648 } |
|
649 break; |
|
650 case QStyle::PM_ToolBarItemSpacing: |
|
651 { |
|
652 TAknLayoutRect popupToolBarWindow; |
|
653 variety = 4; |
|
654 popupToolBarWindow.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_toolbar_window(variety) ); |
|
655 TAknLayoutRect gridToolBarRect; |
|
656 gridToolBarRect.LayoutRect( popupToolBarWindow.Rect(), AknLayoutScalable_Avkon::grid_toobar_pane() ); |
|
657 TAknLayoutRect cellToolBarRect1; |
|
658 TAknLayoutRect cellToolBarRect2; |
|
659 cellToolBarRect1.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(0).LayoutLine() ); //first item |
|
660 cellToolBarRect2.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(1).LayoutLine() ); //second item |
|
661 value = cellToolBarRect1.Rect().iBr.iX - cellToolBarRect2.Rect().iTl.iX; |
|
662 } |
|
663 break; |
|
664 case QStyle::PM_ToolBarItemMargin: |
|
665 { |
|
666 variety = 4; |
|
667 TAknLayoutRect popupToolBarWindow; |
|
668 popupToolBarWindow.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_toolbar_window(variety) ); |
|
669 TAknLayoutRect gridToolBarRect; |
|
670 gridToolBarRect.LayoutRect( popupToolBarWindow.Rect(), AknLayoutScalable_Avkon::grid_toobar_pane() ); |
|
671 TAknLayoutRect cellToolBarRect1; |
|
672 cellToolBarRect1.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(0).LayoutLine() ); //first item |
|
673 value = gridToolBarRect.Rect().iTl.iX - cellToolBarRect1.Rect().iTl.iX; |
|
674 } |
|
675 break; |
|
676 case QStyle::PM_LayoutLeftMargin: // there really isn't a default layoutting on s60, but lets use AppShell icon deployment as base |
|
677 case QStyle::PM_LayoutRightMargin: |
|
678 case QStyle::PM_LayoutTopMargin: |
|
679 case QStyle::PM_LayoutBottomMargin: |
|
680 case QStyle::PM_LayoutHorizontalSpacing: |
|
681 case QStyle::PM_LayoutVerticalSpacing: |
|
682 { |
|
683 //since spacing and margins should be globally same, lets use same easy component as base - such as find popup |
|
684 TAknLayoutRect popup_find_windowRect; |
|
685 TAknLayoutRect bg_popup_window_pane_cp12Rect; |
|
686 TAknLayoutRect find_popup_paneRect; |
|
687 popup_find_windowRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_find_window(0).LayoutLine()); |
|
688 bg_popup_window_pane_cp12Rect.LayoutRect( popup_find_windowRect.Rect(), AknLayoutScalable_Avkon::bg_popup_window_pane_cp12().LayoutLine()); |
|
689 find_popup_paneRect.LayoutRect( bg_popup_window_pane_cp12Rect.Rect(), AknLayoutScalable_Avkon::find_popup_pane().LayoutLine()); |
|
690 |
|
691 const TBool mirrored = AknLayoutUtils::LayoutMirrored(); |
|
692 if ((metric==QStyle::PM_LayoutVerticalSpacing && !mirrored) || metric==QStyle::PM_LayoutLeftMargin) |
|
693 { |
|
694 if (mirrored) |
|
695 { |
|
696 value = find_popup_paneRect.Rect().iTl.iX - bg_popup_window_pane_cp12Rect.Rect().iTl.iX; |
|
697 } |
|
698 else |
|
699 { |
|
700 value = find_popup_paneRect.Rect().iTl.iX - bg_popup_window_pane_cp12Rect.Rect().iTl.iX; |
|
701 } |
|
702 } |
|
703 else if (metric==QStyle::PM_LayoutRightMargin || (metric==QStyle::PM_LayoutVerticalSpacing && mirrored)) |
|
704 { |
|
705 if (mirrored) |
|
706 { |
|
707 value = bg_popup_window_pane_cp12Rect.Rect().iBr.iX - find_popup_paneRect.Rect().iBr.iX; |
|
708 } |
|
709 else |
|
710 { |
|
711 value = bg_popup_window_pane_cp12Rect.Rect().iBr.iX - find_popup_paneRect.Rect().iBr.iX; |
|
712 } |
|
713 } |
|
714 else if (metric==QStyle::PM_LayoutTopMargin || metric==QStyle::PM_LayoutHorizontalSpacing) |
|
715 { |
|
716 value = find_popup_paneRect.Rect().iTl.iY - bg_popup_window_pane_cp12Rect.Rect().iTl.iY; |
|
717 } |
|
718 else if (metric==QStyle::PM_LayoutBottomMargin) |
|
719 { |
|
720 value = bg_popup_window_pane_cp12Rect.Rect().iBr.iY - find_popup_paneRect.Rect().iBr.iY; |
|
721 } |
|
722 } |
|
723 break; |
|
724 case QStyle::PM_MaximumDragDistance: |
|
725 { |
|
726 value = -1; //disable - not in S60 |
|
727 } |
|
728 break; |
|
729 case QStyle::PM_ScrollBarExtent: |
|
730 { |
|
731 TAknLayoutRect miscGraphicsRect; |
|
732 miscGraphicsRect.LayoutRect( screenRect, AknLayoutScalable_Avkon::misc_graphics()); |
|
733 miscGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::misc_graphics()); |
|
734 TAknLayoutRect textsGraphicsRect; |
|
735 textsGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::texts_graphics()); |
|
736 TAknLayoutRect editorScrollRect; |
|
737 editorScrollRect.LayoutRect( textsGraphicsRect.Rect(), AknLayoutScalable_Avkon::editor_scroll_pane()); |
|
738 TAknLayoutRect scrollPaneRect; |
|
739 scrollPaneRect.LayoutRect( editorScrollRect.Rect(), AknLayoutScalable_Avkon::scroll_pane_cp13()); |
|
740 value = scrollPaneRect.Rect().Width(); // width of editor's scroll bar |
|
741 } |
|
742 break; |
|
743 case QStyle::PM_ScrollBarSliderMin: |
|
744 { |
|
745 TAknLayoutRect listScrollPane; |
|
746 listScrollPane.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_gen_pane(0)); |
|
747 TAknLayoutRect scrollPane; |
|
748 scrollPane.LayoutRect( listScrollPane.Rect(), AknLayoutScalable_Avkon::scroll_pane()); |
|
749 TAknLayoutRect scrollHandlePane; |
|
750 scrollHandlePane.LayoutRect( scrollPane.Rect(), AknLayoutScalable_Avkon::scroll_handle_pane()); |
|
751 TAknLayoutRect aidMinSizePane; |
|
752 aidMinSizePane.LayoutRect( scrollHandlePane.Rect(), AknLayoutScalable_Avkon::aid_size_min_handle()); // this gives min width size for horizontal scroll bar - same can be used for vertical height minimum |
|
753 value = aidMinSizePane.Rect().Height(); |
|
754 } |
|
755 break; |
|
756 case QStyle::PM_MenuBarPanelWidth: |
|
757 { |
|
758 TAknLayoutRect appWindow; |
|
759 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) ); |
|
760 |
|
761 variety = 0; |
|
762 if ( landscape ) |
|
763 { |
|
764 variety = 2; |
|
765 } |
|
766 TAknLayoutRect areaBottomRect; |
|
767 areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) ); |
|
768 |
|
769 // todo: prt: variety 7 if thin status pane, 1 if no status pane, 3 if small status pane and with main pane, 4 otherwise (idle has bunch of own varieties) |
|
770 // todo: lsc: variety 6 if thin status pane |
|
771 // todo: should stacon be considered? |
|
772 TAknLayoutRect controlPaneRect; |
|
773 controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() ); |
|
774 value = areaBottomRect.Rect().Height() - controlPaneRect.Rect().Height(); //usually zero |
|
775 } |
|
776 break; |
|
777 case QStyle::PM_ProgressBarChunkWidth: |
|
778 { |
|
779 // This is either deduced or skinned (for Java) in S60 |
|
780 // Layout data does not know it. It would require parameters from the |
|
781 // actual progress dialog to be able to calc this (max. value and increment) |
|
782 // So we need to set up some values - lets take one tenth of progress dialog area: |
|
783 TAknLayoutRect appWindow; |
|
784 appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(variety) ); |
|
785 if (landscape) |
|
786 { |
|
787 variety = 6; |
|
788 } |
|
789 TAknLayoutRect popupWaitWindowRect; |
|
790 popupWaitWindowRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_note_wait_window(variety) ); |
|
791 TAknLayoutRect waitbarPaneRect; |
|
792 waitbarPaneRect.LayoutRect( popupWaitWindowRect.Rect(), AknLayoutScalable_Avkon::wait_bar_pane(0) ); |
|
793 TAknLayoutRect waitAnimRect; |
|
794 waitAnimRect.LayoutRect( waitbarPaneRect.Rect(), AknLayoutScalable_Avkon::wait_anim_pane() ); |
|
795 value = (TInt) (waitAnimRect.Rect().Width() / 10); |
|
796 } |
|
797 break; |
|
798 case QStyle::PM_TabBarTabOverlap: |
|
799 case QStyle::PM_TabBarTabHSpace: |
|
800 case QStyle::PM_TabBarTabVSpace: |
|
801 case QStyle::PM_TabBarBaseHeight: |
|
802 case QStyle::PM_TabBarBaseOverlap: |
|
803 case QStyle::PM_TabBarScrollButtonWidth: |
|
804 case QStyle::PM_TabBarTabShiftHorizontal: |
|
805 case QStyle::PM_TabBarTabShiftVertical: |
|
806 value = PixelMetricTabValue(metric, appWindow.Rect(), landscape); |
|
807 break; |
|
808 case QStyle::PM_MenuPanelWidth: |
|
809 case QStyle::PM_MenuHMargin: |
|
810 case QStyle::PM_MenuVMargin: |
|
811 value = PixelMetricMenuValue(metric, mainPaneRect); |
|
812 break; |
|
813 case QStyle::PM_ButtonIconSize: |
|
814 //lets use voice recorder icons as a base |
|
815 //Unfortunately S60 graphics don't separate button bevel graphics from the actual icon. |
|
816 //Se we have no means to query the margin from bevel border to "central icon" border. |
|
817 //So, we need to make a estimate... |
|
818 |
|
819 const TInt varietyForButtons = !landscape ? 0 : 1; |
|
820 |
|
821 TAknLayoutRect vRMainRect; |
|
822 vRMainRect.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::main_vorec_pane() ); |
|
823 |
|
824 TAknLayoutRect vRButtonGridRect; |
|
825 vRButtonGridRect.LayoutRect( vRMainRect.Rect(), AknLayoutScalable_Apps::grid_vorec_pane() ); |
|
826 |
|
827 TAknLayoutRect vRButtonCellRect; |
|
828 vRButtonCellRect.LayoutRect( vRButtonGridRect.Rect(), AknLayoutScalable_Apps::cell_vorec_pane(0) ); |
|
829 |
|
830 TAknLayoutRect vRButtonCellGraphicsRect; |
|
831 vRButtonCellGraphicsRect.LayoutRect( vRButtonCellRect.Rect(), AknLayoutScalable_Apps::cell_vorec_pane_g1() ); |
|
832 |
|
833 // 0.32 is the estimate how much the icon occupies of the button bevel area |
|
834 value = vRButtonCellGraphicsRect.Rect().Width() * 0.32; |
|
835 |
|
836 break; |
|
837 case QStyle::PM_SmallIconSize: |
|
838 { |
|
839 // lets use AI2 icon as a base |
|
840 TAknLayoutRect idlePaneRect; |
|
841 idlePaneRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::main_idle_act2_pane() ); |
|
842 TAknLayoutRect idleDataRect; |
|
843 idleDataRect.LayoutRect( idlePaneRect.Rect(), AknLayoutScalable_Avkon::popup_ai2_data_window(1) ); |
|
844 TAknLayoutRect ai2GridRect; |
|
845 ai2GridRect.LayoutRect( idleDataRect.Rect(), AknLayoutScalable_Avkon::grid_ai2_button_pane() ); |
|
846 TAknLayoutRect ai2MpRect; |
|
847 ai2MpRect.LayoutRect( ai2GridRect.Rect(), AknLayoutScalable_Avkon::ai2_mp_button_pane() ); |
|
848 TAknLayoutRect ai2CellPaneRect; |
|
849 ai2CellPaneRect.LayoutRect( ai2MpRect.Rect(), AknLayoutScalable_Avkon::cell_ai2_button_pane(1).LayoutLine() ); |
|
850 TAknLayoutRect ai2CellButtonRect; |
|
851 ai2CellButtonRect.LayoutRect( ai2CellPaneRect.Rect(), AknLayoutScalable_Avkon::cell_ai2_button_pane_g1()); |
|
852 value = Min( ai2CellButtonRect.Rect().Width(), ai2CellButtonRect.Rect().Height()); |
|
853 } |
|
854 break; |
|
855 case QStyle::PM_FocusFrameHMargin: |
|
856 case QStyle::PM_FocusFrameVMargin: |
|
857 { |
|
858 TAknLayoutRect gridRect; |
|
859 gridRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::grid_highlight_pane(0)); |
|
860 TAknLayoutRect gridRectCenter; |
|
861 gridRectCenter.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::cell_highlight_pane_g1()); |
|
862 |
|
863 // The difference of center piece from border tell the frame width. |
|
864 if ( value == QStyle::PM_FocusFrameHMargin) |
|
865 { |
|
866 value = gridRect.Rect().iBr.iX - gridRectCenter.Rect().iBr.iX; |
|
867 } |
|
868 else |
|
869 { |
|
870 value = gridRect.Rect().iBr.iY - gridRectCenter.Rect().iBr.iY; |
|
871 } |
|
872 } |
|
873 break; |
|
874 case QStyle::PM_ToolBarIconSize: |
|
875 { |
|
876 TAknLayoutRect popupToolBarWindow; |
|
877 variety = 4; |
|
878 popupToolBarWindow.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_toolbar_window(variety) ); |
|
879 TAknLayoutRect gridToolBarRect; |
|
880 gridToolBarRect.LayoutRect( popupToolBarWindow.Rect(), AknLayoutScalable_Avkon::grid_toobar_pane() ); |
|
881 TAknLayoutRect cellToolBarRect1; |
|
882 TAknLayoutRect cellToolBarRect2; |
|
883 cellToolBarRect1.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(0).LayoutLine() ); //first item |
|
884 value = Min( cellToolBarRect1.Rect().Height(), cellToolBarRect1.Rect().Width() ); |
|
885 } |
|
886 break; |
|
887 |
|
888 case QStyle::PM_TitleBarHeight: // use titlepane height |
|
889 { |
|
890 TAknLayoutRect statusPaneRect; |
|
891 TAknLayoutRect titlePane; |
|
892 TAknLayoutRect areaTopRect; |
|
893 if (landscape) |
|
894 { |
|
895 if ( AknLayoutUtils::PenEnabled() ) |
|
896 { |
|
897 // Top area - 0 is for classic landscape (used in touch landscape as well) |
|
898 areaTopRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_top_pane(2) ); |
|
899 // Status pane - 0 softkeys on right |
|
900 statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_top_pane() ); |
|
901 } |
|
902 else |
|
903 { |
|
904 // Top area - 2 is for classic landscape. |
|
905 areaTopRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(2) ); |
|
906 // Stacon top pane (default ok) |
|
907 statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_bottom_pane() ); |
|
908 } |
|
909 titlePane.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::title_pane_stacon(0) ); //softkeys on right |
|
910 } |
|
911 else |
|
912 { |
|
913 // Top area - 0 is for classic portrait |
|
914 areaTopRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_top_pane(0) ); |
|
915 // Status pane - 0 is for classic portrait |
|
916 statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::status_pane(0) ); |
|
917 titlePane.LayoutRect( statusPaneRect.Rect(), AknLayoutScalable_Avkon::title_pane(0) ); |
|
918 } |
|
919 value = titlePane.Rect().Height(); |
|
920 } |
|
921 break; |
|
922 case QStyle::PM_IndicatorWidth: |
|
923 case QStyle::PM_IndicatorHeight: |
|
924 { |
|
925 TRect rectParent( mainPaneRect ); |
|
926 |
|
927 TAknLayoutRect layoutRect; |
|
928 layoutRect.LayoutRect( rectParent,AknLayoutScalable_Avkon::set_content_pane().LayoutLine() ); |
|
929 TAknLayoutRect layoutRect2; |
|
930 layoutRect2.LayoutRect( layoutRect.Rect(),AknLayoutScalable_Avkon::list_set_graphic_pane(0).LayoutLine() ); |
|
931 |
|
932 TAknLayoutRect iconLayoutRect; |
|
933 iconLayoutRect.LayoutRect( layoutRect2.Rect(), AknLayoutScalable_Avkon::list_set_graphic_pane_g1(0).LayoutLine() ); |
|
934 if (metric==QStyle::PM_IndicatorWidth) |
|
935 { |
|
936 value = iconLayoutRect.Rect().Width(); |
|
937 } |
|
938 else |
|
939 { |
|
940 value = iconLayoutRect.Rect().Height(); |
|
941 } |
|
942 } |
|
943 break; |
|
944 case QStyle::PM_ExclusiveIndicatorHeight: |
|
945 case QStyle::PM_ExclusiveIndicatorWidth: |
|
946 { |
|
947 TRect rectParent( mainPaneRect ); |
|
948 TAknLayoutRect layoutRect; |
|
949 layoutRect.LayoutRect( rectParent,AknLayoutScalable_Avkon::list_choice_list_pane(1).LayoutLine() ); // w/ scrollbar |
|
950 TAknLayoutText itemText; |
|
951 itemText.LayoutText( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1) ); |
|
952 TAknLayoutRect iconLayoutRect; |
|
953 iconLayoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_g1().LayoutLine() ); |
|
954 |
|
955 if (metric==QStyle::PM_ExclusiveIndicatorHeight) |
|
956 { |
|
957 value = iconLayoutRect.Rect().Height(); |
|
958 } |
|
959 else |
|
960 { |
|
961 value = iconLayoutRect.Rect().Width(); |
|
962 } |
|
963 } |
|
964 break; |
|
965 |
|
966 // These are obsolete. |
|
967 case QStyle::PM_DefaultTopLevelMargin: |
|
968 case QStyle::PM_DefaultChildMargin: |
|
969 case QStyle::PM_DefaultLayoutSpacing: |
|
970 break; |
|
971 |
|
972 case QStyle::PM_Custom_FrameCornerWidth: |
|
973 { |
|
974 TAknLayoutRect inputFocusRect; |
|
975 inputFocusRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane(0)); |
|
976 TAknLayoutRect inputFocusInnerRect; |
|
977 inputFocusInnerRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane_g1()); |
|
978 |
|
979 value = inputFocusRect.Rect().iBr.iX - inputFocusInnerRect.Rect().iBr.iX; |
|
980 value+= 2; //visually better value for generic cases |
|
981 } |
|
982 break; |
|
983 case QStyle::PM_Custom_FrameCornerHeight: |
|
984 { |
|
985 TAknLayoutRect inputFocusRect; |
|
986 inputFocusRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane(0)); |
|
987 TAknLayoutRect inputFocusInnerRect; |
|
988 inputFocusInnerRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane_g1()); |
|
989 value = inputFocusRect.Rect().iBr.iY - inputFocusInnerRect.Rect().iBr.iY; |
|
990 value+= 2; //visually better value for generic cases |
|
991 } |
|
992 break; |
|
993 case QStyle::PM_Custom_BoldLineWidth: |
|
994 value = 3; |
|
995 break; |
|
996 case QStyle::PM_Custom_ThinLineWidth: |
|
997 value = 1; |
|
998 break; |
|
999 case QStyle::PM_ButtonShiftHorizontal: |
|
1000 case QStyle::PM_ButtonShiftVertical: |
|
1001 value = 0; |
|
1002 break; |
|
1003 |
|
1004 case QStyle::PM_ToolBarExtensionExtent: |
|
1005 value = PixelMetricTabValue(QStyle::PM_TabBarScrollButtonWidth, appWindow.Rect(), landscape); |
|
1006 break; |
|
1007 |
|
1008 // todo: re-check if these really are not available in s60 |
|
1009 case QStyle::PM_MenuDesktopFrameWidth: // not needed in S60 - dislocates Menu both horizontally and vertically |
|
1010 case QStyle::PM_HeaderMarkSize: // The size of the sort indicator in a header. Not in S60 |
|
1011 case QStyle::PM_SpinBoxSliderHeight: // The height of the optional spin box slider. Not in S60 |
|
1012 case QStyle::PM_HeaderMargin: // not in S60 |
|
1013 case QStyle::PM_MenuScrollerHeight: // not in S60 |
|
1014 case QStyle::PM_MenuTearoffHeight: // not in S60 |
|
1015 case QStyle::PM_DockWidgetFrameWidth: // not in S60 |
|
1016 case QStyle::PM_DockWidgetSeparatorExtent: // not in S60 |
|
1017 case QStyle::PM_MdiSubWindowMinimizedWidth: //no such thing in S60 |
|
1018 case QStyle::PM_HeaderGripMargin: // not in S60 |
|
1019 case QStyle::PM_SplitterWidth: // not in S60 |
|
1020 case QStyle::PM_ToolBarSeparatorExtent: // not in S60 |
|
1021 case QStyle::PM_ToolBarHandleExtent: // not in s60 |
|
1022 case QStyle::PM_MenuButtonIndicator: // none??? |
|
1023 case QStyle::PM_TabBar_ScrollButtonOverlap: // not used in S60 - tab arrows are on left and right side of tab group - not together |
|
1024 case QStyle::PM_SizeGripSize: // use default |
|
1025 case QStyle::PM_TabCloseIndicatorWidth: |
|
1026 case QStyle::PM_TabCloseIndicatorHeight: |
|
1027 case QStyle::PM_ScrollView_ScrollBarSpacing: |
|
1028 case QStyle::PM_SubMenuOverlap: |
|
1029 default: |
|
1030 break; |
|
1031 } |
|
1032 return value; |
|
1033 } |
|
1034 |
|
1035 TInt PixelMetrics::PixelMetricTabValue(QStyle::PixelMetric tabMetric, TRect appWindow, TBool landscape) |
|
1036 { |
|
1037 TInt tabValue = 0; |
|
1038 // common ones |
|
1039 TAknLayoutRect mainAreaRect; |
|
1040 TAknLayoutRect rightIndicationRect; |
|
1041 TAknLayoutRect leftIndicationRect; |
|
1042 TAknLayoutRect activeTabRect; |
|
1043 TAknLayoutText activeTabTextRect; |
|
1044 TAknLayoutRect passiveTabRect; |
|
1045 TAknLayoutText passiveTabTextRect; |
|
1046 TAknLayoutRect tabsPaneRect; |
|
1047 if ( landscape ) |
|
1048 { |
|
1049 TAknLayoutRect statusPaneRect; |
|
1050 TAknLayoutRect areaTopRect; |
|
1051 if ( AknLayoutUtils::PenEnabled() ) |
|
1052 { |
|
1053 // Top area - 0 is for classic landscape (used in touch landscape as well) |
|
1054 areaTopRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::area_top_pane(2) ); |
|
1055 // Status pane - 0 softkeys on right |
|
1056 statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_top_pane() ); |
|
1057 } |
|
1058 else |
|
1059 { |
|
1060 // Top area - 2 is for classic landscape. |
|
1061 areaTopRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::area_bottom_pane(2) ); |
|
1062 // Stacon top pane (default ok) |
|
1063 statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_bottom_pane() ); |
|
1064 } |
|
1065 // main pane for landscape |
|
1066 mainAreaRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::main_pane(4) ); |
|
1067 |
|
1068 // navi pane |
|
1069 TAknLayoutRect naviPaneRect; |
|
1070 naviPaneRect.LayoutRect( statusPaneRect.Rect(), AknLayoutScalable_Avkon::navi_pane_stacon(0) ); // softkeys on right |
|
1071 // navi-navi pane |
|
1072 tabsPaneRect.LayoutRect( naviPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_stacon(0) ); // softkeys on right |
|
1073 // Passive tab item - lets use layout where active is on left side of passive |
|
1074 passiveTabRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane(0) ); |
|
1075 // Active tab item |
|
1076 activeTabRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane(0) ); |
|
1077 // Left indication |
|
1078 leftIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g1(0) ); |
|
1079 // Right indication |
|
1080 rightIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g2(0) ); |
|
1081 // active tab text rect |
|
1082 activeTabTextRect.LayoutText( activeTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane_t1(1) ); |
|
1083 // passive tab text rect |
|
1084 passiveTabTextRect.LayoutText( passiveTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane_t1(1) ); |
|
1085 } |
|
1086 else |
|
1087 { |
|
1088 // main pane for portait |
|
1089 mainAreaRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::main_pane(3) ); |
|
1090 // Top area - 0 is for classic portrait |
|
1091 TAknLayoutRect areaTopRect; |
|
1092 areaTopRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::area_top_pane(0) ); |
|
1093 // Status pane - 0 is for classic portrait |
|
1094 TAknLayoutRect statusPaneRect; |
|
1095 statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::status_pane(0) ); |
|
1096 |
|
1097 // Navi pane |
|
1098 TAknLayoutRect naviPaneRect; |
|
1099 naviPaneRect.LayoutRect( statusPaneRect.Rect(), AknLayoutScalable_Avkon::navi_pane(0) ); |
|
1100 // Navi-navi pane for tabs (0) |
|
1101 TAknLayoutRect navi2PaneRect; |
|
1102 navi2PaneRect.LayoutRect( naviPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane() ); |
|
1103 // Short tab pane |
|
1104 tabsPaneRect.LayoutRect( navi2PaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_tabs_pane() ); |
|
1105 // Tab pane for 2 items |
|
1106 TAknLayoutRect tab2PaneRect; |
|
1107 tab2PaneRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_tabs_3_pane() ); |
|
1108 // Passive tab item - lets use layout where active is on left side of passive |
|
1109 passiveTabRect.LayoutRect( tab2PaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane(0) ); |
|
1110 // Active tab item |
|
1111 activeTabRect.LayoutRect( tab2PaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane(0) ); |
|
1112 // Left indication |
|
1113 leftIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g1(0) ); |
|
1114 // Right indication |
|
1115 rightIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g2(0) ); |
|
1116 // active tab text rect |
|
1117 activeTabTextRect.LayoutText( activeTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane_t1(0) ); |
|
1118 // passive tab text rect |
|
1119 passiveTabTextRect.LayoutText( passiveTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane_t1(0) ); |
|
1120 } |
|
1121 |
|
1122 // active tab on left, passive on rightside |
|
1123 TInt tabOverlap = activeTabRect.Rect().iBr.iX - passiveTabRect.Rect().iTl.iX; |
|
1124 TInt tabHSpace = (TInt) ((activeTabTextRect.TextRect().iTl.iX - activeTabRect.Rect().iTl.iX + activeTabRect.Rect().iBr.iX - activeTabTextRect.TextRect().iBr.iX)/2); |
|
1125 TInt tabVSpace = (TInt) ((activeTabTextRect.TextRect().iTl.iY - activeTabRect.Rect().iTl.iY + activeTabRect.Rect().iBr.iY - activeTabTextRect.TextRect().iBr.iY)/2); |
|
1126 TInt tabBaseHeight = 0; |
|
1127 if ( landscape && !AknLayoutUtils::PenEnabled()) |
|
1128 { |
|
1129 // In landscape tab is below mainpane |
|
1130 tabBaseHeight = mainAreaRect.Rect().iBr.iY - tabsPaneRect.Rect().iTl.iY; |
|
1131 } |
|
1132 else |
|
1133 { |
|
1134 // In portrait (and in landscape touch) tab is above mainpane |
|
1135 tabBaseHeight = tabsPaneRect.Rect().iBr.iY - mainAreaRect.Rect().iTl.iY; |
|
1136 } |
|
1137 TInt tabBaseOverlap = 0; |
|
1138 if ( landscape && !AknLayoutUtils::PenEnabled()) |
|
1139 { |
|
1140 // In landscape tab is below mainpane |
|
1141 tabBaseOverlap = Max( 0, mainAreaRect.Rect().iBr.iY - tabsPaneRect.Rect().iTl.iY); |
|
1142 } |
|
1143 else |
|
1144 { |
|
1145 // In portrait tab is above mainpane |
|
1146 tabBaseOverlap = Max( 0, mainAreaRect.Rect().iTl.iY - tabsPaneRect.Rect().iBr.iY); |
|
1147 } |
|
1148 TInt tabButtonWidth = Max(leftIndicationRect.Rect().Width(), rightIndicationRect.Rect().Width()); |
|
1149 TInt tabVShift = Max( Abs(activeTabTextRect.TextRect().iBr.iY - passiveTabTextRect.TextRect().iBr.iY), Abs(activeTabTextRect.TextRect().iTl.iY - passiveTabTextRect.TextRect().iTl.iY) ); |
|
1150 TInt tabHShift = Max( Abs(activeTabTextRect.TextRect().iBr.iX - passiveTabTextRect.TextRect().iBr.iX), Abs(activeTabTextRect.TextRect().iTl.iX - passiveTabTextRect.TextRect().iTl.iX) ); |
|
1151 tabHShift -= (passiveTabRect.Rect().Width() - tabOverlap); // remove tab change and add overlapping area |
|
1152 |
|
1153 switch( tabMetric ) |
|
1154 { |
|
1155 case QStyle::PM_TabBarTabOverlap: |
|
1156 tabValue = tabOverlap; |
|
1157 break; |
|
1158 case QStyle::PM_TabBarTabHSpace: |
|
1159 tabValue = tabHSpace; |
|
1160 break; |
|
1161 case QStyle::PM_TabBarTabVSpace: |
|
1162 tabValue = tabVSpace; |
|
1163 break; |
|
1164 case QStyle::PM_TabBarBaseHeight: |
|
1165 tabValue = tabBaseHeight; |
|
1166 break; |
|
1167 case QStyle::PM_TabBarBaseOverlap: |
|
1168 tabValue = tabBaseOverlap; |
|
1169 break; |
|
1170 case QStyle::PM_TabBarScrollButtonWidth: |
|
1171 // Since in Qt the scroll indicator is shown within a button, we need to add button margins to this value |
|
1172 { |
|
1173 tabValue = tabButtonWidth + 2*PixelMetricValue(QStyle::PM_ButtonMargin); |
|
1174 } |
|
1175 break; |
|
1176 case QStyle::PM_TabBarTabShiftHorizontal: |
|
1177 tabValue = tabHShift; |
|
1178 break; |
|
1179 case QStyle::PM_TabBarTabShiftVertical: |
|
1180 tabValue = tabVShift; |
|
1181 break; |
|
1182 default: |
|
1183 break; |
|
1184 } |
|
1185 return tabValue; |
|
1186 } |
|
1187 |
|
1188 TInt PixelMetrics::PixelMetricMenuValue(QStyle::PixelMetric tabMetric, TRect mainPaneRect ) |
|
1189 { |
|
1190 TInt menuValue = 0; |
|
1191 TAknLayoutRect popupMenuRect; |
|
1192 popupMenuRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_menu_window(0) ); |
|
1193 TAknLayoutRect listScrollPaneRect; |
|
1194 listScrollPaneRect.LayoutRect( popupMenuRect.Rect(), AknLayoutScalable_Avkon::listscroll_menu_pane(0) ); |
|
1195 TAknLayoutRect listMenuPaneRect; |
|
1196 listMenuPaneRect.LayoutRect( listScrollPaneRect.Rect(), AknLayoutScalable_Avkon::list_menu_pane(0) ); |
|
1197 TAknLayoutRect listMenuRow1Rect; |
|
1198 listMenuRow1Rect.LayoutRect( listScrollPaneRect.Rect(), AknLayoutScalable_Avkon::list_single_pane_cp2(0)); |
|
1199 |
|
1200 switch (tabMetric) |
|
1201 { |
|
1202 case QStyle::PM_MenuPanelWidth: |
|
1203 menuValue = listMenuPaneRect.Rect().iTl.iX - listScrollPaneRect.Rect().iTl.iX; |
|
1204 if ( AknLayoutUtils::LayoutMirrored() ) |
|
1205 { |
|
1206 menuValue = listScrollPaneRect.Rect().iBr.iX - listMenuPaneRect.Rect().iBr.iX; |
|
1207 } |
|
1208 break; |
|
1209 case QStyle::PM_MenuHMargin: |
|
1210 menuValue = listMenuRow1Rect.Rect().iTl.iX - popupMenuRect.Rect().iTl.iX; |
|
1211 if ( AknLayoutUtils::LayoutMirrored() ) |
|
1212 { |
|
1213 menuValue = popupMenuRect.Rect().iBr.iX - listMenuRow1Rect.Rect().iBr.iX; |
|
1214 } |
|
1215 break; |
|
1216 case QStyle::PM_MenuVMargin: |
|
1217 menuValue = listMenuRow1Rect.Rect().iTl.iY - popupMenuRect.Rect().iTl.iY; |
|
1218 break; |
|
1219 default: |
|
1220 break; |
|
1221 } |
|
1222 return menuValue; |
|
1223 } |