aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@qt.io>2020-09-24 14:22:32 +0200
committerRichard Moe Gustavsen <richard.gustavsen@qt.io>2020-09-29 10:30:58 +0200
commit0ea96f1896a13c8e01b4ee9d45439565e19eb18a (patch)
tree84f8f19eb6d608a7a40ced17b15f977b5165b221
parent5e4f4ed2410a29914a70b7c7d0b7b4f3a136f289 (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>
-rw-r--r--src/imports/nativestyle/items/qquickstyleitem.cpp5
-rw-r--r--src/imports/nativestyle/items/qquickstyleitem.h2
-rw-r--r--src/imports/nativestyle/items/qquickstyleitembutton.cpp1
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemcheckbox.cpp1
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemcombobox.cpp1
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemdial.cpp1
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemradiobutton.cpp1
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemslider.cpp2
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemspinbox.cpp1
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemtextfield.cpp1
-rw-r--r--src/imports/nativestyle/qstyle/mac/qquickmacstyle_mac.mm22
-rw-r--r--src/imports/nativestyle/qstyle/qquickstyle.h10
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
};