1256 lines
62 KiB
C++
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;
|
||
|
}
|