diff options
author | Sami Merilä <sami.merila@nokia.com> | 2009-05-05 06:36:39 (GMT) |
---|---|---|
committer | Sami Merilä <sami.merila@nokia.com> | 2009-05-05 06:36:39 (GMT) |
commit | 4d9acb8baf4af1fe203c937c9ee8d3c3714212f6 (patch) | |
tree | 09942378eff33c026668768f0bc474ae2729cf9e /util/s60pixelmetrics/pixel_metrics.cpp | |
parent | 812b8de816bf84a5607d5a5d178283be3eb6bfc7 (diff) | |
download | Qt-4d9acb8baf4af1fe203c937c9ee8d3c3714212f6.zip Qt-4d9acb8baf4af1fe203c937c9ee8d3c3714212f6.tar.gz Qt-4d9acb8baf4af1fe203c937c9ee8d3c3714212f6.tar.bz2 |
S60Style: renamed pixelmetricsmapper files and relocated them all under one subfolder.
Diffstat (limited to 'util/s60pixelmetrics/pixel_metrics.cpp')
-rw-r--r-- | util/s60pixelmetrics/pixel_metrics.cpp | 1223 |
1 files changed, 1223 insertions, 0 deletions
diff --git a/util/s60pixelmetrics/pixel_metrics.cpp b/util/s60pixelmetrics/pixel_metrics.cpp new file mode 100644 index 0000000..8925ebe --- /dev/null +++ b/util/s60pixelmetrics/pixel_metrics.cpp @@ -0,0 +1,1223 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (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 either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@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 = 14; + +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_g2() ); + 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_g2() ); + 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_g2() ); + 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_g2() ); + 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_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... + + const TInt varietyForButtons = !landscape ? 0 : 1; + + 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 gridRect; + gridRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::grid_highlight_pane(0)); + TAknLayoutRect gridRectCenter; + gridRectCenter.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::cell_highlight_pane_g1()); + + // The difference of center piece from border tell the frame width. + if ( value == QStyle::PM_FocusFrameHMargin) + { + value = gridRect.Rect().iBr.iX - gridRectCenter.Rect().iBr.iX; + } + else + { + value = gridRect.Rect().iBr.iY - gridRectCenter.Rect().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_ButtonShiftHorizontal: + case QStyle::PM_ButtonShiftVertical: + value = 0; + break; + + case QStyle::PM_ToolBarExtensionExtent: + value = PixelMetricTabValue(QStyle::PM_TabBarScrollButtonWidth, appWindow.Rect(), landscape); + 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_MenuScrollerHeight: // 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_SplitterWidth: // 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; + } |