diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2020-09-24 14:22:32 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2020-09-29 10:30:58 +0200 |
commit | 0ea96f1896a13c8e01b4ee9d45439565e19eb18a (patch) | |
tree | 84f8f19eb6d608a7a40ced17b15f977b5165b221 | |
parent | 5e4f4ed2410a29914a70b7c7d0b7b4f3a136f289 (diff) |
NativeStyle: add focusFrameRadius to QStyle
To be able to show a focus frame around a control
from QML, we need to know the control's geometry and radius.
For the geometry we can use the already existing layout rect.
But for the latter we need to add focusFrameRadius enums to
QStyle using the already existing pixel metric function.
Change-Id: I45619194766cccbf824d93073a4dcea3a0893fbe
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
12 files changed, 48 insertions, 0 deletions
diff --git a/src/imports/nativestyle/items/qquickstyleitem.cpp b/src/imports/nativestyle/items/qquickstyleitem.cpp index 1fd933ea..03659aa2 100644 --- a/src/imports/nativestyle/items/qquickstyleitem.cpp +++ b/src/imports/nativestyle/items/qquickstyleitem.cpp @@ -412,6 +412,11 @@ QQuickStyleMargins QQuickStyleItem::layoutMargins() const return QQuickStyleMargins(outerRect, m_styleItemGeometry.layoutRect); } +qreal QQuickStyleItem::focusFrameRadius() const +{ + return m_styleItemGeometry.focusFrameRadius; +} + QFont QQuickStyleItem::styleFont(QQuickItem *control) { Q_ASSERT(control); diff --git a/src/imports/nativestyle/items/qquickstyleitem.h b/src/imports/nativestyle/items/qquickstyleitem.h index daffa16f..3d5bfc31 100644 --- a/src/imports/nativestyle/items/qquickstyleitem.h +++ b/src/imports/nativestyle/items/qquickstyleitem.h @@ -145,6 +145,7 @@ struct StyleItemGeometry QRect contentRect; QRect layoutRect; QMargins ninePatchMargins; + qreal focusFrameRadius; }; QDebug operator<<(QDebug debug, const StyleItemGeometry &cg); @@ -201,6 +202,7 @@ public: QQuickStyleMargins contentPadding() const; QQuickStyleMargins layoutMargins() const; + qreal focusFrameRadius() const; Q_INVOKABLE virtual QFont styleFont(QQuickItem *control); diff --git a/src/imports/nativestyle/items/qquickstyleitembutton.cpp b/src/imports/nativestyle/items/qquickstyleitembutton.cpp index 8e45cc69..f3e2c3e1 100644 --- a/src/imports/nativestyle/items/qquickstyleitembutton.cpp +++ b/src/imports/nativestyle/items/qquickstyleitembutton.cpp @@ -60,6 +60,7 @@ StyleItemGeometry QQuickStyleItemButton::calculateGeometry() geometry.contentRect = style()->subElementRect(QStyle::SE_PushButtonContents, &styleOption); geometry.layoutRect = style()->subElementRect(QStyle::SE_PushButtonLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CE_PushButtonBevel, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_PushButtonFocusFrameRadius, &styleOption); return geometry; } diff --git a/src/imports/nativestyle/items/qquickstyleitemcheckbox.cpp b/src/imports/nativestyle/items/qquickstyleitemcheckbox.cpp index e5ee9133..f947caf4 100644 --- a/src/imports/nativestyle/items/qquickstyleitemcheckbox.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemcheckbox.cpp @@ -61,6 +61,7 @@ StyleItemGeometry QQuickStyleItemCheckBox::calculateGeometry() geometry.contentRect = style()->subElementRect(QStyle::SE_CheckBoxContents, &styleOption); geometry.layoutRect = style()->subElementRect(QStyle::SE_CheckBoxLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CE_CheckBox, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_CheckBoxFocusFrameRadius, &styleOption); // Spacing seems to already be baked into SE_CheckBoxContents, so ignore until needed //const int space = style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, &styleOption); diff --git a/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp b/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp index c9b7fca1..ba903b92 100644 --- a/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp @@ -60,6 +60,7 @@ StyleItemGeometry QQuickStyleItemComboBox::calculateGeometry() geometry.contentRect = style()->subControlRect(QStyle::CC_ComboBox, &styleOption, QStyle::SC_ComboBoxEditField); geometry.layoutRect = style()->subElementRect(QStyle::SE_ComboBoxLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CC_ComboBox, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_ComboBoxFocusFrameRadius, &styleOption); return geometry; } diff --git a/src/imports/nativestyle/items/qquickstyleitemdial.cpp b/src/imports/nativestyle/items/qquickstyleitemdial.cpp index f214fb2e..56357a7c 100644 --- a/src/imports/nativestyle/items/qquickstyleitemdial.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemdial.cpp @@ -63,6 +63,7 @@ StyleItemGeometry QQuickStyleItemDial::calculateGeometry() geometry.implicitSize = geometry.minimumSize; geometry.layoutRect = style()->subElementRect(QStyle::SE_SliderLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CC_Dial, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_DialFocusFrameRadius, &styleOption); return geometry; } diff --git a/src/imports/nativestyle/items/qquickstyleitemradiobutton.cpp b/src/imports/nativestyle/items/qquickstyleitemradiobutton.cpp index c8bb251f..b889474b 100644 --- a/src/imports/nativestyle/items/qquickstyleitemradiobutton.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemradiobutton.cpp @@ -61,6 +61,7 @@ StyleItemGeometry QQuickStyleItemRadioButton::calculateGeometry() geometry.contentRect = style()->subElementRect(QStyle::SE_RadioButtonContents, &styleOption); geometry.layoutRect = style()->subElementRect(QStyle::SE_RadioButtonLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CE_RadioButton, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_RadioButtonFocusFrameRadius, &styleOption); return geometry; } diff --git a/src/imports/nativestyle/items/qquickstyleitemslider.cpp b/src/imports/nativestyle/items/qquickstyleitemslider.cpp index 5ca282cc..faaf0057 100644 --- a/src/imports/nativestyle/items/qquickstyleitemslider.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemslider.cpp @@ -62,8 +62,10 @@ StyleItemGeometry QQuickStyleItemSlider::calculateGeometry() StyleItemGeometry geometry; geometry.minimumSize = style()->sizeFromContents(QStyle::CT_Slider, &styleOption, QSize(0, 0)); geometry.implicitSize = geometry.minimumSize; + styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize); geometry.layoutRect = style()->subElementRect(QStyle::SE_SliderLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CC_Slider, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_SliderFocusFrameRadius, &styleOption); return geometry; } diff --git a/src/imports/nativestyle/items/qquickstyleitemspinbox.cpp b/src/imports/nativestyle/items/qquickstyleitemspinbox.cpp index a2c4f1d1..bfce65bb 100644 --- a/src/imports/nativestyle/items/qquickstyleitemspinbox.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemspinbox.cpp @@ -63,6 +63,7 @@ StyleItemGeometry QQuickStyleItemSpinBox::calculateGeometry() geometry.contentRect = style()->subControlRect(QStyle::CC_SpinBox, &styleOption, QStyle::SC_SpinBoxEditField); geometry.layoutRect = style()->subElementRect(QStyle::SE_SpinBoxLayoutItem, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CC_SpinBox, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_SpinBoxFocusFrameRadius, &styleOption); } else { geometry.implicitSize = geometry.minimumSize; } diff --git a/src/imports/nativestyle/items/qquickstyleitemtextfield.cpp b/src/imports/nativestyle/items/qquickstyleitemtextfield.cpp index dff6a93b..d4b4a9a1 100644 --- a/src/imports/nativestyle/items/qquickstyleitemtextfield.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemtextfield.cpp @@ -61,6 +61,7 @@ StyleItemGeometry QQuickStyleItemTextField::calculateGeometry() geometry.layoutRect = styleOption.rect; geometry.contentRect = style()->subElementRect(QStyle::SE_LineEditContents, &styleOption); geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CE_ShapedFrame, &styleOption, geometry.minimumSize); + geometry.focusFrameRadius = style()->pixelMetric(QStyle::PM_TextFieldFocusFrameRadius, &styleOption); return geometry; } diff --git a/src/imports/nativestyle/qstyle/mac/qquickmacstyle_mac.mm b/src/imports/nativestyle/qstyle/mac/qquickmacstyle_mac.mm index e1aba599..2673e706 100644 --- a/src/imports/nativestyle/qstyle/mac/qquickmacstyle_mac.mm +++ b/src/imports/nativestyle/qstyle/mac/qquickmacstyle_mac.mm @@ -2223,6 +2223,28 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt) const ret = [NSScroller preferredScrollerStyle] == NSScrollerStyleOverlay ? pixelMetric(PM_ScrollBarExtent, opt) : 0; break; + case PM_PushButtonFocusFrameRadius: + ret = LargeSmallMini(opt, 8, 7, 5); + break; + case PM_CheckBoxFocusFrameRadius: + ret = LargeSmallMini(opt, 6, 5, 4); + break; + case PM_ComboBoxFocusFrameRadius: + ret = LargeSmallMini(opt, 8, 7, 4); + break; + case PM_RadioButtonFocusFrameRadius: + ret = 10; + break; + case PM_SliderFocusFrameRadius: + if (const QStyleOptionSlider *sliderOpt = qstyleoption_cast<const QStyleOptionSlider *>(opt)) + ret = sliderOpt->tickPosition == QStyleOptionSlider::NoTicks ? 10 : 3; + break; + case PM_DialFocusFrameRadius: + case PM_SpinBoxFocusFrameRadius: + case PM_TextAreaFocusFrameRadius: + case PM_TextFieldFocusFrameRadius: + ret = 3; + break; default: ret = QCommonStyle::pixelMetric(metric, opt); break; diff --git a/src/imports/nativestyle/qstyle/qquickstyle.h b/src/imports/nativestyle/qstyle/qquickstyle.h index 4a2e5287..38a0dcf5 100644 --- a/src/imports/nativestyle/qstyle/qquickstyle.h +++ b/src/imports/nativestyle/qstyle/qquickstyle.h @@ -524,6 +524,16 @@ public: PM_TitleBarButtonIconSize, PM_TitleBarButtonSize, + PM_PushButtonFocusFrameRadius, + PM_CheckBoxFocusFrameRadius, + PM_ComboBoxFocusFrameRadius, + PM_DialFocusFrameRadius, + PM_RadioButtonFocusFrameRadius, + PM_SliderFocusFrameRadius, + PM_SpinBoxFocusFrameRadius, + PM_TextAreaFocusFrameRadius, + PM_TextFieldFocusFrameRadius, + // do not add any values below/greater than this PM_CustomBase = 0xf0000000 }; |