qt5base-lts/util/s60pixelmetrics/pixel_metrics.cpp
Qt by Nokia 38be0d1383 Initial import from the monolithic Qt.
This is the beginning of revision history for this module. If you
want to look at revision history older than this, please refer to the
Qt Git wiki for how to use Git history grafting. At the time of
writing, this wiki is located here:

http://qt.gitorious.org/qt/pages/GitIntroductionWithQt

If you have already performed the grafting and you don't see any
history beyond this commit, try running "git log" with the "--follow"
argument.

Branched from the monolithic repo, Qt master branch, at commit
896db169ea224deb96c59ce8af800d019de63f12
2011-04-27 12:05:43 +02:00

1256 lines
62 KiB
C++

/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the utility applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "pixel_metrics.h"
#include <AknLayout2ScalableDef.h>
#include <AknLayoutScalable_Avkon.cdl.h>
#include <AknLayoutScalable_Apps.cdl.h>
#include <AknUtils.h>
// Version number for dynamic calculations. These are to be exported to static data,
// so that we can keep dynamic and static values inline.
// Please adjust version data if correcting dynamic PM calculations.
const TInt KPMMajorVersion = 1;
const TInt KPMMinorVersion = 19;
TPixelMetricsVersion PixelMetrics::Version()
{
TPixelMetricsVersion version;
version.majorVersion = KPMMajorVersion;
version.minorVersion = KPMMinorVersion;
return version;
}
TInt PixelMetrics::PixelMetricValue(QStyle::PixelMetric metric)
{
TInt value = -909;
// Main pane
TRect mainPaneRect;
AknLayoutUtils::LayoutMetricsRect(
AknLayoutUtils::EMainPane,
mainPaneRect );
// Screen
TRect screenRect;
AknLayoutUtils::LayoutMetricsRect(
AknLayoutUtils::EApplicationWindow,
screenRect );
// Navi pane
TRect naviPaneRect;
AknLayoutUtils::LayoutMetricsRect(
AknLayoutUtils::ENaviPane,
naviPaneRect );
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) );
TInt variety = 0;
TBool landscape = EFalse;
if ( screenRect.iBr.iX > screenRect.iBr.iY )
{
// in landscape another variety is used
landscape = ETrue;
}
switch (metric)
{
case QStyle::PM_DockWidgetHandleExtent:
// what's this??? Not in S60
break;
case QStyle::PM_CheckListControllerSize:
case QStyle::PM_CheckListButtonSize:
{
// hierarchical menu - checkbox / radiobutton
// Area (width/height) of the checkbox/radio button in a Q3CheckListItem.
TAknLayoutRect listScrollPane;
listScrollPane.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_gen_pane(0));
TAknLayoutRect listGenPane;
listGenPane.LayoutRect( listScrollPane.Rect(), AknLayoutScalable_Avkon::list_gen_pane(0));
TAknLayoutRect listHierarchyPane;
listHierarchyPane.LayoutRect( listGenPane.Rect(), AknLayoutScalable_Avkon::list_single_graphic_hl_pane(0));
TAknLayoutRect listHierarchyControllerPane;
listHierarchyPane.LayoutRect( listHierarchyPane.Rect(), AknLayoutScalable_Avkon::list_single_graphic_hl_pane_g3(0));
TAknLayoutRect listHierarchyPropertyPane;
listHierarchyPropertyPane.LayoutRect( listHierarchyPane.Rect(), AknLayoutScalable_Avkon::list_single_graphic_hl_pane_g2(0));
if (metric==QStyle::PM_CheckListControllerSize)value = Max( listHierarchyPane.Rect().Width(), listHierarchyPane.Rect().Width());
else value = Max( listHierarchyPropertyPane.Rect().Width(), listHierarchyPropertyPane.Rect().Width());
}
break;
case QStyle::PM_DialogButtonsSeparator: //Distance between buttons in a dialog buttons widget.
case QStyle::PM_DialogButtonsButtonWidth: // Minimum width of a button in a dialog buttons widget.
case QStyle::PM_DialogButtonsButtonHeight:// Minimum height of a button in a dialog buttons widget.
{
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) );
variety = 0;
if ( landscape )
{
variety = 2;
}
TAknLayoutRect areaBottomRect;
areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) );
TAknLayoutRect controlPaneRect;
controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() );
TAknLayoutText controlPaneLSKText;
TAknLayoutText controlPaneRSKText;
TAknLayoutText controlPaneMSKText;
variety = 0;
if (AknLayoutUtils::MSKEnabled())
{
variety = 3;
controlPaneMSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t3(variety)); //MSK text area
}
controlPaneLSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t1(variety)); //LSK text area
controlPaneRSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t2(variety)); //RSK text area
/*
*
==================================================================================
| A | LSK_rect | B | MSK_rect | C | RSK_rect | D |
==================================================================================
where A is left padding (between control pane and LSK rect)
B is mid-left padding (between LSK and MSK rects)
C is mid-right padding (between MSK and RSK rects)
D is right padding (between RSK and control pane)
==> Since all these can be separate, lets take Max of {A..D} for PM value
*/
TInt itemSpacingA = 0;
TInt itemSpacingB = 0;
TInt itemSpacingC = 0;
TInt itemSpacingMax = 0;
if ( !AknLayoutUtils::MSKEnabled() )
{
itemSpacingA = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX;
itemSpacingB = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX;
if (!landscape)
{
// use mid-gap only in portrait
itemSpacingC = controlPaneRSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX;
}
itemSpacingMax = Max(itemSpacingA, Max( itemSpacingB, itemSpacingC));
// no itemspacing4 if no MSK
}
else
{
TInt itemSpacingD = 0;
itemSpacingA = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX;
itemSpacingB = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX;
if ( !(AknLayoutUtils::PenEnabled() || landscape) ) // no MSK in touch, nor in landscape
{
itemSpacingC = controlPaneRSKText.TextRect().iTl.iX - controlPaneMSKText.TextRect().iBr.iX;
itemSpacingD = controlPaneMSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX;
}
itemSpacingMax = Max(itemSpacingA, Max( itemSpacingB, Max( itemSpacingC, itemSpacingD )));
}
if (metric==QStyle::PM_DialogButtonsSeparator) value = itemSpacingMax;
else if (metric==QStyle::PM_DialogButtonsButtonWidth)
{
value = Max( controlPaneLSKText.TextRect().Width(), controlPaneRSKText.TextRect().Width());
if (AknLayoutUtils::MSKEnabled())
{
value = Max(value, controlPaneMSKText.TextRect().Width());
}
}
else if (metric==QStyle::PM_DialogButtonsButtonHeight)
{
value = Max( controlPaneLSKText.TextRect().Height(), controlPaneRSKText.TextRect().Height());
if (AknLayoutUtils::MSKEnabled())
{
value = Max(value, controlPaneMSKText.TextRect().Height());
}
}
}
break;
case QStyle::PM_DockWidgetTitleMargin: // not in S60, lets use the same margin as in button
case QStyle::PM_DockWidgetTitleBarButtonMargin: // not in S60, lets use the same margin as in button
case QStyle::PM_ButtonMargin:
{
TRect myRect(TSize( 80, 20)); // this arbitrary size - user can set it - button border does not seem to have any scalability in it
TAknLayoutRect buttonRect;
TAknLayoutRect buttonBordersRect;
TAknLayoutText buttonText;
buttonRect.LayoutRect( myRect, AknLayoutScalable_Avkon::eswt_ctrl_button_pane());
buttonBordersRect.LayoutRect( buttonRect.Rect(), AknLayoutScalable_Avkon::common_borders_pane_copy2(0)); //with text
buttonText.LayoutText( buttonRect.Rect(), AknLayoutScalable_Avkon::control_button_pane_t1() );
// Its better to use left-right margins, since font deployment can create funny top / bottom margins
TInt leftMargin = buttonText.TextRect().iTl.iX - buttonBordersRect.Rect().iTl.iX;
TInt rightMargin = buttonBordersRect.Rect().iBr.iX - buttonText.TextRect().iBr.iX;
value = (TInt) ((leftMargin+rightMargin)/2);
}
break;
case QStyle::PM_ButtonDefaultIndicator:
{
// no default button indicators in S60
value = 0;
}
break;
case QStyle::PM_MdiSubWindowFrameWidth:
case QStyle::PM_ComboBoxFrameWidth:
case QStyle::PM_SpinBoxFrameWidth:
value = 0;
break;
case QStyle::PM_ToolBarFrameWidth:
case QStyle::PM_DefaultFrameWidth:
{
TAknLayoutRect highLightPaneRect;
TAknLayoutRect centerPaneRect;
TRect rectParent( mainPaneRect );
highLightPaneRect.LayoutRect( rectParent, AknLayoutScalable_Avkon::toolbar_button_pane(0).LayoutLine());
centerPaneRect.LayoutRect(rectParent, AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine());
value = highLightPaneRect.Rect().iBr.iX - centerPaneRect.Rect().iBr.iX;
}
break;
case QStyle::PM_RadioButtonLabelSpacing:
{
/*
*
===================================================================================
| A | iconLayoutRect |B| itemText | C |
===================================================================================
mirrored:
===================================================================================
| C | itemText |B| iconLayoutRect | A |
===================================================================================
where A is left padding
B is gap between icon and text
C is right padding
*/
TRect rectParent( mainPaneRect );
TAknLayoutRect layoutRect;
layoutRect.LayoutRect( rectParent,AknLayoutScalable_Avkon::list_choice_list_pane(1).LayoutLine() ); // w/ scrollbar
TAknLayoutText itemText;
itemText.LayoutText( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1) );
TAknLayoutRect iconLayoutRect;
iconLayoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_g1().LayoutLine() );
if ( !AknLayoutUtils::LayoutMirrored() )
{
value = itemText.TextRect().iTl.iX - iconLayoutRect.Rect().iBr.iX;
}
else
{
value = iconLayoutRect.Rect().iTl.iX - itemText.TextRect().iBr.iX;
}
}
break;
case QStyle::PM_CheckBoxLabelSpacing:
{
/*
*
===================================================================================
| A | iconLayoutRect |B| itemText | C |
===================================================================================
mirrored:
===================================================================================
| C | itemText |B| iconLayoutRect | A |
===================================================================================
where A is left padding
B is gap between icon and text
C is right padding
*/
TRect rectParent( mainPaneRect );
TAknLayoutRect layoutRect;
layoutRect.LayoutRect( rectParent, AknLayoutScalable_Avkon::listscroll_gen_pane(0).LayoutLine() );
TAknLayoutRect layoutRect2;
layoutRect2.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Avkon::list_gen_pane(0).LayoutLine() );
TAknLayoutRect layoutRect3;
layoutRect3.LayoutRect( layoutRect2.Rect(), AknLayoutScalable_Avkon::list_single_graphic_pane(0).LayoutLine() );
TAknLayoutText itemText;
itemText.LayoutText( layoutRect3.Rect(), AknLayoutScalable_Avkon::list_single_graphic_pane_t1(0) );
TAknLayoutRect iconLayoutRect;
iconLayoutRect.LayoutRect( layoutRect3.Rect(), AknLayoutScalable_Avkon::list_single_graphic_pane_g1(0).LayoutLine() );
if ( !AknLayoutUtils::LayoutMirrored() )
{
value = itemText.TextRect().iTl.iX - iconLayoutRect.Rect().iBr.iX;
}
else
{
value = iconLayoutRect.Rect().iTl.iX - itemText.TextRect().iBr.iX;
}
}
break;
case QStyle::PM_ToolTipLabelFrameWidth:
{
/*
*
|===================================================================================|
| info popup note B |
| ============================================================================== |
| A | hintText | D|
| ============================================================================== |
| C |
|===================================================================================|
where A is left padding
B is top padding
C is bottom padding
D is right padding
we'll provide the average of top and bottom padding as PM_ToolTipLabelFrameWidth
*/
// Set pop-up to contain only one line of text
TInt index = 0;
if ( landscape )
{
// in landscape another variety is used
index += 5;
}
// Get parameter and table limits for popup preview text window
TAknLayoutScalableParameterLimits limits =
AknLayoutScalable_Avkon::popup_preview_text_window_ParamLimits();
TAknLayoutScalableTableLimits tableLimits =
AknLayoutScalable_Avkon::popup_preview_text_window_t_Limits();
TInt windowVariety = Min( Max( index, limits.FirstVariety() ), limits.LastVariety() );
TAknLayoutScalableParameterLimits tParamLimits =
AknLayoutScalable_Avkon:: popup_preview_text_window_t_ParamLimits(
tableLimits.FirstIndex() );
TInt lineVariety = Min( Max( index, tParamLimits.FirstVariety() ), tParamLimits.LastVariety() );
TAknWindowLineLayout lineLayout = AknLayoutScalable_Avkon::popup_preview_text_window(windowVariety).LayoutLine();
// rect for the whole info popup
TAknLayoutRect layoutRect;
layoutRect.LayoutRect(screenRect, lineLayout);
TRect rectPopupWindow = layoutRect.Rect();
TAknTextComponentLayout popupTextLayout =
AknLayoutScalable_Avkon::popup_preview_text_window_t(
tableLimits.FirstIndex(), lineVariety );
// rect for the whole the text inside the popup
TAknLayoutText layoutText;
layoutText.LayoutText( rectPopupWindow, popupTextLayout );
// Each margin has different value in S60 - let's take average of top & bottom
TInt topMargin = layoutText.TextRect().iTl.iY - layoutRect.Rect().iTl.iY;
TInt bottomMargin = layoutRect.Rect().iBr.iY - layoutText.TextRect().iBr.iY;
TInt averageMargin = (TInt)(topMargin+bottomMargin)/2;
value = averageMargin;
}
break;
case QStyle::PM_ListViewIconSize:
{
// todo: there are lots and lots of views with different sized icons - which one to use?
// todo: this is probably not a good default icon size, as this fetches A column icon size
// todo: preferably use settings item with graphic instead
TAknLayoutRect iconRect;
iconRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::list_double_graphic_pane_g1_cp2(0).LayoutLine());
//icon areas are usually squares - lets take bigger of two dimensions
value = Max( iconRect.Rect().Width(), iconRect.Rect().Height() );
}
break;
case QStyle::PM_LargeIconSize: // lets use AS icon as a base for large icon
case QStyle::PM_IconViewIconSize:
{
// Lets assume that we'd take these from grid (3x4) layout
TAknLayoutRect appPaneRect;
TAknLayoutRect gridAppRect;
TAknLayoutRect cellAppRect;
TInt varietyGrid = 2; //Let's use the 3x4 grid as a base.
TInt varietyCell = 1; //Let's use the 3x4 grid as a base.
if ( landscape )
{
varietyGrid = 3;
varietyCell = 2;
}
appPaneRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_app_pane(1).LayoutLine()); //3x4 grid
gridAppRect.LayoutRect( appPaneRect.Rect(), AknLayoutScalable_Avkon::grid_app_pane(varietyGrid).LayoutLine());
cellAppRect.LayoutRect( gridAppRect.Rect(), AknLayoutScalable_Avkon::cell_app_pane(varietyCell, 0, 0).LayoutLine());
TAknLayoutRect cellGraphRect;
TAknWindowComponentLayout appIcon = AknLayoutScalable_Avkon::cell_app_pane_g1(0); // no mark, no highlight
cellGraphRect.LayoutRect( gridAppRect.Rect(), appIcon);
//icon areas are usually squares - if not, lets take larger
value = Max( cellGraphRect.Rect().Width(), cellGraphRect.Rect().Height());
}
break;
case QStyle::PM_TabBarIconSize:
{
TAknLayoutRect naviNaviRect;
naviNaviRect.LayoutRect( naviPaneRect, AknLayoutScalable_Avkon::navi_navi_tabs_pane().LayoutLine()); // two tabs
TAknLayoutRect tabRect;
tabRect.LayoutRect( naviNaviRect.Rect(), AknLayoutScalable_Avkon::navi_tabs_3_pane().LayoutLine()); //active tab on left
TAknLayoutRect activeTabRect;
activeTabRect.LayoutRect( tabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane(0).LayoutLine()); //active tab
TAknLayoutRect activeTabGraphicRect;
activeTabGraphicRect.LayoutRect( activeTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane_g1().LayoutLine()); //active tab graphic
value = Min(activeTabGraphicRect.Rect().Width(), activeTabGraphicRect.Rect().Height());
}
break;
case QStyle::PM_MessageBoxIconSize:
{
TAknLayoutRect noteRect;
noteRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_note_image_window(0).LayoutLine()); //note with image
TAknLayoutRect noteImageRect;
noteImageRect.LayoutRect( noteRect.Rect(), AknLayoutScalable_Avkon::popup_note_image_window_g2(2).LayoutLine()); //note with image
value = noteImageRect.Rect().Width();
}
break;
case QStyle::PM_TextCursorWidth:
{
TAknLayoutRect miscGraphicsRect;
miscGraphicsRect.LayoutRect( screenRect, AknLayoutScalable_Avkon::misc_graphics());
miscGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::misc_graphics());
TAknLayoutRect textsGraphicsRect;
textsGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::texts_graphics());
TAknLayoutRect cursorGraphicsRect;
cursorGraphicsRect.LayoutRect( textsGraphicsRect.Rect(), AknLayoutScalable_Avkon::cursor_graphics_pane());
TAknLayoutRect cursorPrimaryRect;
cursorPrimaryRect.LayoutRect( cursorGraphicsRect.Rect(), AknLayoutScalable_Avkon::cursor_primary_pane());
TAknLayoutRect cursorRect;
cursorRect.LayoutRect( cursorPrimaryRect.Rect(), AknLayoutScalable_Avkon::cursor_digital_pane_g1());
value = cursorRect.Rect().Width();
}
break;
case QStyle::PM_SliderLength:
{
TAknLayoutRect settingRect;
settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() );
TAknLayoutRect settingContentRect;
settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() );
TAknLayoutRect sliderRect;
sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() );
TAknLayoutRect sliderSettingRect;
sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
TAknLayoutRect sliderGraph2Rect;
sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
value = sliderGraph2Rect.Rect().Width();
}
break;
case QStyle::PM_SliderThickness:
{
TAknLayoutRect settingRect;
settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() );
TAknLayoutRect settingContentRect;
settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() );
TAknLayoutRect sliderRect;
sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() );
TAknLayoutRect sliderSettingRect;
sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
TAknLayoutRect sliderGraph2Rect;
sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
//todo: make a proper calculation for tick marks
value = (TInt)(sliderGraph2Rect.Rect().Height()*1.5); // add assumed tickmark height
}
break;
case QStyle::PM_SliderTickmarkOffset:
{
TAknLayoutRect settingRect;
settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() );
TAknLayoutRect settingContentRect;
settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() );
TAknLayoutRect sliderRect;
sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() );
TAknLayoutRect sliderSettingRect;
sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
TAknLayoutRect sliderGraph2Rect;
sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
//todo: make a proper calculation for tick marks
value = (TInt)(sliderGraph2Rect.Rect().Height()*0.5); // no tickmarks in S60, lets assume they are half the size of slider indicator
}
break;
case QStyle::PM_SliderControlThickness:
{
TAknLayoutRect settingRect;
settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() );
TAknLayoutRect settingContentRect;
settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() );
TAknLayoutRect sliderRect;
sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() );
TAknLayoutRect sliderSettingRect;
sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
TAknLayoutRect sliderGraph2Rect;
sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
value = sliderGraph2Rect.Rect().Height();
}
break;
case QStyle::PM_SliderSpaceAvailable:
{
TAknLayoutRect settingRect;
settingRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_set_pane() );
TAknLayoutRect settingContentRect;
settingContentRect.LayoutRect( settingRect.Rect(), AknLayoutScalable_Avkon::set_content_pane() );
TAknLayoutRect sliderRect;
sliderRect.LayoutRect( settingContentRect.Rect(), AknLayoutScalable_Avkon::setting_slider_graphic_pane() );
TAknLayoutRect sliderSettingRect;
sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
value = sliderSettingRect.Rect().Width();
}
break;
case QStyle::PM_MenuBarItemSpacing:
{
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) );
variety = 0;
if ( landscape )
{
variety = 2;
}
TAknLayoutRect areaBottomRect;
areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) );
TAknLayoutRect controlPaneRect;
controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() );
TAknLayoutText controlPaneLSKText;
TAknLayoutText controlPaneRSKText;
TAknLayoutText controlPaneMSKText;
variety = 0;
if (AknLayoutUtils::MSKEnabled())
{
variety = 3;
controlPaneMSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t3(variety)); //MSK text area
}
controlPaneLSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t1(variety)); //LSK text area
controlPaneRSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t2(variety)); //RSK text area
/*
*
==================================================================================
| A | LSK_rect | B | MSK_rect | C | RSK_rect | D |
==================================================================================
where A is left padding (between control pane and LSK rect)
B is mid-left padding (between LSK and MSK rects)
C is mid-right padding (between MSK and RSK rects)
D is right padding (between RSK and control pane)
==> Since all these can be separate, lets take Max of {A..D} for PM value
*/
TInt itemSpacing1 = 0;
TInt itemSpacing2 = 0;
TInt itemSpacing3 = 0;
TInt itemSpacing4 = 0;
TInt itemSpacingMax = 0;
if ( !AknLayoutUtils::MSKEnabled() )
{
itemSpacing1 = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX;
itemSpacing2 = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX;
if ( !landscape )
{
// use mid gap only in portrait
itemSpacing3 = controlPaneRSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX;
}
itemSpacingMax = Max(itemSpacing1, Max( itemSpacing2, itemSpacing3));
// no itemspacing4 if no MSK
}
else
{
itemSpacing1 = controlPaneRect.Rect().iBr.iX - controlPaneRSKText.TextRect().iBr.iX;
itemSpacing2 = controlPaneLSKText.TextRect().iTl.iX - controlPaneRect.Rect().iTl.iX;
if ( !(AknLayoutUtils::PenEnabled() || landscape) ) // no MSK in touch, nor in landscape
{
itemSpacing3 = controlPaneRSKText.TextRect().iTl.iX - controlPaneMSKText.TextRect().iBr.iX;
itemSpacing4 = controlPaneMSKText.TextRect().iTl.iX - controlPaneLSKText.TextRect().iBr.iX;
}
itemSpacingMax = Max(itemSpacing1, Max( itemSpacing2, Max( itemSpacing3, itemSpacing4 )));
}
value = itemSpacingMax;
}
break;
case QStyle::PM_MenuBarHMargin:
{
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) );
variety = 0;
if ( landscape )
{
variety = 6;
}
TAknLayoutRect areaBottomRect;
areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) );
// 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)
TAknLayoutRect controlPaneRect;
controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() );
value = areaBottomRect.Rect().Height() - controlPaneRect.Rect().Height();
}
break;
case QStyle::PM_MenuBarVMargin:
{
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) );
variety = 0;
if ( landscape )
{
variety = 6;
}
TAknLayoutText controlPaneLSKText;
TAknLayoutRect areaBottomRect;
areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) );
// 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)
TAknLayoutRect controlPaneRect;
controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() );
variety = 0;
if (AknLayoutUtils::MSKEnabled())
{
variety = 3;
}
controlPaneLSKText.LayoutText( controlPaneRect.Rect(), AknLayoutScalable_Avkon::control_pane_t1(variety)); //LSK text area
value = controlPaneRect.Rect().Height() - controlPaneLSKText.TextRect().Height();
}
break;
case QStyle::PM_ToolBarItemSpacing:
{
TAknLayoutRect popupToolBarWindow;
variety = 4;
popupToolBarWindow.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_toolbar_window(variety) );
TAknLayoutRect gridToolBarRect;
gridToolBarRect.LayoutRect( popupToolBarWindow.Rect(), AknLayoutScalable_Avkon::grid_toobar_pane() );
TAknLayoutRect cellToolBarRect1;
TAknLayoutRect cellToolBarRect2;
cellToolBarRect1.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(0).LayoutLine() ); //first item
cellToolBarRect2.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(1).LayoutLine() ); //second item
value = cellToolBarRect1.Rect().iBr.iX - cellToolBarRect2.Rect().iTl.iX;
}
break;
case QStyle::PM_ToolBarItemMargin:
{
variety = 4;
TAknLayoutRect popupToolBarWindow;
popupToolBarWindow.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_toolbar_window(variety) );
TAknLayoutRect gridToolBarRect;
gridToolBarRect.LayoutRect( popupToolBarWindow.Rect(), AknLayoutScalable_Avkon::grid_toobar_pane() );
TAknLayoutRect cellToolBarRect1;
cellToolBarRect1.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(0).LayoutLine() ); //first item
value = gridToolBarRect.Rect().iTl.iX - cellToolBarRect1.Rect().iTl.iX;
}
break;
case QStyle::PM_LayoutLeftMargin: // there really isn't a default layoutting on s60, but lets use AppShell icon deployment as base
case QStyle::PM_LayoutRightMargin:
case QStyle::PM_LayoutTopMargin:
case QStyle::PM_LayoutBottomMargin:
case QStyle::PM_LayoutHorizontalSpacing:
case QStyle::PM_LayoutVerticalSpacing:
{
//since spacing and margins should be globally same, lets use same easy component as base - such as find popup
TAknLayoutRect popup_find_windowRect;
TAknLayoutRect bg_popup_window_pane_cp12Rect;
TAknLayoutRect find_popup_paneRect;
popup_find_windowRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_find_window(0).LayoutLine());
bg_popup_window_pane_cp12Rect.LayoutRect( popup_find_windowRect.Rect(), AknLayoutScalable_Avkon::bg_popup_window_pane_cp12().LayoutLine());
find_popup_paneRect.LayoutRect( bg_popup_window_pane_cp12Rect.Rect(), AknLayoutScalable_Avkon::find_popup_pane().LayoutLine());
const TBool mirrored = AknLayoutUtils::LayoutMirrored();
if ((metric==QStyle::PM_LayoutVerticalSpacing && !mirrored) || metric==QStyle::PM_LayoutLeftMargin)
{
if (mirrored)
{
value = find_popup_paneRect.Rect().iTl.iX - bg_popup_window_pane_cp12Rect.Rect().iTl.iX;
}
else
{
value = find_popup_paneRect.Rect().iTl.iX - bg_popup_window_pane_cp12Rect.Rect().iTl.iX;
}
}
else if (metric==QStyle::PM_LayoutRightMargin || (metric==QStyle::PM_LayoutVerticalSpacing && mirrored))
{
if (mirrored)
{
value = bg_popup_window_pane_cp12Rect.Rect().iBr.iX - find_popup_paneRect.Rect().iBr.iX;
}
else
{
value = bg_popup_window_pane_cp12Rect.Rect().iBr.iX - find_popup_paneRect.Rect().iBr.iX;
}
}
else if (metric==QStyle::PM_LayoutTopMargin || metric==QStyle::PM_LayoutHorizontalSpacing)
{
value = find_popup_paneRect.Rect().iTl.iY - bg_popup_window_pane_cp12Rect.Rect().iTl.iY;
}
else if (metric==QStyle::PM_LayoutBottomMargin)
{
value = bg_popup_window_pane_cp12Rect.Rect().iBr.iY - find_popup_paneRect.Rect().iBr.iY;
}
}
break;
case QStyle::PM_MaximumDragDistance:
{
value = -1; //disable - not in S60
}
break;
case QStyle::PM_SplitterWidth:
case QStyle::PM_ScrollBarExtent:
{
TAknLayoutRect miscGraphicsRect;
miscGraphicsRect.LayoutRect( screenRect, AknLayoutScalable_Avkon::misc_graphics());
miscGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::misc_graphics());
TAknLayoutRect textsGraphicsRect;
textsGraphicsRect.LayoutRect( miscGraphicsRect.Rect(), AknLayoutScalable_Avkon::texts_graphics());
TAknLayoutRect editorScrollRect;
editorScrollRect.LayoutRect( textsGraphicsRect.Rect(), AknLayoutScalable_Avkon::editor_scroll_pane());
TAknLayoutRect scrollPaneRect;
scrollPaneRect.LayoutRect( editorScrollRect.Rect(), AknLayoutScalable_Avkon::scroll_pane_cp13());
value = scrollPaneRect.Rect().Width(); // width of editor's scroll bar
}
break;
case QStyle::PM_ScrollBarSliderMin:
{
TAknLayoutRect listScrollPane;
listScrollPane.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::listscroll_gen_pane(0));
TAknLayoutRect scrollPane;
scrollPane.LayoutRect( listScrollPane.Rect(), AknLayoutScalable_Avkon::scroll_pane());
TAknLayoutRect scrollHandlePane;
scrollHandlePane.LayoutRect( scrollPane.Rect(), AknLayoutScalable_Avkon::scroll_handle_pane());
TAknLayoutRect aidMinSizePane;
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
value = aidMinSizePane.Rect().Height();
}
break;
case QStyle::PM_MenuBarPanelWidth:
{
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(0) );
variety = 0;
if ( landscape )
{
variety = 2;
}
TAknLayoutRect areaBottomRect;
areaBottomRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(variety) );
// 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)
// todo: lsc: variety 6 if thin status pane
// todo: should stacon be considered?
TAknLayoutRect controlPaneRect;
controlPaneRect.LayoutRect( areaBottomRect.Rect(), AknLayoutScalable_Avkon::control_pane() );
value = areaBottomRect.Rect().Height() - controlPaneRect.Rect().Height(); //usually zero
}
break;
case QStyle::PM_ProgressBarChunkWidth:
{
// This is either deduced or skinned (for Java) in S60
// Layout data does not know it. It would require parameters from the
// actual progress dialog to be able to calc this (max. value and increment)
// So we need to set up some values - lets take one tenth of progress dialog area:
TAknLayoutRect appWindow;
appWindow.LayoutRect( screenRect, AknLayoutScalable_Avkon::application_window(variety) );
if (landscape)
{
variety = 6;
}
TAknLayoutRect popupWaitWindowRect;
popupWaitWindowRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_note_wait_window(variety) );
TAknLayoutRect waitbarPaneRect;
waitbarPaneRect.LayoutRect( popupWaitWindowRect.Rect(), AknLayoutScalable_Avkon::wait_bar_pane(0) );
TAknLayoutRect waitAnimRect;
waitAnimRect.LayoutRect( waitbarPaneRect.Rect(), AknLayoutScalable_Avkon::wait_anim_pane() );
value = (TInt) (waitAnimRect.Rect().Width() / 10);
}
break;
case QStyle::PM_TabBarTabOverlap:
case QStyle::PM_TabBarTabHSpace:
case QStyle::PM_TabBarTabVSpace:
case QStyle::PM_TabBarBaseHeight:
case QStyle::PM_TabBarBaseOverlap:
case QStyle::PM_TabBarScrollButtonWidth:
case QStyle::PM_TabBarTabShiftHorizontal:
case QStyle::PM_TabBarTabShiftVertical:
value = PixelMetricTabValue(metric, appWindow.Rect(), landscape);
break;
case QStyle::PM_MenuPanelWidth:
case QStyle::PM_MenuHMargin:
case QStyle::PM_MenuVMargin:
value = PixelMetricMenuValue(metric, mainPaneRect);
break;
case QStyle::PM_ButtonIconSize:
{
//lets use voice recorder icons as a base
//Unfortunately S60 graphics don't separate button bevel graphics from the actual icon.
//Se we have no means to query the margin from bevel border to "central icon" border.
//So, we need to make a estimate...
TAknLayoutRect vRMainRect;
vRMainRect.LayoutRect( mainPaneRect, AknLayoutScalable_Apps::main_vorec_pane() );
TAknLayoutRect vRButtonGridRect;
vRButtonGridRect.LayoutRect( vRMainRect.Rect(), AknLayoutScalable_Apps::grid_vorec_pane() );
TAknLayoutRect vRButtonCellRect;
vRButtonCellRect.LayoutRect( vRButtonGridRect.Rect(), AknLayoutScalable_Apps::cell_vorec_pane(0) );
TAknLayoutRect vRButtonCellGraphicsRect;
vRButtonCellGraphicsRect.LayoutRect( vRButtonCellRect.Rect(), AknLayoutScalable_Apps::cell_vorec_pane_g1() );
// 0.32 is the estimate how much the icon occupies of the button bevel area
value = vRButtonCellGraphicsRect.Rect().Width() * 0.32;
}
break;
case QStyle::PM_SmallIconSize:
{
// lets use AI2 icon as a base
TAknLayoutRect idlePaneRect;
idlePaneRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::main_idle_act2_pane() );
TAknLayoutRect idleDataRect;
idleDataRect.LayoutRect( idlePaneRect.Rect(), AknLayoutScalable_Avkon::popup_ai2_data_window(1) );
TAknLayoutRect ai2GridRect;
ai2GridRect.LayoutRect( idleDataRect.Rect(), AknLayoutScalable_Avkon::grid_ai2_button_pane() );
TAknLayoutRect ai2MpRect;
ai2MpRect.LayoutRect( ai2GridRect.Rect(), AknLayoutScalable_Avkon::ai2_mp_button_pane() );
TAknLayoutRect ai2CellPaneRect;
ai2CellPaneRect.LayoutRect( ai2MpRect.Rect(), AknLayoutScalable_Avkon::cell_ai2_button_pane(1).LayoutLine() );
TAknLayoutRect ai2CellButtonRect;
ai2CellButtonRect.LayoutRect( ai2CellPaneRect.Rect(), AknLayoutScalable_Avkon::cell_ai2_button_pane_g1());
value = Min( ai2CellButtonRect.Rect().Width(), ai2CellButtonRect.Rect().Height());
}
break;
case QStyle::PM_FocusFrameHMargin:
case QStyle::PM_FocusFrameVMargin:
{
TAknLayoutRect listScrollPane;
listScrollPane.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::listscroll_gen_pane(0));
TAknLayoutRect listGenPane;
listGenPane.LayoutRect(listScrollPane.Rect(), AknLayoutScalable_Avkon::list_gen_pane(0));
TAknLayoutRect listSinglePane;
listSinglePane.LayoutRect(listGenPane.Rect(), AknLayoutScalable_Avkon::list_single_pane(0));
TAknLayoutText listSinglePaneText;
listSinglePaneText.LayoutText(listSinglePane.Rect(), AknLayoutScalable_Avkon::list_single_pane_t1(0));
TAknLayoutRect highlightRect;
highlightRect.LayoutRect(listSinglePane.Rect(), AknLayoutScalable_Avkon::list_highlight_pane_cp1().LayoutLine());
// The difference of center piece from border tell the frame width.
if ( value == QStyle::PM_FocusFrameHMargin)
{
//use topleft for horizontal as S60 uses different values for right and left borders
value = listSinglePaneText.TextRect().iTl.iX - highlightRect.Rect().iTl.iX;
}
else
{
value = highlightRect.Rect().iBr.iY - listSinglePaneText.TextRect().iBr.iY;
}
}
break;
case QStyle::PM_ToolBarIconSize:
{
TAknLayoutRect popupToolBarWindow;
variety = 4;
popupToolBarWindow.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_toolbar_window(variety) );
TAknLayoutRect gridToolBarRect;
gridToolBarRect.LayoutRect( popupToolBarWindow.Rect(), AknLayoutScalable_Avkon::grid_toobar_pane() );
TAknLayoutRect cellToolBarRect1;
TAknLayoutRect cellToolBarRect2;
cellToolBarRect1.LayoutRect( gridToolBarRect.Rect(), AknLayoutScalable_Avkon::cell_toolbar_pane(0).LayoutLine() ); //first item
value = Min( cellToolBarRect1.Rect().Height(), cellToolBarRect1.Rect().Width() );
}
break;
case QStyle::PM_TitleBarHeight: // use titlepane height
{
TAknLayoutRect statusPaneRect;
TAknLayoutRect titlePane;
TAknLayoutRect areaTopRect;
if (landscape)
{
if ( AknLayoutUtils::PenEnabled() )
{
// Top area - 0 is for classic landscape (used in touch landscape as well)
areaTopRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_top_pane(2) );
// Status pane - 0 softkeys on right
statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_top_pane() );
}
else
{
// Top area - 2 is for classic landscape.
areaTopRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_bottom_pane(2) );
// Stacon top pane (default ok)
statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_bottom_pane() );
}
titlePane.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::title_pane_stacon(0) ); //softkeys on right
}
else
{
// Top area - 0 is for classic portrait
areaTopRect.LayoutRect( appWindow.Rect(), AknLayoutScalable_Avkon::area_top_pane(0) );
// Status pane - 0 is for classic portrait
statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::status_pane(0) );
titlePane.LayoutRect( statusPaneRect.Rect(), AknLayoutScalable_Avkon::title_pane(0) );
}
value = titlePane.Rect().Height();
}
break;
case QStyle::PM_IndicatorWidth:
case QStyle::PM_IndicatorHeight:
{
TRect rectParent( mainPaneRect );
TAknLayoutRect layoutRect;
layoutRect.LayoutRect( rectParent,AknLayoutScalable_Avkon::set_content_pane().LayoutLine() );
TAknLayoutRect layoutRect2;
layoutRect2.LayoutRect( layoutRect.Rect(),AknLayoutScalable_Avkon::list_set_graphic_pane(0).LayoutLine() );
TAknLayoutRect iconLayoutRect;
iconLayoutRect.LayoutRect( layoutRect2.Rect(), AknLayoutScalable_Avkon::list_set_graphic_pane_g1(0).LayoutLine() );
if (metric==QStyle::PM_IndicatorWidth)
{
value = iconLayoutRect.Rect().Width();
}
else
{
value = iconLayoutRect.Rect().Height();
}
}
break;
case QStyle::PM_ExclusiveIndicatorHeight:
case QStyle::PM_ExclusiveIndicatorWidth:
{
TRect rectParent( mainPaneRect );
TAknLayoutRect layoutRect;
layoutRect.LayoutRect( rectParent,AknLayoutScalable_Avkon::list_choice_list_pane(1).LayoutLine() ); // w/ scrollbar
TAknLayoutText itemText;
itemText.LayoutText( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1) );
TAknLayoutRect iconLayoutRect;
iconLayoutRect.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Avkon::list_single_choice_list_pane_g1().LayoutLine() );
if (metric==QStyle::PM_ExclusiveIndicatorHeight)
{
value = iconLayoutRect.Rect().Height();
}
else
{
value = iconLayoutRect.Rect().Width();
}
}
break;
// These are obsolete.
case QStyle::PM_DefaultTopLevelMargin:
case QStyle::PM_DefaultChildMargin:
case QStyle::PM_DefaultLayoutSpacing:
break;
case QStyle::PM_Custom_FrameCornerWidth:
{
TAknLayoutRect inputFocusRect;
inputFocusRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane(0));
TAknLayoutRect inputFocusInnerRect;
inputFocusInnerRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane_g1());
value = inputFocusRect.Rect().iBr.iX - inputFocusInnerRect.Rect().iBr.iX;
value+= 2; //visually better value for generic cases
}
break;
case QStyle::PM_Custom_FrameCornerHeight:
{
TAknLayoutRect inputFocusRect;
inputFocusRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane(0));
TAknLayoutRect inputFocusInnerRect;
inputFocusInnerRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::input_focus_pane_g1());
value = inputFocusRect.Rect().iBr.iY - inputFocusInnerRect.Rect().iBr.iY;
value+= 2; //visually better value for generic cases
}
break;
case QStyle::PM_Custom_BoldLineWidth:
value = 3;
break;
case QStyle::PM_Custom_ThinLineWidth:
value = 1;
break;
case QStyle::PM_Custom_MessageBoxHeight:
{
TAknLayoutRect popupRect;
popupRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::popup_window_general(0));
value = popupRect.Rect().Height();
}
break;
case QStyle::PM_ButtonShiftHorizontal:
case QStyle::PM_ButtonShiftVertical:
value = 0;
break;
case QStyle::PM_ToolBarExtensionExtent:
value = PixelMetricTabValue(QStyle::PM_TabBarScrollButtonWidth, appWindow.Rect(), landscape);
break;
case QStyle::PM_MenuScrollerHeight:
{
TRect rectParent( mainPaneRect );
TAknLayoutRect listWidthScrollBarsRect;
listWidthScrollBarsRect.LayoutRect( rectParent, AknLayoutScalable_Avkon::listscroll_gen_pane(0).LayoutLine() );
TAknLayoutRect listWidgetRect;
listWidgetRect.LayoutRect( listWidthScrollBarsRect.Rect(), AknLayoutScalable_Avkon::list_gen_pane(0).LayoutLine() );
TAknLayoutRect singleLineListWidgetRect;
singleLineListWidgetRect.LayoutRect( listWidgetRect.Rect(), AknLayoutScalable_Avkon::list_single_pane(0).LayoutLine() );
TAknLayoutRect listHighlightRect;
listHighlightRect.LayoutRect( singleLineListWidgetRect.Rect(), AknLayoutScalable_Avkon::list_highlight_pane_cp1(0).LayoutLine() );
value = listHighlightRect.Rect().Height();
}
break;
// todo: re-check if these really are not available in s60
case QStyle::PM_MenuDesktopFrameWidth: // not needed in S60 - dislocates Menu both horizontally and vertically
case QStyle::PM_HeaderMarkSize: // The size of the sort indicator in a header. Not in S60
case QStyle::PM_SpinBoxSliderHeight: // The height of the optional spin box slider. Not in S60
case QStyle::PM_HeaderMargin: // not in S60
case QStyle::PM_MenuTearoffHeight: // not in S60
case QStyle::PM_DockWidgetFrameWidth: // not in S60
case QStyle::PM_DockWidgetSeparatorExtent: // not in S60
case QStyle::PM_MdiSubWindowMinimizedWidth: //no such thing in S60
case QStyle::PM_HeaderGripMargin: // not in S60
case QStyle::PM_ToolBarSeparatorExtent: // not in S60
case QStyle::PM_ToolBarHandleExtent: // not in s60
case QStyle::PM_MenuButtonIndicator: // none???
case QStyle::PM_TabBar_ScrollButtonOverlap: // not used in S60 - tab arrows are on left and right side of tab group - not together
case QStyle::PM_SizeGripSize: // use default
case QStyle::PM_TabCloseIndicatorWidth:
case QStyle::PM_TabCloseIndicatorHeight:
case QStyle::PM_ScrollView_ScrollBarSpacing:
case QStyle::PM_SubMenuOverlap:
default:
break;
}
return value;
}
TInt PixelMetrics::PixelMetricTabValue(QStyle::PixelMetric tabMetric, TRect appWindow, TBool landscape)
{
TInt tabValue = 0;
// common ones
TAknLayoutRect mainAreaRect;
TAknLayoutRect rightIndicationRect;
TAknLayoutRect leftIndicationRect;
TAknLayoutRect activeTabRect;
TAknLayoutText activeTabTextRect;
TAknLayoutRect passiveTabRect;
TAknLayoutText passiveTabTextRect;
TAknLayoutRect tabsPaneRect;
if ( landscape )
{
TAknLayoutRect statusPaneRect;
TAknLayoutRect areaTopRect;
if ( AknLayoutUtils::PenEnabled() )
{
// Top area - 0 is for classic landscape (used in touch landscape as well)
areaTopRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::area_top_pane(2) );
// Status pane - 0 softkeys on right
statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_top_pane() );
}
else
{
// Top area - 2 is for classic landscape.
areaTopRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::area_bottom_pane(2) );
// Stacon top pane (default ok)
statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::stacon_bottom_pane() );
}
// main pane for landscape
mainAreaRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::main_pane(4) );
// navi pane
TAknLayoutRect naviPaneRect;
naviPaneRect.LayoutRect( statusPaneRect.Rect(), AknLayoutScalable_Avkon::navi_pane_stacon(0) ); // softkeys on right
// navi-navi pane
tabsPaneRect.LayoutRect( naviPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_stacon(0) ); // softkeys on right
// Passive tab item - lets use layout where active is on left side of passive
passiveTabRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane(0) );
// Active tab item
activeTabRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane(0) );
// Left indication
leftIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g1(0) );
// Right indication
rightIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g2(0) );
// active tab text rect
activeTabTextRect.LayoutText( activeTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane_t1(1) );
// passive tab text rect
passiveTabTextRect.LayoutText( passiveTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane_t1(1) );
}
else
{
// main pane for portait
mainAreaRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::main_pane(3) );
// Top area - 0 is for classic portrait
TAknLayoutRect areaTopRect;
areaTopRect.LayoutRect( appWindow, AknLayoutScalable_Avkon::area_top_pane(0) );
// Status pane - 0 is for classic portrait
TAknLayoutRect statusPaneRect;
statusPaneRect.LayoutRect( areaTopRect.Rect(), AknLayoutScalable_Avkon::status_pane(0) );
// Navi pane
TAknLayoutRect naviPaneRect;
naviPaneRect.LayoutRect( statusPaneRect.Rect(), AknLayoutScalable_Avkon::navi_pane(0) );
// Navi-navi pane for tabs (0)
TAknLayoutRect navi2PaneRect;
navi2PaneRect.LayoutRect( naviPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane() );
// Short tab pane
tabsPaneRect.LayoutRect( navi2PaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_tabs_pane() );
// Tab pane for 2 items
TAknLayoutRect tab2PaneRect;
tab2PaneRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_tabs_3_pane() );
// Passive tab item - lets use layout where active is on left side of passive
passiveTabRect.LayoutRect( tab2PaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane(0) );
// Active tab item
activeTabRect.LayoutRect( tab2PaneRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane(0) );
// Left indication
leftIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g1(0) );
// Right indication
rightIndicationRect.LayoutRect( tabsPaneRect.Rect(), AknLayoutScalable_Avkon::navi_navi_pane_g2(0) );
// active tab text rect
activeTabTextRect.LayoutText( activeTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_active_pane_t1(0) );
// passive tab text rect
passiveTabTextRect.LayoutText( passiveTabRect.Rect(), AknLayoutScalable_Avkon::tabs_3_passive_pane_t1(0) );
}
// active tab on left, passive on rightside
TInt tabOverlap = activeTabRect.Rect().iBr.iX - passiveTabRect.Rect().iTl.iX;
TInt tabHSpace = (TInt) ((activeTabTextRect.TextRect().iTl.iX - activeTabRect.Rect().iTl.iX + activeTabRect.Rect().iBr.iX - activeTabTextRect.TextRect().iBr.iX)/2);
TInt tabVSpace = (TInt) ((activeTabTextRect.TextRect().iTl.iY - activeTabRect.Rect().iTl.iY + activeTabRect.Rect().iBr.iY - activeTabTextRect.TextRect().iBr.iY)/2);
TInt tabBaseHeight = 0;
if ( landscape && !AknLayoutUtils::PenEnabled())
{
// In landscape tab is below mainpane
tabBaseHeight = mainAreaRect.Rect().iBr.iY - tabsPaneRect.Rect().iTl.iY;
}
else
{
// In portrait (and in landscape touch) tab is above mainpane
tabBaseHeight = tabsPaneRect.Rect().iBr.iY - mainAreaRect.Rect().iTl.iY;
}
TInt tabBaseOverlap = 0;
if ( landscape && !AknLayoutUtils::PenEnabled())
{
// In landscape tab is below mainpane
tabBaseOverlap = Max( 0, mainAreaRect.Rect().iBr.iY - tabsPaneRect.Rect().iTl.iY);
}
else
{
// In portrait tab is above mainpane
tabBaseOverlap = Max( 0, mainAreaRect.Rect().iTl.iY - tabsPaneRect.Rect().iBr.iY);
}
TInt tabButtonWidth = Max(leftIndicationRect.Rect().Width(), rightIndicationRect.Rect().Width());
TInt tabVShift = Max( Abs(activeTabTextRect.TextRect().iBr.iY - passiveTabTextRect.TextRect().iBr.iY), Abs(activeTabTextRect.TextRect().iTl.iY - passiveTabTextRect.TextRect().iTl.iY) );
TInt tabHShift = Max( Abs(activeTabTextRect.TextRect().iBr.iX - passiveTabTextRect.TextRect().iBr.iX), Abs(activeTabTextRect.TextRect().iTl.iX - passiveTabTextRect.TextRect().iTl.iX) );
tabHShift -= (passiveTabRect.Rect().Width() - tabOverlap); // remove tab change and add overlapping area
switch( tabMetric )
{
case QStyle::PM_TabBarTabOverlap:
tabValue = tabOverlap;
break;
case QStyle::PM_TabBarTabHSpace:
tabValue = tabHSpace;
break;
case QStyle::PM_TabBarTabVSpace:
tabValue = tabVSpace;
break;
case QStyle::PM_TabBarBaseHeight:
tabValue = tabBaseHeight;
break;
case QStyle::PM_TabBarBaseOverlap:
tabValue = tabBaseOverlap;
break;
case QStyle::PM_TabBarScrollButtonWidth:
// Since in Qt the scroll indicator is shown within a button, we need to add button margins to this value
{
tabValue = tabButtonWidth + 2*PixelMetricValue(QStyle::PM_ButtonMargin);
}
break;
case QStyle::PM_TabBarTabShiftHorizontal:
tabValue = tabHShift;
break;
case QStyle::PM_TabBarTabShiftVertical:
tabValue = tabVShift;
break;
default:
break;
}
return tabValue;
}
TInt PixelMetrics::PixelMetricMenuValue(QStyle::PixelMetric tabMetric, TRect mainPaneRect )
{
TInt menuValue = 0;
TAknLayoutRect popupMenuRect;
popupMenuRect.LayoutRect( mainPaneRect, AknLayoutScalable_Avkon::popup_menu_window(0) );
TAknLayoutRect listScrollPaneRect;
listScrollPaneRect.LayoutRect( popupMenuRect.Rect(), AknLayoutScalable_Avkon::listscroll_menu_pane(0) );
TAknLayoutRect listMenuPaneRect;
listMenuPaneRect.LayoutRect( listScrollPaneRect.Rect(), AknLayoutScalable_Avkon::list_menu_pane(0) );
TAknLayoutRect listMenuRow1Rect;
listMenuRow1Rect.LayoutRect( listScrollPaneRect.Rect(), AknLayoutScalable_Avkon::list_single_pane_cp2(0));
switch (tabMetric)
{
case QStyle::PM_MenuPanelWidth:
menuValue = listMenuPaneRect.Rect().iTl.iX - listScrollPaneRect.Rect().iTl.iX;
if ( AknLayoutUtils::LayoutMirrored() )
{
menuValue = listScrollPaneRect.Rect().iBr.iX - listMenuPaneRect.Rect().iBr.iX;
}
break;
case QStyle::PM_MenuHMargin:
menuValue = listMenuRow1Rect.Rect().iTl.iX - popupMenuRect.Rect().iTl.iX;
if ( AknLayoutUtils::LayoutMirrored() )
{
menuValue = popupMenuRect.Rect().iBr.iX - listMenuRow1Rect.Rect().iBr.iX;
}
break;
case QStyle::PM_MenuVMargin:
menuValue = listMenuRow1Rect.Rect().iTl.iY - popupMenuRect.Rect().iTl.iY;
break;
default:
break;
}
return menuValue;
}