aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicknativestyle
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicknativestyle')
-rw-r--r--src/quicknativestyle/CMakeLists.txt103
-rw-r--r--src/quicknativestyle/controls/DefaultButton.qml83
-rw-r--r--src/quicknativestyle/controls/DefaultCheckBox.qml93
-rw-r--r--src/quicknativestyle/controls/DefaultComboBox.qml129
-rw-r--r--src/quicknativestyle/controls/DefaultDial.qml60
-rw-r--r--src/quicknativestyle/controls/DefaultFrame.qml62
-rw-r--r--src/quicknativestyle/controls/DefaultGroupBox.qml91
-rw-r--r--src/quicknativestyle/controls/DefaultProgressBar.qml60
-rw-r--r--src/quicknativestyle/controls/DefaultRadioButton.qml96
-rw-r--r--src/quicknativestyle/controls/DefaultScrollBar.qml67
-rw-r--r--src/quicknativestyle/controls/DefaultSlider.qml74
-rw-r--r--src/quicknativestyle/controls/DefaultSpinBox.qml109
-rw-r--r--src/quicknativestyle/controls/DefaultTextArea.qml83
-rw-r--r--src/quicknativestyle/controls/DefaultTextField.qml89
-rw-r--r--src/quicknativestyle/controls/controls.pri14
-rw-r--r--src/quicknativestyle/items/items.pri36
-rw-r--r--src/quicknativestyle/items/qquickstyleitem.cpp563
-rw-r--r--src/quicknativestyle/items/qquickstyleitem.h311
-rw-r--r--src/quicknativestyle/items/qquickstyleitembutton.cpp88
-rw-r--r--src/quicknativestyle/items/qquickstyleitembutton.h60
-rw-r--r--src/quicknativestyle/items/qquickstyleitemcheckbox.cpp89
-rw-r--r--src/quicknativestyle/items/qquickstyleitemcheckbox.h60
-rw-r--r--src/quicknativestyle/items/qquickstyleitemcombobox.cpp89
-rw-r--r--src/quicknativestyle/items/qquickstyleitemcombobox.h60
-rw-r--r--src/quicknativestyle/items/qquickstyleitemdial.cpp111
-rw-r--r--src/quicknativestyle/items/qquickstyleitemdial.h60
-rw-r--r--src/quicknativestyle/items/qquickstyleitemframe.cpp67
-rw-r--r--src/quicknativestyle/items/qquickstyleitemframe.h56
-rw-r--r--src/quicknativestyle/items/qquickstyleitemgroupbox.cpp100
-rw-r--r--src/quicknativestyle/items/qquickstyleitemgroupbox.h70
-rw-r--r--src/quicknativestyle/items/qquickstyleitemprogressbar.cpp114
-rw-r--r--src/quicknativestyle/items/qquickstyleitemprogressbar.h61
-rw-r--r--src/quicknativestyle/items/qquickstyleitemradiobutton.cpp83
-rw-r--r--src/quicknativestyle/items/qquickstyleitemradiobutton.h60
-rw-r--r--src/quicknativestyle/items/qquickstyleitemscrollbar.cpp151
-rw-r--r--src/quicknativestyle/items/qquickstyleitemscrollbar.h74
-rw-r--r--src/quicknativestyle/items/qquickstyleitemscrollviewcorner.cpp119
-rw-r--r--src/quicknativestyle/items/qquickstyleitemscrollviewcorner.h56
-rw-r--r--src/quicknativestyle/items/qquickstyleitemslider.cpp123
-rw-r--r--src/quicknativestyle/items/qquickstyleitemslider.h72
-rw-r--r--src/quicknativestyle/items/qquickstyleitemspinbox.cpp110
-rw-r--r--src/quicknativestyle/items/qquickstyleitemspinbox.h73
-rw-r--r--src/quicknativestyle/items/qquickstyleitemtextfield.cpp86
-rw-r--r--src/quicknativestyle/items/qquickstyleitemtextfield.h60
-rw-r--r--src/quicknativestyle/qstyle/mac/mac.pri12
-rw-r--r--src/quicknativestyle/qstyle/mac/qquickmacstyle_mac.mm6072
-rw-r--r--src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p.h104
-rw-r--r--src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p_p.h230
-rw-r--r--src/quicknativestyle/qstyle/qquickcommonstyle.cpp6082
-rw-r--r--src/quicknativestyle/qstyle/qquickcommonstyle.h89
-rw-r--r--src/quicknativestyle/qstyle/qquickcommonstyle_p.h109
-rw-r--r--src/quicknativestyle/qstyle/qquickcommonstylepixmaps_p.h532
-rw-r--r--src/quicknativestyle/qstyle/qquickdrawutil.cpp1145
-rw-r--r--src/quicknativestyle/qstyle/qquickdrawutil.h170
-rw-r--r--src/quicknativestyle/qstyle/qquicknativestyle.cpp47
-rw-r--r--src/quicknativestyle/qstyle/qquicknativestyle.h69
-rw-r--r--src/quicknativestyle/qstyle/qquickstyle.cpp412
-rw-r--r--src/quicknativestyle/qstyle/qquickstyle.h839
-rw-r--r--src/quicknativestyle/qstyle/qquickstyle_p.h121
-rw-r--r--src/quicknativestyle/qstyle/qquickstylehelper.cpp438
-rw-r--r--src/quicknativestyle/qstyle/qquickstylehelper_p.h99
-rw-r--r--src/quicknativestyle/qstyle/qquickstyleoption.cpp652
-rw-r--r--src/quicknativestyle/qstyle/qquickstyleoption.h795
-rw-r--r--src/quicknativestyle/qstyle/qstyle.pri23
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsstyle.cpp2388
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p.h111
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p_p.h122
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle.cpp2509
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p.h109
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p_p.h204
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle.cpp4149
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p.h102
-rw-r--r--src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p_p.h348
-rw-r--r--src/quicknativestyle/qstyle/windows/windows.pri18
-rw-r--r--src/quicknativestyle/qtquickcontrols2nativestyleplugin.cpp164
-rw-r--r--src/quicknativestyle/util/FocusFrame.qml118
-rw-r--r--src/quicknativestyle/util/qquickmacfocusframe.h73
-rw-r--r--src/quicknativestyle/util/qquickmacfocusframe.mm181
-rw-r--r--src/quicknativestyle/util/util.pri11
79 files changed, 0 insertions, 32922 deletions
diff --git a/src/quicknativestyle/CMakeLists.txt b/src/quicknativestyle/CMakeLists.txt
deleted file mode 100644
index 428938c2..00000000
--- a/src/quicknativestyle/CMakeLists.txt
+++ /dev/null
@@ -1,103 +0,0 @@
-#####################################################################
-## qtquickcontrols2nativestyleplugin Plugin:
-#####################################################################
-
-set(qml_files
- "controls/DefaultButton.qml"
- "controls/DefaultSlider.qml"
- "controls/DefaultGroupBox.qml"
- "controls/DefaultCheckBox.qml"
- "controls/DefaultRadioButton.qml"
- "controls/DefaultSpinBox.qml"
- "controls/DefaultTextField.qml"
- "controls/DefaultFrame.qml"
- "controls/DefaultTextArea.qml"
- "controls/DefaultComboBox.qml"
- "controls/DefaultScrollBar.qml"
- "controls/DefaultProgressBar.qml"
- "controls/DefaultDial.qml"
-)
-set_source_files_properties(${qml_files} PROPERTIES
- QT_QML_SOURCE_VERSION "2.0;6.0"
-)
-
-if(MACOS)
- # TODO: QT_QML_SOURCE_VERSION wasn't set on this file before, should it be?
- list(APPEND qml_files "util/FocusFrame.qml")
-endif()
-
-qt_internal_add_qml_module(qtquickcontrols2nativestyleplugin
- URI "QtQuick.NativeStyle"
- VERSION "${PROJECT_VERSION}"
- CLASSNAME QtQuickControls2NativeStylePlugin
- DEPENDENCIES
- QtQuick.Controls/auto
- QtQuick.Layouts/auto
- PAST_MAJOR_VERSIONS 2
- PLUGIN_TARGET qtquickcontrols2nativestyleplugin
- NO_PLUGIN_OPTIONAL
- NO_GENERATE_PLUGIN_SOURCE
- SOURCES
- items/qquickstyleitem.cpp items/qquickstyleitem.h
- items/qquickstyleitembutton.cpp items/qquickstyleitembutton.h
- items/qquickstyleitemcheckbox.cpp items/qquickstyleitemcheckbox.h
- items/qquickstyleitemcombobox.cpp items/qquickstyleitemcombobox.h
- items/qquickstyleitemdial.cpp items/qquickstyleitemdial.h
- items/qquickstyleitemframe.cpp items/qquickstyleitemframe.h
- items/qquickstyleitemgroupbox.cpp items/qquickstyleitemgroupbox.h
- items/qquickstyleitemprogressbar.cpp items/qquickstyleitemprogressbar.h
- items/qquickstyleitemradiobutton.cpp items/qquickstyleitemradiobutton.h
- items/qquickstyleitemscrollbar.cpp items/qquickstyleitemscrollbar.h
- items/qquickstyleitemslider.cpp items/qquickstyleitemslider.h
- items/qquickstyleitemspinbox.cpp items/qquickstyleitemspinbox.h
- items/qquickstyleitemtextfield.cpp items/qquickstyleitemtextfield.h
- qstyle/qquickcommonstyle.cpp qstyle/qquickcommonstyle.h qstyle/qquickcommonstyle_p.h
- qstyle/qquickcommonstylepixmaps_p.h
- qstyle/qquickdrawutil.cpp qstyle/qquickdrawutil.h
- qstyle/qquicknativestyle.cpp qstyle/qquicknativestyle.h
- qstyle/qquickstyle.cpp qstyle/qquickstyle.h qstyle/qquickstyle_p.h
- qstyle/qquickstylehelper.cpp qstyle/qquickstylehelper_p.h
- qstyle/qquickstyleoption.cpp qstyle/qquickstyleoption.h
- qtquickcontrols2nativestyleplugin.cpp
- QML_FILES
- ${qml_files}
- DEFINES
- QT_NO_CAST_FROM_ASCII
- QT_NO_CAST_TO_ASCII
- INCLUDE_DIRECTORIES
- items
- qstyle
- util
- LIBRARIES
- Qt::CorePrivate
- Qt::GuiPrivate
- Qt::QmlPrivate
- Qt::QuickControls2Private
- Qt::QuickPrivate
- Qt::QuickTemplates2Private
-)
-
-qt_internal_extend_target(qtquickcontrols2nativestyleplugin CONDITION MACOS
- SOURCES
- items/qquickstyleitemscrollviewcorner.cpp items/qquickstyleitemscrollviewcorner.h
- qstyle/mac/qquickmacstyle_mac.mm qstyle/mac/qquickmacstyle_mac_p.h
- qstyle/mac/qquickmacstyle_mac_p_p.h
- util/qquickmacfocusframe.h util/qquickmacfocusframe.mm
- INCLUDE_DIRECTORIES
- qstyle/mac
- LIBRARIES
- ${FWAppKit}
-)
-
-qt_internal_extend_target(qtquickcontrols2nativestyleplugin CONDITION WIN32
- SOURCES
- qstyle/windows/qquickwindowsstyle.cpp qstyle/windows/qquickwindowsstyle_p.h
- qstyle/windows/qquickwindowsstyle_p_p.h
- qstyle/windows/qquickwindowsxpstyle.cpp
- INCLUDE_DIRECTORIES
- qstyle/windows
- LIBRARIES
- gdi32
- user32
- uxtheme
-)
diff --git a/src/quicknativestyle/controls/DefaultButton.qml b/src/quicknativestyle/controls/DefaultButton.qml
deleted file mode 100644
index 7e55aaa2..00000000
--- a/src/quicknativestyle/controls/DefaultButton.qml
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Controls.impl
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.Button {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- // Since QQuickControl will subtract the insets from the control size to
- // figure out the background size, we need to reverse that here, otherwise
- // the control ends up too big.
- implicitWidth: implicitBackgroundWidth + leftInset + rightInset
- implicitHeight: implicitBackgroundHeight + topInset + bottomInset
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- leftPadding: __nativeBackground ? background.contentPadding.left : 5
- rightPadding: __nativeBackground ? background.contentPadding.right : 5
- topPadding: __nativeBackground ? background.contentPadding.top : 5
- bottomPadding: __nativeBackground ? background.contentPadding.bottom : 5
-
- background: NativeStyle.Button {
- control: control
- contentWidth: contentItem.implicitWidth
- contentHeight: contentItem.implicitHeight
- }
-
- icon.width: 24
- icon.height: 24
- icon.color: control.checked || control.highlighted ? control.palette.brightText :
- control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
-
- contentItem: IconLabel {
- spacing: control.spacing
- mirrored: control.mirrored
- display: control.display
-
- icon: control.icon
- text: control.text
- font: control.font
- color: control.checked || control.highlighted ? control.palette.brightText :
- control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultCheckBox.qml b/src/quicknativestyle/controls/DefaultCheckBox.qml
deleted file mode 100644
index 09166820..00000000
--- a/src/quicknativestyle/controls/DefaultCheckBox.qml
+++ /dev/null
@@ -1,93 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Templates as T
-import QtQuick.Controls
-import QtQuick.Controls.impl
-import QtQuick.NativeStyle as NativeStyle
-
-T.CheckBox {
- id: control
-
- readonly property bool nativeIndicator: indicator instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitContentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitContentHeight + topPadding + bottomPadding,
- implicitIndicatorHeight + topPadding + bottomPadding)
-
- font.pixelSize: nativeIndicator ? indicator.styleFont(control).pixelSize : undefined
-
- spacing: nativeIndicator ? 0 : 6
- padding: nativeIndicator ? 0 : 6
-
- indicator: NativeStyle.CheckBox {
- control: control
- y: control.topPadding + (control.availableHeight - height) >> 1
- contentWidth: contentItem.implicitWidth
- contentHeight: contentItem.implicitHeight
- useNinePatchImage: false
- }
-
- contentItem: CheckLabel {
- text: control.text
- font: control.font
- color: control.palette.windowText
-
- // For some reason, the other styles set padding here (in the delegate), instead of in
- // the control above. And they also adjust the indicator position by setting x and y
- // explicitly (instead of using insets). So we follow the same pattern to ensure that
- // setting a custom contentItem delegate from the app will end up looking the same for
- // all styles. But this should probably be fixed for all styles (to make them work the
- // same way as e.g Buttons).
- leftPadding: {
- if (nativeIndicator)
- indicator.contentPadding.left
- else
- indicator && !mirrored ? indicator.width + spacing : 0
- }
-
- topPadding: nativeIndicator ? indicator.contentPadding.top : 0
- rightPadding: {
- if (nativeIndicator)
- indicator.contentPadding.right
- else
- indicator && mirrored ? indicator.width + spacing : 0
- }
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultComboBox.qml b/src/quicknativestyle/controls/DefaultComboBox.qml
deleted file mode 100644
index 7b286a1e..00000000
--- a/src/quicknativestyle/controls/DefaultComboBox.qml
+++ /dev/null
@@ -1,129 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Window
-import QtQuick.Controls
-import QtQuick.Controls.impl
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.ComboBox {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitContentWidth + leftPadding + rightPadding,
- 90 /* minimum */ )
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitContentHeight + topPadding + bottomPadding,
- implicitIndicatorHeight + topPadding + bottomPadding)
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- leftPadding: __nativeBackground ? background.contentPadding.left : 5
- rightPadding: __nativeBackground ? background.contentPadding.right : 5
- topPadding: __nativeBackground ? background.contentPadding.top : 5
- bottomPadding: __nativeBackground ? background.contentPadding.bottom : 5
-
- contentItem: T.TextField {
- implicitWidth: contentWidth
- implicitHeight: contentHeight
- text: control.editable ? control.editText : control.displayText
-
- enabled: control.editable
- autoScroll: control.editable
- readOnly: control.down
- inputMethodHints: control.inputMethodHints
- validator: control.validator
- selectByMouse: control.selectTextByMouse
-
- font: control.font
- color: control.editable ? control.palette.text : control.palette.buttonText
- selectionColor: control.palette.highlight
- selectedTextColor: control.palette.highlightedText
- verticalAlignment: Text.AlignVCenter
- }
-
- background: NativeStyle.ComboBox {
- control: control
- contentWidth: contentItem.implicitWidth
- contentHeight: contentItem.implicitHeight
- }
-
- delegate: ItemDelegate {
- width: ListView.view.width
- text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
- palette.text: control.palette.text
- palette.highlightedText: control.palette.highlightedText
- font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
- highlighted: control.highlightedIndex === index
- hoverEnabled: control.hoverEnabled
- }
-
- popup: T.Popup {
- readonly property var layoutMargins: control.__nativeBackground ? control.background.layoutMargins : null
- x: layoutMargins ? layoutMargins.left : 0
- y: control.height - (layoutMargins ? layoutMargins.bottom : 0)
- width: control.width - (layoutMargins ? layoutMargins.left + layoutMargins.right : 0)
- height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
- topMargin: 6
- bottomMargin: 6
-
- contentItem: ListView {
- clip: true
- implicitHeight: contentHeight
- model: control.delegateModel
- currentIndex: control.highlightedIndex
- highlightMoveDuration: 0
-
- Rectangle {
- z: 10
- width: parent.width
- height: parent.height
- color: "transparent"
- border.color: control.palette.mid
- }
-
- T.ScrollIndicator.vertical: ScrollIndicator { }
- }
-
- background: Rectangle {
- color: control.palette.window
- }
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultDial.qml b/src/quicknativestyle/controls/DefaultDial.qml
deleted file mode 100644
index b628ed09..00000000
--- a/src/quicknativestyle/controls/DefaultDial.qml
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.Dial {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitContentWidth + leftPadding + rightPadding,
- 80 /* minimum */ )
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitContentHeight + topPadding + bottomPadding,
- 80 /* minimum */ )
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- background: NativeStyle.Dial {
- control: control
- useNinePatchImage: false
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultFrame.qml b/src/quicknativestyle/controls/DefaultFrame.qml
deleted file mode 100644
index 77ca6125..00000000
--- a/src/quicknativestyle/controls/DefaultFrame.qml
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.Frame {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- contentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- contentHeight + topPadding + bottomPadding)
-
- leftPadding: __nativeBackground ? background.contentPadding.left : 12
- rightPadding: __nativeBackground ? background.contentPadding.right : 12
- topPadding: __nativeBackground ? background.contentPadding.top : 12
- bottomPadding: __nativeBackground ? background.contentPadding.bottom : 12
-
- background: NativeStyle.Frame {
- control: control
- contentWidth: control.contentWidth
- contentHeight: control.contentHeight
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultGroupBox.qml b/src/quicknativestyle/controls/DefaultGroupBox.qml
deleted file mode 100644
index a7f3f9d0..00000000
--- a/src/quicknativestyle/controls/DefaultGroupBox.qml
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.GroupBox {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- contentWidth + leftPadding + rightPadding,
- implicitLabelWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- contentHeight + topPadding + bottomPadding)
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- label: Rectangle {
- color: control.palette.window
- property point labelPos : control.__nativeBackground
- ? background.labelPos
- : Qt.point(0,0)
- x: labelPos.x + background.x
- y: labelPos.y + background.y - (__nativeBackground ? background.groupBoxPadding.top : 0)
- width: children[0].implicitWidth
- height: children[0].implicitHeight
- Text {
- width: parent.width
- height: parent.height
- text: control.title
- font: control.font
- color: control.palette.windowText
- elide: Text.ElideRight
- verticalAlignment: Text.AlignVCenter
- }
- }
-
- leftPadding: __nativeBackground ? background.contentPadding.left : 0
- rightPadding: __nativeBackground ? background.contentPadding.right : 0
- topPadding: __nativeBackground ? background.contentPadding.top : 0
- bottomPadding: __nativeBackground ? background.contentPadding.bottom : 0
-
- background: NativeStyle.GroupBox {
- control: control
-
- x: groupBoxPadding.left
- y: groupBoxPadding.top
- width: contentItem.width + control.leftPadding + control.rightPadding - groupBoxPadding.left - groupBoxPadding.right
- height: contentItem.height + control.topPadding + control.bottomPadding - groupBoxPadding.top - groupBoxPadding.bottom
-
- contentWidth: contentItem.implicitWidth
- contentHeight: contentItem.implicitHeight
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultProgressBar.qml b/src/quicknativestyle/controls/DefaultProgressBar.qml
deleted file mode 100644
index 037bdbae..00000000
--- a/src/quicknativestyle/controls/DefaultProgressBar.qml
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Templates as T
-import QtQuick.Controls
-import QtQuick.NativeStyle as NativeStyle
-
-T.ProgressBar {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitContentWidth + leftPadding + rightPadding,
- control.horizontal ? 90 : 0 /* minimum */ )
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitContentHeight + topPadding + bottomPadding,
- control.vertical ? 90 : 0 /* minimum */ )
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- background: NativeStyle.ProgressBar {
- control: control
- useNinePatchImage: false
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultRadioButton.qml b/src/quicknativestyle/controls/DefaultRadioButton.qml
deleted file mode 100644
index 29746ba7..00000000
--- a/src/quicknativestyle/controls/DefaultRadioButton.qml
+++ /dev/null
@@ -1,96 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Templates as T
-import QtQuick.Controls
-import QtQuick.Controls.impl
-import QtQuick.NativeStyle as NativeStyle
-
-T.RadioButton {
- id: control
-
- readonly property bool nativeIndicator: indicator instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitContentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitContentHeight + topPadding + bottomPadding,
- implicitIndicatorHeight + topPadding + bottomPadding)
-
- font.pixelSize: nativeIndicator ? indicator.styleFont(control).pixelSize : undefined
-
- spacing: nativeIndicator ? 0 : 6
- padding: nativeIndicator ? 0 : 6
-
- indicator: NativeStyle.RadioButton {
- control: control
- contentWidth: contentItem.implicitWidth
- contentHeight: contentItem.implicitHeight
- useNinePatchImage: false
-// Component.onCompleted: {
-// var f = indicator.font(control)
-// control.font.pixelSize = f.pixelSize
-// print(f)
-// }
- }
-
- contentItem: CheckLabel {
- text: control.text
- font: control.font
- color: control.palette.windowText
-
- // For some reason, the other styles set padding here (in the delegate), instead of in
- // the control above. And they also adjust the indicator position by setting x and y
- // explicitly (instead of using insets). So we follow the same pattern to ensure that
- // setting a custom contentItem delegate from the app will end up looking the same for
- // all styles. But this should probably be fixed for all styles (to make them work the
- // same way as e.g Buttons).
- leftPadding: {
- if (nativeIndicator)
- indicator.contentPadding.left
- else
- indicator && !mirrored ? indicator.width + spacing : 0
- }
-
- rightPadding: {
- if (nativeIndicator)
- indicator.contentPadding.right
- else
- indicator && mirrored ? indicator.width + spacing : 0
- }
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultScrollBar.qml b/src/quicknativestyle/controls/DefaultScrollBar.qml
deleted file mode 100644
index b7b78732..00000000
--- a/src/quicknativestyle/controls/DefaultScrollBar.qml
+++ /dev/null
@@ -1,67 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.ScrollBar {
- id: control
-
- readonly property bool __nativeContentItem: contentItem instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitContentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitContentHeight + topPadding + bottomPadding)
-
- font.pixelSize: __nativeContentItem ? contentItem.styleFont(control).pixelSize : undefined
-
- visible: policy === T.ScrollBar.AlwaysOn || (policy === T.ScrollBar.AsNeeded && size < 1.0)
- minimumSize: !__nativeContentItem ? 10 : orientation === Qt.Vertical ?
- contentItem.minimumSize.height / height : contentItem.minimumSize.width / width
-
- background: NativeStyle.ScrollBar {
- control: control
- subControl: NativeStyle.ScrollBar.Groove
- }
-
- contentItem: NativeStyle.ScrollBar {
- control: control
- subControl: NativeStyle.ScrollBar.Handle
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultSlider.qml b/src/quicknativestyle/controls/DefaultSlider.qml
deleted file mode 100644
index ebc1c265..00000000
--- a/src/quicknativestyle/controls/DefaultSlider.qml
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.Slider {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitHandleWidth + leftPadding + rightPadding,
- control.horizontal ? 90 : 0 /* minimum */ )
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitHandleHeight + topPadding + bottomPadding,
- control.vertical ? 90 : 0 /* minimum */ )
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- background: NativeStyle.Slider {
- control: control
- subControl: NativeStyle.Slider.Groove
- // We normally cannot use a nine patch image for the
- // groove if we draw tickmarks (since then the scaling
- // would scale the tickmarks too). The groove might
- // also use a different background color before, and
- // after, the handle.
- useNinePatchImage: false
- }
-
- handle: NativeStyle.Slider {
- control: control
- subControl: NativeStyle.Slider.Handle
- x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
- y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))
- useNinePatchImage: false
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultSpinBox.qml b/src/quicknativestyle/controls/DefaultSpinBox.qml
deleted file mode 100644
index 869ff411..00000000
--- a/src/quicknativestyle/controls/DefaultSpinBox.qml
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.SpinBox {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(implicitBackgroundWidth + spacing + up.implicitIndicatorWidth
- + leftInset + rightInset,
- 90 /* minimum */ )
- implicitHeight: Math.max(implicitBackgroundHeight, up.implicitIndicatorHeight + down.implicitIndicatorHeight
- + (spacing * 3)) + topInset + bottomInset
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- spacing: 2
-
- leftPadding: (__nativeBackground ? background.contentPadding.left: 0)
- topPadding: (__nativeBackground ? background.contentPadding.top: 0)
- rightPadding: (__nativeBackground ? background.contentPadding.right : 0) + up.implicitIndicatorWidth + spacing
- bottomPadding: (__nativeBackground ? background.contentPadding.bottom: 0) + spacing
-
- validator: IntValidator {
- locale: control.locale.name
- bottom: Math.min(control.from, control.to)
- top: Math.max(control.from, control.to)
- }
-
- contentItem: TextInput {
- text: control.displayText
- font: font.font
- color: control.palette.text
- selectionColor: control.palette.highlight
- selectedTextColor: control.palette.highlightedText
- horizontalAlignment: Qt.AlignLeft
- verticalAlignment: Qt.AlignVCenter
-
- topPadding: 2
- bottomPadding: 2
- leftPadding: 10
- rightPadding: 10
-
- readOnly: !control.editable
- validator: control.validator
- inputMethodHints: control.inputMethodHints
- }
-
- up.indicator: NativeStyle.SpinBox {
- control: control
- subControl: NativeStyle.SpinBox.Up
- x: parent.width - width - spacing
- y: (parent.height / 2) - height
- useNinePatchImage: false
- }
-
- down.indicator: NativeStyle.SpinBox {
- control: control
- subControl: NativeStyle.SpinBox.Down
- x: up.indicator.x
- y: up.indicator.y + up.indicator.height
- useNinePatchImage: false
- }
-
- background: NativeStyle.SpinBox {
- control: control
- subControl: NativeStyle.SpinBox.Frame
- contentWidth: contentItem.implicitWidth
- contentHeight: contentItem.implicitHeight
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultTextArea.qml b/src/quicknativestyle/controls/DefaultTextArea.qml
deleted file mode 100644
index c634da7e..00000000
--- a/src/quicknativestyle/controls/DefaultTextArea.qml
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Controls.impl
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.TextArea {
- id: control
-
- implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
- implicitBackgroundWidth + leftInset + rightInset,
- placeholder.implicitWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,
- implicitBackgroundHeight + topInset + bottomInset,
- placeholder.implicitHeight + topPadding + bottomPadding)
-
- leftPadding: 7
- rightPadding: 7
- topPadding: 3
- bottomPadding: 3
-
- color: control.palette.text
- selectionColor: control.palette.highlight
- selectedTextColor: control.palette.highlightedText
- placeholderTextColor: control.palette.placeholderText
- verticalAlignment: TextInput.AlignTop
-
- PlaceholderText {
- id: placeholder
- height: control.height
- topPadding: control.topPadding
- bottomPadding: control.bottomPadding
- leftPadding: control.leftPadding
- rightPadding: control.rightPadding
- text: control.placeholderText
- font: control.font
- color: control.placeholderTextColor
- verticalAlignment: control.verticalAlignment
- visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
- elide: Text.ElideRight
- renderType: control.renderType
- }
-
- background: Rectangle {
- color: control.palette.light
- }
-}
diff --git a/src/quicknativestyle/controls/DefaultTextField.qml b/src/quicknativestyle/controls/DefaultTextField.qml
deleted file mode 100644
index 8f8c8e4d..00000000
--- a/src/quicknativestyle/controls/DefaultTextField.qml
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Controls.impl
-import QtQuick.Templates as T
-import QtQuick.NativeStyle as NativeStyle
-
-T.TextField {
- id: control
-
- readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
-
- implicitWidth: Math.max(Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding,
- implicitBackgroundWidth + leftInset + rightInset,
- 90 /* minimum */ )
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- contentHeight + topPadding + bottomPadding,
- placeholder.implicitHeight + topPadding + bottomPadding)
-
- font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined
-
- leftPadding: __nativeBackground ? background.contentPadding.left: 7
- rightPadding: __nativeBackground ? background.contentPadding.right: 7
- topPadding: __nativeBackground ? background.contentPadding.top: 3
- bottomPadding: __nativeBackground ? background.contentPadding.bottom: 3
-
- color: control.palette.text
- selectionColor: control.palette.highlight
- selectedTextColor: control.palette.highlightedText
- placeholderTextColor: control.palette.placeholderText
- verticalAlignment: TextInput.AlignTop
-
- PlaceholderText {
- id: placeholder
- height: control.height
- topPadding: control.topPadding
- bottomPadding: control.bottomPadding
- leftPadding: control.leftPadding
- rightPadding: control.rightPadding
- text: control.placeholderText
- font: control.font
- color: control.placeholderTextColor
- verticalAlignment: control.verticalAlignment
- visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
- elide: Text.ElideRight
- renderType: control.renderType
- }
-
- background: NativeStyle.TextField {
- control: control
- contentWidth: Math.max(control.contentWidth, placeholder.implicitWidth)
- contentHeight: control.contentHeight
- }
-}
diff --git a/src/quicknativestyle/controls/controls.pri b/src/quicknativestyle/controls/controls.pri
deleted file mode 100644
index 8675989e..00000000
--- a/src/quicknativestyle/controls/controls.pri
+++ /dev/null
@@ -1,14 +0,0 @@
-QML_FILES += \
- $$PWD/DefaultButton.qml \
- $$PWD/DefaultSlider.qml \
- $$PWD/DefaultGroupBox.qml \
- $$PWD/DefaultCheckBox.qml \
- $$PWD/DefaultRadioButton.qml \
- $$PWD/DefaultSpinBox.qml \
- $$PWD/DefaultTextField.qml \
- $$PWD/DefaultFrame.qml \
- $$PWD/DefaultTextArea.qml \
- $$PWD/DefaultComboBox.qml \
- $$PWD/DefaultScrollBar.qml \
- $$PWD/DefaultProgressBar.qml \
- $$PWD/DefaultDial.qml \
diff --git a/src/quicknativestyle/items/items.pri b/src/quicknativestyle/items/items.pri
deleted file mode 100644
index 5b6d9251..00000000
--- a/src/quicknativestyle/items/items.pri
+++ /dev/null
@@ -1,36 +0,0 @@
-INCLUDEPATH += $$PWD
-
-HEADERS += \
- $$PWD/qquickstyleitem.h \
- $$PWD/qquickstyleitembutton.h \
- $$PWD/qquickstyleitemgroupbox.h \
- $$PWD/qquickstyleitemcheckbox.h \
- $$PWD/qquickstyleitemradiobutton.h \
- $$PWD/qquickstyleitemslider.h \
- $$PWD/qquickstyleitemspinbox.h \
- $$PWD/qquickstyleitemtextfield.h \
- $$PWD/qquickstyleitemframe.h \
- $$PWD/qquickstyleitemcombobox.h \
- $$PWD/qquickstyleitemscrollbar.h \
- $$PWD/qquickstyleitemprogressbar.h \
- $$PWD/qquickstyleitemdial.h \
-
-SOURCES += \
- $$PWD/qquickstyleitem.cpp \
- $$PWD/qquickstyleitembutton.cpp \
- $$PWD/qquickstyleitemgroupbox.cpp \
- $$PWD/qquickstyleitemcheckbox.cpp \
- $$PWD/qquickstyleitemradiobutton.cpp \
- $$PWD/qquickstyleitemslider.cpp \
- $$PWD/qquickstyleitemspinbox.cpp \
- $$PWD/qquickstyleitemtextfield.cpp \
- $$PWD/qquickstyleitemframe.cpp \
- $$PWD/qquickstyleitemcombobox.cpp \
- $$PWD/qquickstyleitemscrollbar.cpp \
- $$PWD/qquickstyleitemprogressbar.cpp \
- $$PWD/qquickstyleitemdial.cpp \
-
-macos {
- HEADERS += $$PWD/qquickstyleitemscrollviewcorner.h
- SOURCES += $$PWD/qquickstyleitemscrollviewcorner.cpp
-}
diff --git a/src/quicknativestyle/items/qquickstyleitem.cpp b/src/quicknativestyle/items/qquickstyleitem.cpp
deleted file mode 100644
index ec041d01..00000000
--- a/src/quicknativestyle/items/qquickstyleitem.cpp
+++ /dev/null
@@ -1,563 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitem.h"
-
-#include <QtCore/qscopedvaluerollback.h>
-#include <QtCore/qdir.h>
-
-#include <QtQuick/qsgninepatchnode.h>
-#include <QtQuick/private/qquickwindow_p.h>
-#include <QtQuick/qquickwindow.h>
-
-#include <QtQuickTemplates2/private/qquickcontrol_p.h>
-#include <QtQuickTemplates2/private/qquickbutton_p.h>
-
-#include <QtQml/qqml.h>
-
-#include "qquickstyleitembutton.h"
-#include "qquickstylehelper_p.h"
-
-QT_BEGIN_NAMESPACE
-
-QDebug operator<<(QDebug debug, const QQuickStyleMargins &padding)
-{
- QDebugStateSaver saver(debug);
- debug.nospace();
- debug << "StyleMargins(";
- debug << padding.left() << ", ";
- debug << padding.top() << ", ";
- debug << padding.right() << ", ";
- debug << padding.bottom();
- debug << ')';
- return debug;
-}
-
-QDebug operator<<(QDebug debug, const StyleItemGeometry &cg)
-{
- QDebugStateSaver saver(debug);
- debug.nospace();
- debug << "StyleItemGeometry(";
- debug << "implicitSize:" << cg.implicitSize << ", ";
- debug << "contentRect:" << cg.contentRect << ", ";
- debug << "layoutRect:" << cg.layoutRect << ", ";
- debug << "minimumSize:" << cg.minimumSize << ", ";
- debug << "9patchMargins:" << cg.ninePatchMargins;
- debug << ')';
- return debug;
-}
-
-int QQuickStyleItem::dprAlignedSize(const int size) const
-{
- // Return the first value equal to or bigger than size
- // that is a whole number when multiplied with the dpr.
- static int multiplier = [&]() {
- const qreal dpr = window()->devicePixelRatio();
- for (int m = 1; m <= 10; ++m) {
- const qreal v = m * dpr;
- if (v == int(v))
- return m;
- }
-
- qWarning() << "The current dpr (" << dpr << ") is not supported"
- << "by the style and might result in drawing artifacts";
- return 1;
- }();
-
- return int(qCeil(qreal(size) / qreal(multiplier)) * multiplier);
-}
-
-QQuickStyleItem::QQuickStyleItem(QQuickItem *parent)
- : QQuickItem(parent)
-{
- setFlag(QQuickItem::ItemHasContents);
-}
-
-QQuickStyleItem::~QQuickStyleItem()
-{
-}
-
-void QQuickStyleItem::connectToControl() const
-{
- connect(m_control, &QQuickStyleItem::enabledChanged, this, &QQuickStyleItem::markImageDirty);
- connect(m_control, &QQuickItem::activeFocusChanged, this, &QQuickStyleItem::markImageDirty);
-
- if (QQuickWindow *win = window()) {
- connect(win, &QQuickWindow::activeChanged, this, &QQuickStyleItem::markImageDirty);
- m_connectedWindow = win;
- }
-}
-
-void QQuickStyleItem::markImageDirty()
-{
- m_dirty.setFlag(DirtyFlag::Image);
- if (isComponentComplete())
- polish();
-}
-
-void QQuickStyleItem::markGeometryDirty()
-{
- m_dirty.setFlag(DirtyFlag::Geometry);
- if (isComponentComplete())
- polish();
-}
-
-QSGNode *QQuickStyleItem::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
-{
- QSGNinePatchNode *node = static_cast<QSGNinePatchNode *>(oldNode);
- if (!node)
- node = window()->createNinePatchNode();
- if (m_paintedImage.isNull())
- return node;
-
- const auto texture = window()->createTextureFromImage(m_paintedImage, QQuickWindow::TextureCanUseAtlas);
-
- QRectF bounds = boundingRect();
- const qreal dpr = window()->devicePixelRatio();
- const QSizeF unscaledImageSize = QSizeF(m_paintedImage.size()) / dpr;
-
- // We can scale the image up with a nine patch node, but should
- // avoid to scale it down. Otherwise the nine patch image will look
- // wrapped (or look truncated, in case of no padding). So if the
- // item is smaller that the image, don't scale.
- if (bounds.width() < unscaledImageSize.width())
- bounds.setWidth(unscaledImageSize.width());
- if (bounds.height() < unscaledImageSize.height())
- bounds.setHeight(unscaledImageSize.height());
-
-#ifdef QT_DEBUG
- if (m_debugFlags.testFlag(Unscaled)) {
- bounds.setSize(unscaledImageSize);
- qqc2Info() << "Setting qsg node size to the unscaled size of m_paintedImage:" << bounds;
- }
-#endif
-
- if (m_useNinePatchImage) {
- QMargins padding = m_styleItemGeometry.ninePatchMargins;
- if (padding.right() == -1) {
- // Special case: a padding of -1 means that
- // the image shouldn't scale in the given direction.
- padding.setLeft(0);
- padding.setRight(0);
- }
- if (padding.bottom() == -1) {
- padding.setTop(0);
- padding.setBottom(0);
- }
- node->setPadding(padding.left(), padding.top(), padding.right(), padding.bottom());
- }
-
- node->setBounds(bounds);
- node->setTexture(texture);
- node->setDevicePixelRatio(dpr);
- node->update();
-
- return node;
-}
-
-QStyle::State QQuickStyleItem::controlSize(QQuickItem *item)
-{
- // TODO: add proper API for small and mini
- if (item->metaObject()->indexOfProperty("qqc2_style_small") != -1)
- return QStyle::State_Small;
- if (item->metaObject()->indexOfProperty("qqc2_style_mini") != -1)
- return QStyle::State_Mini;
- return QStyle::State_None;
-}
-
-void QQuickStyleItem::initStyleOptionBase(QStyleOption &styleOption) const
-{
- Q_ASSERT(m_control);
-
- styleOption.control = const_cast<QQuickItem *>(control<QQuickItem>());
- styleOption.window = window();
- styleOption.palette = QQuickItemPrivate::get(m_control)->palette()->toQPalette();
- styleOption.rect = QRect(QPoint(0, 0), imageSize());
-
- styleOption.state = QStyle::State_None;
- styleOption.state |= controlSize(styleOption.control);
-
- // Note: not all controls inherit from QQuickControl (e.g QQuickTextField)
- if (const auto quickControl = dynamic_cast<QQuickControl *>(m_control.data()))
- styleOption.direction = quickControl->isMirrored() ? Qt::RightToLeft : Qt::LeftToRight;
-
- if (window()) {
- if (styleOption.window->isActive())
- styleOption.state |= QStyle::State_Active;
- if (m_control->isEnabled())
- styleOption.state |= QStyle::State_Enabled;
- if (m_control->hasActiveFocus())
- styleOption.state |= QStyle::State_HasFocus;
- if (m_control->isUnderMouse())
- styleOption.state |= QStyle::State_MouseOver;
- // Should this depend on the focusReason (e.g. only TabFocus) ?
- styleOption.state |= QStyle::State_KeyboardFocusChange;
- }
-
- if (m_overrideState != None) {
- // In Button.qml we fade between two versions of
- // the handle, depending on if it's hovered or not
- if (m_overrideState & AlwaysHovered)
- styleOption.state |= QStyle::State_MouseOver;
- else if (m_overrideState & NeverHovered)
- styleOption.state &= ~QStyle::State_MouseOver;
- }
-
- qqc2Info() << styleOption;
-}
-
-void QQuickStyleItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
-{
- QQuickItem::geometryChange(newGeometry, oldGeometry);
-
- // Ensure that we only schedule a new geometry update
- // and polish if this geometry change was caused by
- // something else than us already updating geometry.
- if (!m_polishing)
- markGeometryDirty();
-}
-
-void QQuickStyleItem::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data)
-{
- QQuickItem::itemChange(change, data);
-
- switch (change) {
- case QQuickItem::ItemVisibleHasChanged:
- if (data.boolValue)
- markImageDirty();
- break;
- case QQuickItem::ItemSceneChange: {
- markImageDirty();
- QQuickWindow *win = data.window;
- if (m_connectedWindow)
- disconnect(m_connectedWindow, &QQuickWindow::activeChanged, this, &QQuickStyleItem::markImageDirty);
- if (win)
- connect(win, &QQuickWindow::activeChanged, this, &QQuickStyleItem::markImageDirty);
- m_connectedWindow = win;
- break;}
- default:
- break;
- }
-}
-
-void QQuickStyleItem::updateGeometry()
-{
- qqc2InfoHeading("GEOMETRY");
- m_dirty.setFlag(DirtyFlag::Geometry, false);
-
- const QQuickStyleMargins oldContentPadding = contentPadding();
- const QQuickStyleMargins oldLayoutMargins = layoutMargins();
- const QSize oldMinimumSize = minimumSize();
-
- m_styleItemGeometry = calculateGeometry();
-
-#ifdef QT_DEBUG
- if (m_styleItemGeometry.minimumSize.isEmpty())
- qmlWarning(this) << "minimumSize is empty!";
-#endif
-
- if (m_styleItemGeometry.implicitSize.isEmpty()) {
- // If the item has no contents (or its size is
- // empty), we just use the minimum size as implicit size.
- m_styleItemGeometry.implicitSize = m_styleItemGeometry.minimumSize;
- qqc2Info() << "implicitSize is empty, using minimumSize instead";
- }
-
- if (contentPadding() != oldContentPadding)
- emit contentPaddingChanged();
- if (layoutMargins() != oldLayoutMargins)
- emit layoutMarginsChanged();
- if (minimumSize() != oldMinimumSize)
- emit minimumSizeChanged();
-
- setImplicitSize(m_styleItemGeometry.implicitSize.width(), m_styleItemGeometry.implicitSize.height());
-
- qqc2Info() << m_styleItemGeometry
- << "bounding rect:" << boundingRect()
- << "layout margins:" << layoutMargins()
- << "content padding:" << contentPadding()
- << "input content size:" << m_contentSize;
-}
-
-void QQuickStyleItem::paintControlToImage()
-{
- qqc2InfoHeading("PAINT");
- const QSize imgSize = imageSize();
- if (imgSize.isEmpty())
- return;
-
- m_dirty.setFlag(DirtyFlag::Image, false);
-
- // The size of m_paintedImage should normally be imgSize * dpr. The problem is
- // that the dpr can be e.g 1.25, which means that the size can end up having a
- // fraction. But an image cannot have a size with a fraction, so it would need
- // to be rounded. But on the flip side, rounding the size means that the size
- // of the scene graph node (which is, when the texture is not scaled,
- // m_paintedImage.size() / dpr), will end up with a fraction instead. And this
- // causes rendering artifacts in the scene graph when the texture is mapped
- // to physical screen coordinates. So for that reason we calculate an image size
- // that might be slightly larger than imgSize, so that imgSize * dpr lands on a
- // whole number. The result is that neither the image size, nor the scene graph
- // node, ends up with a size that has a fraction.
- const qreal dpr = window()->devicePixelRatio();
- const int alignedW = int(dprAlignedSize(imgSize.width()) * dpr);
- const int alignedH = int(dprAlignedSize(imgSize.height()) * dpr);
- const QSize alignedSize = QSize(alignedW, alignedH);
-
- if (m_paintedImage.size() != alignedSize) {
- m_paintedImage = QImage(alignedSize, QImage::Format_ARGB32_Premultiplied);
- m_paintedImage.setDevicePixelRatio(dpr);
- qqc2Info() << "created image with dpr aligned size:" << alignedSize;
- }
-
- m_paintedImage.fill(Qt::transparent);
-
- QPainter painter(&m_paintedImage);
- paintEvent(&painter);
-
-#ifdef QT_DEBUG
- if (m_debugFlags != NoDebug) {
- painter.setPen(QColor(255, 0, 0, 255));
- if (m_debugFlags.testFlag(ImageRect))
- painter.drawRect(QRect(QPoint(0, 0), alignedSize / dpr));
- if (m_debugFlags.testFlag(LayoutRect)) {
- const auto m = layoutMargins();
- QRect rect = QRect(QPoint(0, 0), imgSize);
- rect.adjust(m.left(), m.top(), -m.right(), -m.bottom());
- painter.drawRect(rect);
- }
- if (m_debugFlags.testFlag(ContentRect)) {
- const auto p = contentPadding();
- QRect rect = QRect(QPoint(0, 0), imgSize);
- rect.adjust(p.left(), p.top(), -p.right(), -p.bottom());
- painter.drawRect(rect);
- }
- if (m_debugFlags.testFlag(InputContentSize)) {
- const int offset = 2;
- const QPoint p = m_styleItemGeometry.contentRect.topLeft();
- painter.drawLine(p.x() - offset, p.y() - offset, p.x() + m_contentSize.width(), p.y() - offset);
- painter.drawLine(p.x() - offset, p.y() - offset, p.x() - offset, p.y() + m_contentSize.height());
- }
- if (m_debugFlags.testFlag(NinePatchMargins)) {
- const QMargins m = m_styleItemGeometry.ninePatchMargins;
- if (m.right() != -1) {
- painter.drawLine(m.left(), 0, m.left(), imgSize.height());
- painter.drawLine(imgSize.width() - m.right(), 0, imgSize.width() - m.right(), imgSize.height());
- }
- if (m.bottom() != -1) {
- painter.drawLine(0, m.top(), imgSize.width(), m.top());
- painter.drawLine(0, imgSize.height() - m.bottom(), imgSize.width(), imgSize.height() - m.bottom());
- }
- }
- if (m_debugFlags.testFlag(SaveImage)) {
- static int nr = -1;
- ++nr;
- static QString filename = QStringLiteral("styleitem_saveimage_");
- const QString path = QDir::current().absoluteFilePath(filename);
- const QString name = path + QString::number(nr) + QStringLiteral(".png");
- m_paintedImage.save(name);
- qDebug() << "image saved to:" << name;
- }
- }
-#endif
-
- update();
-}
-
-void QQuickStyleItem::updatePolish()
-{
- QScopedValueRollback<bool> guard(m_polishing, true);
-
- const bool dirtyGeometry = m_dirty & DirtyFlag::Geometry;
- const bool dirtyImage = isVisible() && ((m_dirty & DirtyFlag::Image) || (!m_useNinePatchImage && dirtyGeometry));
-
- if (dirtyGeometry)
- updateGeometry();
- if (dirtyImage)
- paintControlToImage();
-}
-
-#ifdef QT_DEBUG
-void QQuickStyleItem::addDebugInfo()
-{
- // Example debug strings:
- // "QQC2_NATIVESTYLE_DEBUG="myButton output contentRect"
- // "QQC2_NATIVESTYLE_DEBUG="ComboBox ninepatchmargins"
- // "QQC2_NATIVESTYLE_DEBUG="All layoutrect"
-
- static const auto debugString = qEnvironmentVariable("QQC2_NATIVESTYLE_DEBUG");
- static const auto matchAll = debugString.startsWith(QLatin1String("All "));
- static const auto prefix = QStringLiteral("QQuickStyleItem");
- if (debugString.isEmpty())
- return;
-
- const auto objectName = m_control->objectName();
- const auto typeName = QString::fromUtf8(metaObject()->className()).remove(prefix);
- const bool matchName = !objectName.isEmpty() && debugString.startsWith(objectName);
- const bool matchType = debugString.startsWith(typeName);
-
- if (!(matchAll || matchName || matchType))
- return;
-
-#define QQC2_DEBUG_FLAG(FLAG) \
- if (debugString.contains(QLatin1String(#FLAG), Qt::CaseInsensitive)) m_debugFlags |= FLAG
-
- QQC2_DEBUG_FLAG(Info);
- QQC2_DEBUG_FLAG(ImageRect);
- QQC2_DEBUG_FLAG(ContentRect);
- QQC2_DEBUG_FLAG(LayoutRect);
- QQC2_DEBUG_FLAG(InputContentSize);
- QQC2_DEBUG_FLAG(DontUseNinePatchImage);
- QQC2_DEBUG_FLAG(NinePatchMargins);
- QQC2_DEBUG_FLAG(Unscaled);
- QQC2_DEBUG_FLAG(Debug);
- QQC2_DEBUG_FLAG(SaveImage);
-
- if (m_debugFlags & (DontUseNinePatchImage
- | InputContentSize
- | ContentRect
- | LayoutRect
- | NinePatchMargins)) {
- // Some rects will not fit inside the drawn image unless
- // we switch off (nine patch) image scaling.
- m_debugFlags |= DontUseNinePatchImage;
- m_useNinePatchImage = false;
- }
-
- if (m_debugFlags != NoDebug)
- qDebug() << "debug options set for" << typeName << "(" << objectName << "):" << m_debugFlags;
- else
- qDebug() << "available debug options:" << DebugFlags(0xFFFF);
-}
-#endif
-
-void QQuickStyleItem::componentComplete()
-{
- Q_ASSERT_X(m_control, Q_FUNC_INFO, "You need to assign a value to property 'control'");
-#ifdef QT_DEBUG
- addDebugInfo();
-#endif
- QQuickItem::componentComplete();
- connectToControl();
- polish();
-}
-
-qreal QQuickStyleItem::contentWidth()
-{
- return m_contentSize.width();
-}
-
-void QQuickStyleItem::setContentWidth(qreal contentWidth)
-{
- if (qFuzzyCompare(m_contentSize.width(), contentWidth))
- return;
-
- m_contentSize.setWidth(contentWidth);
- markGeometryDirty();
-}
-
-qreal QQuickStyleItem::contentHeight()
-{
- return m_contentSize.height();
-}
-
-void QQuickStyleItem::setContentHeight(qreal contentHeight)
-{
- if (qFuzzyCompare(m_contentSize.height(), contentHeight))
- return;
-
- m_contentSize.setHeight(contentHeight);
- markGeometryDirty();
-}
-
-QQuickStyleMargins QQuickStyleItem::contentPadding() const
-{
- const QRect outerRect(QPoint(0, 0), m_styleItemGeometry.implicitSize);
- return QQuickStyleMargins(outerRect, m_styleItemGeometry.contentRect);
-}
-
-QQuickStyleMargins QQuickStyleItem::layoutMargins() const
-{
- // ### TODO: layoutRect is currently not being used for anything. But
- // eventually this information will be needed by layouts to align the controls
- // correctly. This because the images drawn by QStyle are usually a bit bigger
- // than the control(frame) itself, to e.g make room for shadow effects
- // or focus rects/glow. And this will differ from control to control. The
- // layoutRect will then inform where the frame of the control is.
- QQuickStyleMargins margins;
- if (m_styleItemGeometry.layoutRect.isValid()) {
- const QRect outerRect(QPoint(0, 0), m_styleItemGeometry.implicitSize);
- margins = QQuickStyleMargins(outerRect, m_styleItemGeometry.layoutRect);
- }
- return margins;
-}
-
-QSize QQuickStyleItem::minimumSize() const
-{
- // The style item should not be scaled below this size.
- // Otherwise the image will be truncated.
- return m_styleItemGeometry.minimumSize;
-}
-
-QSize QQuickStyleItem::imageSize() const
-{
- // Returns the size of the QImage (unscaled) that
- // is used to draw the control from QStyle.
- return m_useNinePatchImage ? m_styleItemGeometry.minimumSize : size().toSize();
-}
-
-qreal QQuickStyleItem::focusFrameRadius() const
-{
- return m_styleItemGeometry.focusFrameRadius;
-}
-
-QFont QQuickStyleItem::styleFont(QQuickItem *control) const
-{
- Q_ASSERT(control);
- // Note: This function should be treated as if it was static
- // (meaning, don't assume anything in this object to be initialized).
- // Resolving the font/font size should be done early on from QML, before we get
- // around to calculate geometry and paint. Otherwise we typically need to do it
- // all over again when/if the font changes. In practice this means that other
- // items in QML that uses a style font, and at the same time, affects our input
- // contentSize, cannot wait for this item to be fully constructed before it
- // gets the font. So we need to resolve it here and now, even if this
- // object might be in a half initialized state (hence also the control
- // argument, instead of relying on m_control to be set).
- return QGuiApplication::font();
-}
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/items/qquickstyleitem.h b/src/quicknativestyle/items/qquickstyleitem.h
deleted file mode 100644
index 3b87faf6..00000000
--- a/src/quicknativestyle/items/qquickstyleitem.h
+++ /dev/null
@@ -1,311 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEM_H
-#define QQUICKSTYLEITEM_H
-
-#include <QtCore/qdebug.h>
-#include <QtQml/qqml.h>
-#include <QtQml/qqmlinfo.h>
-#include <QtQuick/private/qquickitem_p.h>
-#include <QtQuickTemplates2/private/qquickcontrol_p.h>
-
-#include "qquicknativestyle.h"
-#include "qquickstyle.h"
-#include "qquickstyleoption.h"
-
-// Work-around for now, to avoid creator getting confused
-// about missing macros. Should eventually be defined
-// in qt declarative somewhere I assume.
-#ifndef QML_NAMED_ELEMENT
-#define QML_NAMED_ELEMENT(NAME)
-#define QML_UNCREATABLE(NAME)
-#endif
-
-#ifdef QT_DEBUG
-#define qqc2Debug() if (m_debugFlags.testFlag(Debug)) qDebug() << __FUNCTION__ << ":"
-#define qqc2Info() if (m_debugFlags.testFlag(Info)) qDebug() << __FUNCTION__ << ":"
-#define qqc2InfoHeading(HEADING) if (m_debugFlags.testFlag(Info)) qDebug() << "--------" << HEADING << "--------"
-#else
-#define qqc2Debug() if (false) qDebug()
-#define qqc2Info() if (false) qDebug()
-#define qqc2InfoHeading(HEADING) if (false) qDebug()
-#endif
-
-QT_BEGIN_NAMESPACE
-
-using namespace QQC2;
-
-class QQuickStyleMargins
-{
- Q_GADGET
-
- Q_PROPERTY(int left READ left())
- Q_PROPERTY(int top READ top())
- Q_PROPERTY(int right READ right())
- Q_PROPERTY(int bottom READ bottom())
-
- QML_NAMED_ELEMENT(stylemargins)
- QML_UNCREATABLE("")
-
-public:
- QQuickStyleMargins() {}
- QQuickStyleMargins(const QQuickStyleMargins &other) : m_margins(other.m_margins) {}
- QQuickStyleMargins(const QMargins &margins) : m_margins(margins) {}
- QQuickStyleMargins(const QRect &outer, const QRect &inner)
- {
- const int left = inner.left() - outer.left();
- const int top = inner.top() - outer.top();
- const int right = outer.right() - inner.right();
- const int bottom = outer.bottom() - inner.bottom();
- m_margins = QMargins(left, top, right, bottom);
- }
-
- inline void operator=(const QQuickStyleMargins &other) { m_margins = other.m_margins; }
- inline bool operator==(const QQuickStyleMargins &other) const { return other.m_margins == m_margins; }
- inline bool operator!=(const QQuickStyleMargins &other) const { return other.m_margins != m_margins; }
-
- inline int left() const { return m_margins.left(); }
- inline int right() const { return m_margins.right(); }
- inline int top() const { return m_margins.top(); }
- inline int bottom() const { return m_margins.bottom(); }
-
- QMargins m_margins;
-};
-
-QDebug operator<<(QDebug debug, const QQuickStyleMargins &padding);
-
-struct StyleItemGeometry
-{
- /*
- A QQuickStyleItem is responsible for drawing a control, or a part of it.
-
- 'minimumSize' should be the minimum possible size that the item can
- have _without_ taking content size into consideration (and still render
- correctly). This will also be the size of the image that the item is drawn
- to, unless QQuickStyleItem::useNinePatchImage is set to false. In that
- case, the size of the image will be set to the size of the item instead
- (which is set from QML, and will typically be the same as the size of the control).
- The default way to calculate minimumSize is to call style()->sizeFromContents()
- with an empty content size. This is not always well supported by the legacy QStyle
- implementation, which means that you might e.g get an empty size in return.
- For those cases, the correct solution is to go into the specific platform style
- and change it so that it returns a valid size also for this special case.
-
- 'implicitSize' should reflect the preferred size of the item, taking the
- given content size (as set from QML) into account. But not all controls
- have contents (slider), and for many controls, the content/label is instead
- placed outside the item/background image (radiobutton). In both cases, the
- size of the item will not include the content size, and implicitSize can
- usually be set equal to minimumSize instead.
-
- 'contentRect' should be the free space where the contents can be placed. Note that
- this rect doesn't need to have the same size as the contentSize provided as input
- to the style item. Instead, QStyle can typically calculate a rect that is bigger, to
- e.g center the contents inside the control.
-
- 'layoutRect' can be set to shift the position of the whole control so
- that aligns correctly with the other controls. This is important for
- controls that draws e.g shadows or focus rings. Such adornments should
- be painted, but not be included when aligning the controls.
- */
-
- QSize minimumSize;
- QSize implicitSize;
- QRect contentRect;
- QRect layoutRect; // If invalid, there are no layout margins!
- QMargins ninePatchMargins;
- qreal focusFrameRadius;
-};
-
-QDebug operator<<(QDebug debug, const StyleItemGeometry &cg);
-
-class QQuickStyleItem : public QQuickItem
-{
- Q_OBJECT
-
- // Input
- Q_PROPERTY(QQuickItem *control MEMBER m_control NOTIFY controlChanged)
- Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth)
- Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight)
- Q_PROPERTY(bool useNinePatchImage MEMBER m_useNinePatchImage)
- Q_PROPERTY(OverrideState overrideState MEMBER m_overrideState)
-
- // Output
- Q_PROPERTY(QQuickStyleMargins contentPadding READ contentPadding() NOTIFY contentPaddingChanged)
- Q_PROPERTY(QQuickStyleMargins layoutMargins READ layoutMargins() NOTIFY layoutMarginsChanged)
- Q_PROPERTY(QSize minimumSize READ minimumSize() NOTIFY minimumSizeChanged)
- Q_PROPERTY(int transitionDuration MEMBER m_transitionDuration CONSTANT)
-
- QML_NAMED_ELEMENT(StyleItem)
- QML_UNCREATABLE("StyleItem is an abstract base class.")
-
-public:
- enum DirtyFlag {
- Nothing = 0,
- Geometry,
- Image,
- Everything = 255
- };
- Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
-
- enum OverrideState {
- None = 0,
- AlwaysHovered,
- NeverHovered,
- AlwaysSunken
- };
- Q_ENUM(OverrideState)
-
-
-#ifdef QT_DEBUG
- enum DebugFlag {
- NoDebug = 0x000,
- Debug = 0x001,
- Info = 0x002,
- ImageRect = 0x004,
- ContentRect = 0x008,
- LayoutRect = 0x010,
- Unscaled = 0x020,
- InputContentSize = 0x040,
- DontUseNinePatchImage = 0x080,
- NinePatchMargins = 0x100,
- SaveImage = 0x200,
- };
- Q_FLAG(DebugFlag)
- Q_DECLARE_FLAGS(DebugFlags, DebugFlag)
-#endif
-
- explicit QQuickStyleItem(QQuickItem *parent = nullptr);
- ~QQuickStyleItem() override;
-
- qreal contentWidth();
- void setContentWidth(qreal contentWidth);
- qreal contentHeight();
- void setContentHeight(qreal contentHeight);
-
- QQuickStyleMargins contentPadding() const;
- QQuickStyleMargins layoutMargins() const;
- QSize minimumSize() const;
- QSize imageSize() const;
- qreal focusFrameRadius() const;
-
- Q_INVOKABLE virtual QFont styleFont(QQuickItem *control) const;
-
- void markGeometryDirty();
- void markImageDirty();
-
-signals:
- void controlChanged();
- void contentPaddingChanged();
- void layoutMarginsChanged();
- void fontChanged();
- void minimumSizeChanged();
-
-protected:
- void componentComplete() override;
- QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData) override;
- void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
- void itemChange(ItemChange change, const ItemChangeData &data) override;
- void updatePolish() override;
-
- virtual void connectToControl() const;
- virtual void paintEvent(QPainter *painter) const = 0;
- virtual StyleItemGeometry calculateGeometry() = 0;
-
- static QStyle::State controlSize(QQuickItem *item);
- void initStyleOptionBase(QStyleOption &styleOption) const;
-
- inline QSize contentSize() const { return QSize(qCeil(m_contentSize.width()), qCeil(m_contentSize.height())); }
- inline static QStyle *style() { return QQuickNativeStyle::style(); }
-
- template <class T> inline const T* control() const {
-#ifdef QT_DEBUG
- if (!dynamic_cast<T *>(m_control.data())) {
- qmlWarning(this) << "control property is not of correct type";
- Q_UNREACHABLE();
- }
-#endif
- return static_cast<T *>(m_control.data());
- }
-
-#ifdef QT_DEBUG
- DebugFlags m_debugFlags = NoDebug;
-#endif
- OverrideState m_overrideState = None;
-
-private:
- inline void updateGeometry();
- inline void paintControlToImage();
-
- int dprAlignedSize(const int size) const;
-
-#ifdef QT_DEBUG
- void addDebugInfo();
-#endif
-
-private:
- QPointer<QQuickItem> m_control;
- QImage m_paintedImage;
- StyleItemGeometry m_styleItemGeometry;
- QSizeF m_contentSize;
-
- DirtyFlags m_dirty = Everything;
- bool m_useNinePatchImage = true;
- bool m_polishing = false;
- mutable QQuickWindow *m_connectedWindow = nullptr;
-
-#ifdef Q_OS_MACOS
- int m_transitionDuration = 150;
-#else
- int m_transitionDuration = 400;
-#endif
-
-private:
- friend class QtQuickControls2MacOSStylePlugin;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickStyleItem::DirtyFlags)
-
-#ifdef QT_DEBUG
-Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickStyleItem::DebugFlags)
-#endif
-
-QT_END_NAMESPACE
-
-QML_DECLARE_TYPE(QQuickStyleItem)
-
-#endif // QQUICKSTYLEITEM_H
diff --git a/src/quicknativestyle/items/qquickstyleitembutton.cpp b/src/quicknativestyle/items/qquickstyleitembutton.cpp
deleted file mode 100644
index 5dfe060f..00000000
--- a/src/quicknativestyle/items/qquickstyleitembutton.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitembutton.h"
-
-QFont QQuickStyleItemButton::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_PushButtonLabel, controlSize(control));
-}
-
-void QQuickStyleItemButton::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto button = control<QQuickButton>();
- connect(button, &QQuickButton::downChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemButton::calculateGeometry()
-{
- QStyleOptionButton styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_PushButton, &styleOption, QSize(0, 0));
- geometry.implicitSize = style()->sizeFromContents(QStyle::CT_PushButton, &styleOption, contentSize());
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- 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;
-}
-
-void QQuickStyleItemButton::paintEvent(QPainter *painter) const
-{
- QStyleOptionButton styleOption;
- initStyleOption(styleOption);
- style()->drawControl(QStyle::CE_PushButtonBevel, &styleOption, painter);
-}
-
-void QQuickStyleItemButton::initStyleOption(QStyleOptionButton &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto button = control<QQuickButton>();
-
- if (button->isDown())
- styleOption.state |= QStyle::State_Sunken;
- if (!button->isFlat() && !button->isDown())
- styleOption.state |= QStyle::State_Raised;
- if (button->isHighlighted() || button->isChecked())
- styleOption.state |= QStyle::State_On;
- if (button->isFlat())
- styleOption.features |= QStyleOptionButton::Flat;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitembutton.h b/src/quicknativestyle/items/qquickstyleitembutton.h
deleted file mode 100644
index 41ca0cf1..00000000
--- a/src/quicknativestyle/items/qquickstyleitembutton.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMBUTTON_H
-#define QQUICKSTYLEITEMBUTTON_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickbutton_p.h>
-
-class QQuickStyleItemButton : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(Button)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionButton &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMBUTTON_H
diff --git a/src/quicknativestyle/items/qquickstyleitemcheckbox.cpp b/src/quicknativestyle/items/qquickstyleitemcheckbox.cpp
deleted file mode 100644
index 6c4ac8ea..00000000
--- a/src/quicknativestyle/items/qquickstyleitemcheckbox.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemcheckbox.h"
-
-QFont QQuickStyleItemCheckBox::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_RadioButtonLabel, controlSize(control));
-}
-
-void QQuickStyleItemCheckBox::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto checkbox = control<QQuickCheckBox>();
- connect(checkbox, &QQuickCheckBox::downChanged, this, &QQuickStyleItem::markImageDirty);
- connect(checkbox, &QQuickCheckBox::checkStateChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemCheckBox::calculateGeometry()
-{
- QStyleOptionButton styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_CheckBox, &styleOption, QSize(0, 0));
- geometry.implicitSize = geometry.minimumSize;
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- 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);
-
- return geometry;
-}
-
-void QQuickStyleItemCheckBox::paintEvent(QPainter *painter) const
-{
- QStyleOptionButton styleOption;
- initStyleOption(styleOption);
- style()->drawControl(QStyle::CE_CheckBox, &styleOption, painter);
-}
-
-void QQuickStyleItemCheckBox::initStyleOption(QStyleOptionButton &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto checkbox = control<QQuickCheckBox>();
-
- styleOption.state |= checkbox->isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
- if (checkbox->isTristate() && checkbox->checkState() == Qt::PartiallyChecked)
- styleOption.state |= QStyle::State_NoChange;
- else
- styleOption.state |= checkbox->isChecked() ? QStyle::State_On : QStyle::State_Off;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemcheckbox.h b/src/quicknativestyle/items/qquickstyleitemcheckbox.h
deleted file mode 100644
index 03bf34b9..00000000
--- a/src/quicknativestyle/items/qquickstyleitemcheckbox.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMCHECKBOX_H
-#define QQUICKSTYLEITEMCHECKBOX_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickcheckbox_p.h>
-
-class QQuickStyleItemCheckBox : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(CheckBox)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionButton &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMCHECKBOX_H
diff --git a/src/quicknativestyle/items/qquickstyleitemcombobox.cpp b/src/quicknativestyle/items/qquickstyleitemcombobox.cpp
deleted file mode 100644
index 0ac3756e..00000000
--- a/src/quicknativestyle/items/qquickstyleitemcombobox.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemcombobox.h"
-
-QFont QQuickStyleItemComboBox::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_PushButtonLabel, controlSize(control));
-}
-
-void QQuickStyleItemComboBox::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto comboBox = control<QQuickComboBox>();
- connect(comboBox, &QQuickComboBox::downChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemComboBox::calculateGeometry()
-{
- QStyleOptionComboBox styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_ComboBox, &styleOption, QSize(0, 0));
- geometry.implicitSize = style()->sizeFromContents(QStyle::CT_ComboBox, &styleOption, contentSize());
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- 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;
-}
-
-void QQuickStyleItemComboBox::paintEvent(QPainter *painter) const
-{
- QStyleOptionComboBox styleOption;
- initStyleOption(styleOption);
- style()->drawComplexControl(QStyle::CC_ComboBox, &styleOption, painter);
-}
-
-void QQuickStyleItemComboBox::initStyleOption(QStyleOptionComboBox &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto comboBox = control<QQuickComboBox>();
-
- styleOption.subControls = QStyle::SC_ComboBoxArrow | QStyle::SC_ComboBoxFrame | QStyle::SC_ComboBoxEditField;
- styleOption.frame = true;
- styleOption.state |= QStyle::State_Selected;
- styleOption.editable = comboBox->isEditable();
-
- if (comboBox->isDown())
- styleOption.state |= QStyle::State_Sunken;
- if (!comboBox->isFlat() && !comboBox->isDown())
- styleOption.state |= QStyle::State_Raised;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemcombobox.h b/src/quicknativestyle/items/qquickstyleitemcombobox.h
deleted file mode 100644
index 79f1995e..00000000
--- a/src/quicknativestyle/items/qquickstyleitemcombobox.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMCOMBOBOX_H
-#define QQUICKSTYLEITEMCOMBOBOX_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickcombobox_p.h>
-
-class QQuickStyleItemComboBox : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(ComboBox)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionComboBox &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMCOMBOBOX_H
diff --git a/src/quicknativestyle/items/qquickstyleitemdial.cpp b/src/quicknativestyle/items/qquickstyleitemdial.cpp
deleted file mode 100644
index bf5784e1..00000000
--- a/src/quicknativestyle/items/qquickstyleitemdial.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemdial.h"
-
-QFont QQuickStyleItemDial::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_ProgressBarLabel, controlSize(control));
-}
-
-void QQuickStyleItemDial::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto dial = control<QQuickDial>();
- connect(dial, &QQuickDial::fromChanged, this, &QQuickStyleItem::markImageDirty);
- connect(dial, &QQuickDial::toChanged, this, &QQuickStyleItem::markImageDirty);
- connect(dial, &QQuickDial::positionChanged, this, &QQuickStyleItem::markImageDirty);
- connect(dial, &QQuickDial::valueChanged, this, &QQuickStyleItem::markImageDirty);
- connect(dial, &QQuickDial::stepSizeChanged, this, &QQuickStyleItem::markImageDirty);
- connect(dial, &QQuickDial::pressedChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemDial::calculateGeometry()
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
-
- StyleItemGeometry geometry;
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_Dial, &styleOption, QSize(0, 0));
- 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;
-}
-
-void QQuickStyleItemDial::paintEvent(QPainter *painter) const
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
- style()->drawComplexControl(QStyle::CC_Dial, &styleOption, painter);
-}
-
-void QQuickStyleItemDial::initStyleOption(QStyleOptionSlider &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto dial = control<QQuickDial>();
-
- styleOption.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
- styleOption.activeSubControls = QStyle::SC_None;
- styleOption.tickInterval = dial->stepSize();
- styleOption.dialWrapping = dial->wrap();
- styleOption.upsideDown = true;
-
- if (dial->isPressed())
- styleOption.state |= QStyle::State_Sunken;
-
- if (dial->stepSize() == 0) {
- styleOption.minimum = 0;
- styleOption.maximum = 10000;
- styleOption.sliderPosition = dial->position() * styleOption.maximum;
- } else {
- styleOption.minimum = dial->from();
- styleOption.maximum = dial->to();
- styleOption.sliderPosition = dial->value();
- }
-
- // TODO: add proper API for tickmarks
- const int index = dial->metaObject()->indexOfProperty("qqc2_style_tickPosition");
- if (index != -1) {
- const int tickPosition = dial->metaObject()->property(index).read(dial).toInt();
- styleOption.tickPosition = QStyleOptionSlider::TickPosition(tickPosition);
- if (styleOption.tickPosition != QStyleOptionSlider::NoTicks)
- styleOption.subControls |= QStyle::SC_DialTickmarks;
- }
-
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemdial.h b/src/quicknativestyle/items/qquickstyleitemdial.h
deleted file mode 100644
index 569820fe..00000000
--- a/src/quicknativestyle/items/qquickstyleitemdial.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMDIAL_H
-#define QQUICKSTYLEITEMDIAL_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickdial_p.h>
-
-class QQuickStyleItemDial : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(Dial)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionSlider &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMDIAL_H
diff --git a/src/quicknativestyle/items/qquickstyleitemframe.cpp b/src/quicknativestyle/items/qquickstyleitemframe.cpp
deleted file mode 100644
index cf060492..00000000
--- a/src/quicknativestyle/items/qquickstyleitemframe.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemframe.h"
-
-StyleItemGeometry QQuickStyleItemFrame::calculateGeometry()
-{
- QStyleOptionFrame styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_Frame, &styleOption, QSize(0, 0));
- geometry.implicitSize = contentSize();
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- geometry.contentRect = style()->subElementRect(QStyle::SE_FrameContents, &styleOption);
- geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CE_ShapedFrame, &styleOption, geometry.minimumSize);
-
- return geometry;
-}
-
-void QQuickStyleItemFrame::paintEvent(QPainter *painter) const
-{
- QStyleOptionFrame styleOption;
- initStyleOption(styleOption);
- style()->drawControl(QStyle::CE_ShapedFrame, &styleOption, painter);
-}
-
-void QQuickStyleItemFrame::initStyleOption(QStyleOptionFrame &styleOption) const
-{
- initStyleOptionBase(styleOption);
- styleOption.lineWidth = 1;
- styleOption.frameShape = QStyleOptionFrame::StyledPanel;
- styleOption.features = QStyleOptionFrame::Flat;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemframe.h b/src/quicknativestyle/items/qquickstyleitemframe.h
deleted file mode 100644
index 8e8da68b..00000000
--- a/src/quicknativestyle/items/qquickstyleitemframe.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMFRAME_H
-#define QQUICKSTYLEITEMFRAME_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickframe_p.h>
-
-class QQuickStyleItemFrame : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(Frame)
-
-protected:
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionFrame &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMFRAME_H
diff --git a/src/quicknativestyle/items/qquickstyleitemgroupbox.cpp b/src/quicknativestyle/items/qquickstyleitemgroupbox.cpp
deleted file mode 100644
index a828160d..00000000
--- a/src/quicknativestyle/items/qquickstyleitemgroupbox.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemgroupbox.h"
-
-QFont QQuickStyleItemGroupBox::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_HeaderLabel, controlSize(control));
-}
-
-StyleItemGeometry QQuickStyleItemGroupBox::calculateGeometry()
-{
- QStyleOptionGroupBox styleOption;
- initStyleOption(styleOption);
-
- StyleItemGeometry geometry;
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_GroupBox, &styleOption, QSize(0, 0));
-
- if (!control<QQuickGroupBox>()->title().isEmpty()) {
- // We don't draw the title, but we need to take
- // it into calculation for the control size
- styleOption.text = QStringLiteral(" ");
- styleOption.subControls |= QStyle::SC_GroupBoxLabel;
- }
-
- geometry.implicitSize = style()->sizeFromContents(QStyle::CT_GroupBox, &styleOption, contentSize());
- styleOption.rect.setSize(geometry.implicitSize);
- geometry.contentRect = style()->subControlRect(QStyle::CC_GroupBox, &styleOption, QStyle::SC_GroupBoxContents);
- geometry.layoutRect = style()->subElementRect(QStyle::SE_GroupBoxLayoutItem, &styleOption);
- geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CC_GroupBox, &styleOption, geometry.minimumSize);
-
- const QQuickStyleMargins oldGroupBoxPadding = m_groupBoxPadding;
- const QRect frame = style()->subControlRect(QStyle::CC_GroupBox, &styleOption, QStyle::SC_GroupBoxFrame);
- m_groupBoxPadding = QQuickStyleMargins(QRect(QPoint(), geometry.implicitSize), frame);
- if (m_groupBoxPadding != oldGroupBoxPadding)
- emit groupBoxPaddingChanged();
-
- const QPointF oldLabelPos = m_labelPos;
- m_labelPos = style()->subControlRect(QStyle::CC_GroupBox, &styleOption, QStyle::SC_GroupBoxLabel).topLeft();
- if (m_labelPos != oldLabelPos)
- emit labelPosChanged();
- return geometry;
-}
-
-void QQuickStyleItemGroupBox::paintEvent(QPainter *painter) const
-{
- QStyleOptionGroupBox styleOption;
- initStyleOption(styleOption);
- style()->drawComplexControl(QStyle::CC_GroupBox, &styleOption, painter);
-}
-
-void QQuickStyleItemGroupBox::initStyleOption(QStyleOptionGroupBox &styleOption) const
-{
- initStyleOptionBase(styleOption);
- styleOption.subControls = QStyle::SC_GroupBoxFrame;
- styleOption.lineWidth = 1;
-}
-
-QQuickStyleMargins QQuickStyleItemGroupBox::groupBoxPadding() const
-{
- return m_groupBoxPadding;
-}
-
-QPointF QQuickStyleItemGroupBox::labelPos() const
-{
- return m_labelPos;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemgroupbox.h b/src/quicknativestyle/items/qquickstyleitemgroupbox.h
deleted file mode 100644
index 2b07287f..00000000
--- a/src/quicknativestyle/items/qquickstyleitemgroupbox.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMGROUPBOX_H
-#define QQUICKSTYLEITEMGROUPBOX_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickgroupbox_p.h>
-
-class QQuickStyleItemGroupBox : public QQuickStyleItem
-{
- Q_OBJECT
- Q_PROPERTY(QQuickStyleMargins groupBoxPadding READ groupBoxPadding NOTIFY groupBoxPaddingChanged)
- Q_PROPERTY(QPointF labelPos READ labelPos NOTIFY labelPosChanged)
- QML_NAMED_ELEMENT(GroupBox)
-
-public:
- QQuickStyleMargins groupBoxPadding() const;
- QPointF labelPos() const;
- QFont styleFont(QQuickItem *control) const override;
-
-signals:
- void groupBoxPaddingChanged();
- void labelPosChanged();
-
-protected:
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- QQuickStyleMargins m_groupBoxPadding;
- QPointF m_labelPos;
-
- void initStyleOption(QStyleOptionGroupBox &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMGROUPBOX_H
diff --git a/src/quicknativestyle/items/qquickstyleitemprogressbar.cpp b/src/quicknativestyle/items/qquickstyleitemprogressbar.cpp
deleted file mode 100644
index 480e8981..00000000
--- a/src/quicknativestyle/items/qquickstyleitemprogressbar.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemprogressbar.h"
-
-QFont QQuickStyleItemProgressBar::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_ProgressBarLabel, controlSize(control));
-}
-
-void QQuickStyleItemProgressBar::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto progressBar = control<QQuickProgressBar>();
- connect(progressBar, &QQuickProgressBar::fromChanged, this, &QQuickStyleItem::markImageDirty);
- connect(progressBar, &QQuickProgressBar::toChanged, this, &QQuickStyleItem::markImageDirty);
- connect(progressBar, &QQuickProgressBar::positionChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemProgressBar::calculateGeometry()
-{
- QStyleOptionProgressBar styleOption;
- initStyleOption(styleOption);
-
- StyleItemGeometry geometry;
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_ProgressBar, &styleOption, QSize(0, 0));
-
- // From qprogressbar.cpp in qtbase:
- const int cw = style()->pixelMetric(QStyle::PM_ProgressBarChunkWidth, &styleOption);
- QFontMetrics fm(control<QQuickProgressBar>()->font());
- QSize size = QSize(qMax(9, cw) * 7 + fm.horizontalAdvance(QLatin1Char('0')) * 4, fm.height() + 8);
- if (!(styleOption.state & QStyle::State_Horizontal))
- size = size.transposed();
-
- geometry.implicitSize = style()->sizeFromContents(QStyle::CT_ProgressBar, &styleOption, size);
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- geometry.contentRect = style()->subElementRect(QStyle::SE_ProgressBarContents, &styleOption);
- geometry.layoutRect = style()->subElementRect(QStyle::SE_ProgressBarLayoutItem, &styleOption);
- geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CE_ProgressBar, &styleOption, geometry.minimumSize);
-
- return geometry;
-}
-
-void QQuickStyleItemProgressBar::paintEvent(QPainter *painter) const
-{
- QStyleOptionProgressBar styleOption;
- initStyleOption(styleOption);
-#ifndef Q_OS_MACOS
- const QRect r = styleOption.rect;
-#endif
- // Note: on macOS, the groove will paint both the background and the contents
- styleOption.rect = style()->subElementRect(QStyle::SE_ProgressBarGroove, &styleOption);
- style()->drawControl(QStyle::CE_ProgressBarGroove, &styleOption, painter);
-#ifndef Q_OS_MACOS
- styleOption.rect = r;
- styleOption.rect = style()->subElementRect(QStyle::SE_ProgressBarContents, &styleOption);
- style()->drawControl(QStyle::CE_ProgressBarContents, &styleOption, painter);
-#endif
-}
-
-void QQuickStyleItemProgressBar::initStyleOption(QStyleOptionProgressBar &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto progressBar = control<QQuickProgressBar>();
-
- styleOption.state = QStyle::State_Horizontal;
-
- if (progressBar->isIndeterminate()) {
- styleOption.minimum = 0;
- styleOption.maximum = 0;
- } else if (progressBar->to() - progressBar->from() < 100) {
- // Add some range to support float numbers
- styleOption.minimum = 0;
- styleOption.maximum = (progressBar->to() - progressBar->from()) * 100;
- styleOption.progress = (progressBar->value() - progressBar->from()) * 100;
- } else {
- styleOption.minimum = progressBar->from();
- styleOption.maximum = progressBar->to();
- styleOption.progress = progressBar->value();
- }
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemprogressbar.h b/src/quicknativestyle/items/qquickstyleitemprogressbar.h
deleted file mode 100644
index 53692dbe..00000000
--- a/src/quicknativestyle/items/qquickstyleitemprogressbar.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMPROGRESSBAR_H
-#define QQUICKSTYLEITEMPROGRESSBAR_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickprogressbar_p.h>
-
-class QQuickStyleItemProgressBar : public QQuickStyleItem
-{
- Q_OBJECT
-
- QML_NAMED_ELEMENT(ProgressBar)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionProgressBar &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMPROGRESSBAR_H
diff --git a/src/quicknativestyle/items/qquickstyleitemradiobutton.cpp b/src/quicknativestyle/items/qquickstyleitemradiobutton.cpp
deleted file mode 100644
index 655bb0b6..00000000
--- a/src/quicknativestyle/items/qquickstyleitemradiobutton.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemradiobutton.h"
-
-QFont QQuickStyleItemRadioButton::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_RadioButtonLabel, controlSize(control));
-}
-
-void QQuickStyleItemRadioButton::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto checkbox = control<QQuickRadioButton>();
- connect(checkbox, &QQuickRadioButton::downChanged, this, &QQuickStyleItem::markImageDirty);
- connect(checkbox, &QQuickRadioButton::checkedChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemRadioButton::calculateGeometry()
-{
- QStyleOptionButton styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_RadioButton, &styleOption, QSize(0, 0));
- geometry.implicitSize = geometry.minimumSize;
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- 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;
-}
-
-void QQuickStyleItemRadioButton::paintEvent(QPainter *painter) const
-{
- QStyleOptionButton styleOption;
- initStyleOption(styleOption);
- style()->drawControl(QStyle::CE_RadioButton, &styleOption, painter);
-}
-
-void QQuickStyleItemRadioButton::initStyleOption(QStyleOptionButton &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto checkbox = control<QQuickRadioButton>();
-
- styleOption.state |= checkbox->isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
- styleOption.state |= checkbox->isChecked() ? QStyle::State_On : QStyle::State_Off;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemradiobutton.h b/src/quicknativestyle/items/qquickstyleitemradiobutton.h
deleted file mode 100644
index 56073d8f..00000000
--- a/src/quicknativestyle/items/qquickstyleitemradiobutton.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMRADIOBUTTON_H
-#define QQUICKSTYLEITEMRADIOBUTTON_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickradiobutton_p.h>
-
-class QQuickStyleItemRadioButton : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(RadioButton)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionButton &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMRADIOBUTTON_H
diff --git a/src/quicknativestyle/items/qquickstyleitemscrollbar.cpp b/src/quicknativestyle/items/qquickstyleitemscrollbar.cpp
deleted file mode 100644
index d6d41d96..00000000
--- a/src/quicknativestyle/items/qquickstyleitemscrollbar.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemscrollbar.h"
-
-QFont QQuickStyleItemScrollBar::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_ProgressBarLabel, controlSize(control));
-}
-
-void QQuickStyleItemScrollBar::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto scrollBar = control<QQuickScrollBar>();
- connect(scrollBar, &QQuickScrollBar::orientationChanged, this, &QQuickStyleItem::markImageDirty);
- connect(scrollBar, &QQuickScrollBar::pressedChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemScrollBar::calculateGeometry()
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
-
- StyleItemGeometry geometry;
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_ScrollBar, &styleOption, QSize(0, 0));
- if (m_subControl == SubLine || m_subControl == AddLine) {
- // So far, we know that only the windows style uses these subcontrols,
- // so we can use hardcoded sizes...
- QSize sz(16, 17);
- if (styleOption.orientation == Qt::Vertical)
- sz.transpose();
- geometry.minimumSize = sz;
- }
- geometry.implicitSize = geometry.minimumSize;
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- geometry.layoutRect = style()->subElementRect(QStyle::SE_ScrollBarLayoutItem, &styleOption);
- geometry.ninePatchMargins = style()->ninePatchMargins(QStyle::CC_ScrollBar, &styleOption, geometry.minimumSize);
-
- return geometry;
-}
-
-void QQuickStyleItemScrollBar::paintEvent(QPainter *painter) const
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
- if (m_subControl == SubLine || m_subControl == AddLine) {
- QStyle::SubControl sc = m_subControl == SubLine ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine;
- QStyleOptionSlider opt = styleOption;
- opt.subControls = QStyle::SC_ScrollBarAddLine
- | QStyle::SC_ScrollBarSubLine
- | QStyle::SC_ScrollBarGroove;
-
- const qreal scale = window()->devicePixelRatio();
- const QSize scrollBarMinSize = style()->sizeFromContents(QStyle::CT_ScrollBar, &opt, QSize(0, 0));
- const QSize sz = scrollBarMinSize * scale;
- QImage scrollBarImage(sz, QImage::Format_ARGB32_Premultiplied);
- scrollBarImage.setDevicePixelRatio(scale);
- QPainter p(&scrollBarImage);
- opt.rect = QRect(QPoint(0, 0), scrollBarMinSize);
- style()->drawComplexControl(QStyle::CC_ScrollBar, &opt, &p);
- QRect sourceImageRect = style()->subControlRect(QStyle::CC_ScrollBar, &opt, sc);
- sourceImageRect = QRect(sourceImageRect.topLeft() * scale, sourceImageRect.size() * scale);
- painter->drawImage(QPoint(0, 0), scrollBarImage, sourceImageRect);
- } else {
- style()->drawComplexControl(QStyle::CC_ScrollBar, &styleOption, painter);
- }
-}
-
-void QQuickStyleItemScrollBar::initStyleOption(QStyleOptionSlider &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto scrollBar = control<QQuickScrollBar>();
-
- switch (m_subControl) {
- case Groove:
- styleOption.subControls = QStyle::SC_ScrollBarGroove | QStyle::SC_ScrollBarAddLine | QStyle::SC_ScrollBarSubLine;
- break;
- case Handle:
- styleOption.subControls = QStyle::SC_ScrollBarSlider;
- break;
- case AddLine:
- styleOption.subControls = QStyle::SC_ScrollBarAddLine;
- break;
- case SubLine:
- styleOption.subControls = QStyle::SC_ScrollBarSubLine;
- break;
- }
-
- styleOption.activeSubControls = QStyle::SC_None;
- styleOption.orientation = scrollBar->orientation();
- if (styleOption.orientation == Qt::Horizontal)
- styleOption.state |= QStyle::State_Horizontal;
-
- if (scrollBar->isPressed())
- styleOption.state |= QStyle::State_Sunken;
-
- if (m_overrideState != None) {
- // In ScrollBar.qml we fade between two versions of
- // the handle, depending on if it's hovered or not
-
- if (m_overrideState == AlwaysHovered) {
- styleOption.activeSubControls = (styleOption.subControls & (QStyle::SC_ScrollBarSlider | QStyle::SC_ScrollBarGroove | QStyle::SC_ScrollBarAddLine | QStyle::SC_ScrollBarSubLine));
- } else if (m_overrideState == NeverHovered) {
- styleOption.activeSubControls &= ~(styleOption.subControls & (QStyle::SC_ScrollBarSlider | QStyle::SC_ScrollBarGroove | QStyle::SC_ScrollBarAddLine | QStyle::SC_ScrollBarSubLine));
- } else if (m_overrideState == AlwaysSunken) {
- styleOption.state |= QStyle::State_Sunken;
- styleOption.activeSubControls = (styleOption.subControls & (QStyle::SC_ScrollBarSlider | QStyle::SC_ScrollBarGroove | QStyle::SC_ScrollBarAddLine | QStyle::SC_ScrollBarSubLine));
- }
- }
-
- // The following values will let the handle fill 100% of the
- // groove / imageSize. But when the handle is resized by
- // QQuickScrollBar, it will end up with the correct size visually.
- styleOption.pageStep = 1000;
- styleOption.minimum = 0;
- styleOption.maximum = 1;
- styleOption.sliderValue = 0;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemscrollbar.h b/src/quicknativestyle/items/qquickstyleitemscrollbar.h
deleted file mode 100644
index f89d8d3e..00000000
--- a/src/quicknativestyle/items/qquickstyleitemscrollbar.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMSCROLLBAR_H
-#define QQUICKSTYLEITEMSCROLLBAR_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickscrollbar_p.h>
-
-class QQuickStyleItemScrollBar : public QQuickStyleItem
-{
- Q_OBJECT
-
- Q_PROPERTY(SubControl subControl MEMBER m_subControl)
-
- QML_NAMED_ELEMENT(ScrollBar)
-
-public:
- enum SubControl {
- Groove = 1,
- Handle,
- AddLine,
- SubLine
- };
- Q_ENUM(SubControl)
-
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionSlider &styleOption) const;
-
-private:
- SubControl m_subControl = Groove;
-};
-
-#endif // QQUICKSTYLEITEMSCROLLBAR_H
diff --git a/src/quicknativestyle/items/qquickstyleitemscrollviewcorner.cpp b/src/quicknativestyle/items/qquickstyleitemscrollviewcorner.cpp
deleted file mode 100644
index 3a992f2d..00000000
--- a/src/quicknativestyle/items/qquickstyleitemscrollviewcorner.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemscrollviewcorner.h"
-
-StyleItemGeometry QQuickStyleItemScrollViewCorner::calculateGeometry()
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
-
- StyleItemGeometry geometry;
-
- // The size of the corner should be the width of the vertical
- // scrollbar and the height of the horizontal scrollbar.
- styleOption.orientation = Qt::Vertical;
- const auto vScrollBarWidth = style()->sizeFromContents(QStyle::CT_ScrollBar, &styleOption, QSize(0, 0)).width();
- styleOption.orientation = Qt::Horizontal;
- const auto hScrollBarHeight = style()->sizeFromContents(QStyle::CT_ScrollBar, &styleOption, QSize(0, 0)).height();
-
- geometry.minimumSize = QSize(vScrollBarWidth, hScrollBarHeight);
- geometry.implicitSize = geometry.minimumSize;
-
- return geometry;
-}
-
-void QQuickStyleItemScrollViewCorner::paintEvent(QPainter *painter) const
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
-
- // Grab a center piece of a vertical scrollbar groove onto a QImage, and use this
- // image to draw a corner. We draw the corner by first drawing the piece as it is, and
- // then rotate it 90 degrees, clip it into a triangle, and draw it once more on top.
- // The result is that we end up with one vertical and one horizontal triangle that
- // together form a filled corner rectangle.
-
- styleOption.orientation = Qt::Vertical;
-
- const qreal scale = window()->devicePixelRatio();
- const int grooveWidth = minimumSize().width();
- const int grooveHeight = minimumSize().height();
- const QSize scrollBarMinSize = style()->sizeFromContents(QStyle::CT_ScrollBar, &styleOption, QSize(0, 0));
- const QSize scrollBarSize = scrollBarMinSize + QSize(0, grooveHeight);
- const int hStart = scrollBarMinSize.height() / 2;
- const QRect targetImageRect(0, hStart * scale, grooveWidth * scale, grooveHeight * scale);
-
- QImage scrollBarImage(scrollBarSize * scale, QImage::Format_ARGB32_Premultiplied);
- scrollBarImage.setDevicePixelRatio(scale);
- scrollBarImage.fill(Qt::transparent);
- QPainter scrollBarPainter(&scrollBarImage);
- styleOption.rect = QRect(QPoint(0, 0), scrollBarSize);
- style()->drawComplexControl(QStyle::CC_ScrollBar, &styleOption, &scrollBarPainter);
-
- // Draw vertical groove
- painter->drawImage(QPoint(0, 0), scrollBarImage, targetImageRect);
-
- QPainterPath path;
- path.moveTo(0, 0);
- path.lineTo(0, grooveHeight);
- path.lineTo(grooveWidth, grooveHeight);
- path.closeSubpath();
-
- QTransform transform;
- transform.translate(grooveWidth, 0);
- transform.rotate(90);
-
- painter->save();
- painter->setCompositionMode(QPainter::CompositionMode_Source);
- painter->setClipPath(path);
- painter->setTransform(transform);
- // Draw horizontal groove, clipped to a triangle
- painter->drawImage(QPoint(0, 0), scrollBarImage, targetImageRect);
- painter->restore();
-}
-
-void QQuickStyleItemScrollViewCorner::initStyleOption(QStyleOptionSlider &styleOption) const
-{
- initStyleOptionBase(styleOption);
-
- styleOption.subControls = QStyle::SC_ScrollBarGroove;
- styleOption.activeSubControls = QStyle::SC_None;
- styleOption.pageStep = 1000;
- styleOption.minimum = 0;
- styleOption.maximum = 1;
- styleOption.sliderValue = 0;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemscrollviewcorner.h b/src/quicknativestyle/items/qquickstyleitemscrollviewcorner.h
deleted file mode 100644
index 637a8ea8..00000000
--- a/src/quicknativestyle/items/qquickstyleitemscrollviewcorner.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMSCROLLVIEWCORNER_H
-#define QQUICKSTYLEITEMSCROLLVIEWCORNER_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickscrollbar_p.h>
-
-class QQuickStyleItemScrollViewCorner : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(ScrollViewCorner)
-
-protected:
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionSlider &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMSCROLLVIEWCORNER_H
diff --git a/src/quicknativestyle/items/qquickstyleitemslider.cpp b/src/quicknativestyle/items/qquickstyleitemslider.cpp
deleted file mode 100644
index 67161ad3..00000000
--- a/src/quicknativestyle/items/qquickstyleitemslider.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemslider.h"
-
-QFont QQuickStyleItemSlider::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_ProgressBarLabel, controlSize(control));
-}
-
-void QQuickStyleItemSlider::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto slider = control<QQuickSlider>();
- connect(slider, &QQuickSlider::fromChanged, this, &QQuickStyleItem::markImageDirty);
- connect(slider, &QQuickSlider::toChanged, this, &QQuickStyleItem::markImageDirty);
- connect(slider, &QQuickSlider::positionChanged, this, &QQuickStyleItem::markImageDirty);
- connect(slider, &QQuickSlider::valueChanged, this, &QQuickStyleItem::markImageDirty);
- connect(slider, &QQuickSlider::stepSizeChanged, this, &QQuickStyleItem::markImageDirty);
- connect(slider, &QQuickSlider::pressedChanged, this, &QQuickStyleItem::markImageDirty);
- connect(slider, &QQuickSlider::orientationChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemSlider::calculateGeometry()
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
-
- 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;
-}
-
-void QQuickStyleItemSlider::paintEvent(QPainter *painter) const
-{
- QStyleOptionSlider styleOption;
- initStyleOption(styleOption);
- style()->drawComplexControl(QStyle::CC_Slider, &styleOption, painter);
-}
-
-void QQuickStyleItemSlider::initStyleOption(QStyleOptionSlider &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto slider = control<QQuickSlider>();
-
- styleOption.subControls = QStyle::SC_None;
- if (m_subControl & Groove)
- styleOption.subControls |= QStyle::SC_SliderGroove;
- if (m_subControl & Handle)
- styleOption.subControls |= QStyle::SC_SliderHandle;
- styleOption.activeSubControls = QStyle::SC_None;
- styleOption.orientation = slider->orientation();
-
- if (slider->isPressed())
- styleOption.state |= QStyle::State_Sunken;
-
- qreal min = 0;
- qreal max = 1;
- if (!qFuzzyIsNull(slider->stepSize())) {
- min = slider->from();
- max = slider->to();
-
- // TODO: add proper API for tickmarks
- const int index = slider->metaObject()->indexOfProperty("qqc2_style_tickPosition");
- if (index != -1) {
- const int tickPosition = slider->metaObject()->property(index).read(slider).toInt();
- styleOption.tickPosition = QStyleOptionSlider::TickPosition(tickPosition);
- if (styleOption.tickPosition != QStyleOptionSlider::NoTicks)
- styleOption.subControls |= QStyle::SC_SliderTickmarks;
- }
- }
-
- // Since the [from, to] interval in QQuickSlider is floating point, users can
- // specify very small ranges and step sizes, (e.g. [0.., 0.25], step size 0.05).
- // Since the style operates on ints, we cannot pass these values directly to the style,
- // so we normalize all values to the range [0, 10000]
- static const qreal Scale = 10000;
- const qreal normalizeMultiplier = Scale/(max - min);
- styleOption.tickInterval = int(slider->stepSize() * normalizeMultiplier);
- styleOption.minimum = 0;
- styleOption.maximum = int(Scale);
- styleOption.sliderValue = int((slider->value() - min) * normalizeMultiplier);
- styleOption.sliderPosition = int(slider->position() * styleOption.maximum);
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemslider.h b/src/quicknativestyle/items/qquickstyleitemslider.h
deleted file mode 100644
index 9a514207..00000000
--- a/src/quicknativestyle/items/qquickstyleitemslider.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMSLIDER_H
-#define QQUICKSTYLEITEMSLIDER_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickslider_p.h>
-
-class QQuickStyleItemSlider : public QQuickStyleItem
-{
- Q_OBJECT
-
- Q_PROPERTY(SubControl subControl MEMBER m_subControl)
-
- QML_NAMED_ELEMENT(Slider)
-
-public:
- enum SubControl {
- Groove = 1,
- Handle,
- };
- Q_ENUM(SubControl)
-
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionSlider &styleOption) const;
-
-private:
- SubControl m_subControl = Groove;
-};
-
-#endif // QQUICKSTYLEITEMSLIDER_H
diff --git a/src/quicknativestyle/items/qquickstyleitemspinbox.cpp b/src/quicknativestyle/items/qquickstyleitemspinbox.cpp
deleted file mode 100644
index 2a232b8a..00000000
--- a/src/quicknativestyle/items/qquickstyleitemspinbox.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemspinbox.h"
-#include <QtQuickTemplates2/private/qquickindicatorbutton_p.h>
-
-QFont QQuickStyleItemSpinBox::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_ComboBoxLabel, controlSize(control));
-}
-
-void QQuickStyleItemSpinBox::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto spinbox = control<QQuickSpinBox>();
- connect(spinbox->up(), &QQuickIndicatorButton::pressedChanged, this, &QQuickStyleItem::markImageDirty);
- connect(spinbox->down(), &QQuickIndicatorButton::pressedChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemSpinBox::calculateGeometry()
-{
- QStyleOptionSpinBox styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_SpinBox, &styleOption, QSize(0, 0));
-
- if (styleOption.subControls == QStyle::SC_SpinBoxFrame) {
- geometry.implicitSize = style()->sizeFromContents(QStyle::CT_SpinBox, &styleOption, contentSize());
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- 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;
- }
-
- return geometry;
-}
-
-void QQuickStyleItemSpinBox::paintEvent(QPainter *painter) const
-{
- QStyleOptionSpinBox styleOption;
- initStyleOption(styleOption);
- style()->drawComplexControl(QStyle::CC_SpinBox, &styleOption, painter);
-}
-
-void QQuickStyleItemSpinBox::initStyleOption(QStyleOptionSpinBox &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto spinbox = control<QQuickSpinBox>();
-
- switch (m_subControl) {
- case Frame:
- styleOption.subControls = QStyle::SC_SpinBoxFrame;
- styleOption.frame = true;
- break;
- case Up:
- styleOption.subControls = (QStyle::SC_SpinBoxUp | QStyle::SC_SpinBoxDown);
- break;
- case Down:
- styleOption.subControls = QStyle::SC_SpinBoxDown;
- break;
- }
-
- if (spinbox->up()->isPressed()) {
- styleOption.activeSubControls = QStyle::SC_SpinBoxUp;
- styleOption.state |= QStyle::State_Sunken;
- } else if (spinbox->down()->isPressed()) {
- styleOption.activeSubControls = QStyle::SC_SpinBoxDown;
- styleOption.state |= QStyle::State_Sunken;
- }
-
- styleOption.buttonSymbols = QStyleOptionSpinBox::UpDownArrows;
- styleOption.stepEnabled = QStyleOptionSpinBox::StepEnabled;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemspinbox.h b/src/quicknativestyle/items/qquickstyleitemspinbox.h
deleted file mode 100644
index d4b9f9fa..00000000
--- a/src/quicknativestyle/items/qquickstyleitemspinbox.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMSPINBOX_H
-#define QQUICKSTYLEITEMSPINBOX_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquickspinbox_p.h>
-
-class QQuickStyleItemSpinBox : public QQuickStyleItem
-{
- Q_OBJECT
-
- Q_PROPERTY(SubControl subControl MEMBER m_subControl)
-
- QML_NAMED_ELEMENT(SpinBox)
-
-public:
- enum SubControl {
- Frame = 1,
- Up,
- Down,
- };
- Q_ENUM(SubControl)
-
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionSpinBox &styleOption) const;
-
-private:
- SubControl m_subControl = Frame;
-};
-
-#endif // QQUICKSTYLEITEMSPINBOX_H
diff --git a/src/quicknativestyle/items/qquickstyleitemtextfield.cpp b/src/quicknativestyle/items/qquickstyleitemtextfield.cpp
deleted file mode 100644
index cd7d35aa..00000000
--- a/src/quicknativestyle/items/qquickstyleitemtextfield.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleitemtextfield.h"
-
-QFont QQuickStyleItemTextField::styleFont(QQuickItem *control) const
-{
- return style()->font(QStyle::CE_ComboBoxLabel, controlSize(control));
-}
-
-void QQuickStyleItemTextField::connectToControl() const
-{
- QQuickStyleItem::connectToControl();
- auto textField = control<QQuickTextField>();
- connect(textField, &QQuickTextField::readOnlyChanged, this, &QQuickStyleItem::markImageDirty);
- connect(textField, &QQuickTextField::focusChanged, this, &QQuickStyleItem::markImageDirty);
-}
-
-StyleItemGeometry QQuickStyleItemTextField::calculateGeometry()
-{
- QStyleOptionFrame styleOption;
- initStyleOption(styleOption);
- StyleItemGeometry geometry;
-
- geometry.minimumSize = style()->sizeFromContents(QStyle::CT_LineEdit, &styleOption, QSize(0, 0));
- geometry.implicitSize = style()->sizeFromContents(QStyle::CT_LineEdit, &styleOption, contentSize());
- styleOption.rect = QRect(QPoint(0, 0), geometry.implicitSize);
- 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;
-}
-
-void QQuickStyleItemTextField::paintEvent(QPainter *painter) const
-{
- QStyleOptionFrame styleOption;
- initStyleOption(styleOption);
- style()->drawPrimitive(QStyle::PE_PanelLineEdit, &styleOption, painter);
-}
-
-void QQuickStyleItemTextField::initStyleOption(QStyleOptionFrame &styleOption) const
-{
- initStyleOptionBase(styleOption);
- auto textField = control<QQuickTextField>();
-
- styleOption.lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, &styleOption);
- styleOption.midLineWidth = 0;
- styleOption.state |= QStyle::State_Sunken;
- if (textField->isReadOnly())
- styleOption.state |= QStyle::State_ReadOnly;
-}
diff --git a/src/quicknativestyle/items/qquickstyleitemtextfield.h b/src/quicknativestyle/items/qquickstyleitemtextfield.h
deleted file mode 100644
index 35aaf753..00000000
--- a/src/quicknativestyle/items/qquickstyleitemtextfield.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKSTYLEITEMTEXTFIELD_H
-#define QQUICKSTYLEITEMTEXTFIELD_H
-
-#include "qquickstyleitem.h"
-#include <QtQuickTemplates2/private/qquicktextfield_p.h>
-
-class QQuickStyleItemTextField : public QQuickStyleItem
-{
- Q_OBJECT
- QML_NAMED_ELEMENT(TextField)
-
-public:
- QFont styleFont(QQuickItem *control) const override;
-
-protected:
- void connectToControl() const override;
- void paintEvent(QPainter *painter) const override;
- StyleItemGeometry calculateGeometry() override;
-
-private:
- void initStyleOption(QStyleOptionFrame &styleOption) const;
-};
-
-#endif // QQUICKSTYLEITEMTEXTFIELD_H
diff --git a/src/quicknativestyle/qstyle/mac/mac.pri b/src/quicknativestyle/qstyle/mac/mac.pri
deleted file mode 100644
index 2f7ee7d4..00000000
--- a/src/quicknativestyle/qstyle/mac/mac.pri
+++ /dev/null
@@ -1,12 +0,0 @@
-LIBS_PRIVATE += -framework AppKit
-
-INCLUDEPATH += $$PWD
-
-HEADERS += \
- $$PWD/qquickmacstyle_mac_p.h \
- $$PWD/qquickmacstyle_mac_p_p.h
-
-SOURCES +=
-
-OBJECTIVE_SOURCES += \
- $$PWD/qquickmacstyle_mac.mm
diff --git a/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac.mm b/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac.mm
deleted file mode 100644
index 5d061667..00000000
--- a/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac.mm
+++ /dev/null
@@ -1,6072 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*
- Note: The qdoc comments for QMacStyle are contained in
- .../doc/src/qstyles.qdoc.
-*/
-
-#include <AppKit/AppKit.h>
-
-#include "qquickmacstyle_mac_p.h"
-#include "qquickmacstyle_mac_p_p.h"
-#include "qquickstylehelper_p.h"
-
-#include <QtQuickTemplates2/private/qquickcontrol_p.h>
-
-#define QMAC_QAQUASTYLE_SIZE_CONSTRAIN
-//#define DEBUG_SIZE_CONSTRAINT
-
-#include <QtCore/qoperatingsystemversion.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qvarlengtharray.h>
-
-#include <QtGui/qpainterpath.h>
-#include <QtGui/qpa/qplatformnativeinterface.h>
-#include <QtGui/qpa/qplatformfontdatabase.h>
-#include <QtGui/qpa/qplatformtheme.h>
-
-#include <QtCore/private/qcore_mac_p.h>
-#include <QtGui/private/qcoregraphics_p.h>
-#include <QtGui/private/qguiapplication_p.h>
-
-#include <cmath>
-
-QT_USE_NAMESPACE
-
-// OBS! Changing QT_MANGLE_NAMESPACE and QT_NAMESPACE_ALIAS_OBJC_CLASS to take
-// both QT_NAMESPACE and QQC2_NAMESPACE into account (and not only QT_NAMESPACE, which
-// would otherwise be the case). This will make it possible to link in both widgets and
-// controls in the same application when building statically.
-#undef QT_MANGLE_NAMESPACE
-#undef QT_NAMESPACE_ALIAS_OBJC_CLASS
-
-#define QQC2_MANGLE1(a, b) a##_##b
-#define QQC2_MANGLE2(a, b) QQC2_MANGLE1(a, b)
-
-#if defined(QT_NAMESPACE)
- #define QT_MANGLE_NAMESPACE(name) QQC2_MANGLE2(QQC2_MANGLE1(name, QQC2_NAMESPACE), QT_NAMESPACE)
- #define QT_NAMESPACE_ALIAS_OBJC_CLASS(name) @compatibility_alias name QT_MANGLE_NAMESPACE(name)
-#else
- #define QT_MANGLE_NAMESPACE(name) QQC2_MANGLE2(name, QQC2_NAMESPACE)
- #define QT_NAMESPACE_ALIAS_OBJC_CLASS(name) @compatibility_alias name QT_MANGLE_NAMESPACE(name)
-#endif
-
-@interface QT_MANGLE_NAMESPACE(QIndeterminateProgressIndicator) : NSProgressIndicator
-
-@property (readonly, nonatomic) NSInteger animators;
-
-- (instancetype)init;
-
-- (void)startAnimation;
-- (void)stopAnimation;
-
-- (void)drawWithFrame:(CGRect)rect inView:(NSView *)view;
-
-@end
-
-QT_NAMESPACE_ALIAS_OBJC_CLASS(QIndeterminateProgressIndicator);
-
-@implementation QIndeterminateProgressIndicator
-
-- (instancetype)init
-{
- if ((self = [super init])) {
- _animators = 0;
- self.indeterminate = YES;
- self.usesThreadedAnimation = NO;
- self.alphaValue = 0.0;
- }
-
- return self;
-}
-
-- (void)startAnimation
-{
- if (_animators == 0) {
- self.hidden = NO;
- [super startAnimation:self];
- }
- ++_animators;
-}
-
-- (void)stopAnimation
-{
- --_animators;
- if (_animators == 0) {
- [super stopAnimation:self];
- self.hidden = YES;
- [self removeFromSuperviewWithoutNeedingDisplay];
- }
-}
-
-- (void)drawWithFrame:(CGRect)rect inView:(NSView *)view
-{
- // The alphaValue change is not strictly necessary, but feels safer.
- self.alphaValue = 1.0;
- if (self.superview != view)
- [view addSubview:self];
- if (!CGRectEqualToRect(self.frame, rect))
- self.frame = rect;
- [self drawRect:rect];
- self.alphaValue = 0.0;
-}
-
-@end
-
-@interface QT_MANGLE_NAMESPACE(QVerticalSplitView) : NSSplitView
-- (BOOL)isVertical;
-@end
-
-QT_NAMESPACE_ALIAS_OBJC_CLASS(QVerticalSplitView);
-
-@implementation QVerticalSplitView
-- (BOOL)isVertical
-{
- return YES;
-}
-@end
-
-// See render code in drawPrimitive(PE_FrameTabWidget)
-@interface QT_MANGLE_NAMESPACE(QDarkNSBox) : NSBox
-@end
-
-QT_NAMESPACE_ALIAS_OBJC_CLASS(QDarkNSBox);
-
-@implementation QDarkNSBox
-- (instancetype)init
-{
- if ((self = [super init])) {
- self.title = @"";
- self.titlePosition = NSNoTitle;
- self.boxType = NSBoxCustom;
- self.cornerRadius = 3;
- self.borderColor = [NSColor.controlColor colorWithAlphaComponent:0.1];
- self.fillColor = [NSColor.darkGrayColor colorWithAlphaComponent:0.2];
- }
-
- return self;
-}
-
-- (void)drawRect:(NSRect)rect
-{
- [super drawRect:rect];
-}
-@end
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2_NAMESPACE {
-
-// The following constants are used for adjusting the size
-// of push buttons so that they are drawn inside their bounds.
-const int QMacStylePrivate::PushButtonLeftOffset = 6;
-const int QMacStylePrivate::PushButtonRightOffset = 12;
-const int QMacStylePrivate::PushButtonContentPadding = 6;
-
-QVector<QPointer<QObject> > QMacStylePrivate::scrollBars;
-
-// Title bar gradient colors for Lion were determined by inspecting PSDs exported
-// using CoreUI's CoreThemeDocument; there is no public API to retrieve them
-
-static QLinearGradient titlebarGradientActive()
-{
- static QLinearGradient darkGradient = [](){
- QLinearGradient gradient;
- // FIXME: colors are chosen somewhat arbitrarily and could be fine-tuned,
- // or ideally determined by calling a native API.
- gradient.setColorAt(0, QColor(47, 47, 47));
- return gradient;
- }();
- static QLinearGradient lightGradient = [](){
- QLinearGradient gradient;
- gradient.setColorAt(0, QColor(235, 235, 235));
- gradient.setColorAt(0.5, QColor(210, 210, 210));
- gradient.setColorAt(0.75, QColor(195, 195, 195));
- gradient.setColorAt(1, QColor(180, 180, 180));
- return gradient;
- }();
- return qt_mac_applicationIsInDarkMode() ? darkGradient : lightGradient;
-}
-
-static QLinearGradient titlebarGradientInactive()
-{
- static QLinearGradient darkGradient = [](){
- QLinearGradient gradient;
- gradient.setColorAt(1, QColor(42, 42, 42));
- return gradient;
- }();
- static QLinearGradient lightGradient = [](){
- QLinearGradient gradient;
- gradient.setColorAt(0, QColor(250, 250, 250));
- gradient.setColorAt(1, QColor(225, 225, 225));
- return gradient;
- }();
- return qt_mac_applicationIsInDarkMode() ? darkGradient : lightGradient;
-}
-
-/*
- Since macOS 10.14 AppKit is using transparency more extensively, especially for the
- dark theme. Inactive buttons, for example, are semi-transparent. And we use them to
- draw tab widget's tab bar. The combination of NSBox (also a part of tab widget)
- and these transparent buttons gives us an undesired side-effect: an outline of
- NSBox is visible through transparent buttons. To avoid this, we have this hack below:
- we clip the area where the line would be visible through the buttons. The area we
- want to clip away can be described as an intersection of the option's rect and
- the tab widget's tab bar rect. But some adjustments are required, since those rects
- are anyway adjusted during the rendering and they are not exactly what you'll see on
- the screen. Thus this switch-statement inside.
-*/
-static void clipTabBarFrame(const QStyleOption *option, const QMacStyle *style, CGContextRef ctx)
-{
- Q_ASSERT(option);
- Q_ASSERT(style);
- Q_ASSERT(ctx);
-
- if (qt_mac_applicationIsInDarkMode()) {
-// QTabWidget *tabWidget = qobject_cast<QTabWidget *>(option->styleObject);
-// Q_ASSERT(tabWidget);
-
-// QRect tabBarRect = style->subElementRect(QStyle::SE_TabWidgetTabBar, option, tabWidget).adjusted(2, 0, -3, 0);
-// switch (tabWidget->tabPosition()) {
-// case QTabWidget::South:
-// tabBarRect.setY(tabBarRect.y() + tabBarRect.height() / 2);
-// break;
-// case QTabWidget::North:
-// case QTabWidget::West:
-// tabBarRect = tabBarRect.adjusted(0, 2, 0, -2);
-// break;
-// case QTabWidget::East:
-// tabBarRect = tabBarRect.adjusted(tabBarRect.width() / 2, 2, tabBarRect.width() / 2, -2);
-// }
-
-// const QRegion clipPath = QRegion(option->rect) - tabBarRect;
-// QVarLengthArray<CGRect, 3> cgRects;
-// for (const QRect &qtRect : clipPath)
-// cgRects.push_back(qtRect.toCGRect());
-// if (cgRects.size())
-// CGContextClipToRects(ctx, &cgRects[0], size_t(cgRects.size()));
- }
-}
-
-static const QColor titlebarSeparatorLineActive(111, 111, 111);
-static const QColor titlebarSeparatorLineInactive(131, 131, 131);
-static const QColor darkModeSeparatorLine(88, 88, 88);
-
-// Gradient colors used for the dock widget title bar and
-// non-unifed tool bar background.
-static const QColor lightMainWindowGradientBegin(240, 240, 240);
-static const QColor lightMainWindowGradientEnd(200, 200, 200);
-static const QColor darkMainWindowGradientBegin(47, 47, 47);
-static const QColor darkMainWindowGradientEnd(47, 47, 47);
-
-static const int DisclosureOffset = 4;
-
-static const qreal titleBarIconTitleSpacing = 5;
-static const qreal titleBarTitleRightMargin = 12;
-static const qreal titleBarButtonSpacing = 8;
-
-// Tab bar colors
-// active: window is active
-// selected: tab is selected
-// hovered: tab is hovered
-bool isDarkMode() { return qt_mac_applicationIsInDarkMode(); }
-
-static const QColor lightTabBarTabBackgroundActive(190, 190, 190);
-static const QColor darkTabBarTabBackgroundActive(38, 38, 38);
-static const QColor tabBarTabBackgroundActive() { return isDarkMode() ? darkTabBarTabBackgroundActive : lightTabBarTabBackgroundActive; }
-
-static const QColor lightTabBarTabBackgroundActiveHovered(178, 178, 178);
-static const QColor darkTabBarTabBackgroundActiveHovered(32, 32, 32);
-static const QColor tabBarTabBackgroundActiveHovered() { return isDarkMode() ? darkTabBarTabBackgroundActiveHovered : lightTabBarTabBackgroundActiveHovered; }
-
-static const QColor lightTabBarTabBackgroundActiveSelected(211, 211, 211);
-static const QColor darkTabBarTabBackgroundActiveSelected(52, 52, 52);
-static const QColor tabBarTabBackgroundActiveSelected() { return isDarkMode() ? darkTabBarTabBackgroundActiveSelected : lightTabBarTabBackgroundActiveSelected; }
-
-static const QColor lightTabBarTabBackground(227, 227, 227);
-static const QColor darkTabBarTabBackground(38, 38, 38);
-static const QColor tabBarTabBackground() { return isDarkMode() ? darkTabBarTabBackground : lightTabBarTabBackground; }
-
-static const QColor lightTabBarTabBackgroundSelected(246, 246, 246);
-static const QColor darkTabBarTabBackgroundSelected(52, 52, 52);
-static const QColor tabBarTabBackgroundSelected() { return isDarkMode() ? darkTabBarTabBackgroundSelected : lightTabBarTabBackgroundSelected; }
-
-static const QColor lightTabBarTabLineActive(160, 160, 160);
-static const QColor darkTabBarTabLineActive(90, 90, 90);
-static const QColor tabBarTabLineActive() { return isDarkMode() ? darkTabBarTabLineActive : lightTabBarTabLineActive; }
-
-static const QColor lightTabBarTabLineActiveHovered(150, 150, 150);
-static const QColor darkTabBarTabLineActiveHovered(90, 90, 90);
-static const QColor tabBarTabLineActiveHovered() { return isDarkMode() ? darkTabBarTabLineActiveHovered : lightTabBarTabLineActiveHovered; }
-
-static const QColor lightTabBarTabLine(210, 210, 210);
-static const QColor darkTabBarTabLine(90, 90, 90);
-static const QColor tabBarTabLine() { return isDarkMode() ? darkTabBarTabLine : lightTabBarTabLine; }
-
-static const QColor lightTabBarTabLineSelected(189, 189, 189);
-static const QColor darkTabBarTabLineSelected(90, 90, 90);
-static const QColor tabBarTabLineSelected() { return isDarkMode() ? darkTabBarTabLineSelected : lightTabBarTabLineSelected; }
-
-static const QColor tabBarCloseButtonBackgroundHovered(162, 162, 162);
-static const QColor tabBarCloseButtonBackgroundPressed(153, 153, 153);
-static const QColor tabBarCloseButtonBackgroundSelectedHovered(192, 192, 192);
-static const QColor tabBarCloseButtonBackgroundSelectedPressed(181, 181, 181);
-static const QColor tabBarCloseButtonCross(100, 100, 100);
-static const QColor tabBarCloseButtonCrossSelected(115, 115, 115);
-
-static const int closeButtonSize = 14;
-static const qreal closeButtonCornerRadius = 2.0;
-
-#ifndef QT_NO_ACCESSIBILITY // This ifdef to avoid "unused function" warning.
-QBrush brushForToolButton(bool isOnKeyWindow)
-{
- // When a toolbutton in a toolbar is in the 'ON' state, we draw a
- // partially transparent background. The colors must be different
- // for 'Aqua' and 'DarkAqua' appearances though.
- if (isDarkMode())
- return isOnKeyWindow ? QColor(73, 73, 73, 100) : QColor(56, 56, 56, 100);
-
- return isOnKeyWindow ? QColor(0, 0, 0, 28) : QColor(0, 0, 0, 21);
-}
-#endif // QT_NO_ACCESSIBILITY
-
-static const int headerSectionArrowHeight = 6;
-static const int headerSectionSeparatorInset = 2;
-
-// One for each of QStyleHelper::WidgetSizePolicy
-static const QMarginsF comboBoxFocusRingMargins[3] = {
- { 0.5, 2, 3.5, 4 },
- { 0.5, 1, 2.5, 4 },
- { 0.5, 1.5, 2.5, 3.5 }
-};
-
-static const QMarginsF pullDownButtonShadowMargins[3] = {
- { 0.5, -1, 0.5, 2 },
- { 0.5, -1.5, 0.5, 2.5 },
- { 0.5, 0, 0.5, 1 }
-};
-
-static const QMarginsF pushButtonShadowMargins[3] = {
- { 1.5, -1.5, 1.5, 4.5 },
- { 1.5, -1, 1.5, 4 },
- { 1.5, 0.5, 1.5, 2.5 }
-};
-
-// These are frame heights as reported by Xcode 9's Interface Builder.
-// Alignemnet rectangle's heights match for push and popup buttons
-// with respective values 21, 18 and 15.
-
-static const qreal comboBoxDefaultHeight[3] = {
- 26, 22, 19
-};
-
-static const qreal pushButtonDefaultHeight[3] = {
- 32, 28, 16
-};
-
-static const qreal popupButtonDefaultHeight[3] = {
- 26, 22, 15
-};
-
-static const int toolButtonArrowSize = 7;
-static const int toolButtonArrowMargin = 2;
-
-static const qreal focusRingWidth = 3.5;
-
-// An application can force 'Aqua' theme while the system theme is one of
-// the 'Dark' variants. Since in Qt we sometimes use NSControls and even
-// NSCells directly without attaching them to any view hierarchy, we have
-// to set NSAppearance.currentAppearance to 'Aqua' manually, to make sure
-// the correct rendering path is triggered. Apple recommends us to un-set
-// the current appearance back after we finished with drawing. This is what
-// AppearanceSync is for.
-
-class AppearanceSync {
-public:
- AppearanceSync()
- {
-#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
- if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave
- && !qt_mac_applicationIsInDarkMode()) {
- auto requiredAppearanceName = NSApplication.sharedApplication.effectiveAppearance.name;
- if (![NSAppearance.currentAppearance.name isEqualToString:requiredAppearanceName]) {
- previous = NSAppearance.currentAppearance;
- NSAppearance.currentAppearance = [NSAppearance appearanceNamed:requiredAppearanceName];
- }
- }
-#endif // QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
- }
-
- ~AppearanceSync()
- {
- if (previous)
- NSAppearance.currentAppearance = previous;
- }
-
-private:
- NSAppearance *previous = nil;
-
- Q_DISABLE_COPY(AppearanceSync)
-};
-
-static bool setupScroller(NSScroller *scroller, const QStyleOptionSlider *sb)
-{
- const qreal length = sb->maximum - sb->minimum + sb->pageStep;
- if (qFuzzyIsNull(length))
- return false;
- const qreal proportion = sb->pageStep / length;
- const qreal range = qreal(sb->maximum - sb->minimum);
- qreal value = range ? qreal(sb->sliderValue - sb->minimum) / range : 0;
- if (sb->orientation == Qt::Horizontal && sb->direction == Qt::RightToLeft)
- value = 1.0 - value;
-
- scroller.frame = sb->rect.toCGRect();
- scroller.floatValue = value;
- scroller.knobProportion = proportion;
- return true;
-}
-
-static bool setupSlider(NSSlider *slider, const QStyleOptionSlider *sl)
-{
- if (sl->minimum >= sl->maximum)
- return false;
-
- slider.frame = sl->rect.toCGRect();
- slider.minValue = sl->minimum;
- slider.maxValue = sl->maximum;
- slider.intValue = sl->sliderPosition;
- slider.enabled = sl->state & QStyle::State_Enabled;
- if (sl->tickPosition != QStyleOptionSlider::NoTicks) {
- // Set numberOfTickMarks, but TicksBothSides will be treated differently
- int interval = sl->tickInterval;
- if (interval == 0) {
- interval = sl->pageStep;
- if (interval == 0)
- interval = sl->singleStep;
- if (interval == 0)
- interval = 1; // return false?
- }
- slider.numberOfTickMarks = 1 + ((sl->maximum - sl->minimum) / interval);
-
- const bool ticksAbove = sl->tickPosition == QStyleOptionSlider::TicksAbove;
- if (sl->orientation == Qt::Horizontal)
- slider.tickMarkPosition = ticksAbove ? NSTickMarkPositionAbove : NSTickMarkPositionBelow;
- else
- slider.tickMarkPosition = ticksAbove ? NSTickMarkPositionLeading : NSTickMarkPositionTrailing;
- } else {
- slider.numberOfTickMarks = 0;
- }
-
- // Ensure the values set above are reflected when asking
- // the cell for its metrics and to draw itself.
- [slider layoutSubtreeIfNeeded];
-
- return true;
-}
-
-static bool isInMacUnifiedToolbarArea(QWindow *window, int windowY)
-{
- QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
- QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
- nativeInterface->nativeResourceFunctionForIntegration("testContentBorderPosition");
- if (!function)
- return false; // Not Cocoa platform plugin.
-
- typedef bool (*TestContentBorderPositionFunction)(QWindow *, int);
- return (reinterpret_cast<TestContentBorderPositionFunction>(function))(window, windowY);
-}
-
-
-static void drawTabCloseButton(QPainter *p, bool hover, bool selected, bool pressed, bool documentMode)
-{
- p->setRenderHints(QPainter::Antialiasing);
- QRect rect(0, 0, closeButtonSize, closeButtonSize);
- const int width = rect.width();
- const int height = rect.height();
-
- if (hover) {
- // draw background circle
- QColor background;
- if (selected) {
- if (documentMode)
- background = pressed ? tabBarCloseButtonBackgroundSelectedPressed : tabBarCloseButtonBackgroundSelectedHovered;
- else
- background = QColor(255, 255, 255, pressed ? 150 : 100); // Translucent white
- } else {
- background = pressed ? tabBarCloseButtonBackgroundPressed : tabBarCloseButtonBackgroundHovered;
- if (!documentMode)
- background = background.lighter(pressed ? 135 : 140); // Lighter tab background, lighter color
- }
-
- p->setPen(Qt::transparent);
- p->setBrush(background);
- p->drawRoundedRect(rect, closeButtonCornerRadius, closeButtonCornerRadius);
- }
-
- // draw cross
- const int margin = 3;
- QPen crossPen;
- crossPen.setColor(selected ? (documentMode ? tabBarCloseButtonCrossSelected : Qt::white) : tabBarCloseButtonCross);
- crossPen.setWidthF(1.1);
- crossPen.setCapStyle(Qt::FlatCap);
- p->setPen(crossPen);
- p->drawLine(margin, margin, width - margin, height - margin);
- p->drawLine(margin, height - margin, width - margin, margin);
-}
-
-QRect rotateTabPainter(QPainter *p, QStyleOptionTab::Shape shape, QRect tabRect)
-{
- const auto tabDirection = QMacStylePrivate::tabDirection(shape);
- if (QMacStylePrivate::verticalTabs(tabDirection)) {
- int newX, newY, newRot;
- if (tabDirection == QMacStylePrivate::East) {
- newX = tabRect.width();
- newY = tabRect.y();
- newRot = 90;
- } else {
- newX = 0;
- newY = tabRect.y() + tabRect.height();
- newRot = -90;
- }
- tabRect.setRect(0, 0, tabRect.height(), tabRect.width());
- QTransform transform;
- transform.translate(newX, newY);
- transform.rotate(newRot);
- p->setTransform(transform, true);
- }
- return tabRect;
-}
-
-void drawTabShape(QPainter *p, const QStyleOptionTab *tabOpt, bool isUnified, int tabOverlap)
-{
- QRect rect = tabOpt->rect;
- if (QMacStylePrivate::verticalTabs(QMacStylePrivate::tabDirection(tabOpt->shape)))
- rect = rect.adjusted(-tabOverlap, 0, 0, 0);
- else
- rect = rect.adjusted(0, -tabOverlap, 0, 0);
-
- p->translate(rect.x(), rect.y());
- rect.moveLeft(0);
- rect.moveTop(0);
- const QRect tabRect = rotateTabPainter(p, tabOpt->shape, rect);
-
- const int width = tabRect.width();
- const int height = tabRect.height();
- const bool active = (tabOpt->state & QStyle::State_Active);
- const bool selected = (tabOpt->state & QStyle::State_Selected);
-
- const QRect bodyRect(1, 2, width - 2, height - 3);
- const QRect topLineRect(1, 0, width - 2, 1);
- const QRect bottomLineRect(1, height - 1, width - 2, 1);
- if (selected) {
- // fill body
- if (tabOpt->documentMode && isUnified) {
- p->save();
- p->setCompositionMode(QPainter::CompositionMode_Source);
- p->fillRect(tabRect, QColor(Qt::transparent));
- p->restore();
- } else if (active) {
- p->fillRect(bodyRect, tabBarTabBackgroundActiveSelected());
- // top line
- p->fillRect(topLineRect, tabBarTabLineSelected());
- } else {
- p->fillRect(bodyRect, tabBarTabBackgroundSelected());
- }
- } else {
- // when the mouse is over non selected tabs they get a new color
- const bool hover = (tabOpt->state & QStyle::State_MouseOver);
- if (hover) {
- // fill body
- p->fillRect(bodyRect, tabBarTabBackgroundActiveHovered());
- // bottom line
- p->fillRect(bottomLineRect, isDarkMode() ? QColor(Qt::black) : tabBarTabLineActiveHovered());
- }
- }
-
- // separator lines between tabs
- const QRect leftLineRect(0, 1, 1, height - 2);
- const QRect rightLineRect(width - 1, 1, 1, height - 2);
- const QColor separatorLineColor = active ? tabBarTabLineActive() : tabBarTabLine();
- p->fillRect(leftLineRect, separatorLineColor);
- p->fillRect(rightLineRect, separatorLineColor);
-}
-
-void drawTabBase(QPainter *p, const QStyleOptionTabBarBase *tbb)
-{
- QRect r = tbb->rect;
-// if (QMacStylePrivate::verticalTabs(QMacStylePrivate::tabDirection(tbb->shape)))
-// r.setWidth(w->width());
-// else
-// r.setHeight(w->height());
-
- const QRect tabRect = rotateTabPainter(p, tbb->shape, r);
- const int width = tabRect.width();
- const int height = tabRect.height();
- const bool active = (tbb->state & QStyle::State_Active);
-
- // fill body
- const QRect bodyRect(0, 1, width, height - 1);
- const QColor bodyColor = active ? tabBarTabBackgroundActive() : tabBarTabBackground();
- p->fillRect(bodyRect, bodyColor);
-
- // top line
- const QRect topLineRect(0, 0, width, 1);
- const QColor topLineColor = active ? tabBarTabLineActive() : tabBarTabLine();
- p->fillRect(topLineRect, topLineColor);
-
- // bottom line
- const QRect bottomLineRect(0, height - 1, width, 1);
- bool isDocument = false;
-// if (const QTabBar *tabBar = qobject_cast<const QTabBar*>(w))
-// isDocument = tabBar->documentMode();
- const QColor bottomLineColor = isDocument && isDarkMode() ? QColor(Qt::black) : active ? tabBarTabLineActive() : tabBarTabLine();
- p->fillRect(bottomLineRect, bottomLineColor);
-}
-
-static QStyleHelper::WidgetSizePolicy getControlSize(const QStyleOption *option)
-{
- const auto wsp = QStyleHelper::widgetSizePolicy(option);
- if (wsp == QStyleHelper::SizeDefault)
- return QStyleHelper::SizeLarge;
-
- return wsp;
-}
-
-static QString qt_mac_removeMnemonics(const QString &original)
-{
- QString returnText(original.size(), QChar());
- int finalDest = 0;
- int currPos = 0;
- int l = original.length();
- while (l) {
- if (original.at(currPos) == QLatin1Char('&')) {
- ++currPos;
- --l;
- if (l == 0)
- break;
- } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
- original.at(currPos + 1) == QLatin1Char('&') &&
- original.at(currPos + 2) != QLatin1Char('&') &&
- original.at(currPos + 3) == QLatin1Char(')')) {
- /* remove mnemonics its format is "\s*(&X)" */
- int n = 0;
- while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
- ++n;
- finalDest -= n;
- currPos += 4;
- l -= 4;
- continue;
- }
- returnText[finalDest] = original.at(currPos);
- ++currPos;
- ++finalDest;
- --l;
- }
- returnText.truncate(finalDest);
- return returnText;
-}
-
-static bool qt_macWindowMainWindow(const QWindow *window)
-{
- if (window->handle()) {
- if (NSWindow *nswindow = static_cast<NSWindow*>(
- QGuiApplication::platformNativeInterface()->
- nativeResourceForWindow(QByteArrayLiteral("nswindow"),
- const_cast<QWindow *>(window)))) {
- return [nswindow isMainWindow];
- }
- }
- return false;
-}
-
-#define LargeSmallMini(option, large, small, mini) \
- (option->state & QStyle::State_Small) ? small : ((option->state & QStyle::State_Mini) ? mini : large)
-
-/*****************************************************************************
- QMacCGStyle globals
- *****************************************************************************/
-const int macItemFrame = 2; // menu item frame width
-const int macItemHMargin = 3; // menu item hor text margin
-const int macRightBorder = 12; // right border on mac
-
-/*****************************************************************************
- QMacCGStyle utility functions
- *****************************************************************************/
-
-enum QAquaMetric {
- // Prepend kThemeMetric to get the HIToolBox constant.
- // Represents the values already used in QMacStyle.
- CheckBoxHeight = 0,
- CheckBoxWidth,
- EditTextFrameOutset,
- FocusRectOutset,
- HSliderHeight,
- HSliderTickHeight,
- LargeProgressBarThickness,
- ListHeaderHeight,
- MenuSeparatorHeight, // GetThemeMenuSeparatorHeight
- MiniCheckBoxHeight,
- MiniCheckBoxWidth,
- MiniHSliderHeight,
- MiniHSliderTickHeight,
- MiniPopupButtonHeight,
- MiniPushButtonHeight,
- MiniRadioButtonHeight,
- MiniRadioButtonWidth,
- MiniVSliderTickWidth,
- MiniVSliderWidth,
- NormalProgressBarThickness,
- PopupButtonHeight,
- ProgressBarShadowOutset,
- PushButtonHeight,
- RadioButtonHeight,
- RadioButtonWidth,
- SeparatorSize,
- SmallCheckBoxHeight,
- SmallCheckBoxWidth,
- SmallHSliderHeight,
- SmallHSliderTickHeight,
- SmallPopupButtonHeight,
- SmallProgressBarShadowOutset,
- SmallPushButtonHeight,
- SmallRadioButtonHeight,
- SmallRadioButtonWidth,
- SmallVSliderTickWidth,
- SmallVSliderWidth,
- VSliderTickWidth,
- VSliderWidth
-};
-
-static const int qt_mac_aqua_metrics[] = {
- // Values as of macOS 10.12.4 and Xcode 8.3.1
- 18 /* CheckBoxHeight */,
- 18 /* CheckBoxWidth */,
- 1 /* EditTextFrameOutset */,
- 4 /* FocusRectOutset */,
- 22 /* HSliderHeight */,
- 5 /* HSliderTickHeight */,
- 16 /* LargeProgressBarThickness */,
- 17 /* ListHeaderHeight */,
- 12 /* MenuSeparatorHeight, aka GetThemeMenuSeparatorHeight */,
- 11 /* MiniCheckBoxHeight */,
- 11 /* MiniCheckBoxWidth */,
- 12 /* MiniHSliderHeight */,
- 4 /* MiniHSliderTickHeight */,
- 15 /* MiniPopupButtonHeight */,
- 16 /* MiniPushButtonHeight */,
- 11 /* MiniRadioButtonHeight */,
- 11 /* MiniRadioButtonWidth */,
- 4 /* MiniVSliderTickWidth */,
- 12 /* MiniVSliderWidth */,
- 12 /* NormalProgressBarThickness */,
- 20 /* PopupButtonHeight */,
- 4 /* ProgressBarShadowOutset */,
- 20 /* PushButtonHeight */,
- 18 /* RadioButtonHeight */,
- 18 /* RadioButtonWidth */,
- 1 /* SeparatorSize */,
- 16 /* SmallCheckBoxHeight */,
- 14 /* SmallCheckBoxWidth */,
- 15 /* SmallHSliderHeight */,
- 4 /* SmallHSliderTickHeight */,
- 17 /* SmallPopupButtonHeight */,
- 2 /* SmallProgressBarShadowOutset */,
- 17 /* SmallPushButtonHeight */,
- 15 /* SmallRadioButtonHeight */,
- 15 /* SmallRadioButtonWidth */,
- 4 /* SmallVSliderTickWidth */,
- 15 /* SmallVSliderWidth */,
- 5 /* VSliderTickWidth */,
- 22 /* VSliderWidth */
-};
-
-static inline int qt_mac_aqua_get_metric(QAquaMetric m)
-{
- return qt_mac_aqua_metrics[m];
-}
-
-static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QStyleOption *opt,
- QSize szHint, QStyleHelper::WidgetSizePolicy sz)
-{
- QSize ret(-1, -1);
- if (sz != QStyleHelper::SizeSmall && sz != QStyleHelper::SizeLarge && sz != QStyleHelper::SizeMini) {
- qDebug("Not sure how to return this...");
- return ret;
- }
-// if ((widget && widget->testAttribute(Qt::WA_SetFont)) || !QApplication::desktopSettingsAware()) {
-// // If you're using a custom font and it's bigger than the default font,
-// // then no constraints for you. If you are smaller, we can try to help you out
-// QFont font = qt_app_fonts_hash()->value(widget->metaObject()->className(), QFont());
-// if (widget->font().pointSize() > font.pointSize())
-// return ret;
-// }
-
- // TODO: investigate how this function is used. 'ct' can/should be
- // filled out correctly in the styleoption already from the styleitem?
- Q_ASSERT(ct != QStyle::CT_CustomBase);
-// if (ct == QStyle::CT_CustomBase && widget) {
-//#if QT_CONFIG(pushbutton)
-// if (qobject_cast<const QPushButton *>(widg))
-// ct = QStyle::CT_PushButton;
-//#endif
-// else if (qobject_cast<const QRadioButton *>(widget))
-// ct = QStyle::CT_RadioButton;
-//#if QT_CONFIG(checkbox)
-// else if (qobject_cast<const QCheckBox *>(widg))
-// ct = QStyle::CT_CheckBox;
-//#endif
-//#if QT_CONFIG(combobox)
-// else if (qobject_cast<const QComboBox *>(widg))
-// ct = QStyle::CT_ComboBox;
-//#endif
-//#if QT_CONFIG(toolbutton)
-// else if (qobject_cast<const QToolButton *>(widg))
-// ct = QStyle::CT_ToolButton;
-//#endif
-// else if (qobject_cast<const QSlider *>(widget))
-// ct = QStyle::CT_Slider;
-//#if QT_CONFIG(progressbar)
-// else if (qobject_cast<const QProgressBar *>(widg))
-// ct = QStyle::CT_ProgressBar;
-//#endif
-//#if QT_CONFIG(lineedit)
-// else if (qobject_cast<const QLineEdit *>(widg))
-// ct = QStyle::CT_LineEdit;
-//#endif
-//#if QT_CONFIG(itemviews)
-// else if (qobject_cast<const QHeaderView *>(widg))
-// ct = QStyle::CT_HeaderSection;
-//#endif
-//#if QT_CONFIG(menubar)
-// else if (qobject_cast<const QMenuBar *>(widg))
-// ct = QStyle::CT_MenuBar;
-//#endif
-//#if QT_CONFIG(sizegrip)
-// else if (qobject_cast<const QSizeGrip *>(widg))
-// ct = QStyle::CT_SizeGrip;
-//#endif
-// else
-// return ret;
-// }
-
- switch (ct) {
- case QStyle::CT_PushButton: {
- const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt);
- if (btn) {
- QString buttonText = qt_mac_removeMnemonics(btn->text);
- if (buttonText.contains(QLatin1Char('\n')))
- ret = QSize(-1, -1);
- else if (sz == QStyleHelper::SizeLarge)
- ret = QSize(-1, qt_mac_aqua_get_metric(PushButtonHeight));
- else if (sz == QStyleHelper::SizeSmall)
- ret = QSize(-1, qt_mac_aqua_get_metric(SmallPushButtonHeight));
- else if (sz == QStyleHelper::SizeMini)
- ret = QSize(-1, qt_mac_aqua_get_metric(MiniPushButtonHeight));
-
- if (!btn->icon.isNull()){
- // If the button got an icon, and the icon is larger than the
- // button, we can't decide on a default size
- ret.setWidth(-1);
- if (ret.height() < btn->iconSize.height())
- ret.setHeight(-1);
- }
- else if (buttonText == QLatin1String("OK") || buttonText == QLatin1String("Cancel")){
- // Aqua Style guidelines restrict the size of OK and Cancel buttons to 68 pixels.
- // However, this doesn't work for German, therefore only do it for English,
- // I suppose it would be better to do some sort of lookups for languages
- // that like to have really long words.
- // FIXME This is not exactly true. Out of context, OK buttons have their
- // implicit size calculated the same way as any other button. Inside a
- // QDialogButtonBox, their size should be calculated such that the action
- // or accept button (i.e., rightmost) and cancel button have the same width.
- ret.setWidth(69);
- }
- } else {
- // The only sensible thing to do is to return whatever the style suggests...
- if (sz == QStyleHelper::SizeLarge)
- ret = QSize(-1, qt_mac_aqua_get_metric(PushButtonHeight));
- else if (sz == QStyleHelper::SizeSmall)
- ret = QSize(-1, qt_mac_aqua_get_metric(SmallPushButtonHeight));
- else if (sz == QStyleHelper::SizeMini)
- ret = QSize(-1, qt_mac_aqua_get_metric(MiniPushButtonHeight));
- else
- // Since there's no default size we return the large size...
- ret = QSize(-1, qt_mac_aqua_get_metric(PushButtonHeight));
- }
- break; }
- case QStyle::CT_SizeGrip:
- // Not HIG kosher: mimic what we were doing earlier until we support 4-edge resizing in MDI subwindows
- if (sz == QStyleHelper::SizeLarge || sz == QStyleHelper::SizeSmall) {
- int s = sz == QStyleHelper::SizeSmall ? 16 : 22; // large: pixel measured from HITheme, small: from my hat
- int width = 0;
-//#if QT_CONFIG(mdiarea)
-// if (widg && qobject_cast<QMdiSubWindow *>(widg->parentWidget()))
-// width = s;
-//#endif
- ret = QSize(width, s);
- }
- break;
- case QStyle::CT_ComboBox:
- switch (sz) {
- case QStyleHelper::SizeLarge:
- ret = QSize(-1, qt_mac_aqua_get_metric(PopupButtonHeight));
- break;
- case QStyleHelper::SizeSmall:
- ret = QSize(-1, qt_mac_aqua_get_metric(SmallPopupButtonHeight));
- break;
- case QStyleHelper::SizeMini:
- ret = QSize(-1, qt_mac_aqua_get_metric(MiniPopupButtonHeight));
- break;
- default:
- break;
- }
- break;
- case QStyle::CT_ToolButton:
- if (sz == QStyleHelper::SizeSmall) {
- int width = 0, height = 0;
- if (szHint == QSize(-1, -1)) { //just 'guess'..
-//#if QT_CONFIG(toolbutton)
-// const QStyleOptionToolButton *bt = qstyleoption_cast<const QStyleOptionToolButton *>(opt);
-// // If this conversion fails then the widget was not what it claimed to be.
-// if(bt) {
-// if (!bt->icon.isNull()) {
-// QSize iconSize = bt->iconSize;
-// QSize pmSize = bt->icon.actualSize(QSize(32, 32), QIcon::Normal);
-// width = qMax(width, qMax(iconSize.width(), pmSize.width()));
-// height = qMax(height, qMax(iconSize.height(), pmSize.height()));
-// }
-// if (!bt->text.isNull() && bt->toolButtonStyle != Qt::ToolButtonIconOnly) {
-// int text_width = bt->fontMetrics.horizontalAdvance(bt->text),
-// text_height = bt->fontMetrics.height();
-// if (bt->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
-// width = qMax(width, text_width);
-// height += text_height;
-// } else {
-// width += text_width;
-// width = qMax(height, text_height);
-// }
-// }
-// } else
-//#endif
- {
- // Let's return the size hint...
- width = szHint.width();
- height = szHint.height();
- }
- } else {
- width = szHint.width();
- height = szHint.height();
- }
- width = qMax(20, width + 5); //border
- height = qMax(20, height + 5); //border
- ret = QSize(width, height);
- }
- break;
- case QStyle::CT_Slider: {
- int w = -1;
- const QStyleOptionSlider *sld = qstyleoption_cast<const QStyleOptionSlider *>(opt);
- // If this conversion fails then the widget was not what it claimed to be.
- if(sld) {
- if (sz == QStyleHelper::SizeLarge) {
- if (sld->orientation == Qt::Horizontal) {
- w = qt_mac_aqua_get_metric(HSliderHeight);
- if (sld->tickPosition != QStyleOptionSlider::NoTicks)
- w += qt_mac_aqua_get_metric(HSliderTickHeight);
- } else {
- w = qt_mac_aqua_get_metric(VSliderWidth);
- if (sld->tickPosition != QStyleOptionSlider::NoTicks)
- w += qt_mac_aqua_get_metric(VSliderTickWidth);
- }
- } else if (sz == QStyleHelper::SizeSmall) {
- if (sld->orientation == Qt::Horizontal) {
- w = qt_mac_aqua_get_metric(SmallHSliderHeight);
- if (sld->tickPosition != QStyleOptionSlider::NoTicks)
- w += qt_mac_aqua_get_metric(SmallHSliderTickHeight);
- } else {
- w = qt_mac_aqua_get_metric(SmallVSliderWidth);
- if (sld->tickPosition != QStyleOptionSlider::NoTicks)
- w += qt_mac_aqua_get_metric(SmallVSliderTickWidth);
- }
- } else if (sz == QStyleHelper::SizeMini) {
- if (sld->orientation == Qt::Horizontal) {
- w = qt_mac_aqua_get_metric(MiniHSliderHeight);
- if (sld->tickPosition != QStyleOptionSlider::NoTicks)
- w += qt_mac_aqua_get_metric(MiniHSliderTickHeight);
- } else {
- w = qt_mac_aqua_get_metric(MiniVSliderWidth);
- if (sld->tickPosition != QStyleOptionSlider::NoTicks)
- w += qt_mac_aqua_get_metric(MiniVSliderTickWidth);
- }
- }
- } else {
- // This is tricky, we were requested to find a size for a slider which is not
- // a slider. We don't know if this is vertical or horizontal or if we need to
- // have tick marks or not.
- // For this case we will return an horizontal slider without tick marks.
- w = qt_mac_aqua_get_metric(HSliderHeight);
- w += qt_mac_aqua_get_metric(HSliderTickHeight);
- }
- if (sld->orientation == Qt::Horizontal)
- ret.setHeight(w);
- else
- ret.setWidth(w);
- break;
- }
-//#if QT_CONFIG(progressbar)
-// case QStyle::CT_ProgressBar: {
-// int finalValue = -1;
-// Qt::Orientation orient = Qt::Horizontal;
-// if (const QProgressBar *pb = qobject_cast<const QProgressBar *>(widg))
-// orient = pb->orientation();
-
-// if (sz == QStyleHelper::SizeLarge)
-// finalValue = qt_mac_aqua_get_metric(LargeProgressBarThickness)
-// + qt_mac_aqua_get_metric(ProgressBarShadowOutset);
-// else
-// finalValue = qt_mac_aqua_get_metric(NormalProgressBarThickness)
-// + qt_mac_aqua_get_metric(SmallProgressBarShadowOutset);
-// if (orient == Qt::Horizontal)
-// ret.setHeight(finalValue);
-// else
-// ret.setWidth(finalValue);
-// break;
-// }
-//#endif
-//#if QT_CONFIG(combobox)
-// case QStyle::CT_LineEdit:
-// if (!widg || !qobject_cast<QComboBox *>(widg->parentWidget())) {
-// //should I take into account the font dimentions of the lineedit? -Sam
-// if (sz == QStyleHelper::SizeLarge)
-// ret = QSize(-1, 21);
-// else
-// ret = QSize(-1, 19);
-// }
-// break;
-//#endif
- case QStyle::CT_HeaderSection:
-//#if QT_CONFIG(treeview)
-// if (isTreeView(widg))
-// ret = QSize(-1, qt_mac_aqua_get_metric(ListHeaderHeight));
-//#endif
- break;
- case QStyle::CT_MenuBar:
- if (sz == QStyleHelper::SizeLarge) {
- ret = QSize(-1, [[NSApp mainMenu] menuBarHeight]);
- // In the qt_mac_set_native_menubar(false) case,
- // we come it here with a zero-height main menu,
- // preventing the in-window menu from displaying.
- // Use 22 pixels for the height, by observation.
- if (ret.height() <= 0)
- ret.setHeight(22);
- }
- break;
- default:
- break;
- }
- return ret;
-}
-
-#if defined(QMAC_QAQUASTYLE_SIZE_CONSTRAIN) || defined(DEBUG_SIZE_CONSTRAINT)
-static QStyleHelper::WidgetSizePolicy qt_aqua_guess_size(
- const QSize &large,
- const QSize &small,
- const QSize &mini)
-{
- if (large == QSize(-1, -1)) {
- if (small != QSize(-1, -1))
- return QStyleHelper::SizeSmall;
- if (mini != QSize(-1, -1))
- return QStyleHelper::SizeMini;
- return QStyleHelper::SizeDefault;
- } else if (small == QSize(-1, -1)) {
- if (mini != QSize(-1, -1))
- return QStyleHelper::SizeMini;
- return QStyleHelper::SizeLarge;
- } else if (mini == QSize(-1, -1)) {
- return QStyleHelper::SizeLarge;
- }
-
- if (qEnvironmentVariableIsSet("QWIDGET_ALL_SMALL"))
- return QStyleHelper::SizeSmall;
- else if (qEnvironmentVariableIsSet("QWIDGET_ALL_MINI"))
- return QStyleHelper::SizeMini;
-
- return QStyleHelper::SizeLarge;
-}
-#endif
-
-QPainterPath QMacStylePrivate::windowPanelPath(const QRectF &r) const
-{
- static const qreal CornerPointOffset = 5.5;
- static const qreal CornerControlOffset = 2.1;
-
- QPainterPath path;
- // Top-left corner
- path.moveTo(r.left(), r.top() + CornerPointOffset);
- path.cubicTo(r.left(), r.top() + CornerControlOffset,
- r.left() + CornerControlOffset, r.top(),
- r.left() + CornerPointOffset, r.top());
- // Top-right corner
- path.lineTo(r.right() - CornerPointOffset, r.top());
- path.cubicTo(r.right() - CornerControlOffset, r.top(),
- r.right(), r.top() + CornerControlOffset,
- r.right(), r.top() + CornerPointOffset);
- // Bottom-right corner
- path.lineTo(r.right(), r.bottom() - CornerPointOffset);
- path.cubicTo(r.right(), r.bottom() - CornerControlOffset,
- r.right() - CornerControlOffset, r.bottom(),
- r.right() - CornerPointOffset, r.bottom());
- // Bottom-right corner
- path.lineTo(r.left() + CornerPointOffset, r.bottom());
- path.cubicTo(r.left() + CornerControlOffset, r.bottom(),
- r.left(), r.bottom() - CornerControlOffset,
- r.left(), r.bottom() - CornerPointOffset);
- path.lineTo(r.left(), r.top() + CornerPointOffset);
-
- return path;
-}
-
-QMacStylePrivate::CocoaControlType QMacStylePrivate::windowButtonCocoaControl(QStyle::SubControl sc) const
-{
- struct WindowButtons {
- QStyle::SubControl sc;
- QMacStylePrivate::CocoaControlType ct;
- };
-
- static const WindowButtons buttons[] = {
- { QStyle::SC_TitleBarCloseButton, QMacStylePrivate::Button_WindowClose },
- { QStyle::SC_TitleBarMinButton, QMacStylePrivate::Button_WindowMiniaturize },
- { QStyle::SC_TitleBarMaxButton, QMacStylePrivate::Button_WindowZoom }
- };
-
- for (const auto &wb : buttons)
- if (wb.sc == sc)
- return wb.ct;
-
- return NoControl;
-}
-
-
-void QMacStylePrivate::tabLayout(const QStyleOptionTab *opt, QRect *textRect, QRect *iconRect) const
-{
- Q_ASSERT(textRect);
- Q_ASSERT(iconRect);
- QRect tr = opt->rect;
- const bool verticalTabs = opt->shape == QStyleOptionTab::RoundedEast
- || opt->shape == QStyleOptionTab::RoundedWest
- || opt->shape == QStyleOptionTab::TriangularEast
- || opt->shape == QStyleOptionTab::TriangularWest;
- if (verticalTabs)
- tr.setRect(0, 0, tr.height(), tr.width()); // 0, 0 as we will have a translate transform
-
- int verticalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftVertical, opt);
- int horizontalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, opt);
- const int hpadding = 4;
- const int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt) / 2;
- if (opt->shape == QStyleOptionTab::RoundedSouth || opt->shape == QStyleOptionTab::TriangularSouth)
- verticalShift = -verticalShift;
- tr.adjust(hpadding, verticalShift - vpadding, horizontalShift - hpadding, vpadding);
-
- // left widget
- if (!opt->leftButtonSize.isEmpty()) {
- const int buttonSize = verticalTabs ? opt->leftButtonSize.height() : opt->leftButtonSize.width();
- tr.setLeft(tr.left() + 4 + buttonSize);
- // make text aligned to center
- if (opt->rightButtonSize.isEmpty())
- tr.setRight(tr.right() - 4 - buttonSize);
- }
- // right widget
- if (!opt->rightButtonSize.isEmpty()) {
- const int buttonSize = verticalTabs ? opt->rightButtonSize.height() : opt->rightButtonSize.width();
- tr.setRight(tr.right() - 4 - buttonSize);
- // make text aligned to center
- if (opt->leftButtonSize.isEmpty())
- tr.setLeft(tr.left() + 4 + buttonSize);
- }
-
- // icon
- if (!opt->icon.isNull()) {
- QSize iconSize = opt->iconSize;
- if (!iconSize.isValid()) {
- int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize);
- iconSize = QSize(iconExtent, iconExtent);
- }
- QSize tabIconSize = opt->icon.actualSize(iconSize,
- (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled,
- (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off);
- // High-dpi icons do not need adjustment; make sure tabIconSize is not larger than iconSize
- tabIconSize = QSize(qMin(tabIconSize.width(), iconSize.width()), qMin(tabIconSize.height(), iconSize.height()));
-
- const int stylePadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabHSpace, opt) / 2 - hpadding;
-
- if (opt->documentMode) {
- // documents show the icon as part of the the text
- const int textWidth =
- opt->fontMetrics.boundingRect(tr, Qt::AlignCenter | Qt::TextShowMnemonic, opt->text).width();
- *iconRect = QRect(tr.center().x() - textWidth / 2 - stylePadding - tabIconSize.width(),
- tr.center().y() - tabIconSize.height() / 2,
- tabIconSize.width(), tabIconSize.height());
- } else {
- *iconRect = QRect(tr.left() + stylePadding, tr.center().y() - tabIconSize.height() / 2,
- tabIconSize.width(), tabIconSize.height());
- }
- if (!verticalTabs)
- *iconRect = proxyStyle->visualRect(opt->direction, opt->rect, *iconRect);
-
- tr.setLeft(tr.left() + stylePadding + tabIconSize.width() + 4);
- tr.setRight(tr.right() - stylePadding - tabIconSize.width() - 4);
- }
-
- if (!verticalTabs)
- tr = proxyStyle->visualRect(opt->direction, opt->rect, tr);
-
- *textRect = tr;
-}
-
-QMacStylePrivate::Direction QMacStylePrivate::tabDirection(QStyleOptionTab::Shape shape)
-{
- switch (shape) {
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- return South;
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- return North;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- return West;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- return East;
- }
-}
-
-bool QMacStylePrivate::verticalTabs(QMacStylePrivate::Direction direction)
-{
- return (direction == QMacStylePrivate::East
- || direction == QMacStylePrivate::West);
-}
-
-QStyleHelper::WidgetSizePolicy QMacStylePrivate::effectiveAquaSizeConstrain(const QStyleOption *option,
- QStyle::ContentsType ct,
- QSize szHint, QSize *insz) const
-{
- QStyleHelper::WidgetSizePolicy sz = aquaSizeConstrain(option, ct, szHint, insz);
- if (sz == QStyleHelper::SizeDefault)
- return QStyleHelper::SizeLarge;
- return sz;
-}
-
-QStyleHelper::WidgetSizePolicy QMacStylePrivate::aquaSizeConstrain(const QStyleOption *option,
- QStyle::ContentsType ct, QSize szHint, QSize *insz) const
-{
- if (!option)
- return QStyleHelper::SizeLarge;
-
- if (option->state & QStyle::State_Small)
- return QStyleHelper::SizeSmall;
- if (option->state & QStyle::State_Mini)
- return QStyleHelper::SizeMini;
-
- return QStyleHelper::SizeLarge;
-
-}
-
-uint qHash(const QMacStylePrivate::CocoaControl &cw, uint seed = 0)
-{
- return ((cw.type << 2) | cw.size) ^ seed;
-}
-
-QMacStylePrivate::CocoaControl::CocoaControl()
- : type(NoControl), size(QStyleHelper::SizeDefault)
-{
-}
-
-QMacStylePrivate::CocoaControl::CocoaControl(CocoaControlType t, QStyleHelper::WidgetSizePolicy s)
- : type(t), size(s)
-{
-}
-
-bool QMacStylePrivate::CocoaControl::operator==(const CocoaControl &other) const
-{
- return other.type == type && other.size == size;
-}
-
-QSizeF QMacStylePrivate::CocoaControl::defaultFrameSize() const
-{
- // We need this because things like NSView.alignmentRectInsets
- // or -[NSCell titleRectForBounds:] won't work unless the control
- // has a reasonable frame set. IOW, it's a chicken and egg problem.
- // These values are as observed in Xcode 9's Interface Builder.
-
- if (type == Button_PushButton)
- return QSizeF(-1, pushButtonDefaultHeight[size]);
-
- if (type == Button_PopupButton
- || type == Button_PullDown)
- return QSizeF(-1, popupButtonDefaultHeight[size]);
-
- if (type == ComboBox)
- return QSizeF(-1, comboBoxDefaultHeight[size]);
-
- return QSizeF();
-}
-
-QRectF QMacStylePrivate::CocoaControl::adjustedControlFrame(const QRectF &rect) const
-{
- QRectF frameRect;
- const auto frameSize = defaultFrameSize();
- if (type == QMacStylePrivate::Button_SquareButton) {
- frameRect = rect.adjusted(3, 1, -3, -1)
- .adjusted(focusRingWidth, focusRingWidth, -focusRingWidth, -focusRingWidth);
- } else if (type == QMacStylePrivate::Button_PushButton) {
- // Start from the style option's top-left corner.
- frameRect = QRectF(rect.topLeft(),
- QSizeF(rect.width(), frameSize.height()));
- if (size == QStyleHelper::SizeSmall)
- frameRect = frameRect.translated(0, 1.5);
- else if (size == QStyleHelper::SizeMini)
- frameRect = frameRect.adjusted(0, 0, -8, 0).translated(4, 4);
- } else {
- // Center in the style option's rect.
- frameRect = QRectF(QPointF(0, (rect.height() - frameSize.height()) / 2.0),
- QSizeF(rect.width(), frameSize.height()));
- frameRect = frameRect.translated(rect.topLeft());
- if (type == QMacStylePrivate::Button_PullDown || type == QMacStylePrivate::Button_PopupButton) {
- if (size == QStyleHelper::SizeLarge)
- frameRect = frameRect.adjusted(0, 0, -6, 0).translated(3, 0);
- else if (size == QStyleHelper::SizeSmall)
- frameRect = frameRect.adjusted(0, 0, -4, 0).translated(2, 1);
- else if (size == QStyleHelper::SizeMini)
- frameRect = frameRect.adjusted(0, 0, -9, 0).translated(5, 0);
- } else if (type == QMacStylePrivate::ComboBox) {
- frameRect = frameRect.adjusted(0, 0, -6, 0).translated(4, 0);
- }
- }
-
- return frameRect;
-}
-
-QMarginsF QMacStylePrivate::CocoaControl::titleMargins() const
-{
- if (type == QMacStylePrivate::Button_PushButton) {
- if (size == QStyleHelper::SizeLarge)
- return QMarginsF(12, 5, 12, 9);
- if (size == QStyleHelper::SizeSmall)
- return QMarginsF(12, 4, 12, 9);
- if (size == QStyleHelper::SizeMini)
- return QMarginsF(10, 1, 10, 2);
- }
-
- if (type == QMacStylePrivate::Button_PullDown) {
- if (size == QStyleHelper::SizeLarge)
- return QMarginsF(7.5, 2.5, 22.5, 5.5);
- if (size == QStyleHelper::SizeSmall)
- return QMarginsF(7.5, 2, 20.5, 4);
- if (size == QStyleHelper::SizeMini)
- return QMarginsF(4.5, 0, 16.5, 2);
- }
-
- if (type == QMacStylePrivate::Button_SquareButton)
- return QMarginsF(6, 1, 6, 2);
-
- return QMarginsF();
-}
-
-bool QMacStylePrivate::CocoaControl::getCocoaButtonTypeAndBezelStyle(NSButtonType *buttonType, NSBezelStyle *bezelStyle) const
-{
- switch (type) {
- case Button_CheckBox:
- *buttonType = NSSwitchButton;
- *bezelStyle = NSRegularSquareBezelStyle;
- break;
- case Button_Disclosure:
- *buttonType = NSOnOffButton;
- *bezelStyle = NSDisclosureBezelStyle;
- break;
- case Button_RadioButton:
- *buttonType = NSRadioButton;
- *bezelStyle = NSRegularSquareBezelStyle;
- break;
- case Button_SquareButton:
- *buttonType = NSPushOnPushOffButton;
- *bezelStyle = NSShadowlessSquareBezelStyle;
- break;
- case Button_PushButton:
- *buttonType = NSPushOnPushOffButton;
- *bezelStyle = NSRoundedBezelStyle;
- break;
- default:
- return false;
- }
-
- return true;
-}
-
-QMacStylePrivate::CocoaControlType cocoaControlType(const QStyleOption *opt)
-{
- if (const auto *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- const bool hasMenu = btn->features & QStyleOptionButton::HasMenu;
- // When the contents won't fit in a large sized button,
- // and WA_MacNormalSize is not set, make the button square.
- // Threshold used to be at 34, not 32.
- const auto maxNonSquareHeight = pushButtonDefaultHeight[QStyleHelper::SizeLarge];
- const bool isSquare = (btn->features & QStyleOptionButton::Flat)
- || (btn->rect.height() > maxNonSquareHeight);
-// && !(w && w->testAttribute(Qt::WA_MacNormalSize)));
- return (isSquare? QMacStylePrivate::Button_SquareButton :
- hasMenu ? QMacStylePrivate::Button_PullDown :
- QMacStylePrivate::Button_PushButton);
- }
-
- if (const auto *combo = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- if (combo->editable)
- return QMacStylePrivate::ComboBox;
- // TODO Me may support square, non-editable combo boxes, but not more than that
- return QMacStylePrivate::Button_PopupButton;
- }
-
- return QMacStylePrivate::NoControl;
-}
-
-/**
- Carbon draws comboboxes (and other views) outside the rect given as argument. Use this function to obtain
- the corresponding inner rect for drawing the same combobox so that it stays inside the given outerBounds.
-*/
-CGRect QMacStylePrivate::comboboxInnerBounds(const CGRect &outerBounds, const CocoaControl &cocoaWidget)
-{
- CGRect innerBounds = outerBounds;
- // Carbon draw parts of the view outside the rect.
- // So make the rect a bit smaller to compensate
- // (I wish HIThemeGetButtonBackgroundBounds worked)
- if (cocoaWidget.type == Button_PopupButton) {
- switch (cocoaWidget.size) {
- case QStyleHelper::SizeSmall:
- innerBounds.origin.x += 3;
- innerBounds.origin.y += 3;
- innerBounds.size.width -= 6;
- innerBounds.size.height -= 7;
- break;
- case QStyleHelper::SizeMini:
- innerBounds.origin.x += 2;
- innerBounds.origin.y += 2;
- innerBounds.size.width -= 5;
- innerBounds.size.height -= 6;
- break;
- case QStyleHelper::SizeLarge:
- case QStyleHelper::SizeDefault:
- innerBounds.origin.x += 2;
- innerBounds.origin.y += 2;
- innerBounds.size.width -= 5;
- innerBounds.size.height -= 6;
- }
- } else if (cocoaWidget.type == ComboBox) {
- switch (cocoaWidget.size) {
- case QStyleHelper::SizeSmall:
- innerBounds.origin.x += 3;
- innerBounds.origin.y += 3;
- innerBounds.size.width -= 7;
- innerBounds.size.height -= 8;
- break;
- case QStyleHelper::SizeMini:
- innerBounds.origin.x += 3;
- innerBounds.origin.y += 3;
- innerBounds.size.width -= 4;
- innerBounds.size.height -= 8;
- break;
- case QStyleHelper::SizeLarge:
- case QStyleHelper::SizeDefault:
- innerBounds.origin.x += 3;
- innerBounds.origin.y += 2;
- innerBounds.size.width -= 6;
- innerBounds.size.height -= 8;
- }
- }
-
- return innerBounds;
-}
-
-/**
- Inside a combobox Qt places a line edit widget. The size of this widget should depend on the kind
- of combobox we choose to draw. This function calculates and returns this size.
-*/
-QRectF QMacStylePrivate::comboboxEditBounds(const QRectF &outerBounds, const CocoaControl &cw)
-{
- QRectF ret = outerBounds;
- if (cw.type == ComboBox) {
- switch (cw.size) {
- case QStyleHelper::SizeLarge:
- ret = ret.adjusted(0, 0, -25, 0).translated(2, 4.5);
- ret.setHeight(16);
- break;
- case QStyleHelper::SizeSmall:
- ret = ret.adjusted(0, 0, -22, 0).translated(2, 3);
- ret.setHeight(14);
- break;
- case QStyleHelper::SizeMini:
- ret = ret.adjusted(0, 0, -19, 0).translated(2, 2.5);
- ret.setHeight(10.5);
- break;
- default:
- break;
- }
- } else if (cw.type == Button_PopupButton) {
- switch (cw.size) {
- case QStyleHelper::SizeLarge:
- ret.adjust(10, 1, -23, -4);
- break;
- case QStyleHelper::SizeSmall:
- ret.adjust(10, 4, -20, -3);
- break;
- case QStyleHelper::SizeMini:
- ret.adjust(9, 0, -19, 0);
- ret.setHeight(13);
- break;
- default:
- break;
- }
- }
- return ret;
-}
-
-QMacStylePrivate::QMacStylePrivate()
- : backingStoreNSView(nil)
-{
- if (auto *ssf = QGuiApplicationPrivate::platformTheme()->font(QPlatformTheme::SmallFont))
- smallSystemFont = *ssf;
- if (auto *msf = QGuiApplicationPrivate::platformTheme()->font(QPlatformTheme::MiniFont))
- miniSystemFont = *msf;
-}
-
-QMacStylePrivate::~QMacStylePrivate()
-{
- QMacAutoReleasePool pool;
- for (NSView *b : cocoaControls)
- [b release];
- for (NSCell *cell : cocoaCells)
- [cell release];
-}
-
-NSView *QMacStylePrivate::cocoaControl(CocoaControl cocoaControl) const
-{
- if (cocoaControl.type == QMacStylePrivate::NoControl
- || cocoaControl.size == QStyleHelper::SizeDefault)
- return nil;
-
- if (cocoaControl.type == Box) {
- if (__builtin_available(macOS 10.14, *)) {
- if (qt_mac_applicationIsInDarkMode()) {
- // See render code in drawPrimitive(PE_FrameTabWidget)
- cocoaControl.type = Box_Dark;
- }
- }
- }
-
- NSView *bv = cocoaControls.value(cocoaControl, nil);
- if (!bv) {
- switch (cocoaControl.type) {
- case Box: {
- NSBox *box = [[NSBox alloc] init];
- bv = box;
- box.title = @"";
- box.titlePosition = NSNoTitle;
- break;
- }
- case Box_Dark:
- bv = [[QDarkNSBox alloc] init];
- break;
- case Button_CheckBox:
- case Button_Disclosure:
- case Button_PushButton:
- case Button_RadioButton:
- case Button_SquareButton: {
- NSButton *bc = [[NSButton alloc] init];
- bc.title = @"";
- // See below for style and bezel setting.
- bv = bc;
- break;
- }
- case Button_PopupButton:
- case Button_PullDown: {
- NSPopUpButton *bc = [[NSPopUpButton alloc] init];
- bc.title = @"";
- if (cocoaControl.type == Button_PullDown)
- bc.pullsDown = YES;
- bv = bc;
- break;
- }
- case Button_WindowClose:
- case Button_WindowMiniaturize:
- case Button_WindowZoom: {
- const NSWindowButton button = [=] {
- switch (cocoaControl.type) {
- case Button_WindowClose:
- return NSWindowCloseButton;
- case Button_WindowMiniaturize:
- return NSWindowMiniaturizeButton;
- case Button_WindowZoom:
- return NSWindowZoomButton;
- default:
- break;
- }
- Q_UNREACHABLE();
- } ();
- const auto styleMask = NSWindowStyleMaskTitled
- | NSWindowStyleMaskClosable
- | NSWindowStyleMaskMiniaturizable
- | NSWindowStyleMaskResizable;
- bv = [NSWindow standardWindowButton:button forStyleMask:styleMask];
- [bv retain];
- break;
- }
- case ComboBox:
- bv = [[NSComboBox alloc] init];
- break;
- case ProgressIndicator_Determinate:
- bv = [[NSProgressIndicator alloc] init];
- break;
- case ProgressIndicator_Indeterminate:
- bv = [[QIndeterminateProgressIndicator alloc] init];
- break;
- case Scroller_Horizontal:
- bv = [[NSScroller alloc] initWithFrame:NSMakeRect(0, 0, 200, 20)];
- break;
- case Scroller_Vertical:
- // Cocoa sets the orientation from the view's frame
- // at construction time, and it cannot be changed later.
- bv = [[NSScroller alloc] initWithFrame:NSMakeRect(0, 0, 20, 200)];
- break;
- case Slider_Horizontal:
- bv = [[NSSlider alloc] initWithFrame:NSMakeRect(0, 0, 200, 20)];
- break;
- case Slider_Vertical:
- // Cocoa sets the orientation from the view's frame
- // at construction time, and it cannot be changed later.
- bv = [[NSSlider alloc] initWithFrame:NSMakeRect(0, 0, 20, 200)];
- break;
- case SplitView_Horizontal:
- bv = [[NSSplitView alloc] init];
- break;
- case SplitView_Vertical:
- bv = [[QVerticalSplitView alloc] init];
- break;
- case TextField:
- bv = [[NSTextField alloc] init];
- break;
- default:
- break;
- }
-
- if ([bv isKindOfClass:[NSControl class]]) {
- auto *ctrl = static_cast<NSControl *>(bv);
- switch (cocoaControl.size) {
- case QStyleHelper::SizeSmall:
- ctrl.controlSize = NSControlSizeSmall;
- break;
- case QStyleHelper::SizeMini:
- ctrl.controlSize = NSControlSizeMini;
- break;
- default:
- break;
- }
- } else if (cocoaControl.type == ProgressIndicator_Determinate ||
- cocoaControl.type == ProgressIndicator_Indeterminate) {
- auto *pi = static_cast<NSProgressIndicator *>(bv);
- pi.indeterminate = (cocoaControl.type == ProgressIndicator_Indeterminate);
- switch (cocoaControl.size) {
- case QStyleHelper::SizeSmall:
- pi.controlSize = NSControlSizeSmall;
- break;
- case QStyleHelper::SizeMini:
- pi.controlSize = NSControlSizeMini;
- break;
- default:
- break;
- }
- }
-
- cocoaControls.insert(cocoaControl, bv);
- }
-
- NSButtonType buttonType;
- NSBezelStyle bezelStyle;
- if (cocoaControl.getCocoaButtonTypeAndBezelStyle(&buttonType, &bezelStyle)) {
- // FIXME We need to reset the button's type and
- // bezel style properties, even when cached.
- auto *button = static_cast<NSButton *>(bv);
- button.buttonType = buttonType;
- button.bezelStyle = bezelStyle;
- if (cocoaControl.type == Button_CheckBox)
- button.allowsMixedState = YES;
- }
-
- return bv;
-}
-
-NSCell *QMacStylePrivate::cocoaCell(CocoaControl cocoaControl) const
-{
- NSCell *cell = cocoaCells[cocoaControl];
- if (!cell) {
- switch (cocoaControl.type) {
- case Stepper:
- cell = [[NSStepperCell alloc] init];
- break;
- case Button_Disclosure: {
- NSButtonCell *bc = [[NSButtonCell alloc] init];
- bc.buttonType = NSOnOffButton;
- bc.bezelStyle = NSDisclosureBezelStyle;
- cell = bc;
- break;
- }
- default:
- break;
- }
-
- switch (cocoaControl.size) {
- case QStyleHelper::SizeSmall:
- cell.controlSize = NSControlSizeSmall;
- break;
- case QStyleHelper::SizeMini:
- cell.controlSize = NSControlSizeMini;
- break;
- default:
- break;
- }
-
- cocoaCells.insert(cocoaControl, cell);
- }
-
- return cell;
-}
-
-void QMacStylePrivate::drawNSViewInRect(NSView *view, const QRectF &rect, QPainter *p, DrawRectBlock drawRectBlock) const
-{
- QMacAutoReleasePool pool;
- QMacCGContext ctx(p);
- setupNSGraphicsContext(ctx, YES);
-
- // FIXME: The rect that we get in is relative to the widget that we're drawing
- // style on behalf of, and doesn't take into account the offset of that widget
- // to the widget that owns the backingstore, which we are placing the native
- // view into below. This means most of the views are placed in the upper left
- // corner of backingStoreNSView, which does not map to where the actual widget
- // is, and which may cause problems such as triggering a setNeedsDisplay of the
- // backingStoreNSView for the wrong rect. We work around this by making the view
- // layer-backed, which prevents triggering display of the backingStoreNSView, but
- // but there may be other issues lurking here due to the wrong position. QTBUG-68023
- view.wantsLayer = YES;
-
- // FIXME: We are also setting the frame of the incoming view a lot at the call
- // sites of this function, making it unclear who's actually responsible for
- // maintaining the size and position of the view. In theory the call sites
- // should ensure the _size_ of the view is correct, and then let this code
- // take care of _positioning_ the view at the right place inside backingStoreNSView.
- // For now we pass on the rect as is, to prevent any regressions until this
- // can be investigated properly.
- view.frame = rect.toCGRect();
-
- [backingStoreNSView addSubview:view];
-
- // FIXME: Based on the code below, this method isn't drawing an NSView into
- // a rect, it's drawing _part of the NSView_, defined by the incoming clip
- // or dirty rect, into the current graphics context. We're doing some manual
- // translations at the call sites that would indicate that this relationship
- // is a bit fuzzy.
- const CGRect dirtyRect = rect.toCGRect();
-
- if (drawRectBlock)
- drawRectBlock(ctx, dirtyRect);
- else
- [view drawRect:dirtyRect];
-
- [view removeFromSuperviewWithoutNeedingDisplay];
-
- restoreNSGraphicsContext(ctx);
-}
-
-void QMacStylePrivate::resolveCurrentNSView(QWindow *window) const
-{
- backingStoreNSView = window ? (NSView *)window->winId() : nil;
-}
-
-QMacStyle::QMacStyle()
- : QCommonStyle(*new QMacStylePrivate)
-{
- QMacAutoReleasePool pool;
-
- static QMacNotificationObserver scrollbarStyleObserver(nil,
- NSPreferredScrollerStyleDidChangeNotification, []() {
- // Purge destroyed scroll bars
- QMacStylePrivate::scrollBars.removeAll(QPointer<QObject>());
-
- QEvent event(QEvent::StyleChange);
- for (const auto &o : QMacStylePrivate::scrollBars)
- QCoreApplication::sendEvent(o, &event);
- });
-
-#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
- Q_D(QMacStyle);
- // FIXME: Tie this logic into theme change, or even polish/unpolish
- if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave) {
- d->appearanceObserver = QMacKeyValueObserver(NSApp, @"effectiveAppearance", [this] {
- Q_D(QMacStyle);
- for (NSView *b : d->cocoaControls)
- [b release];
- d->cocoaControls.clear();
- });
- }
-#endif
-}
-
-QMacStyle::~QMacStyle()
-{
-}
-
-int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt) const
-{
- Q_D(const QMacStyle);
- const int controlSize = getControlSize(opt);
- int ret = 0;
-
- switch (metric) {
- case PM_TabCloseIndicatorWidth:
- case PM_TabCloseIndicatorHeight:
- ret = closeButtonSize;
- break;
- case PM_ToolBarIconSize:
- ret = proxy()->pixelMetric(PM_LargeIconSize);
- break;
- case PM_FocusFrameVMargin:
- case PM_FocusFrameHMargin:
- ret = qt_mac_aqua_get_metric(FocusRectOutset);
- break;
- case PM_DialogButtonsSeparator:
- ret = -5;
- break;
- case PM_DialogButtonsButtonHeight: {
- QSize sz;
- ret = d->aquaSizeConstrain(opt, QStyle::CT_PushButton, QSize(-1, -1), &sz);
- if (sz == QSize(-1, -1))
- ret = 32;
- else
- ret = sz.height();
- break; }
- case PM_DialogButtonsButtonWidth: {
- QSize sz;
- ret = d->aquaSizeConstrain(opt, QStyle::CT_PushButton, QSize(-1, -1), &sz);
- if (sz == QSize(-1, -1))
- ret = 70;
- else
- ret = sz.width();
- break; }
-
- case PM_MenuBarHMargin:
- ret = 8;
- break;
-
- case PM_MenuBarVMargin:
- ret = 0;
- break;
-
- case PM_MenuBarPanelWidth:
- ret = 0;
- break;
-
- case PM_MenuButtonIndicator:
- ret = toolButtonArrowSize;
- break;
-
- case QStyle::PM_MenuDesktopFrameWidth:
- ret = 5;
- break;
-
- case PM_CheckBoxLabelSpacing:
- case PM_RadioButtonLabelSpacing:
- ret = [=] {
- if (opt) {
- if (opt->state & State_Mini)
- return 4;
- if (opt->state & State_Small)
- return 3;
- }
- return 2;
- } ();
- break;
- case PM_MenuScrollerHeight:
- ret = 15; // I hate having magic numbers in here...
- break;
- case PM_DefaultFrameWidth:
-//#if QT_CONFIG(mainwindow)
-// if (widget && (widget->isWindow() || !widget->parentWidget()
-// || (qobject_cast<const QMainWindow*>(widget->parentWidget())
-// && static_cast<QMainWindow *>(widget->parentWidget())->centralWidget() == widget))
-// && qobject_cast<const QAbstractScrollArea *>(widget))
-// ret = 0;
-// else
-//#endif
- // The combo box popup has no frame.
- if (qstyleoption_cast<const QStyleOptionComboBox *>(opt) != 0)
- ret = 0;
- else
- ret = 1;
- break;
- case PM_MaximumDragDistance:
- ret = -1;
- break;
- case PM_ScrollBarSliderMin:
- ret = 24;
- break;
- case PM_SpinBoxFrameWidth:
- ret = qt_mac_aqua_get_metric(EditTextFrameOutset);
- break;
- case PM_ButtonShiftHorizontal:
- case PM_ButtonShiftVertical:
- ret = 0;
- break;
- case PM_SliderLength:
- ret = 17;
- break;
- // Returns the number of pixels to use for the business part of the
- // slider (i.e., the non-tickmark portion). The remaining space is shared
- // equally between the tickmark regions.
- case PM_SliderControlThickness:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int space = (sl->orientation == Qt::Horizontal) ? sl->rect.height() : sl->rect.width();
- int ticks = sl->tickPosition;
- int n = 0;
- if (ticks & QStyleOptionSlider::TicksAbove)
- ++n;
- if (ticks & QStyleOptionSlider::TicksBelow)
- ++n;
- if (!n) {
- ret = space;
- break;
- }
-
- int thick = 6; // Magic constant to get 5 + 16 + 5
- if (ticks != QStyleOptionSlider::TicksBothSides && ticks != QStyleOptionSlider::NoTicks)
- thick += proxy()->pixelMetric(PM_SliderLength, sl) / 4;
-
- space -= thick;
- if (space > 0)
- thick += (space * 2) / (n + 2);
- ret = thick;
- } else {
- ret = 0;
- }
- break;
- case PM_SmallIconSize:
- ret = int(QStyleHelper::dpiScaled(16., opt));
- break;
-
- case PM_LargeIconSize:
- ret = int(QStyleHelper::dpiScaled(32., opt));
- break;
-
- case PM_IconViewIconSize:
- ret = proxy()->pixelMetric(PM_LargeIconSize, opt);
- break;
-
- case PM_ButtonDefaultIndicator:
- ret = 0;
- break;
- case PM_TitleBarHeight: {
- NSUInteger style = NSWindowStyleMaskTitled;
-// if (widget && ((widget->windowFlags() & Qt::Tool) == Qt::Tool))
-// style |= NSWindowStyleMaskUtilityWindow;
- ret = int([NSWindow frameRectForContentRect:NSZeroRect
- styleMask:style].size.height);
- break; }
- case QStyle::PM_TabBarTabHSpace:
- switch (d->aquaSizeConstrain(opt)) {
- case QStyleHelper::SizeLarge:
- ret = QCommonStyle::pixelMetric(metric, opt);
- break;
- case QStyleHelper::SizeSmall:
- ret = 20;
- break;
- case QStyleHelper::SizeMini:
- ret = 16;
- break;
- case QStyleHelper::SizeDefault:
- const QStyleOptionTab *tb = qstyleoption_cast<const QStyleOptionTab *>(opt);
- if (tb && tb->documentMode)
- ret = 30;
- else
- ret = QCommonStyle::pixelMetric(metric, opt);
- break;
- }
- break;
- case PM_TabBarTabVSpace:
- ret = 4;
- break;
- case PM_TabBarTabShiftHorizontal:
- case PM_TabBarTabShiftVertical:
- ret = 0;
- break;
- case PM_TabBarBaseHeight:
- ret = 0;
- break;
- case PM_TabBarTabOverlap:
- ret = 1;
- break;
- case PM_TabBarBaseOverlap:
- switch (d->aquaSizeConstrain(opt)) {
- case QStyleHelper::SizeDefault:
- case QStyleHelper::SizeLarge:
- ret = 11;
- break;
- case QStyleHelper::SizeSmall:
- ret = 8;
- break;
- case QStyleHelper::SizeMini:
- ret = 7;
- break;
- }
- break;
- case PM_ScrollBarExtent: {
- const QStyleHelper::WidgetSizePolicy size = d->effectiveAquaSizeConstrain(opt);
- ret = static_cast<int>([NSScroller
- scrollerWidthForControlSize:static_cast<NSControlSize>(size)
- scrollerStyle:[NSScroller preferredScrollerStyle]]);
- break; }
- case PM_IndicatorHeight: {
- switch (d->aquaSizeConstrain(opt)) {
- case QStyleHelper::SizeDefault:
- case QStyleHelper::SizeLarge:
- ret = qt_mac_aqua_get_metric(CheckBoxHeight);
- break;
- case QStyleHelper::SizeMini:
- ret = qt_mac_aqua_get_metric(MiniCheckBoxHeight);
- break;
- case QStyleHelper::SizeSmall:
- ret = qt_mac_aqua_get_metric(SmallCheckBoxHeight);
- break;
- }
- break; }
- case PM_IndicatorWidth: {
- switch (d->aquaSizeConstrain(opt)) {
- case QStyleHelper::SizeDefault:
- case QStyleHelper::SizeLarge:
- ret = qt_mac_aqua_get_metric(CheckBoxWidth);
- break;
- case QStyleHelper::SizeMini:
- ret = qt_mac_aqua_get_metric(MiniCheckBoxWidth);
- break;
- case QStyleHelper::SizeSmall:
- ret = qt_mac_aqua_get_metric(SmallCheckBoxWidth);
- break;
- }
- ++ret;
- break; }
- case PM_ExclusiveIndicatorHeight: {
- switch (d->aquaSizeConstrain(opt)) {
- case QStyleHelper::SizeDefault:
- case QStyleHelper::SizeLarge:
- ret = qt_mac_aqua_get_metric(RadioButtonHeight);
- break;
- case QStyleHelper::SizeMini:
- ret = qt_mac_aqua_get_metric(MiniRadioButtonHeight);
- break;
- case QStyleHelper::SizeSmall:
- ret = qt_mac_aqua_get_metric(SmallRadioButtonHeight);
- break;
- }
- break; }
- case PM_ExclusiveIndicatorWidth: {
- switch (d->aquaSizeConstrain(opt)) {
- case QStyleHelper::SizeDefault:
- case QStyleHelper::SizeLarge:
- ret = qt_mac_aqua_get_metric(RadioButtonWidth);
- break;
- case QStyleHelper::SizeMini:
- ret = qt_mac_aqua_get_metric(MiniRadioButtonWidth);
- break;
- case QStyleHelper::SizeSmall:
- ret = qt_mac_aqua_get_metric(SmallRadioButtonWidth);
- break;
- }
- ++ret;
- break; }
- case PM_MenuVMargin:
- ret = 4;
- break;
- case PM_MenuPanelWidth:
- ret = 0;
- break;
- case PM_ToolTipLabelFrameWidth:
- ret = 0;
- break;
- case PM_SizeGripSize: {
- QStyleHelper::WidgetSizePolicy aSize;
-// if (widget && widget->window()->windowType() == Qt::Tool)
-// aSize = QStyleHelper::SizeSmall;
-// else
- aSize = QStyleHelper::SizeLarge;
- const QSize size = qt_aqua_get_known_size(CT_SizeGrip, opt, QSize(), aSize);
- ret = size.width();
- break; }
- case PM_MdiSubWindowFrameWidth:
- ret = 1;
- break;
- case PM_DockWidgetFrameWidth:
- ret = 0;
- break;
- case PM_DockWidgetTitleMargin:
- ret = 0;
- break;
- case PM_DockWidgetSeparatorExtent:
- ret = 1;
- break;
- case PM_ToolBarHandleExtent:
- ret = 11;
- break;
- case PM_ToolBarItemMargin:
- ret = 0;
- break;
- case PM_ToolBarItemSpacing:
- ret = 4;
- break;
- case PM_SplitterWidth:
- ret = 7;
- break;
- case PM_LayoutLeftMargin:
- case PM_LayoutTopMargin:
- case PM_LayoutRightMargin:
- case PM_LayoutBottomMargin:
- {
- if (opt->state & State_Window) {
- /*
- AHIG would have (20, 8, 10) here but that makes
- no sense. It would also have 14 for the top margin
- but this contradicts both Builder and most
- applications.
- */
- return_SIZE(20, 10, 10); // AHIG
- } else {
- // hack to detect QTabWidget
-// if (widget && widget->parentWidget()
-// && widget->parentWidget()->sizePolicy().controlType() == QSizePolicy::TabWidget) {
-// if (metric == PM_LayoutTopMargin) {
-// /*
-// Builder would have 14 (= 20 - 6) instead of 12,
-// but that makes the tab look disproportionate.
-// */
-// return_SIZE(12, 6, 6); // guess
-// } else {
-// return_SIZE(20 /* Builder */, 8 /* guess */, 8 /* guess */);
-// }
-// } else {
- /*
- Child margins are highly inconsistent in AHIG and Builder.
- */
- return_SIZE(12, 8, 6); // guess
-// }
- }
- }
- case PM_LayoutHorizontalSpacing:
- case PM_LayoutVerticalSpacing:
- return -1;
- case PM_MenuHMargin:
- ret = 0;
- break;
- case PM_ToolBarExtensionExtent:
- ret = 21;
- break;
- case PM_ToolBarFrameWidth:
- ret = 1;
- break;
- case PM_ScrollView_ScrollBarOverlap:
- 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:
- // QTBUG-93423: We currently need to skip drawing a focus ring around the handle, since
- // the handle drawn by the UIKit is not centered inside the rect we get from calling
- // [cell knobRectFlipped:slider.isFlipped]. So we choose to draw the focus as
- // a rect instead until we have a better solution available.
- ret = 0;
- break;
- case PM_DialFocusFrameRadius:
- case PM_SpinBoxFocusFrameRadius:
- case PM_TextAreaFocusFrameRadius:
- case PM_TextFieldFocusFrameRadius:
- ret = 3;
- break;
- default:
- ret = QCommonStyle::pixelMetric(metric, opt);
- break;
- }
- return ret;
-}
-
-//QPalette QMacStyle::standardPalette() const
-//{
-// auto platformTheme = QGuiApplicationPrivate::platformTheme();
-// auto styleNames = platformTheme->themeHint(QPlatformTheme::StyleNames);
-// if (styleNames.toStringList().contains("macintosh"))
-// return QPalette(); // Inherit everything from theme
-// else
-// return QStyle::standardPalette();
-//}
-
-int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, QStyleHintReturn *hret) const
-{
- QMacAutoReleasePool pool;
-
- int ret = 0;
- switch (sh) {
- case SH_Slider_SnapToValue:
- case SH_PrintDialog_RightAlignButtons:
- case SH_FontDialog_SelectAssociatedText:
- case SH_MenuBar_MouseTracking:
- case SH_Menu_MouseTracking:
- case SH_ComboBox_ListMouseTracking:
- case SH_MainWindow_SpaceBelowMenuBar:
- case SH_ItemView_ChangeHighlightOnFocus:
- ret = 1;
- break;
- case SH_ToolBox_SelectedPageTitleBold:
- ret = 0;
- break;
- case SH_DialogButtonBox_ButtonsHaveIcons:
- ret = 0;
- break;
- case SH_Menu_SelectionWrap:
- ret = false;
- break;
- case SH_Menu_KeyboardSearch:
- ret = true;
- break;
- case SH_Menu_SpaceActivatesItem:
- ret = true;
- break;
- case SH_Slider_AbsoluteSetButtons:
- ret = Qt::LeftButton|Qt::MiddleButton;
- break;
- case SH_Slider_PageSetButtons:
- ret = 0;
- break;
- case SH_ScrollBar_ContextMenu:
- ret = false;
- break;
- case SH_TitleBar_AutoRaise:
- ret = true;
- break;
- case SH_Menu_AllowActiveAndDisabled:
- ret = false;
- break;
- case SH_Menu_SubMenuPopupDelay:
- ret = 100;
- break;
- case SH_Menu_SubMenuUniDirection:
- ret = true;
- break;
- case SH_Menu_SubMenuSloppySelectOtherActions:
- ret = false;
- break;
- case SH_Menu_SubMenuResetWhenReenteringParent:
- ret = true;
- break;
- case SH_Menu_SubMenuDontStartSloppyOnLeave:
- ret = true;
- break;
-
- case SH_ScrollBar_LeftClickAbsolutePosition: {
- NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
- bool result = [defaults boolForKey:@"AppleScrollerPagingBehavior"];
-// if(QApplication::keyboardModifiers() & Qt::AltModifier)
-// ret = !result;
-// else
- ret = result;
- break; }
- case SH_TabBar_PreferNoArrows:
- ret = true;
- break;
- /*
- case SH_DialogButtons_DefaultButton:
- ret = QDialogButtons::Reject;
- break;
- */
- case SH_GroupBox_TextLabelVerticalAlignment:
- ret = Qt::AlignTop;
- break;
- case SH_ScrollView_FrameOnlyAroundContents:
- ret = QCommonStyle::styleHint(sh, opt, hret);
- break;
- case SH_Menu_FillScreenWithScroll:
- ret = false;
- break;
- case SH_Menu_Scrollable:
- ret = true;
- break;
- case SH_RichText_FullWidthSelection:
- ret = true;
- break;
- case SH_BlinkCursorWhenTextSelected:
- ret = false;
- break;
- case SH_Slider_StopMouseOverSlider:
- ret = true;
- break;
- case SH_ListViewExpand_SelectMouseType:
- ret = QEvent::MouseButtonRelease;
- break;
- case SH_TabBar_SelectMouseType:
- if (const QStyleOptionTabBarBase *opt2 = qstyleoption_cast<const QStyleOptionTabBarBase *>(opt)) {
- ret = opt2->documentMode ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease;
- } else {
- ret = QEvent::MouseButtonRelease;
- }
- break;
- case SH_ComboBox_Popup:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(opt))
- ret = !cmb->editable;
- else
- ret = 0;
- break;
- case SH_Workspace_FillSpaceOnMaximize:
- ret = true;
- break;
- case SH_Widget_ShareActivation:
- ret = true;
- break;
- case SH_Header_ArrowAlignment:
- ret = Qt::AlignRight;
- break;
- case SH_TabBar_Alignment: {
-//#if QT_CONFIG(tabwidget)
-// if (const QTabWidget *tab = qobject_cast<const QTabWidget*>(w)) {
-// if (tab->documentMode()) {
-// ret = Qt::AlignLeft;
-// break;
-// }
-// }
-//#endif
-//#if QT_CONFIG(tabbar)
-// if (const QTabBar *tab = qobject_cast<const QTabBar*>(w)) {
-// if (tab->documentMode()) {
-// ret = Qt::AlignLeft;
-// break;
-// }
-// }
-//#endif
- ret = Qt::AlignCenter;
- } break;
- case SH_UnderlineShortcut:
- ret = false;
- break;
- case SH_ToolTipLabel_Opacity:
- ret = 242; // About 95%
- break;
- case SH_Button_FocusPolicy:
- ret = Qt::TabFocus;
- break;
- case SH_EtchDisabledText:
- ret = false;
- break;
- case SH_FocusFrame_Mask: {
- ret = true;
- if(QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(hret)) {
- const uchar fillR = 192, fillG = 191, fillB = 190;
- QImage img;
-
- QSize pixmapSize = opt->rect.size();
- if (!pixmapSize.isEmpty()) {
- QPixmap pix(pixmapSize);
- pix.fill(QColor(fillR, fillG, fillB));
- QPainter pix_paint(&pix);
- proxy()->drawControl(CE_FocusFrame, opt, &pix_paint);
- pix_paint.end();
- img = pix.toImage();
- }
-
- const QRgb *sptr = (QRgb*)img.bits(), *srow;
- const qsizetype sbpl = img.bytesPerLine();
- const int w = sbpl/4, h = img.height();
-
- QImage img_mask(img.width(), img.height(), QImage::Format_ARGB32);
- QRgb *dptr = (QRgb*)img_mask.bits(), *drow;
- const qsizetype dbpl = img_mask.bytesPerLine();
-
- for (int y = 0; y < h; ++y) {
- srow = sptr+((y*sbpl)/4);
- drow = dptr+((y*dbpl)/4);
- for (int x = 0; x < w; ++x) {
- const int redDiff = qRed(*srow) - fillR;
- const int greenDiff = qGreen(*srow) - fillG;
- const int blueDiff = qBlue(*srow) - fillB;
- const int diff = (redDiff * redDiff) + (greenDiff * greenDiff) + (blueDiff * blueDiff);
- (*drow++) = (diff < 10) ? 0xffffffff : 0xff000000;
- ++srow;
- }
- }
- QBitmap qmask = QBitmap::fromImage(img_mask);
- mask->region = QRegion(qmask);
- }
- break; }
- case SH_TitleBar_NoBorder:
- ret = 1;
- break;
- case SH_RubberBand_Mask:
- ret = 0;
- break;
- case SH_ComboBox_LayoutDirection:
- ret = Qt::LeftToRight;
- break;
- case SH_ItemView_EllipsisLocation:
- ret = Qt::AlignHCenter;
- break;
- case SH_ItemView_ShowDecorationSelected:
- ret = true;
- break;
- case SH_TitleBar_ModifyNotification:
- ret = false;
- break;
- case SH_ScrollBar_RollBetweenButtons:
- ret = true;
- break;
- case SH_WindowFrame_Mask:
- ret = false;
- break;
- case SH_TabBar_ElideMode:
- ret = Qt::ElideRight;
- break;
-// case SH_DialogButtonLayout:
-// ret = QDialogButtonBox::MacLayout;
-// break;
-// case SH_FormLayoutWrapPolicy:
-// ret = QFormLayout::DontWrapRows;
-// break;
-// case SH_FormLayoutFieldGrowthPolicy:
-// ret = QFormLayout::FieldsStayAtSizeHint;
-// break;
- case SH_FormLayoutFormAlignment:
- ret = Qt::AlignHCenter | Qt::AlignTop;
- break;
- case SH_FormLayoutLabelAlignment:
- ret = Qt::AlignRight;
- break;
-// case SH_ComboBox_PopupFrameStyle:
-// ret = QFrame::NoFrame;
-// break;
- case SH_MessageBox_TextInteractionFlags:
- ret = Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse | Qt::TextSelectableByKeyboard;
- break;
- case SH_SpellCheckUnderlineStyle:
- ret = QTextCharFormat::DashUnderline;
- break;
- case SH_MessageBox_CenterButtons:
- ret = false;
- break;
- case SH_MenuBar_AltKeyNavigation:
- ret = false;
- break;
- case SH_ItemView_MovementWithoutUpdatingSelection:
- ret = false;
- break;
- case SH_FocusFrame_AboveWidget:
- ret = true;
- break;
-// case SH_WizardStyle:
-// ret = QWizard::MacStyle;
-// break;
- case SH_ItemView_ArrowKeysNavigateIntoChildren:
- ret = false;
- break;
- case SH_Menu_FlashTriggeredItem:
- ret = true;
- break;
- case SH_Menu_FadeOutOnHide:
- ret = true;
- break;
- case SH_ItemView_PaintAlternatingRowColorsForEmptyArea:
- ret = true;
- break;
- case SH_TabBar_CloseButtonPosition:
- ret = QStyleOptionTabBarBase::LeftSide;
- break;
- case SH_DockWidget_ButtonsHaveFrame:
- ret = false;
- break;
- case SH_ScrollBar_Transient:
- // For the initial version in QQC2, we don't support transient scrollbars. When the
- // time comes, consider doing all such animations from QML.
- // ret = [NSScroller preferredScrollerStyle] == NSScrollerStyleOverlay;
- ret = false;
- break;
- case SH_TitleBar_ShowToolTipsOnButtons:
- // min/max/close buttons on windows don't show tool tips
- ret = false;
- break;
- case SH_ComboBox_AllowWheelScrolling:
- ret = false;
- break;
- case SH_SpinBox_ButtonsInsideFrame:
- ret = false;
- break;
- case SH_Table_GridLineColor:
- ret = int(qt_mac_toQColor(NSColor.gridColor).rgba());
- break;
- default:
- ret = QCommonStyle::styleHint(sh, opt, hret);
- break;
- }
- return ret;
-}
-
-QPixmap QMacStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const
-{
- switch (iconMode) {
- case QIcon::Disabled: {
- QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
- int imgh = img.height();
- int imgw = img.width();
- QRgb pixel;
- for (int y = 0; y < imgh; ++y) {
- for (int x = 0; x < imgw; ++x) {
- pixel = img.pixel(x, y);
- img.setPixel(x, y, qRgba(qRed(pixel), qGreen(pixel), qBlue(pixel),
- qAlpha(pixel) / 2));
- }
- }
- return QPixmap::fromImage(img);
- }
- default:
- ;
- }
- return QCommonStyle::generatedIconPixmap(iconMode, pixmap, opt);
-}
-
-
-QPixmap QMacStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt) const
-{
- // The default implementation of QStyle::standardIconImplementation() is to call standardPixmap()
- // I don't want infinite recursion so if we do get in that situation, just return the Window's
- // standard pixmap instead (since there is no mac-specific icon then). This should be fine until
- // someone changes how Windows standard
- // pixmap works.
- static bool recursionGuard = false;
-
- if (recursionGuard)
- return QCommonStyle::standardPixmap(standardPixmap, opt);
-
- recursionGuard = true;
- QIcon icon = proxy()->standardIcon(standardPixmap, opt);
- recursionGuard = false;
- int size;
- switch (standardPixmap) {
- default:
- size = 32;
- break;
- case SP_MessageBoxCritical:
- case SP_MessageBoxQuestion:
- case SP_MessageBoxInformation:
- case SP_MessageBoxWarning:
- size = 64;
- break;
- }
- return icon.pixmap(opt->window, QSize(size, size));
-}
-
-void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const
-{
- Q_D(const QMacStyle);
-
- const AppearanceSync appSync;
- QMacCGContext cg(p);
- d->resolveCurrentNSView(opt->window);
-
- switch (pe) {
- case PE_IndicatorArrowUp:
- case PE_IndicatorArrowDown:
- case PE_IndicatorArrowRight:
- case PE_IndicatorArrowLeft: {
- p->save();
- p->setRenderHint(QPainter::Antialiasing);
- const int xOffset = 1; // FIXME: opt->direction == Qt::LeftToRight ? 2 : -1;
- qreal halfSize = 0.5 * qMin(opt->rect.width(), opt->rect.height());
- const qreal penWidth = qMax(halfSize / 3.0, 1.25);
-//#if QT_CONFIG(toolbutton)
-// if (const QToolButton *tb = qobject_cast<const QToolButton *>(w)) {
-// // When stroking the arrow, make sure it fits in the tool button
-// if (tb->arrowType() != Qt::NoArrow
-// || tb->popupMode() == QToolButton::MenuButtonPopup)
-// halfSize -= penWidth;
-// }
-//#endif
-
- QTransform transform;
- transform.translate(opt->rect.center().x() + xOffset, opt->rect.center().y() + 2);
- QPainterPath path;
- switch(pe) {
- default:
- case PE_IndicatorArrowDown:
- break;
- case PE_IndicatorArrowUp:
- transform.rotate(180);
- break;
- case PE_IndicatorArrowLeft:
- transform.rotate(90);
- break;
- case PE_IndicatorArrowRight:
- transform.rotate(-90);
- break;
- }
- p->setTransform(transform);
-
- path.moveTo(-halfSize, -halfSize * 0.5);
- path.lineTo(0.0, halfSize * 0.5);
- path.lineTo(halfSize, -halfSize * 0.5);
-
- const QPen arrowPen(opt->palette.text(), penWidth,
- Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
- p->strokePath(path, arrowPen);
- p->restore();
- break; }
- case PE_FrameTabBarBase:
- if (const QStyleOptionTabBarBase *tbb
- = qstyleoption_cast<const QStyleOptionTabBarBase *>(opt)) {
- if (tbb->documentMode) {
- p->save();
- drawTabBase(p, tbb);
- p->restore();
- return;
- }
- QRegion region(tbb->rect);
- region -= tbb->tabBarRect;
- p->save();
- p->setClipRegion(region);
- QStyleOptionTabWidgetFrame twf;
- twf.QStyleOption::operator=(*tbb);
- twf.shape = tbb->shape;
- switch (QMacStylePrivate::tabDirection(twf.shape)) {
- case QMacStylePrivate::North:
- twf.rect = twf.rect.adjusted(0, 0, 0, 10);
- break;
- case QMacStylePrivate::South:
- twf.rect = twf.rect.adjusted(0, -10, 0, 0);
- break;
- case QMacStylePrivate::West:
- twf.rect = twf.rect.adjusted(0, 0, 10, 0);
- break;
- case QMacStylePrivate::East:
- twf.rect = twf.rect.adjusted(0, -10, 0, 0);
- break;
- }
- proxy()->drawPrimitive(PE_FrameTabWidget, &twf, p);
- p->restore();
- }
- break;
- case PE_PanelTipLabel:
- p->fillRect(opt->rect, opt->palette.brush(QPalette::ToolTipBase));
- break;
- case PE_FrameGroupBox:
- if (const auto *groupBox = qstyleoption_cast<const QStyleOptionFrame *>(opt))
- if (groupBox->features & QStyleOptionFrame::Flat) {
- QCommonStyle::drawPrimitive(pe, groupBox, p);
- break;
- }
- Q_FALLTHROUGH();
- case PE_FrameTabWidget:
- {
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::Box, QStyleHelper::SizeLarge);
- auto *box = static_cast<NSBox *>(d->cocoaControl(cw));
- // FIXME Since macOS 10.14, simply calling drawRect: won't display anything anymore.
- // The AppKit team is aware of this and has proposed a couple of solutions.
- // The first solution was to call displayRectIgnoringOpacity:inContext: instead.
- // However, it doesn't seem to work on 10.13. More importantly, dark mode on 10.14
- // is extremely slow. Light mode works fine.
- // The second solution is to subclass NSBox and reimplement a trivial drawRect: which
- // would only call super. This works without any issue on 10.13, but a double border
- // shows on 10.14 in both light and dark modes.
- // The code below picks what works on each version and mode. On 10.13 and earlier, we
- // simply call drawRect: on a regular NSBox. On 10.14, we call displayRectIgnoringOpacity:
- // inContext:, but only in light mode. In dark mode, we use a custom NSBox subclass,
- // QDarkNSBox, of type NSBoxCustom. Its appearance is close enough to the real thing so
- // we can use this for now.
- auto adjustedRect = opt->rect;
- bool needTranslation = false;
- if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave
- && !qt_mac_applicationIsInDarkMode()) {
- // In Aqua theme we have to use the 'default' NSBox (as opposite
- // to the 'custom' QDarkNSBox we use in dark theme). Since -drawRect:
- // does nothing in default NSBox, we call -displayRectIgnoringOpaticty:.
- // Unfortunately, the resulting box is smaller then the actual rect we
- // wanted. This can be seen, e.g. because tabs (buttons) are misaligned
- // vertically and even worse, if QTabWidget has autoFillBackground
- // set, this background overpaints NSBox making it to disappear.
- // We trick our NSBox to render in a larger rectangle, so that
- // the actuall result (which is again smaller than requested),
- // more or less is what we really want. We'll have to adjust CTM
- // and translate accordingly.
- adjustedRect.adjust(0, 0, 6, 6);
- needTranslation = true;
- }
- d->drawNSViewInRect(box, adjustedRect, p, ^(CGContextRef ctx, const CGRect &rect) {
-//#if QT_CONFIG(tabwidget)
-// if (QTabWidget *tabWidget = qobject_cast<QTabWidget *>(opt->styleObject))
-// clipTabBarFrame(opt, this, ctx);
-//#endif
- QMacAutoReleasePool pool;
- CGContextTranslateCTM(ctx, 0, rect.origin.y + rect.size.height);
- CGContextScaleCTM(ctx, 1, -1);
- if (QOperatingSystemVersion::current() < QOperatingSystemVersion::MacOSMojave
- || [box isMemberOfClass:QDarkNSBox.class]) {
- [box drawRect:rect];
- } else {
- if (needTranslation)
- CGContextTranslateCTM(ctx, -3.0, 5.0);
- [box displayRectIgnoringOpacity:box.bounds inContext:NSGraphicsContext.currentContext];
- }
- });
- break;
- }
- case PE_IndicatorToolBarSeparator: {
- QPainterPath path;
- if (opt->state & State_Horizontal) {
- int xpoint = opt->rect.center().x();
- path.moveTo(xpoint + 0.5, opt->rect.top() + 1);
- path.lineTo(xpoint + 0.5, opt->rect.bottom());
- } else {
- int ypoint = opt->rect.center().y();
- path.moveTo(opt->rect.left() + 2 , ypoint + 0.5);
- path.lineTo(opt->rect.right() + 1, ypoint + 0.5);
- }
- QPainterPathStroker theStroker;
- theStroker.setCapStyle(Qt::FlatCap);
- theStroker.setDashPattern(QVector<qreal>() << 1 << 2);
- path = theStroker.createStroke(path);
- const auto dark = qt_mac_applicationIsInDarkMode() ? opt->palette.dark().color().darker()
- : QColor(0, 0, 0, 119);
- p->fillPath(path, dark);
- }
- break;
- case PE_FrameWindow:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
-// if (w && w->inherits("QMdiSubWindow")) {
-// p->save();
-// p->setPen(QPen(frame->palette.dark().color(), frame->lineWidth));
-// p->setBrush(frame->palette.window());
-// p->drawRect(frame->rect);
-// p->restore();
-// }
- }
- break;
- case PE_IndicatorDockWidgetResizeHandle: {
- // The docwidget resize handle is drawn as a one-pixel wide line.
- p->save();
- if (opt->state & State_Horizontal) {
- p->setPen(QColor(160, 160, 160));
- p->drawLine(opt->rect.topLeft(), opt->rect.topRight());
- } else {
- p->setPen(QColor(145, 145, 145));
- p->drawLine(opt->rect.topRight(), opt->rect.bottomRight());
- }
- p->restore();
- } break;
- case PE_IndicatorToolBarHandle: {
- p->save();
- QPainterPath path;
- int x = opt->rect.x() + 6;
- int y = opt->rect.y() + 7;
- static const int RectHeight = 2;
- if (opt->state & State_Horizontal) {
- while (y < opt->rect.height() - RectHeight - 5) {
- path.moveTo(x, y);
- path.addEllipse(x, y, RectHeight, RectHeight);
- y += 6;
- }
- } else {
- while (x < opt->rect.width() - RectHeight - 5) {
- path.moveTo(x, y);
- path.addEllipse(x, y, RectHeight, RectHeight);
- x += 6;
- }
- }
- p->setPen(Qt::NoPen);
- QColor dark = opt->palette.dark().color().darker();
- dark.setAlphaF(0.50);
- p->fillPath(path, dark);
- p->restore();
-
- break;
- }
- case PE_IndicatorHeaderArrow:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- // In HITheme, up is down, down is up and hamburgers eat people.
- if (header->sortIndicator != QStyleOptionHeader::None)
- proxy()->drawPrimitive(
- (header->sortIndicator == QStyleOptionHeader::SortDown) ?
- PE_IndicatorArrowUp : PE_IndicatorArrowDown, header, p);
- }
- break;
- case PE_IndicatorMenuCheckMark: {
- QColor pc;
- if (opt->state & State_On)
- pc = opt->palette.highlightedText().color();
- else
- pc = opt->palette.text().color();
-
- QCFType<CGColorRef> checkmarkColor = CGColorCreateGenericRGB(static_cast<CGFloat>(pc.redF()),
- static_cast<CGFloat>(pc.greenF()),
- static_cast<CGFloat>(pc.blueF()),
- static_cast<CGFloat>(pc.alphaF()));
- // kCTFontUIFontSystem and others give the same result
- // as kCTFontUIFontMenuItemMark. However, the latter is
- // more reminiscent to HITheme's kThemeMenuItemMarkFont.
- // See also the font for small- and mini-sized widgets,
- // where we end up using the generic system font type.
- const CTFontUIFontType fontType = (opt->state & State_Mini) ? kCTFontUIFontMiniSystem :
- (opt->state & State_Small) ? kCTFontUIFontSmallSystem :
- kCTFontUIFontMenuItemMark;
- // Similarly for the font size, where there is a small difference
- // between regular combobox and item view items, and and menu items.
- // However, we ignore any difference for small- and mini-sized widgets.
- const CGFloat fontSize = fontType == kCTFontUIFontMenuItemMark ? opt->fontMetrics.height() : 0.0;
- QCFType<CTFontRef> checkmarkFont = CTFontCreateUIFontForLanguage(fontType, fontSize, NULL);
-
- CGContextSaveGState(cg);
- CGContextSetShouldSmoothFonts(cg, NO); // Same as HITheme and Cocoa menu checkmarks
-
- // Baseline alignment tweaks for QComboBox and QMenu
- const CGFloat vOffset = (opt->state & State_Mini) ? 0.0 :
- (opt->state & State_Small) ? 1.0 :
- 0.75;
-
- CGContextTranslateCTM(cg, 0, opt->rect.bottom());
- CGContextScaleCTM(cg, 1, -1);
- // Translate back to the original position and add rect origin and offset
- CGContextTranslateCTM(cg, opt->rect.x(), vOffset);
-
- // CTFont has severe difficulties finding the checkmark character among its
- // glyphs. Fortunately, CTLine knows its ways inside the Cocoa labyrinth.
- static const CFStringRef keys[] = { kCTFontAttributeName, kCTForegroundColorAttributeName };
- static const int numValues = sizeof(keys) / sizeof(keys[0]);
- const CFTypeRef values[] = { (CFTypeRef)checkmarkFont, (CFTypeRef)checkmarkColor };
- Q_STATIC_ASSERT((sizeof(values) / sizeof(values[0])) == numValues);
- QCFType<CFDictionaryRef> attributes = CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void **)values,
- numValues, NULL, NULL);
- // U+2713: CHECK MARK
- QCFType<CFAttributedStringRef> checkmarkString = CFAttributedStringCreate(kCFAllocatorDefault, (CFStringRef)@"\u2713", attributes);
- QCFType<CTLineRef> line = CTLineCreateWithAttributedString(checkmarkString);
-
- CTLineDraw((CTLineRef)line, cg);
- CGContextFlush(cg); // CTLineDraw's documentation says it doesn't flush
-
- CGContextRestoreGState(cg);
- break; }
- case PE_IndicatorItemViewItemCheck:
- case PE_IndicatorRadioButton:
- case PE_IndicatorCheckBox: {
- const bool isEnabled = opt->state & State_Enabled;
- const bool isPressed = opt->state & State_Sunken;
- const bool isRadioButton = (pe == PE_IndicatorRadioButton);
- const auto ct = isRadioButton ? QMacStylePrivate::Button_RadioButton : QMacStylePrivate::Button_CheckBox;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *tb = static_cast<NSButton *>(d->cocoaControl(cw));
- tb.enabled = isEnabled;
- tb.state = (opt->state & State_NoChange) ? NSMixedState :
- (opt->state & State_On) ? NSOnState : NSOffState;
- [tb highlight:isPressed];
- const auto vOffset = [=] {
- // As measured
- if (cs == QStyleHelper::SizeMini)
- return ct == QMacStylePrivate::Button_CheckBox ? -0.5 : 0.5;
-
- return cs == QStyleHelper::SizeSmall ? 0.5 : 0.0;
- } ();
- d->drawNSViewInRect(tb, opt->rect, p, ^(CGContextRef ctx, const CGRect &rect) {
- QMacAutoReleasePool pool;
- CGContextTranslateCTM(ctx, 0, vOffset);
- [tb.cell drawInteriorWithFrame:rect inView:tb];
- });
- break; }
- case PE_FrameFocusRect:
- // Use the our own focus widget stuff.
- break;
- case PE_IndicatorBranch: {
- if (!(opt->state & State_Children))
- break;
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::Button_Disclosure, QStyleHelper::SizeLarge);
- NSButtonCell *triangleCell = static_cast<NSButtonCell *>(d->cocoaCell(cw));
- [triangleCell setState:(opt->state & State_Open) ? NSOnState : NSOffState];
-// bool viewHasFocus = (w && w->hasFocus()) || (opt->state & State_HasFocus);
- bool viewHasFocus = false;
- [triangleCell setBackgroundStyle:((opt->state & State_Selected) && viewHasFocus) ? NSBackgroundStyleDark : NSBackgroundStyleLight];
-
- d->setupNSGraphicsContext(cg, NO);
-
- QRect qtRect = opt->rect.adjusted(DisclosureOffset, 0, -DisclosureOffset, 0);
- CGRect rect = CGRectMake(qtRect.x() + 1, qtRect.y(), qtRect.width(), qtRect.height());
- CGContextTranslateCTM(cg, rect.origin.x, rect.origin.y + rect.size.height);
- CGContextScaleCTM(cg, 1, -1);
- CGContextTranslateCTM(cg, -rect.origin.x, -rect.origin.y);
-
- [triangleCell drawBezelWithFrame:NSRectFromCGRect(rect) inView:[triangleCell controlView]];
-
- d->restoreNSGraphicsContext(cg);
- break; }
-
- case PE_Frame: {
- const QPen oldPen = p->pen();
- QPen penCpy = p->pen();
- penCpy.setWidth(2);
- penCpy.setColor(opt->palette.dark().color());
- p->setPen(penCpy);
- p->drawRect(opt->rect);
- p->setPen(oldPen);
- break; }
- case PE_PanelLineEdit:
- case PE_FrameLineEdit:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (frame->state & State_Sunken) {
- const bool isEnabled = opt->state & State_Enabled;
- const bool isReadOnly = opt->state & State_ReadOnly;
- const bool isRounded = frame->features & QStyleOptionFrame::Rounded;
- const auto cs = d->effectiveAquaSizeConstrain(opt, CT_LineEdit);
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::TextField, cs);
- auto *tf = static_cast<NSTextField *>(d->cocoaControl(cw));
- tf.enabled = isEnabled;
- tf.editable = !isReadOnly;
- tf.bezeled = YES;
- static_cast<NSTextFieldCell *>(tf.cell).bezelStyle = isRounded ? NSTextFieldRoundedBezel : NSTextFieldSquareBezel;
- tf.frame = opt->rect.toCGRect();
- d->drawNSViewInRect(tf, opt->rect, p, ^(CGContextRef, const CGRect &rect) {
- QMacAutoReleasePool pool;
- if (!qt_mac_applicationIsInDarkMode()) {
- // In 'Dark' mode controls are transparent, so we do not
- // over-paint the (potentially custom) color in the background.
- // In 'Light' mode we have to care about the correct
- // background color. See the comments below for PE_PanelLineEdit.
- CGContextRef cgContext = NSGraphicsContext.currentContext.CGContext;
- // See QMacCGContext, here we expect bitmap context created with
- // color space 'kCGColorSpaceSRGB', if it's something else - we
- // give up.
- if (cgContext ? bool(CGBitmapContextGetColorSpace(cgContext)) : false) {
- tf.drawsBackground = YES;
- const QColor bgColor = frame->palette.brush(QPalette::Base).color();
- tf.backgroundColor = [NSColor colorWithSRGBRed:bgColor.redF()
- green:bgColor.greenF()
- blue:bgColor.blueF()
- alpha:bgColor.alphaF()];
- if (bgColor.alpha() != 255) {
- // No way we can have it bezeled and transparent ...
- tf.bordered = YES;
- }
- }
- }
-
- [tf.cell drawWithFrame:rect inView:tf];
- });
- } else {
- QCommonStyle::drawPrimitive(pe, opt, p);
- }
- }
- break;
- case PE_PanelScrollAreaCorner: {
- const QBrush brush(opt->palette.brush(QPalette::Base));
- p->fillRect(opt->rect, brush);
- p->setPen(QPen(QColor(217, 217, 217)));
- p->drawLine(opt->rect.topLeft(), opt->rect.topRight());
- p->drawLine(opt->rect.topLeft(), opt->rect.bottomLeft());
- } break;
- case PE_FrameStatusBarItem:
- break;
-//#if QT_CONFIG(tabbar)
-// case PE_IndicatorTabClose: {
-// // Make close button visible only on the hovered tab.
-// QTabBar *tabBar = qobject_cast<QTabBar*>(w->parentWidget());
-// const QWidget *closeBtn = w;
-// if (!tabBar) {
-// // QStyleSheetStyle instead of CloseButton (which has
-// // a QTabBar as a parent widget) uses the QTabBar itself:
-// tabBar = qobject_cast<QTabBar *>(const_cast<QWidget*>(w));
-// closeBtn = decltype(closeBtn)(property("_q_styleSheetRealCloseButton").value<void *>());
-// }
-// if (tabBar) {
-// const bool documentMode = tabBar->documentMode();
-// const QTabBarPrivate *tabBarPrivate = static_cast<QTabBarPrivate *>(QObjectPrivate::get(tabBar));
-// const int hoveredTabIndex = tabBarPrivate->hoveredTabIndex();
-// if (!documentMode ||
-// (hoveredTabIndex != -1 && ((closeBtn == tabBar->tabButton(hoveredTabIndex, QTabBar::LeftSide)) ||
-// (closeBtn == tabBar->tabButton(hoveredTabIndex, QTabBar::RightSide))))) {
-// const bool hover = (opt->state & State_MouseOver);
-// const bool selected = (opt->state & State_Selected);
-// const bool pressed = (opt->state & State_Sunken);
-// drawTabCloseButton(p, hover, selected, pressed, documentMode);
-// }
-// }
-// } break;
-//#endif // QT_CONFIG(tabbar)
- case PE_PanelStatusBar: {
- // Fill the status bar with the titlebar gradient.
- QLinearGradient linearGrad;
- const bool isMainWindow = qt_macWindowMainWindow(opt->window);
- if (isMainWindow)
- linearGrad = titlebarGradientActive();
- else
- linearGrad = titlebarGradientInactive();
-
- linearGrad.setStart(0, opt->rect.top());
- linearGrad.setFinalStop(0, opt->rect.bottom());
- p->fillRect(opt->rect, linearGrad);
-
- // Draw the black separator line at the top of the status bar.
- if (isMainWindow)
- p->setPen(titlebarSeparatorLineActive);
- else
- p->setPen(titlebarSeparatorLineInactive);
- p->drawLine(opt->rect.left(), opt->rect.top(), opt->rect.right(), opt->rect.top());
-
- break;
- }
- case PE_PanelMenu: {
- p->save();
- p->fillRect(opt->rect, Qt::transparent);
- p->setPen(Qt::transparent);
- p->setBrush(opt->palette.window());
- p->setRenderHint(QPainter::Antialiasing, true);
- const QPainterPath path = d->windowPanelPath(opt->rect);
- p->drawPath(path);
- p->restore();
- } break;
-
- default:
- QCommonStyle::drawPrimitive(pe, opt, p);
- break;
- }
-}
-
-static QPixmap darkenPixmap(const QPixmap &pixmap)
-{
- QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
- int imgh = img.height();
- int imgw = img.width();
- int h, s, v, a;
- QRgb pixel;
- for (int y = 0; y < imgh; ++y) {
- for (int x = 0; x < imgw; ++x) {
- pixel = img.pixel(x, y);
- a = qAlpha(pixel);
- QColor hsvColor(pixel);
- hsvColor.getHsv(&h, &s, &v);
- s = qMin(100, s * 2);
- v = v / 2;
- hsvColor.setHsv(h, s, v);
- pixel = hsvColor.rgb();
- img.setPixel(x, y, qRgba(qRed(pixel), qGreen(pixel), qBlue(pixel), a));
- }
- }
- return QPixmap::fromImage(img);
-}
-
-void QMacStylePrivate::setupVerticalInvertedXform(CGContextRef cg, bool reverse, bool vertical, const CGRect &rect) const
-{
- if (vertical) {
- CGContextTranslateCTM(cg, rect.size.height, 0);
- CGContextRotateCTM(cg, M_PI_2);
- }
- if (vertical != reverse) {
- CGContextTranslateCTM(cg, rect.size.width, 0);
- CGContextScaleCTM(cg, -1, 1);
- }
-}
-
-void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter *p) const
-{
- Q_D(const QMacStyle);
-
- const AppearanceSync sync;
- const QMacAutoReleasePool pool;
-
- QMacCGContext cg(p);
- d->resolveCurrentNSView(opt->window);
-
- switch (ce) {
- case CE_HeaderSection:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- State flags = header->state;
- QRect ir = header->rect;
- const bool pressed = (flags & State_Sunken) && !(flags & State_On);
- p->fillRect(ir, pressed ? header->palette.dark() : header->palette.button());
- p->setPen(QPen(header->palette.dark(), 1.0));
- if (header->orientation == Qt::Horizontal)
- p->drawLine(QLineF(ir.right() + 0.5, ir.top() + headerSectionSeparatorInset,
- ir.right() + 0.5, ir.bottom() - headerSectionSeparatorInset));
- else
- p->drawLine(QLineF(ir.left() + headerSectionSeparatorInset, ir.bottom(),
- ir.right() - headerSectionSeparatorInset, ir.bottom()));
- }
-
- break;
- case CE_HeaderLabel:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- p->save();
- QRect textr = header->rect;
- if (!header->icon.isNull()) {
- QIcon::Mode mode = QIcon::Disabled;
- if (opt->state & State_Enabled)
- mode = QIcon::Normal;
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- QPixmap pixmap = header->icon.pixmap(opt->window, QSize(iconExtent, iconExtent), mode);
-
- QRect pixr = header->rect;
- pixr.setY(header->rect.center().y() - (pixmap.height() / pixmap.devicePixelRatio() - 1) / 2);
- proxy()->drawItemPixmap(p, pixr, Qt::AlignVCenter, pixmap);
- textr.translate(pixmap.width() / pixmap.devicePixelRatio() + 2, 0);
- }
-
- proxy()->drawItemText(p, textr, header->textAlignment | Qt::AlignVCenter, header->palette,
- header->state & State_Enabled, header->text, QPalette::ButtonText);
- p->restore();
- }
- break;
- case CE_ToolButtonLabel:
- if (const QStyleOptionToolButton *tb = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QStyleOptionToolButton myTb = *tb;
- myTb.state &= ~State_AutoRaise;
-#ifndef QT_NO_ACCESSIBILITY
- if (QStyleHelper::hasAncestor(opt->styleObject, QAccessible::ToolBar)) {
- QRect cr = tb->rect;
- int shiftX = 0;
- int shiftY = 0;
- bool needText = false;
- int alignment = 0;
- bool down = tb->state & (State_Sunken | State_On);
- if (down) {
- shiftX = proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb);
- shiftY = proxy()->pixelMetric(PM_ButtonShiftVertical, tb);
- }
- // The down state is special for QToolButtons in a toolbar on the Mac
- // The text is a bit bolder and gets a drop shadow and the icons are also darkened.
- // This doesn't really fit into any particular case in QIcon, so we
- // do the majority of the work ourselves.
- if (!(tb->features & QStyleOptionToolButton::Arrow)) {
- Qt::ToolButtonStyle tbstyle = tb->toolButtonStyle;
- if (tb->icon.isNull() && !tb->text.isEmpty())
- tbstyle = Qt::ToolButtonTextOnly;
-
- switch (tbstyle) {
- case Qt::ToolButtonTextOnly: {
- needText = true;
- alignment = Qt::AlignCenter;
- break; }
- case Qt::ToolButtonIconOnly:
- case Qt::ToolButtonTextBesideIcon:
- case Qt::ToolButtonTextUnderIcon: {
- QRect pr = cr;
- QIcon::Mode iconMode = (tb->state & State_Enabled) ? QIcon::Normal
- : QIcon::Disabled;
- QIcon::State iconState = (tb->state & State_On) ? QIcon::On
- : QIcon::Off;
- QPixmap pixmap = tb->icon.pixmap(opt->window,
- tb->rect.size().boundedTo(tb->iconSize),
- iconMode, iconState);
-
- // Draw the text if it's needed.
- if (tb->toolButtonStyle != Qt::ToolButtonIconOnly) {
- needText = true;
- if (tb->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
- pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6);
- cr.adjust(0, pr.bottom(), 0, -3);
- alignment |= Qt::AlignCenter;
- } else {
- pr.setWidth(pixmap.width() / pixmap.devicePixelRatio() + 8);
- cr.adjust(pr.right(), 0, 0, 0);
- alignment |= Qt::AlignLeft | Qt::AlignVCenter;
- }
- }
- if (opt->state & State_Sunken) {
- pr.translate(shiftX, shiftY);
- pixmap = darkenPixmap(pixmap);
- }
- proxy()->drawItemPixmap(p, pr, Qt::AlignCenter, pixmap);
- break; }
- default:
- Q_ASSERT(false);
- break;
- }
-
- if (needText) {
- QPalette pal = tb->palette;
- QPalette::ColorRole role = QPalette::NoRole;
- if (!proxy()->styleHint(SH_UnderlineShortcut, tb))
- alignment |= Qt::TextHideMnemonic;
- if (down)
- cr.translate(shiftX, shiftY);
- if (tbstyle == Qt::ToolButtonTextOnly
- || (tbstyle != Qt::ToolButtonTextOnly && !down)) {
- QPen pen = p->pen();
- QColor light = down || isDarkMode() ? Qt::black : Qt::white;
- light.setAlphaF(0.375f);
- p->setPen(light);
- p->drawText(cr.adjusted(0, 1, 0, 1), alignment, tb->text);
- p->setPen(pen);
- if (down && tbstyle == Qt::ToolButtonTextOnly) {
-// pal = QApplication::palette("QMenu");
- pal.setCurrentColorGroup(tb->palette.currentColorGroup());
- role = QPalette::HighlightedText;
- }
- }
- proxy()->drawItemText(p, cr, alignment, pal,
- tb->state & State_Enabled, tb->text, role);
- }
- } else {
- QCommonStyle::drawControl(ce, &myTb, p);
- }
- } else
-#endif // QT_NO_ACCESSIBILITY
- {
- QCommonStyle::drawControl(ce, &myTb, p);
- }
- }
- break;
- case CE_ToolBoxTabShape:
- QCommonStyle::drawControl(ce, opt, p);
- break;
- case CE_PushButtonBevel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- if (!(btn->state & (State_Raised | State_Sunken | State_On)))
- break;
-
- if (btn->features & QStyleOptionButton::CommandLinkButton) {
- QCommonStyle::drawControl(ce, opt, p);
- break;
- }
-
- const bool hasFocus = btn->state & State_HasFocus;
- const bool isActive = btn->state & State_Active;
-
- // a focused auto-default button within an active window
- // takes precedence over a normal default button
- if ((btn->features & QStyleOptionButton::AutoDefaultButton)
- && isActive && hasFocus)
- d->autoDefaultButton = btn->styleObject;
- else if (d->autoDefaultButton == btn->styleObject)
- d->autoDefaultButton = nullptr;
-
- const bool isEnabled = btn->state & State_Enabled;
- const bool isPressed = btn->state & State_Sunken;
- const bool isHighlighted = isActive &&
- ((btn->state & State_On)
- || (btn->features & QStyleOptionButton::DefaultButton)
- || (btn->features & QStyleOptionButton::AutoDefaultButton
- && d->autoDefaultButton == btn->styleObject));
- const bool hasMenu = btn->features & QStyleOptionButton::HasMenu;
- const auto ct = cocoaControlType(btn);
- const auto cs = d->effectiveAquaSizeConstrain(btn);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *pb = static_cast<NSButton *>(d->cocoaControl(cw));
- // Ensure same size and location as we used to have with HITheme.
- // This is more convoluted than we initialy thought. See for example
- // differences between plain and menu button frames.
- const QRectF frameRect = cw.adjustedControlFrame(btn->rect);
- pb.frame = frameRect.toCGRect();
-
- pb.enabled = isEnabled;
- [pb highlight:isPressed];
- pb.state = isHighlighted && !isPressed ? NSOnState : NSOffState;
- d->drawNSViewInRect(pb, frameRect, p, ^(CGContextRef, const CGRect &r) {
- QMacAutoReleasePool pool;
- [pb.cell drawBezelWithFrame:r inView:pb.superview];
- });
- [pb highlight:NO];
-
- if (hasMenu && cw.type == QMacStylePrivate::Button_SquareButton) {
- // Using -[NSPopuButtonCell drawWithFrame:inView:] above won't do
- // it right because we don't set the text in the native button.
- const int mbi = proxy()->pixelMetric(QStyle::PM_MenuButtonIndicator, btn);
- const auto ir = frameRect.toRect();
- int arrowYOffset = 0;
- const auto ar = visualRect(btn->direction, ir, QRect(ir.right() - mbi - 6, ir.height() / 2 - arrowYOffset, mbi, mbi));
-
- QStyleOption arrowOpt = *opt;
- arrowOpt.rect = ar;
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, p);
- }
- }
- break;
- case CE_PushButtonLabel:
- if (const QStyleOptionButton *b = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- QStyleOptionButton btn(*b);
- // We really don't want the label to be drawn the same as on
- // windows style if it has an icon and text, then it should be more like a
- // tab. So, cheat a little here. However, if it *is* only an icon
- // the windows style works great, so just use that implementation.
- const bool isEnabled = btn.state & State_Enabled;
- const bool hasMenu = btn.features & QStyleOptionButton::HasMenu;
- const bool hasIcon = !btn.icon.isNull();
- const bool hasText = !btn.text.isEmpty();
- const bool isActive = btn.state & State_Active;
- const bool isPressed = btn.state & State_Sunken;
-
- const auto ct = cocoaControlType(&btn);
-
- if (!hasMenu && ct != QMacStylePrivate::Button_SquareButton) {
- if (isPressed
- || (isActive && isEnabled
- && ((btn.state & State_On)
- || ((btn.features & QStyleOptionButton::DefaultButton) && !d->autoDefaultButton)
- || d->autoDefaultButton == btn.styleObject)))
- btn.palette.setColor(QPalette::ButtonText, Qt::white);
- }
-
- if ((!hasIcon && !hasMenu) || (hasIcon && !hasText)) {
- QCommonStyle::drawControl(ce, &btn, p);
- } else {
- QRect freeContentRect = btn.rect;
- QRect textRect = itemTextRect(
- btn.fontMetrics, freeContentRect, Qt::AlignCenter, isEnabled, btn.text);
- if (hasMenu) {
- textRect.moveTo(11, textRect.top());
- }
- // Draw the icon:
- if (hasIcon) {
- int contentW = textRect.width();
- if (hasMenu)
- contentW += proxy()->pixelMetric(PM_MenuButtonIndicator) + 4;
- QIcon::Mode mode = isEnabled ? QIcon::Normal : QIcon::Disabled;
- if (mode == QIcon::Normal && btn.state & State_HasFocus)
- mode = QIcon::Active;
- // Decide if the icon is should be on or off:
- QIcon::State state = QIcon::Off;
- if (btn.state & State_On)
- state = QIcon::On;
- QPixmap pixmap = btn.icon.pixmap(opt->window, btn.iconSize, mode, state);
- int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio();
- int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio();
- contentW += pixmapWidth + QMacStylePrivate::PushButtonContentPadding;
- int iconLeftOffset = freeContentRect.x() + (freeContentRect.width() - contentW) / 2;
- int iconTopOffset = freeContentRect.y() + (freeContentRect.height() - pixmapHeight) / 2;
- QRect iconDestRect(iconLeftOffset, iconTopOffset, pixmapWidth, pixmapHeight);
- QRect visualIconDestRect = visualRect(btn.direction, freeContentRect, iconDestRect);
- proxy()->drawItemPixmap(p, visualIconDestRect, Qt::AlignLeft | Qt::AlignVCenter, pixmap);
- int newOffset = iconDestRect.x() + iconDestRect.width()
- + QMacStylePrivate::PushButtonContentPadding - textRect.x();
- textRect.adjust(newOffset, 0, newOffset, 0);
- }
- // Draw the text:
- if (hasText) {
- textRect = visualRect(btn.direction, freeContentRect, textRect);
- proxy()->drawItemText(p, textRect, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, btn.palette,
- isEnabled, btn.text, QPalette::ButtonText);
- }
- }
- }
- break;
- case CE_ComboBoxLabel:
- if (const auto *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- auto comboCopy = *cb;
- comboCopy.direction = Qt::LeftToRight;
- // The rectangle will be adjusted to SC_ComboBoxEditField with comboboxEditBounds()
- QCommonStyle::drawControl(CE_ComboBoxLabel, &comboCopy, p);
- }
- break;
- case CE_TabBarTabShape:
- if (const auto *tabOpt = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- if (tabOpt->documentMode) {
- p->save();
- bool isUnified = false;
-// if (w) {
-// QRect tabRect = tabOpt->rect;
-// QPoint windowTabStart = w->mapTo(w->window(), tabRect.topLeft());
-// isUnified = isInMacUnifiedToolbarArea(w->window()->windowHandle(), windowTabStart.y());
-// }
-
- const int tabOverlap = proxy()->pixelMetric(PM_TabBarTabOverlap, opt);
- drawTabShape(p, tabOpt, isUnified, tabOverlap);
-
- p->restore();
- return;
- }
-
- const bool isActive = tabOpt->state & State_Active;
- const bool isEnabled = tabOpt->state & State_Enabled;
- const bool isPressed = tabOpt->state & State_Sunken;
- const bool isSelected = tabOpt->state & State_Selected;
- const auto tabDirection = QMacStylePrivate::tabDirection(tabOpt->shape);
- const bool verticalTabs = tabDirection == QMacStylePrivate::East
- || tabDirection == QMacStylePrivate::West;
-
- QStyleOptionTab::TabPosition tp = tabOpt->position;
- QStyleOptionTab::SelectedPosition sp = tabOpt->selectedPosition;
- if (tabOpt->direction == Qt::RightToLeft && !verticalTabs) {
- if (tp == QStyleOptionTab::Beginning)
- tp = QStyleOptionTab::End;
- else if (tp == QStyleOptionTab::End)
- tp = QStyleOptionTab::Beginning;
-
- if (sp == QStyleOptionTab::NextIsSelected)
- sp = QStyleOptionTab::PreviousIsSelected;
- else if (sp == QStyleOptionTab::PreviousIsSelected)
- sp = QStyleOptionTab::NextIsSelected;
- }
-
- // Alas, NSSegmentedControl and NSSegmentedCell are letting us down.
- // We're not able to draw it at will, either calling -[drawSegment:
- // inFrame:withView:], -[drawRect:] or anything in between. Besides,
- // there's no public API do draw the pressed state, AFAICS. We'll use
- // a push NSButton instead and clip the CGContext.
- // NOTE/TODO: this is not true. On 10.13 NSSegmentedControl works with
- // some (black?) magic/magic dances, on 10.14 it simply works (was
- // it fixed in AppKit?). But, indeed, we cannot make a tab 'pressed'
- // with NSSegmentedControl (only selected), so we stay with buttons
- // (mixing buttons and NSSegmentedControl for such a simple thing
- // is too much work).
-
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- // Extra hacks to get the proper pressed appreance when not selected or selected and inactive
- const bool needsInactiveHack = (!isActive && isSelected);
- const auto ct = !needsInactiveHack && (isSelected || tp == QStyleOptionTab::OnlyOneTab) ?
- QMacStylePrivate::Button_PushButton :
- QMacStylePrivate::Button_PopupButton;
- const bool isPopupButton = ct == QMacStylePrivate::Button_PopupButton;
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *pb = static_cast<NSButton *>(d->cocoaControl(cw));
-
- auto vOffset = isPopupButton ? 1 : 2;
- if (tabDirection == QMacStylePrivate::East)
- vOffset -= 1;
- const auto outerAdjust = isPopupButton ? 1 : 4;
- const auto innerAdjust = isPopupButton ? 20 : 10;
- QRectF frameRect = tabOpt->rect;
- if (verticalTabs)
- frameRect = QRectF(frameRect.y(), frameRect.x(), frameRect.height(), frameRect.width());
- // Adjust before clipping
- frameRect = frameRect.translated(0, vOffset);
- switch (tp) {
- case QStyleOptionTab::Beginning:
- // Pressed state hack: tweak adjustments in preparation for flip below
- if (!isSelected && tabDirection == QMacStylePrivate::West)
- frameRect = frameRect.adjusted(-innerAdjust, 0, outerAdjust, 0);
- else
- frameRect = frameRect.adjusted(-outerAdjust, 0, innerAdjust, 0);
- break;
- case QStyleOptionTab::Middle:
- frameRect = frameRect.adjusted(-innerAdjust, 0, innerAdjust, 0);
- break;
- case QStyleOptionTab::End:
- // Pressed state hack: tweak adjustments in preparation for flip below
- if (isSelected || tabDirection == QMacStylePrivate::West)
- frameRect = frameRect.adjusted(-innerAdjust, 0, outerAdjust, 0);
- else
- frameRect = frameRect.adjusted(-outerAdjust, 0, innerAdjust, 0);
- break;
- case QStyleOptionTab::OnlyOneTab:
- frameRect = frameRect.adjusted(-outerAdjust, 0, outerAdjust, 0);
- break;
- }
- pb.frame = frameRect.toCGRect();
-
- pb.enabled = isEnabled;
- [pb highlight:isPressed];
- // Set off state when inactive. See needsInactiveHack for when it's selected
- pb.state = (isActive && isSelected && !isPressed) ? NSOnState : NSOffState;
-
- const auto drawBezelBlock = ^(CGContextRef ctx, const CGRect &r) {
- QMacAutoReleasePool pool;
- CGContextClipToRect(ctx, opt->rect.toCGRect());
- if (!isSelected || needsInactiveHack) {
- // Final stage of the pressed state hack: flip NSPopupButton rendering
- if (!verticalTabs && tp == QStyleOptionTab::End) {
- CGContextTranslateCTM(ctx, opt->rect.right(), 0);
- CGContextScaleCTM(ctx, -1, 1);
- CGContextTranslateCTM(ctx, -frameRect.left(), 0);
- } else if (tabDirection == QMacStylePrivate::West && tp == QStyleOptionTab::Beginning) {
- CGContextTranslateCTM(ctx, 0, opt->rect.top());
- CGContextScaleCTM(ctx, 1, -1);
- CGContextTranslateCTM(ctx, 0, -frameRect.right());
- } else if (tabDirection == QMacStylePrivate::East && tp == QStyleOptionTab::End) {
- CGContextTranslateCTM(ctx, 0, opt->rect.bottom());
- CGContextScaleCTM(ctx, 1, -1);
- CGContextTranslateCTM(ctx, 0, -frameRect.left());
- }
- }
-
- // Rotate and translate CTM when vertical
- // On macOS: positive angle is CW, negative is CCW
- if (tabDirection == QMacStylePrivate::West) {
- CGContextTranslateCTM(ctx, 0, frameRect.right());
- CGContextRotateCTM(ctx, -M_PI_2);
- CGContextTranslateCTM(ctx, -frameRect.left(), 0);
- } else if (tabDirection == QMacStylePrivate::East) {
- CGContextTranslateCTM(ctx, opt->rect.right(), 0);
- CGContextRotateCTM(ctx, M_PI_2);
- }
-
- // Now, if it's a trick with a popup button, it has an arrow
- // which makes no sense on tabs.
- NSPopUpArrowPosition oldPosition = NSPopUpArrowAtCenter;
- NSPopUpButtonCell *pbCell = nil;
- if (isPopupButton) {
- pbCell = static_cast<NSPopUpButtonCell *>(pb.cell);
- oldPosition = pbCell.arrowPosition;
- pbCell.arrowPosition = NSPopUpNoArrow;
- }
-
- [pb.cell drawBezelWithFrame:r inView:pb.superview];
-
- if (pbCell) // Restore, we may reuse it for a ComboBox.
- pbCell.arrowPosition = oldPosition;
- };
-
- if (needsInactiveHack) {
- // First, render tab as non-selected tab on a pixamp
- const qreal pixelRatio = p->device()->devicePixelRatioF();
- QImage tabPixmap(opt->rect.size() * pixelRatio, QImage::Format_ARGB32_Premultiplied);
- tabPixmap.setDevicePixelRatio(pixelRatio);
- tabPixmap.fill(Qt::transparent);
- QPainter tabPainter(&tabPixmap);
- d->drawNSViewInRect(pb, frameRect, &tabPainter, ^(CGContextRef ctx, const CGRect &r) {
- QMacAutoReleasePool pool;
- CGContextTranslateCTM(ctx, -opt->rect.left(), -opt->rect.top());
- drawBezelBlock(ctx, r);
- });
- tabPainter.end();
-
- // Then, darken it with the proper shade of gray
- const qreal inactiveGray = 0.898; // As measured
- const int inactiveGray8 = qRound(inactiveGray * 255.0);
- const QRgb inactiveGrayRGB = qRgb(inactiveGray8, inactiveGray8, inactiveGray8);
- for (int l = 0; l < tabPixmap.height(); ++l) {
- auto *line = reinterpret_cast<QRgb*>(tabPixmap.scanLine(l));
- for (int i = 0; i < tabPixmap.width(); ++i) {
- if (qAlpha(line[i]) == 255) {
- line[i] = inactiveGrayRGB;
- } else if (qAlpha(line[i]) > 128) {
- const int g = qRound(inactiveGray * qRed(line[i]));
- line[i] = qRgba(g, g, g, qAlpha(line[i]));
- }
- }
- }
-
- // Finally, draw the tab pixmap on the current painter
- p->drawImage(opt->rect, tabPixmap);
- } else {
- d->drawNSViewInRect(pb, frameRect, p, drawBezelBlock);
- }
-
- if (!isSelected && sp != QStyleOptionTab::NextIsSelected
- && tp != QStyleOptionTab::End
- && tp != QStyleOptionTab::OnlyOneTab) {
- static const QPen separatorPen(Qt::black, 1.0);
- p->save();
- p->setOpacity(isEnabled ? 0.105 : 0.06); // As measured
- p->setPen(separatorPen);
- if (tabDirection == QMacStylePrivate::West) {
- p->drawLine(QLineF(opt->rect.left() + 1.5, opt->rect.bottom(),
- opt->rect.right() - 0.5, opt->rect.bottom()));
- } else if (tabDirection == QMacStylePrivate::East) {
- p->drawLine(QLineF(opt->rect.left(), opt->rect.bottom(),
- opt->rect.right() - 0.5, opt->rect.bottom()));
- } else {
- p->drawLine(QLineF(opt->rect.right(), opt->rect.top() + 1.0,
- opt->rect.right(), opt->rect.bottom() - 0.5));
- }
- p->restore();
- }
-
- // TODO Needs size adjustment to fit the focus ring
- if (tabOpt->state & State_HasFocus) {
- QMacStylePrivate::CocoaControlType focusRingType;
- switch (tp) {
- case QStyleOptionTab::Beginning:
- focusRingType = verticalTabs ? QMacStylePrivate::SegmentedControl_Last
- : QMacStylePrivate::SegmentedControl_First;
- break;
- case QStyleOptionTab::Middle:
- focusRingType = QMacStylePrivate::SegmentedControl_Middle;
- break;
- case QStyleOptionTab::End:
- focusRingType = verticalTabs ? QMacStylePrivate::SegmentedControl_First
- : QMacStylePrivate::SegmentedControl_Last;
- break;
- case QStyleOptionTab::OnlyOneTab:
- focusRingType = QMacStylePrivate::SegmentedControl_Single;
- break;
- }
- }
- }
- break;
- case CE_TabBarTabLabel:
- if (const auto *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- QStyleOptionTab myTab = *tab;
- const auto tabDirection = QMacStylePrivate::tabDirection(tab->shape);
- const bool verticalTabs = tabDirection == QMacStylePrivate::East
- || tabDirection == QMacStylePrivate::West;
-
- // Check to see if we use have the same as the system font
- // (QComboMenuItem is internal and should never be seen by the
- // outside world, unless they read the source, in which case, it's
- // their own fault).
-// const bool nonDefaultFont = p->font() != qt_app_fonts_hash()->value("QComboMenuItem");
- const bool nonDefaultFont = false;
-
-// if (!myTab.documentMode && (myTab.state & State_Selected) && (myTab.state & State_Active))
-// if (const auto *tabBar = qobject_cast<const QTabBar *>(w))
-// if (!tabBar->tabTextColor(tabBar->currentIndex()).isValid())
-// myTab.palette.setColor(QPalette::WindowText, Qt::white);
-
- if (myTab.documentMode && isDarkMode()) {
- bool active = (myTab.state & State_Selected) && (myTab.state & State_Active);
- myTab.palette.setColor(QPalette::WindowText, active ? Qt::white : Qt::gray);
- }
-
- int heightOffset = 0;
- if (verticalTabs) {
- heightOffset = -1;
- } else if (nonDefaultFont) {
- if (p->fontMetrics().height() == myTab.rect.height())
- heightOffset = 2;
- }
- myTab.rect.setHeight(myTab.rect.height() + heightOffset);
-
- QCommonStyle::drawControl(ce, &myTab, p);
- }
- break;
- case CE_DockWidgetTitle:
- if (const auto *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(opt)) {
- const bool isVertical = dwOpt->verticalTitleBar;
- const auto effectiveRect = isVertical ? opt->rect.transposed() : opt->rect;
- p->save();
- if (isVertical) {
- p->translate(effectiveRect.left(), effectiveRect.top() + effectiveRect.width());
- p->rotate(-90);
- p->translate(-effectiveRect.left(), -effectiveRect.top());
- }
-
- // fill title bar background
- QLinearGradient linearGrad;
- linearGrad.setStart(QPointF(0, 0));
- linearGrad.setFinalStop(QPointF(0, 2 * effectiveRect.height()));
- linearGrad.setColorAt(0, opt->palette.button().color());
- linearGrad.setColorAt(1, opt->palette.dark().color());
- p->fillRect(effectiveRect, linearGrad);
-
- // draw horizontal line at bottom
- p->setPen(opt->palette.dark().color());
- p->drawLine(effectiveRect.bottomLeft(), effectiveRect.bottomRight());
-
- if (!dwOpt->title.isEmpty()) {
- auto titleRect = proxy()->subElementRect(SE_DockWidgetTitleBarText, opt);
- if (isVertical)
- titleRect = QRect(effectiveRect.left() + opt->rect.bottom() - titleRect.bottom(),
- effectiveRect.top() + titleRect.left() - opt->rect.left(),
- titleRect.height(),
- titleRect.width());
-
- const auto text = p->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight, titleRect.width());
- proxy()->drawItemText(p, titleRect, Qt::AlignCenter, dwOpt->palette,
- dwOpt->state & State_Enabled, text, QPalette::WindowText);
- }
- p->restore();
- }
- break;
- case CE_FocusFrame: {
-// const auto *ff = qobject_cast<const QFocusFrame *>(w);
-// const auto *ffw = ff ? ff->widget() : nullptr;
-// const auto ct = [=] {
-// if (ffw) {
-// if (ffw->inherits("QCheckBox"))
-// return QMacStylePrivate::Button_CheckBox;
-// if (ffw->inherits("QRadioButton"))
-// return QMacStylePrivate::Button_RadioButton;
-// if (ffw->inherits("QLineEdit") || ffw->inherits("QTextEdit"))
-// return QMacStylePrivate::TextField;
-// }
-//
-// return QMacStylePrivate::Box; // Not really, just make it the default
-// } ();
-// const auto cs = ffw ? (ffw->testAttribute(Qt::WA_MacMiniSize) ? QStyleHelper::SizeMini :
-// ffw->testAttribute(Qt::WA_MacSmallSize) ? QStyleHelper::SizeSmall :
-// QStyleHelper::SizeLarge) :
-// QStyleHelper::SizeLarge;
-// const int hMargin = proxy()->pixelMetric(QStyle::PM_FocusFrameHMargin, opt);
-// const int vMargin = proxy()->pixelMetric(QStyle::PM_FocusFrameVMargin, opt);
-// d->drawFocusRing(p, opt->rect, hMargin, vMargin, QMacStylePrivate::CocoaControl(ct, cs));
- break; }
- case CE_MenuEmptyArea:
- // Skip: PE_PanelMenu fills in everything
- break;
- case CE_MenuItem:
- case CE_MenuHMargin:
- case CE_MenuVMargin:
- case CE_MenuTearoff:
- case CE_MenuScroller:
- if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- const bool active = mi->state & State_Selected;
- if (active)
- p->fillRect(mi->rect, mi->palette.highlight());
-
- const QStyleHelper::WidgetSizePolicy widgetSize = d->aquaSizeConstrain(opt);
-
- if (ce == CE_MenuTearoff) {
- p->setPen(QPen(mi->palette.dark().color(), 1, Qt::DashLine));
- p->drawLine(mi->rect.x() + 2, mi->rect.y() + mi->rect.height() / 2 - 1,
- mi->rect.x() + mi->rect.width() - 4,
- mi->rect.y() + mi->rect.height() / 2 - 1);
- p->setPen(QPen(mi->palette.light().color(), 1, Qt::DashLine));
- p->drawLine(mi->rect.x() + 2, mi->rect.y() + mi->rect.height() / 2,
- mi->rect.x() + mi->rect.width() - 4,
- mi->rect.y() + mi->rect.height() / 2);
- } else if (ce == CE_MenuScroller) {
- const QSize scrollerSize = QSize(10, 8);
- const int scrollerVOffset = 5;
- const int left = mi->rect.x() + (mi->rect.width() - scrollerSize.width()) / 2;
- const int right = left + scrollerSize.width();
- int top;
- int bottom;
- if (opt->state & State_DownArrow) {
- bottom = mi->rect.y() + scrollerVOffset;
- top = bottom + scrollerSize.height();
- } else {
- bottom = mi->rect.bottom() - scrollerVOffset;
- top = bottom - scrollerSize.height();
- }
- p->save();
- p->setRenderHint(QPainter::Antialiasing);
- QPainterPath path;
- path.moveTo(left, bottom);
- path.lineTo(right, bottom);
- path.lineTo((left + right) / 2, top);
- p->fillPath(path, opt->palette.buttonText());
- p->restore();
- } else if (ce != CE_MenuItem) {
- break;
- }
-
- if (mi->menuItemType == QStyleOptionMenuItem::Separator) {
- CGColorRef separatorColor = [NSColor quaternaryLabelColor].CGColor;
- const QRect separatorRect = QRect(mi->rect.left(), mi->rect.center().y(), mi->rect.width(), 2);
- p->fillRect(separatorRect, qt_mac_toQColor(separatorColor));
- break;
- }
-
- const int maxpmw = mi->maxIconWidth;
- const bool enabled = mi->state & State_Enabled;
-
- int xpos = mi->rect.x() + 18;
- int checkcol = maxpmw;
- if (!enabled)
- p->setPen(mi->palette.text().color());
- else if (active)
- p->setPen(mi->palette.highlightedText().color());
- else
- p->setPen(mi->palette.buttonText().color());
-
- if (mi->checked) {
- QStyleOption checkmarkOpt;
-// checkmarkOpt.initFrom(w);
-
- const int mw = checkcol + macItemFrame;
- const int mh = mi->rect.height() + macItemFrame;
- const int xp = mi->rect.x() + macItemFrame;
- checkmarkOpt.rect = QRect(xp, mi->rect.y() - checkmarkOpt.fontMetrics.descent(), mw, mh);
-
- checkmarkOpt.state.setFlag(State_On, active);
- checkmarkOpt.state.setFlag(State_Enabled, enabled);
- if (widgetSize == QStyleHelper::SizeMini)
- checkmarkOpt.state |= State_Mini;
- else if (widgetSize == QStyleHelper::SizeSmall)
- checkmarkOpt.state |= State_Small;
-
- // We let drawPrimitive(PE_IndicatorMenuCheckMark) pick the right color
- checkmarkOpt.palette.setColor(QPalette::HighlightedText, p->pen().color());
- checkmarkOpt.palette.setColor(QPalette::Text, p->pen().color());
-
- proxy()->drawPrimitive(PE_IndicatorMenuCheckMark, &checkmarkOpt, p);
- }
- if (!mi->icon.isNull()) {
- QIcon::Mode mode = (mi->state & State_Enabled) ? QIcon::Normal
- : QIcon::Disabled;
- // Always be normal or disabled to follow the Mac style.
- int smallIconSize = proxy()->pixelMetric(PM_SmallIconSize);
- QSize iconSize(smallIconSize, smallIconSize);
-//#if QT_CONFIG(combobox)
-// if (const QComboBox *comboBox = qobject_cast<const QComboBox *>(w)) {
-// iconSize = comboBox->iconSize();
-// }
-//#endif
- QPixmap pixmap = mi->icon.pixmap(opt->window, iconSize, mode);
- int pixw = pixmap.width() / pixmap.devicePixelRatio();
- int pixh = pixmap.height() / pixmap.devicePixelRatio();
- QRect cr(xpos, mi->rect.y(), checkcol, mi->rect.height());
- QRect pmr(0, 0, pixw, pixh);
- pmr.moveCenter(cr.center());
- p->drawPixmap(pmr.topLeft(), pixmap);
- xpos += pixw + 6;
- }
-
- QString s = mi->text;
- const auto text_flags = Qt::AlignVCenter | Qt::TextHideMnemonic
- | Qt::TextSingleLine | Qt::AlignAbsolute;
- int yPos = mi->rect.y();
- if (widgetSize == QStyleHelper::SizeMini)
- yPos += 1;
-
- const bool isSubMenu = mi->menuItemType == QStyleOptionMenuItem::SubMenu;
- const int tabwidth = isSubMenu ? 9 : mi->tabWidth;
-
- QString rightMarginText;
- if (isSubMenu)
- rightMarginText = QStringLiteral("\u25b6\ufe0e"); // U+25B6 U+FE0E: BLACK RIGHT-POINTING TRIANGLE
-
- // If present, save and remove embedded shorcut from text
- const int tabIndex = s.indexOf(QLatin1Char('\t'));
- if (tabIndex >= 0) {
- if (!isSubMenu) // ... but ignore it if it's a submenu.
- rightMarginText = s.mid(tabIndex + 1);
- s = s.left(tabIndex);
- }
-
- p->save();
- if (!rightMarginText.isEmpty()) {
-// p->setFont(qt_app_fonts_hash()->value("QMenuItem", p->font()));
- int xp = mi->rect.right() - tabwidth - macRightBorder + 2;
- if (!isSubMenu)
- xp -= macItemHMargin + macItemFrame + 3; // Adjust for shortcut
- p->drawText(xp, yPos, tabwidth, mi->rect.height(), text_flags | Qt::AlignRight, rightMarginText);
- }
-
- if (!s.isEmpty()) {
- const int xm = macItemFrame + maxpmw + macItemHMargin;
- QFont myFont = mi->font;
- // myFont may not have any "hard" flags set. We override
- // the point size so that when it is resolved against the device, this font will win.
- // This is mainly to handle cases where someone sets the font on the window
- // and then the combo inherits it and passes it onward. At that point the resolve mask
- // is very, very weak. This makes it stonger.
- myFont.setPointSizeF(QFontInfo(mi->font).pointSizeF());
-
- // QTBUG-65653: Our own text rendering doesn't look good enough, especially on non-retina
- // displays. Worked around here while waiting for a proper fix in QCoreTextFontEngine.
- // Only if we're not using QCoreTextFontEngine we do fallback to our own text rendering.
- const auto *fontEngine = QFontPrivate::get(myFont)->engineForScript(QChar::Script_Common);
- Q_ASSERT(fontEngine);
- if (fontEngine->type() == QFontEngine::Multi) {
- fontEngine = static_cast<const QFontEngineMulti *>(fontEngine)->engine(0);
- Q_ASSERT(fontEngine);
- }
- if (fontEngine->type() == QFontEngine::Mac) {
- NSFont *f = (NSFont *)(CTFontRef)fontEngine->handle();
-
- // Respect the menu item palette as set in the style option.
- const auto pc = p->pen().color();
- NSColor *c = [NSColor colorWithSRGBRed:pc.redF()
- green:pc.greenF()
- blue:pc.blueF()
- alpha:pc.alphaF()];
-
- s = qt_mac_removeMnemonics(s);
-
- QMacCGContext cgCtx(p);
- d->setupNSGraphicsContext(cgCtx, YES);
-
- // Draw at point instead of in rect, as the rect we've computed for the menu item
- // is based on the font metrics we got from HarfBuzz, so we may risk having CoreText
- // line-break the string if it doesn't fit the given rect. It's better to draw outside
- // the rect and possibly overlap something than to have part of the text disappear.
- [s.toNSString() drawAtPoint:CGPointMake(xpos, yPos)
- withAttributes:@{ NSFontAttributeName:f, NSForegroundColorAttributeName:c,
- NSObliquenessAttributeName: [NSNumber numberWithDouble: myFont.italic() ? 0.3 : 0.0]}];
-
- d->restoreNSGraphicsContext(cgCtx);
- } else {
- p->setFont(myFont);
- p->drawText(xpos, yPos, mi->rect.width() - xm - tabwidth + 1,
- mi->rect.height(), text_flags, s);
- }
- }
- p->restore();
- }
- break;
- case CE_MenuBarItem:
- case CE_MenuBarEmptyArea:
- if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- const bool selected = (opt->state & State_Selected) && (opt->state & State_Enabled) && (opt->state & State_Sunken);
- const QBrush bg = selected ? mi->palette.highlight() : mi->palette.window();
- p->fillRect(mi->rect, bg);
-
- if (ce != CE_MenuBarItem)
- break;
-
- if (!mi->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- drawItemPixmap(p, mi->rect,
- Qt::AlignCenter | Qt::TextHideMnemonic | Qt::TextDontClip
- | Qt::TextSingleLine,
- mi->icon.pixmap(opt->window, QSize(iconExtent, iconExtent),
- (mi->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled));
- } else {
- drawItemText(p, mi->rect,
- Qt::AlignCenter | Qt::TextHideMnemonic | Qt::TextDontClip
- | Qt::TextSingleLine,
- mi->palette, mi->state & State_Enabled,
- mi->text, selected ? QPalette::HighlightedText : QPalette::ButtonText);
- }
- }
- break;
- case CE_ProgressBarLabel:
- case CE_ProgressBarContents:
- break;
- case CE_ProgressBarGroove:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- const bool isIndeterminate = (pb->minimum == 0 && pb->maximum == 0);
- const bool inverted = pb->invertedAppearance;
- bool reverse = pb->direction == Qt::RightToLeft;
- if (inverted)
- reverse = !reverse;
-
- QRect rect = pb->rect;
- const CGRect cgRect = rect.toCGRect();
-
- const auto aquaSize = d->aquaSizeConstrain(opt);
-
-// const QProgressStyleAnimation *animation = qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject));
- QIndeterminateProgressIndicator *ipi = nil;
-// if (isIndeterminate || animation)
- ipi = static_cast<QIndeterminateProgressIndicator *>(d->cocoaControl({ QMacStylePrivate::ProgressIndicator_Indeterminate, aquaSize }));
- if (isIndeterminate) {
- // QIndeterminateProgressIndicator derives from NSProgressIndicator. We use a single
- // instance that we start animating as soon as one of the progress bars is indeterminate.
- // Since they will be in sync (as it's the case in Cocoa), we just need to draw it with
- // the right geometry when the animation triggers an update. However, we can't hide it
- // entirely between frames since that would stop the animation, so we just set its alpha
- // value to 0. Same if we remove it from its superview. See QIndeterminateProgressIndicator
- // implementation for details.
- //
- // Quick: consider implementing this animation by using Quick/QML instead.
- //
-// if (!animation && opt->styleObject) {
-// auto *animation = new QProgressStyleAnimation(d->animateSpeed(QMacStylePrivate::AquaProgressBar), opt->styleObject);
-// // NSProgressIndicator is heavier to draw than the HITheme API, so we reduce the frame rate a couple notches.
-// animation->setFrameRate(QStyleAnimation::FifteenFps);
-// d->startAnimation(animation);
-// [ipi startAnimation];
-// }
-
- d->setupNSGraphicsContext(cg, NO);
- d->setupVerticalInvertedXform(cg, reverse, false, cgRect);
- [ipi drawWithFrame:cgRect inView:d->backingStoreNSView];
- d->restoreNSGraphicsContext(cg);
- } else {
-// if (animation) {
-// d->stopAnimation(opt->styleObject);
-// [ipi stopAnimation];
-// }
-
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::ProgressIndicator_Determinate, aquaSize);
- auto *pi = static_cast<NSProgressIndicator *>(d->cocoaControl(cw));
- d->drawNSViewInRect(pi, rect, p, ^(CGContextRef ctx, const CGRect &rect) {
- QMacAutoReleasePool pool;
- d->setupVerticalInvertedXform(ctx, reverse, false, rect);
- pi.minValue = pb->minimum;
- pi.maxValue = pb->maximum;
- pi.doubleValue = pb->progress;
- [pi drawRect:rect];
- });
- }
- }
- break;
- case CE_SizeGrip: {
- // This is not HIG kosher: Fall back to the old stuff until we decide what to do.
-//#ifndef QT_NO_MDIAREA
-// if (!w || !qobject_cast<QMdiSubWindow *>(w->parentWidget()))
-//#endif
-// break;
-
-// if (w->testAttribute(Qt::WA_MacOpaqueSizeGrip))
-// p->fillRect(opt->rect, opt->palette.window());
-
-// QPen lineColor = QColor(82, 82, 82, 192);
-// lineColor.setWidth(1);
-// p->save();
-// p->setRenderHint(QPainter::Antialiasing);
-// p->setPen(lineColor);
-// const Qt::LayoutDirection layoutDirection = w ? w->layoutDirection() : qApp->layoutDirection();
-// const int NumLines = 3;
-// for (int l = 0; l < NumLines; ++l) {
-// const int offset = (l * 4 + 3);
-// QPoint start, end;
-// if (layoutDirection == Qt::LeftToRight) {
-// start = QPoint(opt->rect.width() - offset, opt->rect.height() - 1);
-// end = QPoint(opt->rect.width() - 1, opt->rect.height() - offset);
-// } else {
-// start = QPoint(offset, opt->rect.height() - 1);
-// end = QPoint(1, opt->rect.height() - offset);
-// }
-// p->drawLine(start, end);
-// }
-// p->restore();
- break;
- }
- case CE_Splitter:
- if (opt->rect.width() > 1 && opt->rect.height() > 1) {
- const bool isVertical = !(opt->state & QStyle::State_Horizontal);
- // Qt refers to the layout orientation, while Cocoa refers to the divider's.
- const auto ct = isVertical ? QMacStylePrivate::SplitView_Horizontal : QMacStylePrivate::SplitView_Vertical;
- const auto cw = QMacStylePrivate::CocoaControl(ct, QStyleHelper::SizeLarge);
- auto *sv = static_cast<NSSplitView *>(d->cocoaControl(cw));
- sv.frame = opt->rect.toCGRect();
- d->drawNSViewInRect(sv, opt->rect, p, ^(CGContextRef, const CGRect &rect) {
- QMacAutoReleasePool pool;
- [sv drawDividerInRect:rect];
- });
- } else {
- QPen oldPen = p->pen();
- p->setPen(opt->palette.dark().color());
- if (opt->state & QStyle::State_Horizontal)
- p->drawLine(opt->rect.topLeft(), opt->rect.bottomLeft());
- else
- p->drawLine(opt->rect.topLeft(), opt->rect.topRight());
- p->setPen(oldPen);
- }
- break;
- case CE_RubberBand:
- if (const QStyleOptionRubberBand *rubber = qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- QColor fillColor(opt->palette.color(QPalette::Disabled, QPalette::Highlight));
- if (!rubber->opaque) {
- QColor strokeColor;
- // I retrieved these colors from the Carbon-Dev mailing list
- strokeColor.setHsvF(0, 0, 0.86, 1.0);
- fillColor.setHsvF(0, 0, 0.53, 0.25);
- if (opt->rect.width() * opt->rect.height() <= 3) {
- p->fillRect(opt->rect, strokeColor);
- } else {
- QPen oldPen = p->pen();
- QBrush oldBrush = p->brush();
- QPen pen(strokeColor);
- p->setPen(pen);
- p->setBrush(fillColor);
- QRect adjusted = opt->rect.adjusted(1, 1, -1, -1);
- if (adjusted.isValid())
- p->drawRect(adjusted);
- p->setPen(oldPen);
- p->setBrush(oldBrush);
- }
- } else {
- p->fillRect(opt->rect, fillColor);
- }
- }
- break;
- case CE_ToolBar: {
- const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt);
- const bool isDarkMode = qt_mac_applicationIsInDarkMode();
-
- // Unified title and toolbar drawing. In this mode the cocoa platform plugin will
- // fill the top toolbar area part with a background gradient that "unifies" with
- // the title bar. The following code fills the toolBar area with transparent pixels
- // to make that gradient visible.
-// if (w) {
-//#if QT_CONFIG(mainwindow)
-// if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(w->window())) {
-// if (toolBar && toolBar->toolBarArea == Qt::TopToolBarArea && mainWindow->unifiedTitleAndToolBarOnMac()) {
-// // fill with transparent pixels.
-// p->save();
-// p->setCompositionMode(QPainter::CompositionMode_Source);
-// p->fillRect(opt->rect, Qt::transparent);
-// p->restore();
-
-// // Draw a horizontal separator line at the toolBar bottom if the "unified" area ends here.
-// // There might be additional toolbars or other widgets such as tab bars in document
-// // mode below. Determine this by making a unified toolbar area test for the row below
-// // this toolbar.
-// const QPoint windowToolbarEnd = w->mapTo(w->window(), opt->rect.bottomLeft());
-// const bool isEndOfUnifiedArea = !isInMacUnifiedToolbarArea(w->window()->windowHandle(), windowToolbarEnd.y() + 1);
-// if (isEndOfUnifiedArea) {
-// const int margin = qt_mac_aqua_get_metric(SeparatorSize);
-// const auto separatorRect = QRect(opt->rect.left(), opt->rect.bottom(), opt->rect.width(), margin);
-// p->fillRect(separatorRect, isDarkMode ? darkModeSeparatorLine : opt->palette.dark().color());
-// }
-// break;
-// }
-// }
-//#endif
-// }
-
- // draw background gradient
- QLinearGradient linearGrad;
- if (opt->state & State_Horizontal)
- linearGrad = QLinearGradient(0, opt->rect.top(), 0, opt->rect.bottom());
- else
- linearGrad = QLinearGradient(opt->rect.left(), 0, opt->rect.right(), 0);
-
- QColor mainWindowGradientBegin = isDarkMode ? darkMainWindowGradientBegin : lightMainWindowGradientBegin;
- QColor mainWindowGradientEnd = isDarkMode ? darkMainWindowGradientEnd : lightMainWindowGradientEnd;
-
- linearGrad.setColorAt(0, mainWindowGradientBegin);
- linearGrad.setColorAt(1, mainWindowGradientEnd);
- p->fillRect(opt->rect, linearGrad);
-
- p->save();
- QRect toolbarRect = isDarkMode ? opt->rect.adjusted(0, 0, 0, 1) : opt->rect;
- if (opt->state & State_Horizontal) {
- p->setPen(isDarkMode ? darkModeSeparatorLine : mainWindowGradientBegin.lighter(114));
- p->drawLine(toolbarRect.topLeft(), toolbarRect.topRight());
- p->setPen(isDarkMode ? darkModeSeparatorLine :mainWindowGradientEnd.darker(114));
- p->drawLine(toolbarRect.bottomLeft(), toolbarRect.bottomRight());
- } else {
- p->setPen(isDarkMode ? darkModeSeparatorLine : mainWindowGradientBegin.lighter(114));
- p->drawLine(toolbarRect.topLeft(), toolbarRect.bottomLeft());
- p->setPen(isDarkMode ? darkModeSeparatorLine : mainWindowGradientEnd.darker(114));
- p->drawLine(toolbarRect.topRight(), toolbarRect.bottomRight());
- }
- p->restore();
-
- break; }
- default:
- QCommonStyle::drawControl(ce, opt, p);
- break;
- }
-}
-
-static void setLayoutItemMargins(int left, int top, int right, int bottom, QRect *rect, Qt::LayoutDirection dir)
-{
- if (dir == Qt::RightToLeft) {
- rect->adjust(-right, top, -left, bottom);
- } else {
- rect->adjust(left, top, right, bottom);
- }
-}
-
-QRect QMacStyle::subElementRect(SubElement sr, const QStyleOption *opt) const
-{
- Q_D(const QMacStyle);
- QRect rect;
- const int controlSize = getControlSize(opt);
-
- switch (sr) {
- case SE_ItemViewItemText:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- int fw = proxy()->pixelMetric(PM_FocusFrameHMargin, opt);
- // We add the focusframeargin between icon and text in commonstyle
- rect = QCommonStyle::subElementRect(sr, opt);
- if (vopt->features & QStyleOptionViewItem::HasDecoration)
- rect.adjust(-fw, 0, 0, 0);
- }
- break;
- case SE_ToolBoxTabContents:
- rect = QCommonStyle::subElementRect(sr, opt);
- break;
- case SE_PushButtonContents:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- // Comment from the old HITheme days:
- // "Unlike Carbon, we want the button to always be drawn inside its bounds.
- // Therefore, the button is a bit smaller, so that even if it got focus,
- // the focus 'shadow' will be inside. Adjust the content rect likewise."
- // In the future, we should consider using -[NSCell titleRectForBounds:].
- // Since it requires configuring the NSButton fully, i.e. frame, image,
- // title and font, we keep things more manual until we are more familiar
- // with side effects when changing NSButton state.
- const auto ct = cocoaControlType(btn);
- const auto cs = d->effectiveAquaSizeConstrain(btn);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto frameRect = cw.adjustedControlFrame(btn->rect);
- frameRect -= cw.titleMargins();
- rect = frameRect.toRect();
- }
- break;
- case SE_HeaderLabel: {
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
- rect.setRect(opt->rect.x() + margin, opt->rect.y(),
- opt->rect.width() - margin * 2, opt->rect.height() - 2);
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- // Subtract width needed for arrow, if there is one
- if (header->sortIndicator != QStyleOptionHeader::None) {
- if (opt->state & State_Horizontal)
- rect.setWidth(rect.width() - (headerSectionArrowHeight) - (margin * 2));
- else
- rect.setHeight(rect.height() - (headerSectionArrowHeight) - (margin * 2));
- }
- }
- rect = visualRect(opt->direction, opt->rect, rect);
- break;
- }
- case SE_HeaderArrow: {
- int h = opt->rect.height();
- int w = opt->rect.width();
- int x = opt->rect.x();
- int y = opt->rect.y();
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
-
- if (opt->state & State_Horizontal) {
- rect.setRect(x + w - margin * 2 - headerSectionArrowHeight, y + 5,
- headerSectionArrowHeight, h - margin * 2 - 5);
- } else {
- rect.setRect(x + 5, y + h - margin * 2 - headerSectionArrowHeight,
- w - margin * 2 - 5, headerSectionArrowHeight);
- }
- rect = visualRect(opt->direction, opt->rect, rect);
- break;
- }
- case SE_ProgressBarGroove:
- // Wrong in the secondary dimension, but accurate enough in the main dimension.
- rect = opt->rect;
- break;
- case SE_ProgressBarLabel:
- break;
- case SE_ProgressBarContents:
- rect = opt->rect;
- break;
- case SE_TreeViewDisclosureItem: {
- rect = opt->rect;
- // As previously returned by HIThemeGetButtonContentBounds
- rect.setLeft(rect.left() + 2 + DisclosureOffset);
- break;
- }
- case SE_TabWidgetLeftCorner:
- if (const QStyleOptionTabWidgetFrame *twf
- = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- rect = QRect(QPoint(0, 0), twf->leftCornerWidgetSize);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- rect = QRect(QPoint(0, twf->rect.height() - twf->leftCornerWidgetSize.height()),
- twf->leftCornerWidgetSize);
- break;
- default:
- break;
- }
- rect = visualRect(twf->direction, twf->rect, rect);
- }
- break;
- case SE_TabWidgetRightCorner:
- if (const QStyleOptionTabWidgetFrame *twf
- = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- rect = QRect(QPoint(twf->rect.width() - twf->rightCornerWidgetSize.width(), 0),
- twf->rightCornerWidgetSize);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- rect = QRect(QPoint(twf->rect.width() - twf->rightCornerWidgetSize.width(),
- twf->rect.height() - twf->rightCornerWidgetSize.height()),
- twf->rightCornerWidgetSize);
- break;
- default:
- break;
- }
- rect = visualRect(twf->direction, twf->rect, rect);
- }
- break;
- case SE_TabWidgetTabContents:
- rect = QCommonStyle::subElementRect(sr, opt);
- if (const auto *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- if (twf->lineWidth != 0) {
- switch (QMacStylePrivate::tabDirection(twf->shape)) {
- case QMacStylePrivate::North:
- rect.adjust(+1, +14, -1, -1);
- break;
- case QMacStylePrivate::South:
- rect.adjust(+1, +1, -1, -14);
- break;
- case QMacStylePrivate::West:
- rect.adjust(+14, +1, -1, -1);
- break;
- case QMacStylePrivate::East:
- rect.adjust(+1, +1, -14, -1);
- }
- }
- }
- break;
- case SE_TabBarTabText:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- QRect dummyIconRect;
- d->tabLayout(tab, &rect, &dummyIconRect);
- }
- break;
- case SE_TabBarTabLeftButton:
- case SE_TabBarTabRightButton:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- bool selected = tab->state & State_Selected;
- int verticalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab);
- int horizontalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab);
- int hpadding = 5;
-
- bool verticalTabs = tab->shape == QStyleOptionTab::RoundedEast
- || tab->shape == QStyleOptionTab::RoundedWest
- || tab->shape == QStyleOptionTab::TriangularEast
- || tab->shape == QStyleOptionTab::TriangularWest;
-
- QRect tr = tab->rect;
- if (tab->shape == QStyleOptionTab::RoundedSouth || tab->shape == QStyleOptionTab::TriangularSouth)
- verticalShift = -verticalShift;
- if (verticalTabs) {
- qSwap(horizontalShift, verticalShift);
- horizontalShift *= -1;
- verticalShift *= -1;
- }
- if (tab->shape == QStyleOptionTab::RoundedWest || tab->shape == QStyleOptionTab::TriangularWest)
- horizontalShift = -horizontalShift;
-
- tr.adjust(0, 0, horizontalShift, verticalShift);
- if (selected)
- {
- tr.setBottom(tr.bottom() - verticalShift);
- tr.setRight(tr.right() - horizontalShift);
- }
-
- QSize size = (sr == SE_TabBarTabLeftButton) ? tab->leftButtonSize : tab->rightButtonSize;
- int w = size.width();
- int h = size.height();
- int midHeight = static_cast<int>(qCeil(float(tr.height() - h) / 2));
- int midWidth = ((tr.width() - w) / 2);
-
- bool atTheTop = true;
- switch (tab->shape) {
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- atTheTop = (sr == SE_TabBarTabLeftButton);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- atTheTop = (sr == SE_TabBarTabRightButton);
- break;
- default:
- if (sr == SE_TabBarTabLeftButton)
- rect = QRect(tab->rect.x() + hpadding, midHeight, w, h);
- else
- rect = QRect(tab->rect.right() - w - hpadding, midHeight, w, h);
- rect = visualRect(tab->direction, tab->rect, rect);
- }
- if (verticalTabs) {
- if (atTheTop)
- rect = QRect(midWidth, tr.y() + tab->rect.height() - hpadding - h, w, h);
- else
- rect = QRect(midWidth, tr.y() + hpadding, w, h);
- }
- }
- break;
- case SE_LineEditContents: {
- // From using pixelTool with XCode/NSTextTextField
- int leftPadding = 4;
- int rightPadding = 4;
- int topPadding = 4;
- int bottomPadding = 0;
-
- if (opt->state & QStyle::State_Small) {
- topPadding = 3;
- } else if (opt->state & QStyle::State_Mini) {
- topPadding = 2;
- }
-
- rect = QRect(leftPadding, topPadding, opt->rect.width() - leftPadding - rightPadding,
- opt->rect.height() - topPadding - bottomPadding);
- break; }
- case SE_CheckBoxLayoutItem:
- rect = opt->rect;
- if (controlSize == QStyleHelper::SizeLarge) {
- setLayoutItemMargins(+2, +2, -3, -2, &rect, opt->direction);
- } else if (controlSize == QStyleHelper::SizeSmall) {
- setLayoutItemMargins(+1, +2, -2, -1, &rect, opt->direction);
- } else {
- setLayoutItemMargins(-0, +0, -1, -0, &rect, opt->direction);
- }
- break;
- case SE_ComboBoxLayoutItem:
- if (const auto *combo = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- //#ifndef QT_NO_TOOLBAR
- // if (widget && qobject_cast<QToolBar *>(widget->parentWidget())) {
- // // Do nothing, because QToolbar needs the entire widget rect.
- // // Otherwise it will be clipped. Equivalent to
- // // widget->setAttribute(Qt::WA_LayoutUsesWidgetRect), but without
- // // all the hassle.
- // } else
- //#endif
- if (combo->editable)
- rect = LargeSmallMini(opt,
- opt->rect.adjusted(5, 6, -6, -7),
- opt->rect.adjusted(4, 4, -5, -7),
- opt->rect.adjusted(5, 4, -4, -6));
- else
- rect = LargeSmallMini(opt,
- opt->rect.adjusted(6, 4, -7, -7),
- opt->rect.adjusted(6, 7, -6, -5),
- opt->rect.adjusted(9, 5, -5, -7));
- }
- break;
- case SE_LabelLayoutItem:
- rect = opt->rect;
- setLayoutItemMargins(+1, 0 /* SHOULD be -1, done for alignment */, 0, 0 /* SHOULD be -1, done for alignment */, &rect, opt->direction);
- break;
- case SE_ProgressBarLayoutItem:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- const bool isIndeterminate = (pb->minimum == 0 && pb->maximum == 0);
- rect = opt->rect;
-
- if (isIndeterminate) {
- rect.adjust(1, 2, -1, -2);
- } else {
- rect.adjust(1, 1, -1, -2);
- }
- }
- break;
- case SE_PushButtonLayoutItem:
- rect = opt->rect;
- if (const QStyleOptionButton *buttonOpt = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- if ((buttonOpt->features & QStyleOptionButton::Flat))
- break;
- }
- rect = LargeSmallMini(opt,
- opt->rect.adjusted(7, 5, -7, -7),
- opt->rect.adjusted(6, 6, -6, -6),
- opt->rect.adjusted(6, 5, -6, -6));
- break;
- case SE_SpinBoxLayoutItem:
- rect = LargeSmallMini(opt,
- opt->rect.adjusted(2, 3, -2, -2),
- opt->rect.adjusted(2, 3, -2, -2),
- opt->rect.adjusted(2, 3, -2, -2));
- break;
- case SE_RadioButtonLayoutItem:
- rect = LargeSmallMini(opt,
- opt->rect.adjusted(2, 2, -3, -2),
- opt->rect.adjusted(2, 2, -3, -2),
- opt->rect.adjusted(1, 2, -3, -2));
- break;
- case SE_SliderLayoutItem:
- if (const QStyleOptionSlider *sliderOpt
- = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- rect = opt->rect;
- if (sliderOpt->subControls & QStyle::SC_SliderHandle) {
- if (sliderOpt->tickPosition == QStyleOptionSlider::NoTicks)
- rect.adjust(3, 3, -3, -3);
- } else {
- rect.adjust(3, 0, -3, 0);
- }
- }
- break;
- case SE_ScrollBarLayoutItem:
- if (const QStyleOptionSlider *sliderOpt = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- rect = opt->rect;
- }
- case SE_FrameLayoutItem:
- // hack because QStyleOptionFrame doesn't have a frameStyle member
-// if (const QFrame *frame = qobject_cast<const QFrame *>(widget)) {
-// rect = opt->rect;
-// switch (frame->frameStyle() & QFrame::Shape_Mask) {
-// case QFrame::HLine:
-// rect.adjust(0, +1, 0, -1);
-// break;
-// case QFrame::VLine:
-// rect.adjust(+1, 0, -1, 0);
-// break;
-// default:
-// ;
-// }
-// }
- break;
- case SE_GroupBoxLayoutItem:
- rect = opt->rect;
- if (const QStyleOptionGroupBox *groupBoxOpt =
- qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- /*
- AHIG is very inconsistent when it comes to group boxes.
- Basically, we make sure that (non-checkable) group boxes
- and tab widgets look good when laid out side by side.
- */
- if (groupBoxOpt->subControls & (QStyle::SC_GroupBoxCheckBox
- | QStyle::SC_GroupBoxLabel)) {
- int delta;
- if (groupBoxOpt->subControls & QStyle::SC_GroupBoxCheckBox) {
- delta = SIZE(8, 4, 4); // guess
- } else {
- delta = SIZE(15, 12, 12); // guess
- }
- rect.setTop(rect.top() + delta);
- }
- }
- rect.setBottom(rect.bottom() - 1);
- break;
- case SE_TabWidgetLayoutItem:
- if (const QStyleOptionTabWidgetFrame *tabWidgetOpt =
- qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- /*
- AHIG specifies "12 or 14" as the distance from the window
- edge. We choose 14 and since the default top margin is 20,
- the overlap is 6.
- */
- rect = tabWidgetOpt->rect;
- if (tabWidgetOpt->shape == QStyleOptionTab::RoundedNorth)
- rect.setTop(rect.top() + SIZE(6 /* AHIG */, 3 /* guess */, 2 /* AHIG */));
- }
- break;
- case SE_DockWidgetCloseButton:
- case SE_DockWidgetFloatButton:
- case SE_DockWidgetTitleBarText:
- case SE_DockWidgetIcon: {
- int iconSize = proxy()->pixelMetric(PM_SmallIconSize, opt);
- int buttonMargin = proxy()->pixelMetric(PM_DockWidgetTitleBarButtonMargin, opt);
- QRect srect = opt->rect;
-
- const QStyleOptionDockWidget *dwOpt
- = qstyleoption_cast<const QStyleOptionDockWidget*>(opt);
- bool canClose = dwOpt == 0 ? true : dwOpt->closable;
- bool canFloat = dwOpt == 0 ? false : dwOpt->floatable;
-
- const bool verticalTitleBar = dwOpt->verticalTitleBar;
-
- // If this is a vertical titlebar, we transpose and work as if it was
- // horizontal, then transpose again.
- if (verticalTitleBar)
- srect = srect.transposed();
-
- do {
- int right = srect.right();
- int left = srect.left();
-
- QRect closeRect;
- if (canClose) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarCloseButton,
- opt).actualSize(QSize(iconSize, iconSize));
- sz += QSize(buttonMargin, buttonMargin);
- if (verticalTitleBar)
- sz = sz.transposed();
- closeRect = QRect(left,
- srect.center().y() - sz.height()/2,
- sz.width(), sz.height());
- left = closeRect.right() + 1;
- }
- if (sr == SE_DockWidgetCloseButton) {
- rect = closeRect;
- break;
- }
-
- QRect floatRect;
- if (canFloat) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarNormalButton,
- opt).actualSize(QSize(iconSize, iconSize));
- sz += QSize(buttonMargin, buttonMargin);
- if (verticalTitleBar)
- sz = sz.transposed();
- floatRect = QRect(left,
- srect.center().y() - sz.height()/2,
- sz.width(), sz.height());
- left = floatRect.right() + 1;
- }
- if (sr == SE_DockWidgetFloatButton) {
- rect = floatRect;
- break;
- }
-
- QRect iconRect;
-// if (const QDockWidget *dw = qobject_cast<const QDockWidget*>(widget)) {
-// QIcon icon;
-// if (dw->isFloating())
-// icon = dw->windowIcon();
-// if (!icon.isNull()
-// && icon.cacheKey() != QApplication::windowIcon().cacheKey()) {
-// QSize sz = icon.actualSize(QSize(rect.height(), rect.height()));
-// if (verticalTitleBar)
-// sz = sz.transposed();
-// iconRect = QRect(right - sz.width(), srect.center().y() - sz.height()/2,
-// sz.width(), sz.height());
-// right = iconRect.left() - 1;
-// }
-// }
- if (sr == SE_DockWidgetIcon) {
- rect = iconRect;
- break;
- }
-
- QRect textRect = QRect(left, srect.top(),
- right - left, srect.height());
- if (sr == SE_DockWidgetTitleBarText) {
- rect = textRect;
- break;
- }
- } while (false);
-
- if (verticalTitleBar) {
- rect = QRect(srect.left() + rect.top() - srect.top(),
- srect.top() + srect.right() - rect.right(),
- rect.height(), rect.width());
- } else {
- rect = visualRect(opt->direction, srect, rect);
- }
- break;
- }
- default:
- rect = QCommonStyle::subElementRect(sr, opt);
- break;
- }
- return rect;
-}
-
-void QMacStylePrivate::drawToolbarButtonArrow(const QStyleOption *opt, QPainter *p) const
-{
- Q_Q(const QMacStyle);
- QStyleOption arrowOpt = *opt;
- arrowOpt.rect = QRect(opt->rect.right() - (toolButtonArrowSize + toolButtonArrowMargin),
- opt->rect.bottom() - (toolButtonArrowSize + toolButtonArrowMargin),
- toolButtonArrowSize,
- toolButtonArrowSize);
- q->proxy()->drawPrimitive(QStyle::PE_IndicatorArrowDown, &arrowOpt, p);
-}
-
-void QMacStylePrivate::setupNSGraphicsContext(CGContextRef cg, bool flipped) const
-{
- CGContextSaveGState(cg);
- [NSGraphicsContext saveGraphicsState];
-
- [NSGraphicsContext setCurrentContext:
- [NSGraphicsContext graphicsContextWithCGContext:cg flipped:flipped]];
-}
-
-void QMacStylePrivate::restoreNSGraphicsContext(CGContextRef cg) const
-{
- [NSGraphicsContext restoreGraphicsState];
- CGContextRestoreGState(cg);
-}
-
-void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const
-{
- Q_D(const QMacStyle);
- const AppearanceSync sync;
-
- QMacCGContext cg(p);
- d->resolveCurrentNSView(opt->window);
-
- switch (cc) {
- case CC_ScrollBar:
- if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
-
- const bool drawTrack = sb->subControls & SC_ScrollBarGroove;
- const bool drawKnob = sb->subControls & SC_ScrollBarSlider;
- if (!drawTrack && !drawKnob)
- break;
-
- const bool isHorizontal = sb->orientation == Qt::Horizontal;
-
- if (opt && opt->styleObject && !QMacStylePrivate::scrollBars.contains(opt->styleObject))
- QMacStylePrivate::scrollBars.append(QPointer<QObject>(opt->styleObject));
-
- static const CGFloat knobWidths[] = { 7.0, 5.0, 5.0 };
- static const CGFloat expandedKnobWidths[] = { 11.0, 9.0, 9.0 };
- const auto cocoaSize = d->effectiveAquaSizeConstrain(opt);
- const CGFloat maxExpandScale = expandedKnobWidths[cocoaSize] / knobWidths[cocoaSize];
-
- const bool isTransient = proxy()->styleHint(SH_ScrollBar_Transient, opt);
-// if (!isTransient)
-// d->stopAnimation(opt->styleObject);
- bool wasActive = false;
- CGFloat opacity = 0.0;
- CGFloat expandScale = 1.0;
- CGFloat expandOffset = 0.0;
- bool shouldExpand = false;
-
- if (QObject *styleObject = opt->styleObject) {
- const int oldPos = styleObject->property("_q_stylepos").toInt();
- const int oldMin = styleObject->property("_q_stylemin").toInt();
- const int oldMax = styleObject->property("_q_stylemax").toInt();
- const QRect oldRect = styleObject->property("_q_stylerect").toRect();
- const QStyle::State oldState = static_cast<QStyle::State>(styleObject->property("_q_stylestate").value<QStyle::State::Int>());
- const uint oldActiveControls = styleObject->property("_q_stylecontrols").toUInt();
-
- // a scrollbar is transient when the scrollbar itself and
- // its sibling are both inactive (ie. not pressed/hovered/moved)
- const bool transient = isTransient && !opt->activeSubControls && !(sb->state & State_On);
-
- if (!transient ||
- oldPos != sb->sliderPosition ||
- oldMin != sb->minimum ||
- oldMax != sb->maximum ||
- oldRect != sb->rect ||
- oldState != sb->state ||
- oldActiveControls != sb->activeSubControls) {
-
- // if the scrollbar is transient or its attributes, geometry or
- // state has changed, the opacity is reset back to 100% opaque
- opacity = 1.0;
-
- styleObject->setProperty("_q_stylepos", sb->sliderPosition);
- styleObject->setProperty("_q_stylemin", sb->minimum);
- styleObject->setProperty("_q_stylemax", sb->maximum);
- styleObject->setProperty("_q_stylerect", sb->rect);
- styleObject->setProperty("_q_stylestate", static_cast<QStyle::State::Int>(sb->state));
- styleObject->setProperty("_q_stylecontrols", static_cast<uint>(sb->activeSubControls));
-
-// QScrollbarStyleAnimation *anim = qobject_cast<QScrollbarStyleAnimation *>(d->animation(styleObject));
-// if (transient) {
-// if (!anim) {
-// anim = new QScrollbarStyleAnimation(QScrollbarStyleAnimation::Deactivating, styleObject);
-// d->startAnimation(anim);
-// } else if (anim->mode() == QScrollbarStyleAnimation::Deactivating) {
-// // the scrollbar was already fading out while the
-// // state changed -> restart the fade out animation
-// anim->setCurrentTime(0);
-// }
-// } else if (anim && anim->mode() == QScrollbarStyleAnimation::Deactivating) {
-// d->stopAnimation(styleObject);
-// }
- }
-
-// QScrollbarStyleAnimation *anim = qobject_cast<QScrollbarStyleAnimation *>(d->animation(styleObject));
-// if (anim && anim->mode() == QScrollbarStyleAnimation::Deactivating) {
-// // once a scrollbar was active (hovered/pressed), it retains
-// // the active look even if it's no longer active while fading out
-// if (oldActiveControls)
-// anim->setActive(true);
-
-// wasActive = anim->wasActive();
-// opacity = anim->currentValue();
-// }
-
- shouldExpand = isTransient && (opt->activeSubControls || wasActive);
- if (shouldExpand) {
-// if (!anim && !oldActiveControls) {
-// // Start expand animation only once and when entering
-// anim = new QScrollbarStyleAnimation(QScrollbarStyleAnimation::Activating, styleObject);
-// d->startAnimation(anim);
-// }
-// if (anim && anim->mode() == QScrollbarStyleAnimation::Activating) {
-// expandScale = 1.0 + (maxExpandScale - 1.0) * anim->currentValue();
-// expandOffset = 5.5 * (1.0 - anim->currentValue());
-// } else {
-// // Keep expanded state after the animation ends, and when fading out
-// expandScale = maxExpandScale;
-// expandOffset = 0.0;
-// }
- }
- }
-
- d->setupNSGraphicsContext(cg, NO /* flipped */);
-
- const auto controlType = isHorizontal ? QMacStylePrivate::Scroller_Horizontal : QMacStylePrivate::Scroller_Vertical;
- const auto cw = QMacStylePrivate::CocoaControl(controlType, cocoaSize);
- NSScroller *scroller = static_cast<NSScroller *>(d->cocoaControl(cw));
-
- const QColor bgColor = QStyleHelper::backgroundColor(opt->palette);
- const bool hasDarkBg = bgColor.red() < 128 && bgColor.green() < 128 && bgColor.blue() < 128;
- if (isTransient) {
- // macOS behavior: as soon as one color channel is >= 128,
- // the background is considered bright, scroller is dark.
- scroller.knobStyle = hasDarkBg? NSScrollerKnobStyleLight : NSScrollerKnobStyleDark;
- } else {
- scroller.knobStyle = NSScrollerKnobStyleDefault;
- }
-
- scroller.scrollerStyle = isTransient ? NSScrollerStyleOverlay : NSScrollerStyleLegacy;
-
- if (!setupScroller(scroller, sb))
- break;
-
- if (isTransient) {
- CGContextBeginTransparencyLayerWithRect(cg, scroller.frame, nullptr);
- CGContextSetAlpha(cg, opacity);
- }
-
- if (drawTrack) {
- // Draw the track when hovering. Expand by shifting the track rect.
- if (!isTransient || opt->activeSubControls || wasActive) {
- CGRect trackRect = scroller.bounds;
- if (isHorizontal)
- trackRect.origin.y += expandOffset;
- else
- trackRect.origin.x += expandOffset;
- [scroller drawKnobSlotInRect:trackRect highlight:NO];
- }
- }
-
- if (drawKnob) {
- if (shouldExpand) {
- // -[NSScroller drawKnob] is not useful here because any scaling applied
- // will only be used to draw the hi-DPI artwork. And even if did scale,
- // the stretched knob would look wrong, actually. So we need to draw the
- // scroller manually when it's being hovered.
- const CGFloat scrollerWidth = [NSScroller scrollerWidthForControlSize:scroller.controlSize scrollerStyle:scroller.scrollerStyle];
- const CGFloat knobWidth = knobWidths[cocoaSize] * expandScale;
- // Cocoa can help get the exact knob length in the current orientation
- const CGRect scrollerKnobRect = CGRectInset([scroller rectForPart:NSScrollerKnob], 1, 1);
- const CGFloat knobLength = isHorizontal ? scrollerKnobRect.size.width : scrollerKnobRect.size.height;
- const CGFloat knobPos = isHorizontal ? scrollerKnobRect.origin.x : scrollerKnobRect.origin.y;
- const CGFloat knobOffset = qRound((scrollerWidth + expandOffset - knobWidth) / 2.0);
- const CGFloat knobRadius = knobWidth / 2.0;
- CGRect knobRect;
- if (isHorizontal)
- knobRect = CGRectMake(knobPos, knobOffset, knobLength, knobWidth);
- else
- knobRect = CGRectMake(knobOffset, knobPos, knobWidth, knobLength);
- QCFType<CGPathRef> knobPath = CGPathCreateWithRoundedRect(knobRect, knobRadius, knobRadius, nullptr);
- CGContextAddPath(cg, knobPath);
- CGContextSetAlpha(cg, 0.5);
- CGColorRef knobColor = hasDarkBg ? NSColor.whiteColor.CGColor : NSColor.blackColor.CGColor;
- CGContextSetFillColorWithColor(cg, knobColor);
- CGContextFillPath(cg);
- } else {
- [scroller drawKnob];
-
- if (!isTransient && opt->state & State_Sunken) {
- // The knob should appear darker (going from 0.76 down to 0.49).
- // But no blending mode can help darken enough in a single pass,
- // so we resort to drawing the knob twice with a small help from
- // blending. This brings the gray level to a close enough 0.53.
- CGContextSetBlendMode(cg, kCGBlendModePlusDarker);
- [scroller drawKnob];
- }
- }
- }
-
- if (isTransient)
- CGContextEndTransparencyLayer(cg);
-
- d->restoreNSGraphicsContext(cg);
- }
- break;
- case CC_Slider:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- const bool isHorizontal = sl->orientation == Qt::Horizontal;
- const auto ct = isHorizontal ? QMacStylePrivate::Slider_Horizontal : QMacStylePrivate::Slider_Vertical;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *slider = static_cast<NSSlider *>(d->cocoaControl(cw));
- if (!setupSlider(slider, sl))
- break;
-
- const bool hasTicks = sl->tickPosition != QStyleOptionSlider::NoTicks;
- const bool hasDoubleTicks = sl->tickPosition == QStyleOptionSlider::TicksBothSides;
- const bool drawKnob = sl->subControls & SC_SliderHandle;
- const bool drawBar = sl->subControls & SC_SliderGroove;
- const bool drawTicks = sl->subControls & SC_SliderTickmarks;
- const bool isPressed = sl->state & State_Sunken;
-
- CGPoint pressPoint;
- if (isPressed && drawKnob) {
- const CGRect knobRect = [slider.cell knobRectFlipped:slider.isFlipped];
- pressPoint.x = CGRectGetMidX(knobRect);
- pressPoint.y = CGRectGetMidY(knobRect);
- [slider.cell startTrackingAt:pressPoint inView:slider];
- }
-
- d->drawNSViewInRect(slider, opt->rect, p, ^(CGContextRef, const CGRect &) {
- // Note that we don't support drawing the slider upside down. When this
- // is needed, simply set scale = -1 on the QML control / style item instead.
- NSSliderCell *cell = slider.cell;
-
- if (drawBar) {
- const CGRect barRect = [cell barRectFlipped:slider.isFlipped];
- // "flipped" will only make a difference when NSSliderCell is vertical. And then
- // flipped means fill the groove from bottom-to-top instead of top-to-bottom.
- // Bottom-to-top is QSlider's normal mode, which means that we always need to flip
- // in vertical mode. (In case NSSlider can also be flipped horizontally in the future,
- // we stay on the safe side, and only flip when in vertical mode).
- [cell drawBarInside:barRect flipped:!isHorizontal];
- }
-
- if (drawBar && hasTicks && drawTicks) {
- if (!hasDoubleTicks) {
- [cell drawTickMarks];
- } else {
- if (sl->orientation == Qt::Horizontal) {
- slider.tickMarkPosition = NSTickMarkPositionAbove;
- [slider layoutSubtreeIfNeeded];
- [cell drawTickMarks];
- slider.tickMarkPosition = NSTickMarkPositionBelow;
- [slider layoutSubtreeIfNeeded];
- [cell drawTickMarks];
- } else {
- slider.tickMarkPosition = NSTickMarkPositionLeading;
- [slider layoutSubtreeIfNeeded];
- [cell drawTickMarks];
- slider.tickMarkPosition = NSTickMarkPositionTrailing;
- [slider layoutSubtreeIfNeeded];
- [cell drawTickMarks];
- }
- }
- }
-
- if (drawKnob)
- [cell drawKnob];
- });
-
- if (isPressed && drawKnob)
- [slider.cell stopTracking:pressPoint at:pressPoint inView:slider mouseIsUp:NO];
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- if (sb->frame && (sb->subControls & SC_SpinBoxFrame)) {
- const auto lineEditRect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxEditField);
- QStyleOptionFrame frame;
- static_cast<QStyleOption &>(frame) = *opt;
- frame.rect = lineEditRect;
- frame.state |= State_Sunken;
- frame.lineWidth = 1;
- frame.midLineWidth = 0;
- frame.features = QStyleOptionFrame::None;
- frame.frameShape = QStyleOptionFrame::Box;
- drawPrimitive(PE_FrameLineEdit, &frame, p);
- }
- if (sb->subControls & (SC_SpinBoxUp | SC_SpinBoxDown)) {
- const QRect updown = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxUp)
- | proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxDown);
-
- d->setupNSGraphicsContext(cg, NO);
-
- const auto aquaSize = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::Stepper, aquaSize);
- NSStepperCell *cell = static_cast<NSStepperCell *>(d->cocoaCell(cw));
- cell.enabled = (sb->state & State_Enabled);
-
- const CGRect newRect = [cell drawingRectForBounds:updown.toCGRect()];
-
- const bool upPressed = sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_Sunken);
- const bool downPressed = sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_Sunken);
- const CGFloat x = CGRectGetMidX(newRect);
- const CGFloat y = upPressed ? -3 : 3; // Weird coordinate shift going on. Verified with Hopper
- const CGPoint pressPoint = CGPointMake(x, y);
- // Pretend we're pressing the mouse on the right button. Unfortunately, NSStepperCell has no
- // API to highlight a specific button. The highlighted property works only on the down button.
- if (upPressed || downPressed)
- [cell startTrackingAt:pressPoint inView:d->backingStoreNSView];
-
- [cell drawWithFrame:newRect inView:d->backingStoreNSView];
-
- if (upPressed || downPressed)
- [cell stopTracking:pressPoint at:pressPoint inView:d->backingStoreNSView mouseIsUp:NO];
-
- d->restoreNSGraphicsContext(cg);
- }
- }
- break;
- case CC_ComboBox:
- if (const auto *combo = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- const bool isEnabled = combo->state & State_Enabled;
- const bool isPressed = combo->state & State_Sunken;
-
- const auto ct = cocoaControlType(combo);
- const auto cs = d->effectiveAquaSizeConstrain(combo);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *cc = static_cast<NSControl *>(d->cocoaControl(cw));
- cc.enabled = isEnabled;
- QRectF frameRect = cw.adjustedControlFrame(combo->rect);;
- if (cw.type == QMacStylePrivate::Button_PopupButton) {
- // Non-editable QComboBox
- auto *pb = static_cast<NSPopUpButton *>(cc);
- // FIXME Old offsets. Try to move to adjustedControlFrame()
- if (cw.size == QStyleHelper::SizeSmall) {
- frameRect = frameRect.translated(0, 1);
- } else if (cw.size == QStyleHelper::SizeMini) {
- // Same 0.5 pt misalignment as AppKit and fit the focus ring
- frameRect = frameRect.translated(2, -0.5);
- }
- pb.frame = frameRect.toCGRect();
- [pb highlight:isPressed];
- d->drawNSViewInRect(pb, frameRect, p, ^(CGContextRef, const CGRect &r) {
- QMacAutoReleasePool pool;
- [pb.cell drawBezelWithFrame:r inView:pb.superview];
- });
- } else if (cw.type == QMacStylePrivate::ComboBox) {
- // Editable QComboBox
- auto *cb = static_cast<NSComboBox *>(cc);
- const auto frameRect = cw.adjustedControlFrame(combo->rect);
- cb.frame = frameRect.toCGRect();
-
- // This API was requested to Apple in rdar #36197888. We know it's safe to use up to macOS 10.13.3
- if (NSButtonCell *cell = static_cast<NSButtonCell *>([cc.cell qt_valueForPrivateKey:@"_buttonCell"])) {
- cell.highlighted = isPressed;
- } else {
- // TODO Render to pixmap and darken the button manually
- }
-
- d->drawNSViewInRect(cb, frameRect, p, ^(CGContextRef, const CGRect &r) {
- // FIXME This is usually drawn in the control's superview, but we wouldn't get inactive look in this case
- QMacAutoReleasePool pool;
- [cb.cell drawWithFrame:r inView:cb];
- });
- }
- }
- break;
- case CC_TitleBar:
- if (const auto *titlebar = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- const bool isActive = (titlebar->state & State_Active)
- && (titlebar->titleBarState & State_Active);
-
- p->fillRect(opt->rect, Qt::transparent);
- p->setRenderHint(QPainter::Antialiasing);
- p->setClipRect(opt->rect, Qt::IntersectClip);
-
- // FIXME A single drawPath() with 0-sized pen
- // doesn't look as good as this double fillPath().
- const auto outerFrameRect = QRectF(opt->rect.adjusted(0, 0, 0, opt->rect.height()));
- QPainterPath outerFramePath = d->windowPanelPath(outerFrameRect);
- p->fillPath(outerFramePath, opt->palette.dark());
-
- const auto frameAdjust = 1.0 / p->device()->devicePixelRatioF();
- const auto innerFrameRect = outerFrameRect.adjusted(frameAdjust, frameAdjust, -frameAdjust, 0);
- QPainterPath innerFramePath = d->windowPanelPath(innerFrameRect);
- if (isActive) {
- QLinearGradient g;
- g.setStart(QPointF(0, 0));
- g.setFinalStop(QPointF(0, 2 * opt->rect.height()));
- g.setColorAt(0, opt->palette.button().color());
- g.setColorAt(1, opt->palette.dark().color());
- p->fillPath(innerFramePath, g);
- } else {
- p->fillPath(innerFramePath, opt->palette.button());
- }
-
- if (titlebar->subControls & (SC_TitleBarCloseButton
- | SC_TitleBarMaxButton
- | SC_TitleBarMinButton
- | SC_TitleBarNormalButton)) {
- const bool isHovered = (titlebar->state & State_MouseOver);
- static const SubControl buttons[] = {
- SC_TitleBarCloseButton, SC_TitleBarMinButton, SC_TitleBarMaxButton
- };
- for (const auto sc : buttons) {
- const auto ct = d->windowButtonCocoaControl(sc);
- const auto cw = QMacStylePrivate::CocoaControl(ct, QStyleHelper::SizeLarge);
- auto *wb = static_cast<NSButton *>(d->cocoaControl(cw));
- wb.enabled = (sc & titlebar->subControls) && isActive;
- [wb highlight:(titlebar->state & State_Sunken) && (sc & titlebar->activeSubControls)];
- Q_UNUSED(isHovered); // FIXME No public API for this
-
- const auto buttonRect = proxy()->subControlRect(CC_TitleBar, titlebar, sc);
- d->drawNSViewInRect(wb, buttonRect, p, ^(CGContextRef, const CGRect &rect) {
- QMacAutoReleasePool pool;
- auto *wbCell = static_cast<NSButtonCell *>(wb.cell);
- [wbCell drawWithFrame:rect inView:wb];
- });
- }
- }
-
- if (titlebar->subControls & SC_TitleBarLabel) {
- const auto tr = proxy()->subControlRect(CC_TitleBar, titlebar, SC_TitleBarLabel);
- if (!titlebar->icon.isNull()) {
- const auto iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- const auto iconSize = QSize(iconExtent, iconExtent);
- const auto iconPos = tr.x() - titlebar->icon.actualSize(iconSize).width() - qRound(titleBarIconTitleSpacing);
- // Only render the icon if it'll be fully visible
- if (iconPos < tr.right() - titleBarIconTitleSpacing)
- p->drawPixmap(iconPos, tr.y(), titlebar->icon.pixmap(opt->window, iconSize, QIcon::Normal));
- }
-
- if (!titlebar->text.isEmpty())
- drawItemText(p, tr, Qt::AlignCenter, opt->palette, isActive, titlebar->text, QPalette::Text);
- }
- }
- break;
- case CC_GroupBox:
- if (const QStyleOptionGroupBox *gb
- = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
-
- QStyleOptionGroupBox groupBox(*gb);
- const bool flat = groupBox.features & QStyleOptionFrame::Flat;
- if (!flat)
- groupBox.state |= QStyle::State_Mini; // Force mini-sized checkbox to go with small-sized label
- else
- groupBox.subControls = groupBox.subControls & ~SC_GroupBoxFrame; // We don't like frames and ugly lines
-
-// const bool didSetFont = widget && widget->testAttribute(Qt::WA_SetFont);
-// const bool didModifySubControls = !didSetFont && QApplication::desktopSettingsAware();
-// if (didModifySubControls)
-// groupBox.subControls = groupBox.subControls & ~SC_GroupBoxLabel;
- QCommonStyle::drawComplexControl(cc, &groupBox, p);
-// if (didModifySubControls) {
-// const QRect rect = proxy()->subControlRect(CC_GroupBox, &groupBox, SC_GroupBoxLabel);
-// const bool rtl = groupBox.direction == Qt::RightToLeft;
-// const int alignment = Qt::TextHideMnemonic | (rtl ? Qt::AlignRight : Qt::AlignLeft);
-// const QFont savedFont = p->font();
-// if (!flat)
-// p->setFont(d->smallSystemFont);
-// proxy()->drawItemText(p, rect, alignment, groupBox.palette, groupBox.state & State_Enabled, groupBox.text, QPalette::WindowText);
-// if (!flat)
-// p->setFont(savedFont);
-// }
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *tb
- = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
-#ifndef QT_NO_ACCESSIBILITY
- if (QStyleHelper::hasAncestor(opt->styleObject, QAccessible::ToolBar)) {
- if (tb->subControls & SC_ToolButtonMenu) {
- QStyleOption arrowOpt = *tb;
- arrowOpt.rect = proxy()->subControlRect(cc, tb, SC_ToolButtonMenu);
- arrowOpt.rect.setY(arrowOpt.rect.y() + arrowOpt.rect.height() / 2);
- arrowOpt.rect.setHeight(arrowOpt.rect.height() / 2);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, p);
- } else if ((tb->features & QStyleOptionToolButton::HasMenu)
- && (tb->toolButtonStyle != Qt::ToolButtonTextOnly && !tb->icon.isNull())) {
- d->drawToolbarButtonArrow(tb, p);
- }
- if (tb->state & State_On) {
- NSView *view = reinterpret_cast<NSView *>(opt->window->winId());
- bool isKey = false;
- if (view)
- isKey = [view.window isKeyWindow];
-
- QBrush brush(brushForToolButton(isKey));
- QPainterPath path;
- path.addRoundedRect(QRectF(tb->rect.x(), tb->rect.y(), tb->rect.width(), tb->rect.height() + 4), 4, 4);
- p->setRenderHint(QPainter::Antialiasing);
- p->fillPath(path, brush);
- }
- proxy()->drawControl(CE_ToolButtonLabel, opt, p);
- } else
-#endif // QT_NO_ACCESSIBILITY
- {
- auto bflags = tb->state;
- if (tb->subControls & SC_ToolButton)
- bflags |= State_Sunken;
- auto mflags = tb->state;
- if (tb->subControls & SC_ToolButtonMenu)
- mflags |= State_Sunken;
-
- if (tb->subControls & SC_ToolButton) {
- if (bflags & (State_Sunken | State_On | State_Raised)) {
- const bool isEnabled = tb->state & State_Enabled;
- const bool isPressed = tb->state & State_Sunken;
- const bool isHighlighted = (tb->state & State_Active) && (tb->state & State_On);
- const auto ct = QMacStylePrivate::Button_PushButton;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *pb = static_cast<NSButton *>(d->cocoaControl(cw));
- pb.bezelStyle = NSShadowlessSquareBezelStyle; // TODO Use NSTexturedRoundedBezelStyle in the future.
- pb.frame = opt->rect.toCGRect();
- pb.buttonType = NSPushOnPushOffButton;
- pb.enabled = isEnabled;
- [pb highlight:isPressed];
- pb.state = isHighlighted && !isPressed ? NSOnState : NSOffState;
- const auto buttonRect = proxy()->subControlRect(cc, tb, SC_ToolButton);
- d->drawNSViewInRect(pb, buttonRect, p, ^(CGContextRef, const CGRect &rect) {
- QMacAutoReleasePool pool;
- [pb.cell drawBezelWithFrame:rect inView:pb];
- });
- }
- }
-
- if (tb->subControls & SC_ToolButtonMenu) {
- const auto menuRect = proxy()->subControlRect(cc, tb, SC_ToolButtonMenu);
- QStyleOption arrowOpt = *tb;
- arrowOpt.rect = QRect(menuRect.x() + ((menuRect.width() - toolButtonArrowSize) / 2),
- menuRect.height() - (toolButtonArrowSize + toolButtonArrowMargin),
- toolButtonArrowSize,
- toolButtonArrowSize);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, p);
- } else if (tb->features & QStyleOptionToolButton::HasMenu) {
- d->drawToolbarButtonArrow(tb, p);
- }
- QRect buttonRect = proxy()->subControlRect(CC_ToolButton, tb, SC_ToolButton);
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- QStyleOptionToolButton label = *tb;
- label.rect = buttonRect.adjusted(fw, fw, -fw, -fw);
- proxy()->drawControl(CE_ToolButtonLabel, &label, p);
- }
- }
- break;
- case CC_Dial:
- if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(opt))
- QStyleHelper::drawDial(dial, p);
- break;
- default:
- QCommonStyle::drawComplexControl(cc, opt, p);
- break;
- }
-}
-
-QStyle::SubControl QMacStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt) const
-{
- Q_D(const QMacStyle);
-
- SubControl sc = QStyle::SC_None;
-
- switch (cc) {
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- sc = QCommonStyle::hitTestComplexControl(cc, cmb, pt);
- if (!cmb->editable && sc != QStyle::SC_None)
- sc = SC_ComboBoxArrow; // A bit of a lie, but what we want
- }
- break;
- case CC_Slider:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (!sl->rect.contains(pt))
- break;
-
- const bool hasTicks = sl->tickPosition != QStyleOptionSlider::NoTicks;
- const bool isHorizontal = sl->orientation == Qt::Horizontal;
- const auto ct = isHorizontal ? QMacStylePrivate::Slider_Horizontal : QMacStylePrivate::Slider_Vertical;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *slider = static_cast<NSSlider *>(d->cocoaControl(cw));
- if (!setupSlider(slider, sl))
- break;
-
- NSSliderCell *cell = slider.cell;
- const auto barRect = QRectF::fromCGRect([cell barRectFlipped:slider.isFlipped]);
- const auto knobRect = QRectF::fromCGRect([cell knobRectFlipped:slider.isFlipped]);
- if (knobRect.contains(pt)) {
- sc = SC_SliderHandle;
- } else if (barRect.contains(pt)) {
- sc = SC_SliderGroove;
- } else if (hasTicks) {
- sc = SC_SliderTickmarks;
- }
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (!sb->rect.contains(pt)) {
- sc = SC_None;
- break;
- }
-
- const bool isHorizontal = sb->orientation == Qt::Horizontal;
- const auto ct = isHorizontal ? QMacStylePrivate::Scroller_Horizontal : QMacStylePrivate::Scroller_Vertical;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *scroller = static_cast<NSScroller *>(d->cocoaControl(cw));
- if (!setupScroller(scroller, sb)) {
- sc = SC_None;
- break;
- }
-
- // Since -[NSScroller testPart:] doesn't want to cooperate, we do it the
- // straightforward way. In any case, macOS doesn't return line-sized changes
- // with NSScroller since 10.7, according to the aforementioned method's doc.
- const auto knobRect = QRectF::fromCGRect([scroller rectForPart:NSScrollerKnob]);
- if (isHorizontal) {
- const bool isReverse = sb->direction == Qt::RightToLeft;
- if (pt.x() < knobRect.left())
- sc = isReverse ? SC_ScrollBarAddPage : SC_ScrollBarSubPage;
- else if (pt.x() > knobRect.right())
- sc = isReverse ? SC_ScrollBarSubPage : SC_ScrollBarAddPage;
- else
- sc = SC_ScrollBarSlider;
- } else {
- if (pt.y() < knobRect.top())
- sc = SC_ScrollBarSubPage;
- else if (pt.y() > knobRect.bottom())
- sc = SC_ScrollBarAddPage;
- else
- sc = SC_ScrollBarSlider;
- }
- }
- break;
- default:
- sc = QCommonStyle::hitTestComplexControl(cc, opt, pt);
- break;
- }
- return sc;
-}
-
-QRect QMacStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc) const
-{
- Q_D(const QMacStyle);
-
- QRect ret;
-
- switch (cc) {
- case CC_ScrollBar:
- if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- const bool isHorizontal = sb->orientation == Qt::Horizontal;
- const bool isReverseHorizontal = isHorizontal && (sb->direction == Qt::RightToLeft);
-
- NSScrollerPart part = NSScrollerNoPart;
- if (sc == SC_ScrollBarSlider) {
- part = NSScrollerKnob;
- } else if (sc == SC_ScrollBarGroove) {
- part = NSScrollerKnobSlot;
- } else if (sc == SC_ScrollBarSubPage || sc == SC_ScrollBarAddPage) {
- if ((!isReverseHorizontal && sc == SC_ScrollBarSubPage)
- || (isReverseHorizontal && sc == SC_ScrollBarAddPage))
- part = NSScrollerDecrementPage;
- else
- part = NSScrollerIncrementPage;
- }
- // And nothing else since 10.7
-
- if (part != NSScrollerNoPart) {
- const auto ct = isHorizontal ? QMacStylePrivate::Scroller_Horizontal : QMacStylePrivate::Scroller_Vertical;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *scroller = static_cast<NSScroller *>(d->cocoaControl(cw));
- if (setupScroller(scroller, sb))
- ret = QRectF::fromCGRect([scroller rectForPart:part]).toRect();
- }
- }
- break;
- case CC_Slider:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- const bool hasTicks = sl->tickPosition != QStyleOptionSlider::NoTicks;
- const bool isHorizontal = sl->orientation == Qt::Horizontal;
- const auto ct = isHorizontal ? QMacStylePrivate::Slider_Horizontal : QMacStylePrivate::Slider_Vertical;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
- auto *slider = static_cast<NSSlider *>(d->cocoaControl(cw));
- if (!setupSlider(slider, sl))
- break;
-
- NSSliderCell *cell = slider.cell;
- if (sc == SC_SliderHandle) {
- ret = QRectF::fromCGRect([cell knobRectFlipped:slider.isFlipped]).toRect();
- } else if (sc == SC_SliderGroove) {
- ret = QRectF::fromCGRect([cell barRectFlipped:slider.isFlipped]).toRect();
- } else if (hasTicks && sc == SC_SliderTickmarks) {
- const auto tickMarkRect = QRectF::fromCGRect([cell rectOfTickMarkAtIndex:0]);
- if (isHorizontal)
- ret = QRect(sl->rect.left(), tickMarkRect.top(), sl->rect.width(), tickMarkRect.height());
- else
- ret = QRect(tickMarkRect.left(), sl->rect.top(), tickMarkRect.width(), sl->rect.height());
- }
-
-// if (sl->upsideDown) {
-// if isHorizontal) {
-// } else {
-// }
-// }
- }
- break;
- case CC_TitleBar:
- if (const auto *titlebar = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- // The title bar layout is as follows: close, min, zoom, icon, title
- // [ x _ + @ Window Title ]
- // Center the icon and title until it starts to overlap with the buttons.
- // The icon doesn't count towards SC_TitleBarLabel, but it's still rendered
- // next to the title text. See drawComplexControl().
- if (sc == SC_TitleBarLabel) {
- qreal labelWidth = titlebar->fontMetrics.horizontalAdvance(titlebar->text) + 1; // FIXME Rounding error?
- qreal labelHeight = titlebar->fontMetrics.height();
-
- const auto lastButtonRect = proxy()->subControlRect(CC_TitleBar, titlebar, SC_TitleBarMaxButton);
- qreal controlsSpacing = lastButtonRect.right() + titleBarButtonSpacing;
- if (!titlebar->icon.isNull()) {
- const auto iconSize = proxy()->pixelMetric(PM_SmallIconSize);
- const auto actualIconSize = titlebar->icon.actualSize(QSize(iconSize, iconSize)).width();;
- controlsSpacing += actualIconSize + titleBarIconTitleSpacing;
- }
-
- const qreal labelPos = qMax(controlsSpacing, (opt->rect.width() - labelWidth) / 2.0);
- labelWidth = qMin(labelWidth, opt->rect.width() - (labelPos + titleBarTitleRightMargin));
- ret = QRect(labelPos, (opt->rect.height() - labelHeight) / 2,
- labelWidth, labelHeight);
- } else {
- const auto currentButton = d->windowButtonCocoaControl(sc);
- if (currentButton == QMacStylePrivate::NoControl)
- break;
-
- QPointF buttonPos = titlebar->rect.topLeft() + QPointF(titleBarButtonSpacing, 0);
- QSizeF buttonSize;
- for (int ct = QMacStylePrivate::Button_WindowClose; ct <= currentButton; ct++) {
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::CocoaControlType(ct),
- QStyleHelper::SizeLarge);
- auto *wb = static_cast<NSButton *>(d->cocoaControl(cw));
- if (ct == currentButton)
- buttonSize = QSizeF::fromCGSize(wb.frame.size);
- else
- buttonPos.rx() += wb.frame.size.width + titleBarButtonSpacing;
- }
-
- const auto vOffset = (opt->rect.height() - buttonSize.height()) / 2.0;
- ret = QRectF(buttonPos, buttonSize).translated(0, vOffset).toRect();
- }
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- const auto ct = cocoaControlType(combo);
- const auto cs = d->effectiveAquaSizeConstrain(combo);
- const auto cw = QMacStylePrivate::CocoaControl(ct, cs);
-
- // Old widget path. Current not understood why it's needed:
- //const auto editRect = QMacStylePrivate::comboboxEditBounds(cw.adjustedControlFrame(combo->rect), cw);
-
- // New path:
- QRectF editRect;
- switch (cs) {
- case QStyleHelper::SizeLarge:
- editRect = combo->rect.adjusted(15, 7, -25, -9);
- break;
- case QStyleHelper::SizeSmall:
- if (combo->editable)
- editRect = combo->rect.adjusted(15, 6, -22, -9);
- else
- editRect = combo->rect.adjusted(15, 8, -22, -6);
- break;
- default:
- if (combo->editable)
- editRect = combo->rect.adjusted(15, 6, -20, -7);
- else
- editRect = combo->rect.adjusted(15, 5, -22, -6);
- break;
- }
-
- switch (sc) {
- case SC_ComboBoxEditField:{
- ret = editRect.toAlignedRect();
- break; }
- case SC_ComboBoxArrow:{
- ret = editRect.toAlignedRect();
- ret.setX(ret.x() + ret.width());
- ret.setWidth(combo->rect.right() - ret.right());
- break; }
- case SC_ComboBoxListBoxPopup:{
- if (combo->editable) {
- const CGRect inner = QMacStylePrivate::comboboxInnerBounds(combo->rect.toCGRect(), cw);
- const int comboTop = combo->rect.top();
- ret = QRect(qRound(inner.origin.x),
- comboTop,
- qRound(inner.origin.x - combo->rect.left() + inner.size.width),
- editRect.bottom() - comboTop + 2);
- } else {
- ret = QRect(combo->rect.x() + 4 - 11,
- combo->rect.y() + 1,
- editRect.width() + 10 + 11,
- 1);
- }
- break; }
- default:
- break;
- }
- }
- break;
- case CC_GroupBox:
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- bool checkable = groupBox->subControls & SC_GroupBoxCheckBox;
- const bool flat = groupBox->features & QStyleOptionFrame::Flat;
- bool hasNoText = !checkable && groupBox->text.isEmpty();
- switch (sc) {
- case SC_GroupBoxLabel:
- case SC_GroupBoxCheckBox: {
- // Cheat and use the smaller font if we need to
- const bool checkable = groupBox->subControls & SC_GroupBoxCheckBox;
- const bool fontIsSet = false;
-// const bool fontIsSet = (widget && widget->testAttribute(Qt::WA_SetFont))
-// || !QApplication::desktopSettingsAware();
- const int margin = flat || hasNoText ? 0 : 9;
- ret = groupBox->rect.adjusted(margin, 0, -margin, 0);
-
- const QFontMetricsF fm = flat || fontIsSet ? QFontMetricsF(groupBox->fontMetrics) : QFontMetricsF(d->smallSystemFont);
- const QSizeF s = fm.size(Qt::AlignHCenter | Qt::AlignVCenter, qt_mac_removeMnemonics(groupBox->text), 0, nullptr);
- const int tw = qCeil(s.width());
- const int h = qCeil(fm.height());
- ret.setHeight(h);
-
- QRect labelRect = alignedRect(groupBox->direction, groupBox->textAlignment,
- QSize(tw, h), ret);
- if (flat && checkable)
- labelRect.moveLeft(labelRect.left() + 4);
- int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, opt);
- bool rtl = groupBox->direction == Qt::RightToLeft;
- if (sc == SC_GroupBoxLabel) {
- if (checkable) {
- int newSum = indicatorWidth + 1;
- int newLeft = labelRect.left() + (rtl ? -newSum : newSum);
- labelRect.moveLeft(newLeft);
- if (flat)
- labelRect.moveTop(labelRect.top() + 3);
- else
- labelRect.moveTop(labelRect.top() + 4);
- } else if (flat) {
- int newLeft = labelRect.left() - (rtl ? 3 : -3);
- labelRect.moveLeft(newLeft);
- labelRect.moveTop(labelRect.top() + 3);
- } else {
- int newLeft = labelRect.left() - (rtl ? 3 : 2);
- labelRect.moveLeft(newLeft);
- labelRect.moveTop(labelRect.top() + 4);
- }
- ret = labelRect;
- }
-
- if (sc == SC_GroupBoxCheckBox) {
- int left = rtl ? labelRect.right() - indicatorWidth : labelRect.left() - 1;
- int top = flat ? ret.top() + 1 : ret.top() + 5;
- ret.setRect(left, top,
- indicatorWidth, proxy()->pixelMetric(PM_IndicatorHeight, opt));
- }
- break;
- }
- case SC_GroupBoxContents:
- case SC_GroupBoxFrame: {
- QFontMetrics fm = groupBox->fontMetrics;
- int yOffset = 3;
- if (!flat)
- yOffset = 5;
-
- if (hasNoText)
- yOffset = -qCeil(QFontMetricsF(fm).height());
- ret = opt->rect.adjusted(0, qCeil(QFontMetricsF(fm).height()) + yOffset, 0, 0);
- if (sc == SC_GroupBoxContents) {
- if (flat)
- ret.adjust(3, -5, -3, -4); // guess too
- else
- ret.adjust(3, 3, -3, -4); // guess
- }
- }
- break;
- default:
- ret = QCommonStyle::subControlRect(cc, groupBox, sc);
- break;
- }
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spin = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QStyleHelper::WidgetSizePolicy aquaSize = d->effectiveAquaSizeConstrain(spin);
- const auto fw = proxy()->pixelMetric(PM_SpinBoxFrameWidth, spin);
- int spinner_w;
- int spinner_h;
- int adjust_y;
- int spinBoxSep;
- switch (aquaSize) {
- case QStyleHelper::SizeLarge:
- spinner_w = 14;
- spinner_h = 24;
- adjust_y = -1;
- spinBoxSep = 2;
- break;
- case QStyleHelper::SizeSmall:
- spinner_w = 12;
- spinner_h = 20;
- adjust_y = -1;
- spinBoxSep = 2;
- break;
- case QStyleHelper::SizeMini:
- spinner_w = 10;
- spinner_h = 16;
- adjust_y = -1;
- spinBoxSep = 1;
- break;
- default:
- Q_UNREACHABLE();
- }
-
- switch (sc) {
- case SC_SpinBoxUp:
- case SC_SpinBoxDown: {
- if (spin->buttonSymbols == QStyleOptionSpinBox::NoButtons)
- break;
-
- const int y = fw;
- const int x = spin->rect.width() - spinner_w;
- ret.setRect(x + spin->rect.x(), y + spin->rect.y(), spinner_w, spinner_h);
-
- const auto cw = QMacStylePrivate::CocoaControl(QMacStylePrivate::Stepper, aquaSize);
- NSStepperCell *cell = static_cast<NSStepperCell *>(d->cocoaCell(cw));
- const CGRect outRect = [cell drawingRectForBounds:ret.toCGRect()];
- ret = QRectF::fromCGRect(outRect).toRect();
-
- switch (sc) {
- case SC_SpinBoxUp:
- ret.setHeight(ret.height() / 2);
- break;
- case SC_SpinBoxDown:
- ret.setY(ret.y() + ret.height() / 2);
- break;
- default:
- Q_ASSERT(0);
- break;
- }
- // The buttons are drawn with a top-margin (for some reason) into
- // the rect. So undo that margin here:
- ret.translate(0, adjust_y);
- ret = visualRect(spin->direction, spin->rect, ret);
- break;
- }
- case SC_SpinBoxEditField:
- ret = spin->rect.adjusted(fw, fw, -fw, -fw);
- if (spin->subControls & SC_SpinBoxUp || spin->subControls & SC_SpinBoxDown) {
- ret.setWidth(spin->rect.width() - spinBoxSep - spinner_w);
- ret = visualRect(spin->direction, spin->rect, ret);
- }
- break;
- default:
- ret = QCommonStyle::subControlRect(cc, spin, sc);
- break;
- }
- }
- break;
- case CC_ToolButton:
- ret = QCommonStyle::subControlRect(cc, opt, sc);
- if (sc == SC_ToolButtonMenu) {
-#ifndef QT_NO_ACCESSIBILITY
- if (QStyleHelper::hasAncestor(opt->styleObject, QAccessible::ToolBar))
- ret.adjust(-toolButtonArrowMargin, 0, 0, 0);
-#endif
- ret.adjust(-1, 0, 0, 0);
- }
- break;
- default:
- ret = QCommonStyle::subControlRect(cc, opt, sc);
- break;
- }
- return ret;
-}
-
-QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &csz) const
-{
- Q_D(const QMacStyle);
-
- QSize sz(csz);
- bool useAquaGuideline = true;
-
- switch (ct) {
- case CT_SpinBox:
- if (const QStyleOptionSpinBox *vopt = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- if (vopt->subControls == SC_SpinBoxFrame) {
- const QSize minimumSize(20, 24);
- if (sz.width() < minimumSize.width())
- sz.setWidth(minimumSize.width());
- if (sz.height() < minimumSize.height())
- sz.setHeight(minimumSize.height());
- } else {
- const QSize buttonSize = proxy()->subControlRect(CC_SpinBox, vopt, SC_SpinBoxUp).size();
- const int upAndDownTogetherHeight = buttonSize.height() * 2;
- sz += QSize(buttonSize.width(), upAndDownTogetherHeight);
- }
- }
- break;
- case QStyle::CT_TabWidget:
- // the size between the pane and the "contentsRect" (+4,+4)
- // (the "contentsRect" is on the inside of the pane)
- sz = QCommonStyle::sizeFromContents(ct, opt, csz);
- /**
- This is supposed to show the relationship between the tabBar and
- the stack widget of a QTabWidget.
- Unfortunately ascii is not a good way of representing graphics.....
- PS: The '=' line is the painted frame.
-
- top ---+
- |
- |
- |
- | vvv just outside the painted frame is the "pane"
- - -|- - - - - - - - - - <-+
- TAB BAR +=====^============ | +2 pixels
- - - -|- - -|- - - - - - - <-+
- | | ^ ^^^ just inside the painted frame is the "contentsRect"
- | | |
- | overlap |
- | | |
- bottom ------+ <-+ +14 pixels
- |
- v
- ------------------------------ <- top of stack widget
-
-
- To summarize:
- * 2 is the distance between the pane and the contentsRect
- * The 14 and the 1's are the distance from the contentsRect to the stack widget.
- (same value as used in SE_TabWidgetTabContents)
- * overlap is how much the pane should overlap the tab bar
- */
- // then add the size between the stackwidget and the "contentsRect"
- if (const QStyleOptionTabWidgetFrame *twf
- = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QSize extra(0,0);
- const int overlap = pixelMetric(PM_TabBarBaseOverlap, opt);
- const int gapBetweenTabbarAndStackWidget = 2 + 14 - overlap;
-
- const auto tabDirection = QMacStylePrivate::tabDirection(twf->shape);
- if (tabDirection == QMacStylePrivate::North
- || tabDirection == QMacStylePrivate::South) {
- extra = QSize(2, gapBetweenTabbarAndStackWidget + 1);
- } else {
- extra = QSize(gapBetweenTabbarAndStackWidget + 1, 2);
- }
- sz+= extra;
- }
- break;
- case QStyle::CT_TabBarTab:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
-// const bool differentFont = (widget && widget->testAttribute(Qt::WA_SetFont))
-// || !QApplication::desktopSettingsAware();
- const bool differentFont = false;
- const auto tabDirection = QMacStylePrivate::tabDirection(tab->shape);
- const bool verticalTabs = tabDirection == QMacStylePrivate::East
- || tabDirection == QMacStylePrivate::West;
- if (verticalTabs)
- sz = sz.transposed();
-
- int defaultTabHeight;
- const auto cs = d->effectiveAquaSizeConstrain(opt);
- switch (cs) {
- case QStyleHelper::SizeLarge:
- if (tab->documentMode)
- defaultTabHeight = 24;
- else
- defaultTabHeight = 21;
- break;
- case QStyleHelper::SizeSmall:
- defaultTabHeight = 18;
- break;
- case QStyleHelper::SizeMini:
- defaultTabHeight = 16;
- break;
- default:
- break;
- }
-
- const bool widthSet = !differentFont && tab->icon.isNull();
- if (widthSet) {
- const auto textSize = opt->fontMetrics.size(Qt::TextShowMnemonic, tab->text);
- sz.rwidth() = textSize.width();
- sz.rheight() = qMax(defaultTabHeight, textSize.height());
- } else {
- sz.rheight() = qMax(defaultTabHeight, sz.height());
- }
- sz.rwidth() += proxy()->pixelMetric(PM_TabBarTabHSpace, tab);
-
- if (verticalTabs)
- sz = sz.transposed();
-
- int maxWidgetHeight = qMax(tab->leftButtonSize.height(), tab->rightButtonSize.height());
- int maxWidgetWidth = qMax(tab->leftButtonSize.width(), tab->rightButtonSize.width());
-
- int widgetWidth = 0;
- int widgetHeight = 0;
- int padding = 0;
- if (tab->leftButtonSize.isValid()) {
- padding += 8;
- widgetWidth += tab->leftButtonSize.width();
- widgetHeight += tab->leftButtonSize.height();
- }
- if (tab->rightButtonSize.isValid()) {
- padding += 8;
- widgetWidth += tab->rightButtonSize.width();
- widgetHeight += tab->rightButtonSize.height();
- }
-
- if (verticalTabs) {
- sz.setWidth(qMax(sz.width(), maxWidgetWidth));
- sz.setHeight(sz.height() + widgetHeight + padding);
- } else {
- if (widthSet)
- sz.setWidth(sz.width() + widgetWidth + padding);
- sz.setHeight(qMax(sz.height(), maxWidgetHeight));
- }
- }
- break;
- case CT_LineEdit:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (sz.isEmpty()) {
- // Minimum size (with padding: 18x24)
- sz.rwidth() = 10;
- sz.rheight() = 20;
- }
- // From using pixelTool with XCode/NSTextTextField
- int leftPadding = 4;
- int rightPadding = 4;
- int topPadding = 4;
- int bottomPadding = 0;
-
- if (opt->state & QStyle::State_Small) {
- topPadding = 3;
- } else if (opt->state & QStyle::State_Mini) {
- topPadding = 2;
- }
-
- sz.rwidth() += leftPadding + rightPadding;
- sz.rheight() += topPadding + bottomPadding;
- }
- break;
- case QStyle::CT_PushButton: {
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt))
- if (btn->features & QStyleOptionButton::CommandLinkButton)
- return QCommonStyle::sizeFromContents(ct, opt, sz);
-
- // By default, we fit the contents inside a normal rounded push button.
- // Do this by add enough space around the contents so that rounded
- // borders (including highlighting when active) will show.
- // TODO Use QFocusFrame and get rid of these horrors.
- QSize macsz;
- const auto controlSize = d->effectiveAquaSizeConstrain(opt, CT_PushButton, sz, &macsz);
- // FIXME See comment in CT_PushButton case in qt_aqua_get_known_size().
- if (macsz.width() != -1)
- sz.setWidth(macsz.width());
- else
- sz.rwidth() += QMacStylePrivate::PushButtonLeftOffset + QMacStylePrivate::PushButtonRightOffset + 12;
- // All values as measured from HIThemeGetButtonBackgroundBounds()
- if (controlSize != QStyleHelper::SizeMini)
- sz.rwidth() += 12; // We like 12 over here.
- if (controlSize == QStyleHelper::SizeLarge && sz.height() > 16)
- sz.rheight() += pushButtonDefaultHeight[QStyleHelper::SizeLarge] - 16;
- else if (controlSize == QStyleHelper::SizeMini)
- sz.setHeight(24); // FIXME Our previous HITheme-based logic returned this.
- else
- sz.setHeight(pushButtonDefaultHeight[controlSize]);
- break;
- }
- case QStyle::CT_MenuItem:
- if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- int maxpmw = mi->maxIconWidth;
- int w = sz.width();
- int h = sz.height();
-
-//#if QT_CONFIG(combobox)
-// const QComboBox *comboBox = qobject_cast<const QComboBox *>(widget);
-//#endif
-
- if (mi->menuItemType == QStyleOptionMenuItem::Separator) {
- w = 10;
- h = qt_mac_aqua_get_metric(MenuSeparatorHeight);
- } else {
- h = mi->fontMetrics.height() + 2;
- if (!mi->icon.isNull()) {
-//#if QT_CONFIG(combobox)
-// if (comboBox) {
-// const QSize &iconSize = comboBox->iconSize();
-// h = qMax(h, iconSize.height() + 4);
-// maxpmw = qMax(maxpmw, iconSize.width());
-// } else
-//#endif
- {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- h = qMax(h, mi->icon.actualSize(QSize(iconExtent, iconExtent)).height() + 4);
- }
- }
- }
- if (mi->text.contains(QLatin1Char('\t')))
- w += 12;
- else if (mi->menuItemType == QStyleOptionMenuItem::SubMenu)
- w += 35; // Not quite exactly as it seems to depend on other factors
- if (maxpmw)
- w += maxpmw + 6;
- // add space for a check. All items have place for a check too.
- w += 20;
-// if (comboBox && comboBox->isVisible()) {
-// QStyleOptionComboBox cmb;
-// cmb.initFrom(comboBox);
-// cmb.editable = false;
-// cmb.subControls = QStyle::SC_ComboBoxEditField;
-// cmb.activeSubControls = QStyle::SC_None;
-// w = qMax(w, subControlRect(QStyle::CC_ComboBox, &cmb,
-// QStyle::SC_ComboBoxEditField,
-// comboBox).width());
-// } else {
-// w += 12;
- sz = QSize(w, h);
- } break;
- case CT_MenuBarItem:
- if (!sz.isEmpty())
- sz += QSize(12, 4); // Constants from QWindowsStyle
- break;
- case CT_ToolButton:
- sz.rwidth() += 10;
- sz.rheight() += 10;
- if (const auto *tb = qstyleoption_cast<const QStyleOptionToolButton *>(opt))
- if (tb->features & QStyleOptionToolButton::Menu)
- sz.rwidth() += toolButtonArrowMargin;
- return sz;
- case CT_ComboBox:
- if (const auto *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- const int controlSize = getControlSize(opt);
-
- if (!cb->editable) {
- if (sz.width() < 10) {
- // minimumSize (to ensure a nice nine patch image)
- sz.rwidth() += 10;
- }
- // Same as CT_PushButton, because we have to fit the focus
- // ring and a non-editable combo box is a NSPopUpButton.
- sz.rwidth() += QMacStylePrivate::PushButtonLeftOffset + QMacStylePrivate::PushButtonRightOffset;
-
- if (controlSize == QStyleHelper::SizeLarge) {
- sz.rwidth() += 30;
- } else if (controlSize == QStyleHelper::SizeSmall) {
- sz.rwidth() += 26;
- } else {
- sz.rwidth() += 21;
- }
- } else {
- sz.rwidth() += 50; // FIXME Double check this
- }
-
- // This should be enough to fit the focus ring
- if (controlSize == QStyleHelper::SizeMini)
- sz.setHeight(24); // FIXME Our previous HITheme-based logic returned this for CT_PushButton.
- else
- sz.setHeight(pushButtonDefaultHeight[controlSize]);
-
- return sz;
- }
- break;
- case CT_Menu: {
- if (proxy() == this) {
- sz = csz;
- } else {
- QStyleHintReturnMask menuMask;
- QStyleOption myOption = *opt;
- myOption.rect.setSize(sz);
- if (proxy()->styleHint(SH_Menu_Mask, &myOption, &menuMask))
- sz = menuMask.region.boundingRect().size();
- }
- break; }
- case CT_HeaderSection:{
- const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt);
- sz = QCommonStyle::sizeFromContents(ct, opt, csz);
- if (header->text.contains(QLatin1Char('\n')))
- useAquaGuideline = false;
- break; }
- case CT_ScrollBar :
- // Make sure that the scroll bar is large enough to display the thumb indicator.
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- const int minimumWidth = 24;
- const int absoluteHeight = 14;
- if (slider->orientation == Qt::Horizontal) {
- sz = sz.expandedTo(QSize(minimumWidth, sz.height()));
- sz.setHeight(absoluteHeight);
- } else {
- sz = sz.expandedTo(QSize(sz.width(), minimumWidth));
- sz.setWidth(absoluteHeight);
- }
- }
- break;
- case CT_ItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- sz = QCommonStyle::sizeFromContents(ct, vopt, csz);
- sz.setHeight(sz.height() + 2);
- }
- break;
- default:
- sz = QCommonStyle::sizeFromContents(ct, opt, csz);
- }
-
- if (useAquaGuideline && ct != CT_PushButton) {
- // TODO Probably going away at some point
- QSize macsz;
- if (d->aquaSizeConstrain(opt, ct, sz, &macsz) != QStyleHelper::SizeDefault) {
- if (macsz.width() != -1)
- sz.setWidth(macsz.width());
- if (macsz.height() != -1)
- sz.setHeight(macsz.height());
- }
- }
-
- // The sizes that Carbon and the guidelines gives us excludes the focus frame.
- // We compensate for this by adding some extra space here to make room for the frame when drawing:
- if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(opt)){
- if (combo->editable) {
- const auto widgetSize = d->aquaSizeConstrain(opt);
- QMacStylePrivate::CocoaControl cw;
- cw.type = combo->editable ? QMacStylePrivate::ComboBox : QMacStylePrivate::Button_PopupButton;
- cw.size = widgetSize;
- const CGRect diffRect = QMacStylePrivate::comboboxInnerBounds(CGRectZero, cw);
- sz.rwidth() -= qRound(diffRect.size.width);
- sz.rheight() -= qRound(diffRect.size.height);
- }
- }
- return sz;
-}
-
-QFont QMacStyle::font(QStyle::ControlElement element, const QStyle::State state) const
-{
- QFont font = QCommonStyle::font(element, state);
-
- if (state & QStyle::State_Small) {
- font.setPixelSize(11);
- } else if (state & QStyle::State_Mini) {
- font.setPixelSize(9);
- }
-
- return font;
-}
-
-QMargins QMacStyle::ninePatchMargins(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, const QSize &imageSize) const
-{
- QMargins margins;
-
- switch (cc) {
- case CC_ComboBox: {
- const QRect arrow = subControlRect(CC_ComboBox, opt, SC_ComboBoxArrow);
- margins = QMargins(10, 0, arrow.width() + 1, -1);
- break; }
- default:
- margins = QCommonStyle::ninePatchMargins(cc, opt, imageSize);
- break;
- }
-
- return margins;
-}
-
-void QMacStyle::drawItemText(QPainter *p, const QRect &r, int flags, const QPalette &pal,
- bool enabled, const QString &text, QPalette::ColorRole textRole) const
-{
- if(flags & Qt::TextShowMnemonic)
- flags |= Qt::TextHideMnemonic;
- QCommonStyle::drawItemText(p, r, flags, pal, enabled, text, textRole);
-}
-
-QIcon QMacStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *opt) const
-{
- switch (standardIcon) {
- default:
- return QCommonStyle::standardIcon(standardIcon, opt);
- case SP_ToolBarHorizontalExtensionButton:
- case SP_ToolBarVerticalExtensionButton: {
- QPixmap pixmap(QLatin1String(":/qt-project.org/styles/macstyle/images/toolbar-ext.png"));
- if (standardIcon == SP_ToolBarVerticalExtensionButton) {
- QPixmap pix2(pixmap.height(), pixmap.width());
- pix2.setDevicePixelRatio(pixmap.devicePixelRatio());
- pix2.fill(Qt::transparent);
- QPainter p(&pix2);
- p.translate(pix2.width(), 0);
- p.rotate(90);
- p.drawPixmap(0, 0, pixmap);
- return pix2;
- }
- return pixmap;
- }
- }
-}
-
-} // QQC2_NAMESPACE
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p.h b/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p.h
deleted file mode 100644
index b9e1c5f3..00000000
--- a/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QMACSTYLE_MAC_P_H
-#define QMACSTYLE_MAC_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qquickcommonstyle.h"
-
-#define QQC2_NAMESPACE QQC2
-
-QT_BEGIN_NAMESPACE
-
-class QPalette;
-
-namespace QQC2_NAMESPACE {
-
-class QStyleOptionButton;
-class QMacStylePrivate;
-
-class QMacStyle : public QCommonStyle
-{
- Q_OBJECT
-public:
- QMacStyle();
- ~QMacStyle();
-
- void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const override;
- void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p) const override;
- void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const override;
-
- QRect subElementRect(SubElement r, const QStyleOption *opt) const override;
- QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc) const override;
- SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt) const override;
-
- QSize sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &contentsSize) const override;
- QFont font(ControlElement element, const QStyle::State state) const override;
- QMargins ninePatchMargins(ComplexControl cc, const QStyleOptionComplex *opt, const QSize &imageSize) const override;
-
- int pixelMetric(PixelMetric pm, const QStyleOption *opt = 0) const override;
- int styleHint(StyleHint sh, const QStyleOption *opt = 0, QStyleHintReturn *shret = 0) const override;
-
- QPixmap standardPixmap(StandardPixmap sp, const QStyleOption *opt) const override;
- QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const override;
-
- void drawItemText(QPainter *p, const QRect &r, int flags, const QPalette &pal,
- bool enabled, const QString &text,
- QPalette::ColorRole textRole = QPalette::NoRole) const override;
-
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *opt = 0) const override;
-
-private:
- Q_DISABLE_COPY_MOVE(QMacStyle)
- Q_DECLARE_PRIVATE(QMacStyle)
-};
-
-} // QQC2_NAMESPACE
-
-QT_END_NAMESPACE
-
-#endif // QMACSTYLE_MAC_P_H
diff --git a/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p_p.h b/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p_p.h
deleted file mode 100644
index a0c67bfb..00000000
--- a/src/quicknativestyle/qstyle/mac/qquickmacstyle_mac_p_p.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef QMACSTYLE_MAC_P_P_H
-#define QMACSTYLE_MAC_P_P_H
-
-#include "qquickmacstyle_mac_p.h"
-#include "qquickcommonstyle_p.h"
-#include "qquickstylehelper_p.h"
-
-#include <QtCore/qdebug.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qmap.h>
-#include <QtCore/qmath.h>
-#include <QtCore/qpair.h>
-#include <QtCore/qpointer.h>
-#include <QtCore/qtextstream.h>
-#include <QtCore/qvector.h>
-
-#include <QtGui/qbitmap.h>
-#include <QtGui/qevent.h>
-#include <QtGui/qpaintdevice.h>
-#include <QtGui/qpainter.h>
-#include <QtGui/qpixmapcache.h>
-
-#include <QtQuick/qquickitem.h>
-
-#include <QtCore/private/qcore_mac_p.h>
-#include <QtGui/private/qpainter_p.h>
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-Q_FORWARD_DECLARE_MUTABLE_CG_TYPE(CGContext);
-
-Q_FORWARD_DECLARE_OBJC_CLASS(NSView);
-Q_FORWARD_DECLARE_OBJC_CLASS(NSCell);
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-/*
- AHIG:
- macOS Human Interface Guidelines
- https://developer.apple.com/macos/human-interface-guidelines/overview/themes/
-
- Builder:
- Interface Builder in Xcode 8 or later
-*/
-
-// this works as long as we have at most 16 different control types
-#define CT1(c) CT2(c, c)
-#define CT2(c1, c2) ((uint(c1) << 16) | uint(c2))
-
-#define SIZE(large, small, mini) \
- (controlSize == QStyleHelper::SizeLarge ? (large) : controlSize == QStyleHelper::SizeSmall ? (small) : (mini))
-
-// same as return SIZE(...) but optimized
-#define return_SIZE(large, small, mini) \
- do { \
- static const int sizes[] = { (large), (small), (mini) }; \
- return sizes[controlSize]; \
- } while (false)
-
-class QMacStylePrivate : public QCommonStylePrivate
-{
- Q_DECLARE_PUBLIC(QMacStyle)
-
-public:
- enum Direction {
- North, South, East, West
- };
-
- enum CocoaControlType {
- NoControl, // For when there's no such a control in Cocoa
- Box, // QGroupBox
- Box_Dark, // FIXME See render code in drawPrimitive(PE_FrameTabWidget)
- Button_CheckBox,
- Button_Disclosure, // Disclosure triangle, like in QTreeView
- Button_PopupButton, // Non-editable QComboBox
- Button_PullDown, // QPushButton with menu
- Button_PushButton, // Plain QPushButton and QTabBar buttons
- Button_RadioButton,
- Button_SquareButton, // Oversized QPushButton
- Button_WindowClose,
- Button_WindowMiniaturize,
- Button_WindowZoom,
- ComboBox, // Editable QComboBox
- ProgressIndicator_Determinate,
- ProgressIndicator_Indeterminate,
- Scroller_Horizontal,
- Scroller_Vertical,
- SegmentedControl_First, // QTabBar buttons focus ring
- SegmentedControl_Middle,
- SegmentedControl_Last,
- SegmentedControl_Single,
- Slider_Horizontal,
- Slider_Vertical,
- SplitView_Horizontal,
- SplitView_Vertical,
- Stepper, // QSpinBox buttons
- TextField
- };
-
- struct CocoaControl {
- CocoaControl();
- CocoaControl(CocoaControlType t, QStyleHelper::WidgetSizePolicy s);
-
- CocoaControlType type;
- QStyleHelper::WidgetSizePolicy size;
-
- bool operator==(const CocoaControl &other) const;
-
- QSizeF defaultFrameSize() const;
- QRectF adjustedControlFrame(const QRectF &rect) const;
- QMarginsF titleMargins() const;
-
- bool getCocoaButtonTypeAndBezelStyle(NSButtonType *buttonType, NSBezelStyle *bezelStyle) const;
- };
-
- typedef void (^DrawRectBlock)(CGContextRef, const CGRect &);
-
- QMacStylePrivate();
- ~QMacStylePrivate();
-
- // Ideally these wouldn't exist, but since they already exist we need some accessors.
- static const int PushButtonLeftOffset;
- static const int PushButtonRightOffset;
- static const int PushButtonContentPadding;
-
- enum Animates { AquaPushButton, AquaProgressBar, AquaListViewItemOpen, AquaScrollBar };
- QStyleHelper::WidgetSizePolicy aquaSizeConstrain(const QStyleOption *option,
- QStyle::ContentsType ct = QStyle::CT_CustomBase,
- QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
- QStyleHelper::WidgetSizePolicy effectiveAquaSizeConstrain(const QStyleOption *option,
- QStyle::ContentsType ct = QStyle::CT_CustomBase,
- QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
- inline int animateSpeed(Animates) const { return 33; }
-
- // Utility functions
- static CGRect comboboxInnerBounds(const CGRect &outterBounds, const CocoaControl &cocoaWidget);
-
- static QRectF comboboxEditBounds(const QRectF &outterBounds, const CocoaControl &cw);
-
- void setAutoDefaultButton(QObject *button) const;
-
- NSView *cocoaControl(CocoaControl cocoaControl) const;
- NSCell *cocoaCell(CocoaControl cocoaControl) const;
-
- void setupNSGraphicsContext(CGContextRef cg, bool flipped) const;
- void restoreNSGraphicsContext(CGContextRef cg) const;
-
- void setupVerticalInvertedXform(CGContextRef cg, bool reverse, bool vertical, const CGRect &rect) const;
-
- void drawNSViewInRect(NSView *view, const QRectF &rect, QPainter *p, DrawRectBlock drawRectBlock = nil) const;
- void resolveCurrentNSView(QWindow *window) const;
-
- void drawToolbarButtonArrow(const QStyleOption *opt, QPainter *p) const;
-
- QPainterPath windowPanelPath(const QRectF &r) const;
-
- CocoaControlType windowButtonCocoaControl(QStyle::SubControl sc) const;
-
- void tabLayout(const QStyleOptionTab *opt, QRect *textRect, QRect *iconRect) const override;
- static Direction tabDirection(QStyleOptionTab::Shape shape);
- static bool verticalTabs(QMacStylePrivate::Direction tabDirection);
-
-public:
- mutable QPointer<QObject> autoDefaultButton;
- static QVector<QPointer<QObject> > scrollBars;
-
- mutable QPointer<QQuickItem> focusWidget; // TODO: rename to focusItem
- mutable NSView *backingStoreNSView;
- mutable QHash<CocoaControl, NSView *> cocoaControls;
- mutable QHash<CocoaControl, NSCell *> cocoaCells;
-
- QFont smallSystemFont;
- QFont miniSystemFont;
-
- QMacKeyValueObserver appearanceObserver;
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QMACSTYLE_MAC_P_P_H
diff --git a/src/quicknativestyle/qstyle/qquickcommonstyle.cpp b/src/quicknativestyle/qstyle/qquickcommonstyle.cpp
deleted file mode 100644
index c5797009..00000000
--- a/src/quicknativestyle/qstyle/qquickcommonstyle.cpp
+++ /dev/null
@@ -1,6082 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickcommonstyle.h"
-#include "qquickcommonstyle_p.h"
-#include "qquickcommonstylepixmaps_p.h"
-
-#include "qquickstyleoption.h"
-#include "qquickdrawutil.h"
-#include "qquickstylehelper_p.h"
-
-#include <QtGui/QWindow>
-#include <qfile.h>
-#include <private/qguiapplication_p.h>
-#include <qpa/qplatformtheme.h>
-#include <qbitmap.h>
-#include <qcache.h>
-#include <qmath.h>
-#include <qpainter.h>
-#include <qpaintengine.h>
-#include <qpainterpath.h>
-#include <private/qmath_p.h>
-#include <qdebug.h>
-#include <qtextformat.h>
-#include <qfileinfo.h>
-#include <qdir.h>
-#include <qsettings.h>
-#include <qvariant.h>
-#include <qpixmapcache.h>
-#include <qmatrix4x4.h>
-
-#include <limits.h>
-
-#include <private/qtextengine_p.h>
-#include <QtGui/private/qhexstring_p.h>
-
-QT_BEGIN_NAMESPACE
-
-static inline qreal dpr(const QWindow *w)
-{
- return w != nullptr ? w->devicePixelRatio() : qApp->devicePixelRatio();
-}
-
-/*!
- \class QCommonStyle
- \brief The QCommonStyle class encapsulates the common Look and Feel of a GUI.
-
- \ingroup appearance
- \inmodule QtWidgets
-
- This abstract class implements some of the widget's look and feel
- that is common to all GUI styles provided and shipped as part of
- Qt.
-
- Since QCommonStyle inherits QStyle, all of its functions are fully documented
- in the QStyle documentation.
- \omit
- , although the
- extra functions that QCommonStyle provides, e.g.
- drawComplexControl(), drawControl(), drawPrimitive(),
- hitTestComplexControl(), subControlRect(), sizeFromContents(), and
- subElementRect() are documented here.
- \endomit
-
- \sa QStyle, QProxyStyle
-*/
-
-namespace QQC2 {
-
-QCommonStyle::QCommonStyle()
- : QStyle(*new QCommonStylePrivate)
-{ }
-
-QCommonStyle::QCommonStyle(QCommonStylePrivate &dd)
- : QStyle(dd)
-{ }
-
-QCommonStyle::~QCommonStyle()
-{ }
-
-void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const
-{
- Q_D(const QCommonStyle);
- switch (pe) {
- case PE_FrameButtonBevel:
- case PE_FrameButtonTool:
- qDrawShadeRect(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1, 0);
- break;
- case PE_PanelButtonCommand:
- case PE_PanelButtonBevel:
- case PE_PanelButtonTool:
- case PE_IndicatorButtonDropDown:
- qDrawShadePanel(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1,
- &opt->palette.brush(QPalette::Button));
- break;
- case PE_IndicatorItemViewItemCheck:
- proxy()->drawPrimitive(PE_IndicatorCheckBox, opt, p);
- break;
- case PE_IndicatorCheckBox:
- if (opt->state & State_NoChange) {
- p->setPen(opt->palette.windowText().color());
- p->fillRect(opt->rect, opt->palette.brush(QPalette::Button));
- p->drawRect(opt->rect);
- p->drawLine(opt->rect.topLeft(), opt->rect.bottomRight());
- } else {
- qDrawShadePanel(p, opt->rect.x(), opt->rect.y(), opt->rect.width(), opt->rect.height(),
- opt->palette, opt->state & (State_Sunken | State_On), 1,
- &opt->palette.brush(QPalette::Button));
- }
- break;
- case PE_IndicatorRadioButton: {
- QRect ir = opt->rect;
- p->setPen(opt->palette.dark().color());
- p->drawArc(opt->rect, 0, 5760);
- if (opt->state & (State_Sunken | State_On)) {
- ir.adjust(2, 2, -2, -2);
- p->setBrush(opt->palette.windowText());
- p->drawEllipse(ir);
- }
- break; }
- case PE_FrameFocusRect:
- if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(opt)) {
- QColor bg = fropt->backgroundColor;
- QPen oldPen = p->pen();
- if (bg.isValid()) {
- int h, s, v;
- bg.getHsv(&h, &s, &v);
- if (v >= 128)
- p->setPen(Qt::black);
- else
- p->setPen(Qt::white);
- } else {
- p->setPen(opt->palette.windowText().color());
- }
- QRect focusRect = opt->rect.adjusted(1, 1, -1, -1);
- p->drawRect(focusRect.adjusted(0, 0, -1, -1)); //draw pen inclusive
- p->setPen(oldPen);
- }
- break;
- case PE_IndicatorMenuCheckMark: {
- const int markW = opt->rect.width() > 7 ? 7 : opt->rect.width();
- const int markH = markW;
- int posX = opt->rect.x() + (opt->rect.width() - markW)/2 + 1;
- int posY = opt->rect.y() + (opt->rect.height() - markH)/2;
-
- QVector<QLineF> a;
- a.reserve(markH);
-
- int i, xx, yy;
- xx = posX;
- yy = 3 + posY;
- for (i = 0; i < markW/2; ++i) {
- a << QLineF(xx, yy, xx, yy + 2);
- ++xx;
- ++yy;
- }
- yy -= 2;
- for (; i < markH; ++i) {
- a << QLineF(xx, yy, xx, yy + 2);
- ++xx;
- --yy;
- }
- if (!(opt->state & State_Enabled) && !(opt->state & State_On)) {
- p->save();
- p->translate(1, 1);
- p->setPen(opt->palette.light().color());
- p->drawLines(a);
- p->restore();
- }
- p->setPen((opt->state & State_On) ? opt->palette.highlightedText().color() : opt->palette.text().color());
- p->drawLines(a);
- break; }
- case PE_Frame:
- case PE_FrameMenu:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (pe == PE_FrameMenu || (frame->state & State_Sunken) || (frame->state & State_Raised)) {
- qDrawShadePanel(p, frame->rect, frame->palette, frame->state & State_Sunken,
- frame->lineWidth);
- } else {
- qDrawPlainRect(p, frame->rect, frame->palette.windowText().color(), frame->lineWidth);
- }
- }
- break;
- case PE_PanelMenuBar:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)){
- qDrawShadePanel(p, frame->rect, frame->palette, false, frame->lineWidth,
- &frame->palette.brush(QPalette::Button));
-
- }
- else if (const QStyleOptionToolBar *frame = qstyleoption_cast<const QStyleOptionToolBar *>(opt)){
- qDrawShadePanel(p, frame->rect, frame->palette, false, frame->lineWidth,
- &frame->palette.brush(QPalette::Button));
- }
-
- break;
- case PE_PanelMenu:
- break;
- case PE_PanelToolBar:
- break;
- case PE_IndicatorProgressChunk:
- {
- p->fillRect(opt->rect.x(), opt->rect.y() + 3, opt->rect.width() -2, opt->rect.height() - 6,
- opt->palette.brush(QPalette::Highlight));
- }
- break;
- case PE_IndicatorBranch: {
- static const int decoration_size = 9;
- int mid_h = opt->rect.x() + opt->rect.width() / 2;
- int mid_v = opt->rect.y() + opt->rect.height() / 2;
- int bef_h = mid_h;
- int bef_v = mid_v;
- int aft_h = mid_h;
- int aft_v = mid_v;
- if (opt->state & State_Children) {
- int delta = decoration_size / 2;
- bef_h -= delta;
- bef_v -= delta;
- aft_h += delta;
- aft_v += delta;
- p->drawLine(bef_h + 2, bef_v + 4, bef_h + 6, bef_v + 4);
- if (!(opt->state & State_Open))
- p->drawLine(bef_h + 4, bef_v + 2, bef_h + 4, bef_v + 6);
- QPen oldPen = p->pen();
- p->setPen(opt->palette.dark().color());
- p->drawRect(bef_h, bef_v, decoration_size - 1, decoration_size - 1);
- p->setPen(oldPen);
- }
- QBrush brush(opt->palette.dark().color(), Qt::Dense4Pattern);
- if (opt->state & State_Item) {
- if (opt->direction == Qt::RightToLeft)
- p->fillRect(opt->rect.left(), mid_v, bef_h - opt->rect.left(), 1, brush);
- else
- p->fillRect(aft_h, mid_v, opt->rect.right() - aft_h + 1, 1, brush);
- }
- if (opt->state & State_Sibling)
- p->fillRect(mid_h, aft_v, 1, opt->rect.bottom() - aft_v + 1, brush);
- if (opt->state & (State_Open | State_Children | State_Item | State_Sibling))
- p->fillRect(mid_h, opt->rect.y(), 1, bef_v - opt->rect.y(), brush);
- break; }
- case PE_FrameStatusBarItem:
- qDrawShadeRect(p, opt->rect, opt->palette, true, 1, 0, nullptr);
- break;
- case PE_IndicatorHeaderArrow:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QPen oldPen = p->pen();
- if (header->sortIndicator & QStyleOptionHeader::SortUp) {
- p->setPen(QPen(opt->palette.light(), 0));
- p->drawLine(opt->rect.x() + opt->rect.width(), opt->rect.y(),
- opt->rect.x() + opt->rect.width() / 2, opt->rect.y() + opt->rect.height());
- p->setPen(QPen(opt->palette.dark(), 0));
- const QPoint points[] = {
- QPoint(opt->rect.x() + opt->rect.width() / 2, opt->rect.y() + opt->rect.height()),
- QPoint(opt->rect.x(), opt->rect.y()),
- QPoint(opt->rect.x() + opt->rect.width(), opt->rect.y()),
- };
- p->drawPolyline(points, sizeof points / sizeof *points);
- } else if (header->sortIndicator & QStyleOptionHeader::SortDown) {
- p->setPen(QPen(opt->palette.light(), 0));
- const QPoint points[] = {
- QPoint(opt->rect.x(), opt->rect.y() + opt->rect.height()),
- QPoint(opt->rect.x() + opt->rect.width(), opt->rect.y() + opt->rect.height()),
- QPoint(opt->rect.x() + opt->rect.width() / 2, opt->rect.y()),
- };
- p->drawPolyline(points, sizeof points / sizeof *points);
- p->setPen(QPen(opt->palette.dark(), 0));
- p->drawLine(opt->rect.x(), opt->rect.y() + opt->rect.height(),
- opt->rect.x() + opt->rect.width() / 2, opt->rect.y());
- }
- p->setPen(oldPen);
- }
- break;
- case PE_FrameTabBarBase:
- if (const QStyleOptionTabBarBase *tbb
- = qstyleoption_cast<const QStyleOptionTabBarBase *>(opt)) {
- p->save();
- switch (tbb->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- p->setPen(QPen(tbb->palette.light(), 0));
- p->drawLine(tbb->rect.topLeft(), tbb->rect.topRight());
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- p->setPen(QPen(tbb->palette.light(), 0));
- p->drawLine(tbb->rect.topLeft(), tbb->rect.bottomLeft());
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- p->setPen(QPen(tbb->palette.shadow(), 0));
- p->drawLine(tbb->rect.left(), tbb->rect.bottom(),
- tbb->rect.right(), tbb->rect.bottom());
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.left(), tbb->rect.bottom() - 1,
- tbb->rect.right() - 1, tbb->rect.bottom() - 1);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.topRight(), tbb->rect.bottomRight());
- break;
- }
- p->restore();
- }
- break;
- case PE_IndicatorTabClose: {
- if (d->tabBarcloseButtonIcon.isNull()) {
- d->tabBarcloseButtonIcon.addPixmap(QPixmap(
- QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-16.png")),
- QIcon::Normal, QIcon::Off);
- d->tabBarcloseButtonIcon.addPixmap(QPixmap(
- QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-down-16.png")),
- QIcon::Normal, QIcon::On);
- d->tabBarcloseButtonIcon.addPixmap(QPixmap(
- QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-hover-16.png")),
- QIcon::Active, QIcon::Off);
- }
-
- int size = proxy()->pixelMetric(QStyle::PM_SmallIconSize);
- QIcon::Mode mode = opt->state & State_Enabled ?
- (opt->state & State_Raised ? QIcon::Active : QIcon::Normal)
- : QIcon::Disabled;
- if (!(opt->state & State_Raised)
- && !(opt->state & State_Sunken)
- && !(opt->state & QStyle::State_Selected))
- mode = QIcon::Disabled;
-
- QIcon::State state = opt->state & State_Sunken ? QIcon::On : QIcon::Off;
- QPixmap pixmap = d->tabBarcloseButtonIcon.pixmap(QSize(size, size), dpr(opt->window), mode, state);
- proxy()->drawItemPixmap(p, opt->rect, Qt::AlignCenter, pixmap);
- break;
- }
- case PE_FrameTabWidget:
- case PE_FrameWindow:
- qDrawWinPanel(p, opt->rect, opt->palette, false, nullptr);
- break;
- case PE_FrameLineEdit:
- proxy()->drawPrimitive(PE_Frame, opt, p);
- break;
- case PE_FrameGroupBox:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (frame->features & QStyleOptionFrame::Flat) {
- QRect fr = frame->rect;
- QPoint p1(fr.x(), fr.y() + 1);
- QPoint p2(fr.x() + fr.width(), p1.y());
- qDrawShadeLine(p, p1, p2, frame->palette, true,
- frame->lineWidth, frame->midLineWidth);
- } else {
- qDrawShadeRect(p, frame->rect.x(), frame->rect.y(), frame->rect.width(),
- frame->rect.height(), frame->palette, true,
- frame->lineWidth, frame->midLineWidth);
- }
- }
- break;
- case PE_FrameDockWidget:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int lw = frame->lineWidth;
- if (lw <= 0)
- lw = proxy()->pixelMetric(PM_DockWidgetFrameWidth);
-
- qDrawShadePanel(p, frame->rect, frame->palette, false, lw);
- }
- break;
- case PE_IndicatorToolBarHandle:
- p->save();
- p->translate(opt->rect.x(), opt->rect.y());
- if (opt->state & State_Horizontal) {
- int x = opt->rect.width() / 3;
- if (opt->direction == Qt::RightToLeft)
- x -= 2;
- if (opt->rect.height() > 4) {
- qDrawShadePanel(p, x, 2, 3, opt->rect.height() - 4,
- opt->palette, false, 1, nullptr);
- qDrawShadePanel(p, x+3, 2, 3, opt->rect.height() - 4,
- opt->palette, false, 1, nullptr);
- }
- } else {
- if (opt->rect.width() > 4) {
- int y = opt->rect.height() / 3;
- qDrawShadePanel(p, 2, y, opt->rect.width() - 4, 3,
- opt->palette, false, 1, nullptr);
- qDrawShadePanel(p, 2, y+3, opt->rect.width() - 4, 3,
- opt->palette, false, 1, nullptr);
- }
- }
- p->restore();
- break;
- case PE_IndicatorToolBarSeparator:
- {
- QPoint p1, p2;
- if (opt->state & State_Horizontal) {
- p1 = QPoint(opt->rect.width()/2, 0);
- p2 = QPoint(p1.x(), opt->rect.height());
- } else {
- p1 = QPoint(0, opt->rect.height()/2);
- p2 = QPoint(opt->rect.width(), p1.y());
- }
- qDrawShadeLine(p, p1, p2, opt->palette, 1, 1, 0);
- break;
- }
- case PE_IndicatorSpinPlus:
- case PE_IndicatorSpinMinus: {
- QRect r = opt->rect;
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- QRect br = r.adjusted(fw, fw, -fw, -fw);
-
- int offset = (opt->state & State_Sunken) ? 1 : 0;
- int step = (br.width() + 4) / 5;
- p->fillRect(br.x() + offset, br.y() + offset +br.height() / 2 - step / 2,
- br.width(), step,
- opt->palette.buttonText());
- if (pe == PE_IndicatorSpinPlus)
- p->fillRect(br.x() + br.width() / 2 - step / 2 + offset, br.y() + offset,
- step, br.height(),
- opt->palette.buttonText());
-
- break; }
- case PE_IndicatorSpinUp:
- case PE_IndicatorSpinDown: {
- QRect r = opt->rect;
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- // QRect br = r.adjusted(fw, fw, -fw, -fw);
- int x = r.x(), y = r.y(), w = r.width(), h = r.height();
- int sw = w-4;
- if (sw < 3)
- break;
- else if (!(sw & 1))
- sw--;
- sw -= (sw / 7) * 2; // Empty border
- int sh = sw/2 + 2; // Must have empty row at foot of arrow
-
- int sx = x + w / 2 - sw / 2;
- int sy = y + h / 2 - sh / 2;
-
- if (pe == PE_IndicatorSpinUp && fw)
- --sy;
-
- int bsx = 0;
- int bsy = 0;
- if (opt->state & State_Sunken) {
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- }
- p->save();
- p->translate(sx + bsx, sy + bsy);
- p->setPen(opt->palette.buttonText().color());
- p->setBrush(opt->palette.buttonText());
- if (pe == PE_IndicatorSpinDown) {
- const QPoint points[] = { QPoint(0, 1), QPoint(sw-1, 1), QPoint(sh-2, sh-1) };
- p->drawPolygon(points, sizeof points / sizeof *points);
- } else {
- const QPoint points[] = { QPoint(0, sh-1), QPoint(sw-1, sh-1), QPoint(sh-2, 1) };
- p->drawPolygon(points, sizeof points / sizeof *points);
- }
- p->restore();
- break; }
- case PE_PanelTipLabel: {
- const QBrush brush(opt->palette.toolTipBase());
- qDrawPlainRect(p, opt->rect, opt->palette.toolTipText().color(), 1, &brush);
- break;
- }
- case PE_IndicatorTabTear:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- bool rtl = tab->direction == Qt::RightToLeft;
- const bool horizontal = tab->rect.height() > tab->rect.width();
- const int margin = 4;
- QPainterPath path;
-
- if (horizontal) {
- QRect rect = tab->rect.adjusted(rtl ? margin : 0, 0, rtl ? 1 : -margin, 0);
- rect.setTop(rect.top() + ((tab->state & State_Selected) ? 1 : 3));
- rect.setBottom(rect.bottom() - ((tab->state & State_Selected) ? 0 : 2));
-
- path.moveTo(QPoint(rtl ? rect.right() : rect.left(), rect.top()));
- int count = 4;
- for (int jags = 1; jags <= count; ++jags, rtl = !rtl)
- path.lineTo(QPoint(rtl ? rect.left() : rect.right(), rect.top() + jags * rect.height()/count));
- } else {
- QRect rect = tab->rect.adjusted(0, 0, 0, -margin);
- rect.setLeft(rect.left() + ((tab->state & State_Selected) ? 1 : 3));
- rect.setRight(rect.right() - ((tab->state & State_Selected) ? 0 : 2));
-
- path.moveTo(QPoint(rect.left(), rect.top()));
- int count = 4;
- for (int jags = 1; jags <= count; ++jags, rtl = !rtl)
- path.lineTo(QPoint(rect.left() + jags * rect.width()/count, rtl ? rect.top() : rect.bottom()));
- }
-
- p->setPen(QPen(tab->palette.dark(), qreal(.8)));
- p->setBrush(tab->palette.window());
- p->setRenderHint(QPainter::Antialiasing);
- p->drawPath(path);
- }
- break;
- case PE_PanelLineEdit:
- if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- p->fillRect(panel->rect.adjusted(panel->lineWidth, panel->lineWidth, -panel->lineWidth, -panel->lineWidth),
- panel->palette.brush(QPalette::Base));
-
- if (panel->lineWidth > 0)
- proxy()->drawPrimitive(PE_FrameLineEdit, panel, p);
- }
- break;
- case PE_IndicatorColumnViewArrow: {
- if (const QStyleOptionViewItem *viewOpt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- bool reverse = (viewOpt->direction == Qt::RightToLeft);
- p->save();
- QPainterPath path;
- int x = viewOpt->rect.x() + 1;
- int offset = (viewOpt->rect.height() / 3);
- int height = (viewOpt->rect.height()) - offset * 2;
- if (height % 2 == 1)
- --height;
- int x2 = x + height - 1;
- if (reverse) {
- x = viewOpt->rect.x() + viewOpt->rect.width() - 1;
- x2 = x - height + 1;
- }
- path.moveTo(x, viewOpt->rect.y() + offset);
- path.lineTo(x, viewOpt->rect.y() + offset + height);
- path.lineTo(x2, viewOpt->rect.y() + offset+height/2);
- path.closeSubpath();
- if (viewOpt->state & QStyle::State_Selected ) {
- if (viewOpt->showDecorationSelected) {
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::HighlightedText);
- p->setPen(color);
- p->setBrush(color);
- } else {
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::WindowText);
- p->setPen(color);
- p->setBrush(color);
- }
-
- } else {
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::Mid);
- p->setPen(color);
- p->setBrush(color);
- }
- p->drawPath(path);
-
- // draw the vertical and top triangle line
- if (!(viewOpt->state & QStyle::State_Selected)) {
- QPainterPath lines;
- lines.moveTo(x, viewOpt->rect.y() + offset);
- lines.lineTo(x, viewOpt->rect.y() + offset + height);
- lines.moveTo(x, viewOpt->rect.y() + offset);
- lines.lineTo(x2, viewOpt->rect.y() + offset+height/2);
- QColor color = viewOpt->palette.color(QPalette::Active, QPalette::Dark);
- p->setPen(color);
- p->drawPath(lines);
- }
- p->restore();
- }
- break; }
- case PE_IndicatorItemViewItemDrop: {
- QRect rect = opt->rect;
- if (opt->rect.height() == 0)
- p->drawLine(rect.topLeft(), rect.topRight());
- else
- p->drawRect(rect);
- break; }
- case PE_PanelItemViewRow:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- if ((vopt->state & QStyle::State_Selected) && proxy()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, opt))
- p->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::Highlight));
- else if (vopt->features & QStyleOptionViewItem::Alternate)
- p->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::AlternateBase));
- }
- break;
- case PE_PanelItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- if (vopt->showDecorationSelected && (vopt->state & QStyle::State_Selected)) {
- p->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::Highlight));
- } else {
- if (vopt->backgroundBrush.style() != Qt::NoBrush) {
- QPointF oldBO = p->brushOrigin();
- p->setBrushOrigin(vopt->rect.topLeft());
- p->fillRect(vopt->rect, vopt->backgroundBrush);
- p->setBrushOrigin(oldBO);
- }
-
- if (vopt->state & QStyle::State_Selected) {
- QRect textRect = subElementRect(QStyle::SE_ItemViewItemText, opt);
- p->fillRect(textRect, vopt->palette.brush(cg, QPalette::Highlight));
- }
- }
- }
- break;
- case PE_PanelScrollAreaCorner: {
- const QBrush brush(opt->palette.brush(QPalette::Window));
- p->fillRect(opt->rect, brush);
- } break;
- case PE_IndicatorArrowUp:
- case PE_IndicatorArrowDown:
- case PE_IndicatorArrowRight:
- case PE_IndicatorArrowLeft:
- {
- if (opt->rect.width() <= 1 || opt->rect.height() <= 1)
- break;
- QRect r = opt->rect;
- int size = qMin(r.height(), r.width());
- QPixmap pixmap;
- QString pixmapName = QStyleHelper::uniqueName(QLatin1String("$qt_ia-")
- % QLatin1String(metaObject()->className()), opt, QSize(size, size))
- % HexString<uint>(pe);
- if (!QPixmapCache::find(pixmapName, &pixmap)) {
- qreal pixelRatio = p->device()->devicePixelRatioF();
- int border = qRound(pixelRatio*(size/5));
- int sqsize = qRound(pixelRatio*(2*(size/2)));
- QImage image(sqsize, sqsize, QImage::Format_ARGB32_Premultiplied);
- image.fill(0);
- QPainter imagePainter(&image);
-
- QPolygon a;
- switch (pe) {
- case PE_IndicatorArrowUp:
- a.setPoints(3, border, sqsize/2, sqsize/2, border, sqsize - border, sqsize/2);
- break;
- case PE_IndicatorArrowDown:
- a.setPoints(3, border, sqsize/2, sqsize/2, sqsize - border, sqsize - border, sqsize/2);
- break;
- case PE_IndicatorArrowRight:
- a.setPoints(3, sqsize - border, sqsize/2, sqsize/2, border, sqsize/2, sqsize - border);
- break;
- case PE_IndicatorArrowLeft:
- a.setPoints(3, border, sqsize/2, sqsize/2, border, sqsize/2, sqsize - border);
- break;
- default:
- break;
- }
-
- int bsx = 0;
- int bsy = 0;
-
- if (opt->state & State_Sunken) {
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt);
- }
-
- QRect bounds = a.boundingRect();
- int sx = sqsize / 2 - bounds.center().x() - 1;
- int sy = sqsize / 2 - bounds.center().y() - 1;
- imagePainter.translate(sx + bsx, sy + bsy);
- imagePainter.setPen(opt->palette.buttonText().color());
- imagePainter.setBrush(opt->palette.buttonText());
-
- if (!(opt->state & State_Enabled)) {
- imagePainter.translate(1, 1);
- imagePainter.setBrush(opt->palette.light().color());
- imagePainter.setPen(opt->palette.light().color());
- imagePainter.drawPolygon(a);
- imagePainter.translate(-1, -1);
- imagePainter.setBrush(opt->palette.mid().color());
- imagePainter.setPen(opt->palette.mid().color());
- }
-
- imagePainter.drawPolygon(a);
- imagePainter.end();
- pixmap = QPixmap::fromImage(image);
- pixmap.setDevicePixelRatio(pixelRatio);
- QPixmapCache::insert(pixmapName, pixmap);
- }
- int xOffset = r.x() + (r.width() - size)/2;
- int yOffset = r.y() + (r.height() - size)/2;
- p->drawPixmap(xOffset, yOffset, pixmap);
- }
- break;
- default:
- break;
- }
-}
-
-static void drawArrow(const QStyle *style, const QStyleOptionToolButton *toolbutton,
- const QRect &rect, QPainter *painter)
-{
- QStyle::PrimitiveElement pe;
- switch (toolbutton->arrowType) {
- case Qt::LeftArrow:
- pe = QStyle::PE_IndicatorArrowLeft;
- break;
- case Qt::RightArrow:
- pe = QStyle::PE_IndicatorArrowRight;
- break;
- case Qt::UpArrow:
- pe = QStyle::PE_IndicatorArrowUp;
- break;
- case Qt::DownArrow:
- pe = QStyle::PE_IndicatorArrowDown;
- break;
- default:
- return;
- }
- QStyleOption arrowOpt = *toolbutton;
- arrowOpt.rect = rect;
- style->drawPrimitive(pe, &arrowOpt, painter);
-}
-
-static QSizeF viewItemTextLayout(QTextLayout &textLayout, int lineWidth, int maxHeight = -1, int *lastVisibleLine = nullptr)
-{
- if (lastVisibleLine)
- *lastVisibleLine = -1;
- qreal height = 0;
- qreal widthUsed = 0;
- textLayout.beginLayout();
- int i = 0;
- while (true) {
- QTextLine line = textLayout.createLine();
- if (!line.isValid())
- break;
- line.setLineWidth(lineWidth);
- line.setPosition(QPointF(0, height));
- height += line.height();
- widthUsed = qMax(widthUsed, line.naturalTextWidth());
- // we assume that the height of the next line is the same as the current one
- if (maxHeight > 0 && lastVisibleLine && height + line.height() > maxHeight) {
- const QTextLine nextLine = textLayout.createLine();
- *lastVisibleLine = nextLine.isValid() ? i : -1;
- break;
- }
- ++i;
- }
- textLayout.endLayout();
- return QSizeF(widthUsed, height);
-}
-
-QString QCommonStylePrivate::calculateElidedText(const QString &text, const QTextOption &textOption,
- const QFont &font, const QRect &textRect, const Qt::Alignment valign,
- Qt::TextElideMode textElideMode, int flags,
- bool lastVisibleLineShouldBeElided, QPointF *paintStartPosition) const
-{
- QTextLayout textLayout(text, font);
- textLayout.setTextOption(textOption);
-
- // In AlignVCenter mode when more than one line is displayed and the height only allows
- // some of the lines it makes no sense to display those. From a users perspective it makes
- // more sense to see the start of the text instead something inbetween.
- const bool vAlignmentOptimization = paintStartPosition && valign.testFlag(Qt::AlignVCenter);
-
- int lastVisibleLine = -1;
- viewItemTextLayout(textLayout, textRect.width(), vAlignmentOptimization ? textRect.height() : -1, &lastVisibleLine);
-
- const QRectF boundingRect = textLayout.boundingRect();
- // don't care about LTR/RTL here, only need the height
- const QRect layoutRect = QStyle::alignedRect(Qt::LayoutDirectionAuto, valign,
- boundingRect.size().toSize(), textRect);
-
- if (paintStartPosition)
- *paintStartPosition = QPointF(textRect.x(), layoutRect.top());
-
- QString ret;
- qreal height = 0;
- const int lineCount = textLayout.lineCount();
- for (int i = 0; i < lineCount; ++i) {
- const QTextLine line = textLayout.lineAt(i);
- height += line.height();
-
- // above visible rect
- if (height + layoutRect.top() <= textRect.top()) {
- if (paintStartPosition)
- paintStartPosition->ry() += line.height();
- continue;
- }
-
- const int start = line.textStart();
- const int length = line.textLength();
- const bool drawElided = line.naturalTextWidth() > textRect.width();
- bool elideLastVisibleLine = lastVisibleLine == i;
- if (!drawElided && i + 1 < lineCount && lastVisibleLineShouldBeElided) {
- const QTextLine nextLine = textLayout.lineAt(i + 1);
- const int nextHeight = height + nextLine.height() / 2;
- // elide when less than the next half line is visible
- if (nextHeight + layoutRect.top() > textRect.height() + textRect.top())
- elideLastVisibleLine = true;
- }
-
- QString text = textLayout.text().mid(start, length);
- if (drawElided || elideLastVisibleLine) {
- if (elideLastVisibleLine) {
- if (text.endsWith(QChar::LineSeparator))
- text.chop(1);
- text += QChar(0x2026);
- }
- const QStackTextEngine engine(text, font);
- ret += engine.elidedText(textElideMode, textRect.width(), flags);
-
- // no newline for the last line (last visible or real)
- // sometimes drawElided is true but no eliding is done so the text ends
- // with QChar::LineSeparator - don't add another one. This happened with
- // arabic text in the testcase for QTBUG-72805
- if (i < lineCount - 1 &&
- !ret.endsWith(QChar::LineSeparator))
- ret += QChar::LineSeparator;
- } else {
- ret += text;
- }
-
- // below visible text, can stop
- if ((height + layoutRect.top() >= textRect.bottom()) ||
- (lastVisibleLine >= 0 && lastVisibleLine == i))
- break;
- }
- return ret;
-}
-
-QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int role) const
-{
- switch (role) {
- case Qt::CheckStateRole:
- if (option->features & QStyleOptionViewItem::HasCheckIndicator)
- return QSize(proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth, option),
- proxyStyle->pixelMetric(QStyle::PM_IndicatorHeight, option));
- break;
- case Qt::DisplayRole:
- if (option->features & QStyleOptionViewItem::HasDisplay) {
- QTextOption textOption;
- textOption.setWrapMode(QTextOption::WordWrap);
- QTextLayout textLayout(option->text, option->font);
- textLayout.setTextOption(textOption);
- const bool wrapText = option->features & QStyleOptionViewItem::WrapText;
- const int textMargin = proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, option) + 1;
- QRect bounds = option->rect;
- switch (option->decorationPosition) {
- case QStyleOptionViewItem::Left:
- case QStyleOptionViewItem::Right: {
- if (wrapText && bounds.isValid()) {
- int width = bounds.width() - 2 * textMargin;
- if (option->features & QStyleOptionViewItem::HasDecoration)
- width -= option->decorationSize.width() + 2 * textMargin;
- bounds.setWidth(width);
- } else
- bounds.setWidth(QFIXED_MAX);
- break;
- }
- case QStyleOptionViewItem::Top:
- case QStyleOptionViewItem::Bottom:
- if (wrapText)
- bounds.setWidth(bounds.isValid() ? bounds.width() - 2 * textMargin : option->decorationSize.width());
- else
- bounds.setWidth(QFIXED_MAX);
- break;
- default:
- break;
- }
-
- if (wrapText && option->features & QStyleOptionViewItem::HasCheckIndicator)
- bounds.setWidth(bounds.width() - proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth) - 2 * textMargin);
-
- const int lineWidth = bounds.width();
- const QSizeF size = viewItemTextLayout(textLayout, lineWidth);
- return QSize(qCeil(size.width()) + 2 * textMargin, qCeil(size.height()));
- }
- break;
- case Qt::DecorationRole:
- if (option->features & QStyleOptionViewItem::HasDecoration) {
- return option->decorationSize;
- }
- break;
- default:
- break;
- }
-
- return QSize(0, 0);
-}
-
-void QCommonStylePrivate::viewItemDrawText(QPainter *p, const QStyleOptionViewItem *option, const QRect &rect) const
-{
- const int textMargin = proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr) + 1;
-
- QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding
- const bool wrapText = option->features & QStyleOptionViewItem::WrapText;
- QTextOption textOption;
- textOption.setWrapMode(wrapText ? QTextOption::WordWrap : QTextOption::ManualWrap);
- textOption.setTextDirection(option->direction);
- textOption.setAlignment(QStyle::visualAlignment(option->direction, option->displayAlignment));
-
- QPointF paintPosition;
- const QString newText = calculateElidedText(option->text, textOption,
- option->font, textRect, option->displayAlignment,
- option->textElideMode, 0,
- true, &paintPosition);
-
- QTextLayout textLayout(newText, option->font);
- textLayout.setTextOption(textOption);
- viewItemTextLayout(textLayout, textRect.width());
- textLayout.draw(p, paintPosition);
-}
-
-/*! \internal
- compute the position for the different component of an item (pixmap, text, checkbox)
-
- Set sizehint to false to layout the elements inside opt->rect. Set sizehint to true to ignore
- opt->rect and return rectangles in infinite space
-
- Code duplicated in QItemDelegate::doLayout
-*/
-void QCommonStylePrivate::viewItemLayout(const QStyleOptionViewItem *opt, QRect *checkRect,
- QRect *pixmapRect, QRect *textRect, bool sizehint) const
-{
- Q_ASSERT(checkRect && pixmapRect && textRect);
- *pixmapRect = QRect(QPoint(0, 0), viewItemSize(opt, Qt::DecorationRole));
- *textRect = QRect(QPoint(0, 0), viewItemSize(opt, Qt::DisplayRole));
- *checkRect = QRect(QPoint(0, 0), viewItemSize(opt, Qt::CheckStateRole));
-
- const bool hasCheck = checkRect->isValid();
- const bool hasPixmap = pixmapRect->isValid();
- const bool hasText = textRect->isValid();
- const bool hasMargin = (hasText | hasPixmap | hasCheck);
- const int frameHMargin = hasMargin ?
- proxyStyle->pixelMetric(QStyle::PM_FocusFrameHMargin, opt) + 1 : 0;
- const int textMargin = hasText ? frameHMargin : 0;
- const int pixmapMargin = hasPixmap ? frameHMargin : 0;
- const int checkMargin = hasCheck ? frameHMargin : 0;
- const int x = opt->rect.left();
- const int y = opt->rect.top();
- int w, h;
-
- if (textRect->height() == 0 && (!hasPixmap || !sizehint)) {
- //if there is no text, we still want to have a decent height for the item sizeHint and the editor size
- textRect->setHeight(opt->fontMetrics.height());
- }
-
- QSize pm(0, 0);
- if (hasPixmap) {
- pm = pixmapRect->size();
- pm.rwidth() += 2 * pixmapMargin;
- }
- if (sizehint) {
- h = qMax(checkRect->height(), qMax(textRect->height(), pm.height()));
- if (opt->decorationPosition == QStyleOptionViewItem::Left
- || opt->decorationPosition == QStyleOptionViewItem::Right) {
- w = textRect->width() + pm.width();
- } else {
- w = qMax(textRect->width(), pm.width());
- }
- } else {
- w = opt->rect.width();
- h = opt->rect.height();
- }
-
- int cw = 0;
- QRect check;
- if (hasCheck) {
- cw = checkRect->width() + 2 * checkMargin;
- if (sizehint) w += cw;
- if (opt->direction == Qt::RightToLeft) {
- check.setRect(x + w - cw, y, cw, h);
- } else {
- check.setRect(x, y, cw, h);
- }
- }
-
- QRect display;
- QRect decoration;
- switch (opt->decorationPosition) {
- case QStyleOptionViewItem::Top: {
- if (hasPixmap)
- pm.setHeight(pm.height() + pixmapMargin); // add space
- h = sizehint ? textRect->height() : h - pm.height();
-
- if (opt->direction == Qt::RightToLeft) {
- decoration.setRect(x, y, w - cw, pm.height());
- display.setRect(x, y + pm.height(), w - cw, h);
- } else {
- decoration.setRect(x + cw, y, w - cw, pm.height());
- display.setRect(x + cw, y + pm.height(), w - cw, h);
- }
- break; }
- case QStyleOptionViewItem::Bottom: {
- if (hasText)
- textRect->setHeight(textRect->height() + textMargin); // add space
- h = sizehint ? textRect->height() + pm.height() : h;
-
- if (opt->direction == Qt::RightToLeft) {
- display.setRect(x, y, w - cw, textRect->height());
- decoration.setRect(x, y + textRect->height(), w - cw, h - textRect->height());
- } else {
- display.setRect(x + cw, y, w - cw, textRect->height());
- decoration.setRect(x + cw, y + textRect->height(), w - cw, h - textRect->height());
- }
- break; }
- case QStyleOptionViewItem::Left: {
- if (opt->direction == Qt::LeftToRight) {
- decoration.setRect(x + cw, y, pm.width(), h);
- display.setRect(decoration.right() + 1, y, w - pm.width() - cw, h);
- } else {
- display.setRect(x, y, w - pm.width() - cw, h);
- decoration.setRect(display.right() + 1, y, pm.width(), h);
- }
- break; }
- case QStyleOptionViewItem::Right: {
- if (opt->direction == Qt::LeftToRight) {
- display.setRect(x + cw, y, w - pm.width() - cw, h);
- decoration.setRect(display.right() + 1, y, pm.width(), h);
- } else {
- decoration.setRect(x, y, pm.width(), h);
- display.setRect(decoration.right() + 1, y, w - pm.width() - cw, h);
- }
- break; }
- default:
- qWarning("doLayout: decoration position is invalid");
- decoration = *pixmapRect;
- break;
- }
-
- if (!sizehint) { // we only need to do the internal layout if we are going to paint
- *checkRect = QStyle::alignedRect(opt->direction, Qt::AlignCenter,
- checkRect->size(), check);
- *pixmapRect = QStyle::alignedRect(opt->direction, opt->decorationAlignment,
- pixmapRect->size(), decoration);
- // the text takes up all available space, unless the decoration is not shown as selected
- if (opt->showDecorationSelected)
- *textRect = display;
- else
- *textRect = QStyle::alignedRect(opt->direction, opt->displayAlignment,
- textRect->size().boundedTo(display.size()), display);
- } else {
- *checkRect = check;
- *pixmapRect = decoration;
- *textRect = display;
- }
-}
-
-QString QCommonStylePrivate::toolButtonElideText(const QStyleOptionToolButton *option,
- const QRect &textRect, int flags) const
-{
- if (option->fontMetrics.horizontalAdvance(option->text) <= textRect.width())
- return option->text;
-
- QString text = option->text;
- text.replace(QLatin1Char('\n'), QChar::LineSeparator);
- QTextOption textOption;
- textOption.setWrapMode(QTextOption::ManualWrap);
- textOption.setTextDirection(option->direction);
-
- return calculateElidedText(text, textOption,
- option->font, textRect, Qt::AlignTop,
- Qt::ElideMiddle, flags,
- false, nullptr);
-}
-
-/*! \internal
- Compute the textRect and the pixmapRect from the opt rect
-
- Uses the same computation than in QTabBar::tabSizeHint
- */
-void QCommonStylePrivate::tabLayout(const QStyleOptionTab *opt, QRect *textRect, QRect *iconRect) const
-{
- Q_ASSERT(textRect);
- Q_ASSERT(iconRect);
- QRect tr = opt->rect;
- bool verticalTabs = opt->shape == QStyleOptionTab::RoundedEast
- || opt->shape == QStyleOptionTab::RoundedWest
- || opt->shape == QStyleOptionTab::TriangularEast
- || opt->shape == QStyleOptionTab::TriangularWest;
- if (verticalTabs)
- tr.setRect(0, 0, tr.height(), tr.width()); // 0, 0 as we will have a translate transform
-
- int verticalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftVertical, opt);
- int horizontalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, opt);
- int hpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabHSpace, opt) / 2;
- int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt) / 2;
- if (opt->shape == QStyleOptionTab::RoundedSouth || opt->shape == QStyleOptionTab::TriangularSouth)
- verticalShift = -verticalShift;
- tr.adjust(hpadding, verticalShift - vpadding, horizontalShift - hpadding, vpadding);
- bool selected = opt->state & QStyle::State_Selected;
- if (selected) {
- tr.setTop(tr.top() - verticalShift);
- tr.setRight(tr.right() - horizontalShift);
- }
-
- // left widget
- if (!opt->leftButtonSize.isEmpty()) {
- tr.setLeft(tr.left() + 4 +
- (verticalTabs ? opt->leftButtonSize.height() : opt->leftButtonSize.width()));
- }
- // right widget
- if (!opt->rightButtonSize.isEmpty()) {
- tr.setRight(tr.right() - 4 -
- (verticalTabs ? opt->rightButtonSize.height() : opt->rightButtonSize.width()));
- }
-
- // icon
- if (!opt->icon.isNull()) {
- QSize iconSize = opt->iconSize;
- if (!iconSize.isValid()) {
- int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize);
- iconSize = QSize(iconExtent, iconExtent);
- }
- QSize tabIconSize = opt->icon.actualSize(iconSize,
- (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled,
- (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off);
- // High-dpi icons do not need adjustment; make sure tabIconSize is not larger than iconSize
- tabIconSize = QSize(qMin(tabIconSize.width(), iconSize.width()), qMin(tabIconSize.height(), iconSize.height()));
-
- const int offsetX = (iconSize.width() - tabIconSize.width()) / 2;
- *iconRect = QRect(tr.left() + offsetX, tr.center().y() - tabIconSize.height() / 2,
- tabIconSize.width(), tabIconSize.height());
- if (!verticalTabs)
- *iconRect = QStyle::visualRect(opt->direction, opt->rect, *iconRect);
- tr.setLeft(tr.left() + tabIconSize.width() + 4);
- }
-
- if (!verticalTabs)
- tr = QStyle::visualRect(opt->direction, opt->rect, tr);
-
- *textRect = tr;
-}
-
-/*!
- \reimp
-*/
-void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, QPainter *p) const
-{
- Q_D(const QCommonStyle);
-
- // TODO: Set opt->window manually for now before calling any of the drawing functions. opt->window is
- // pulled of the widget is QStyle. But now that we have no widget, we need some other
- // solution.
- Q_ASSERT(opt->window);
-
- switch (element) {
-
- case CE_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- proxy()->drawControl(CE_PushButtonBevel, btn, p);
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(SE_PushButtonContents, btn);
- proxy()->drawControl(CE_PushButtonLabel, &subopt, p);
- }
- break;
- case CE_PushButtonBevel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- QRect br = btn->rect;
- int dbi = proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- if (btn->features & QStyleOptionButton::DefaultButton)
- proxy()->drawPrimitive(PE_FrameDefaultButton, opt, p);
- if (btn->features & QStyleOptionButton::AutoDefaultButton)
- br.setCoords(br.left() + dbi, br.top() + dbi, br.right() - dbi, br.bottom() - dbi);
- if (!(btn->features & (QStyleOptionButton::Flat | QStyleOptionButton::CommandLinkButton))
- || btn->state & (State_Sunken | State_On)
- || (btn->features & QStyleOptionButton::CommandLinkButton && btn->state & State_MouseOver)) {
- QStyleOptionButton tmpBtn = *btn;
- tmpBtn.rect = br;
- proxy()->drawPrimitive(PE_PanelButtonCommand, &tmpBtn, p);
- }
- if (btn->features & QStyleOptionButton::HasMenu) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, btn);
- QRect ir = btn->rect;
- QStyleOptionButton newBtn = *btn;
- newBtn.rect = QRect(ir.right() - mbi + 2, ir.height()/2 - mbi/2 + 3, mbi - 6, mbi - 6);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, p);
- }
- if (btn->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*btn);
- fropt.rect = subElementRect(SE_PushButtonFocusRect, btn);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
- case CE_PushButtonLabel:
- if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- QRect textRect = button->rect;
- uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, button))
- tf |= Qt::TextHideMnemonic;
-
- if (!button->icon.isNull()) {
- //Center both icon and text
- QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled;
- if (mode == QIcon::Normal && button->state & State_HasFocus)
- mode = QIcon::Active;
- QIcon::State state = QIcon::Off;
- if (button->state & State_On)
- state = QIcon::On;
-
- QPixmap pixmap = button->icon.pixmap(button->iconSize, dpr(opt->window), mode, state);
- int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio();
- int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio();
- int labelWidth = pixmapWidth;
- int labelHeight = pixmapHeight;
- int iconSpacing = 4;//### 4 is currently hardcoded in QPushButton::sizeHint()
- if (!button->text.isEmpty()) {
- int textWidth = button->fontMetrics.boundingRect(opt->rect, tf, button->text).width();
- labelWidth += (textWidth + iconSpacing);
- }
-
- QRect iconRect = QRect(textRect.x() + (textRect.width() - labelWidth) / 2,
- textRect.y() + (textRect.height() - labelHeight) / 2,
- pixmapWidth, pixmapHeight);
-
- iconRect = visualRect(button->direction, textRect, iconRect);
-
- if (button->direction == Qt::RightToLeft) {
- tf |= Qt::AlignRight;
- textRect.setRight(iconRect.left() - iconSpacing);
- } else {
- tf |= Qt::AlignLeft; //left align, we adjust the text-rect instead
- textRect.setLeft(iconRect.left() + iconRect.width() + iconSpacing);
- }
-
- if (button->state & (State_On | State_Sunken))
- iconRect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt),
- proxy()->pixelMetric(PM_ButtonShiftVertical, opt));
- p->drawPixmap(iconRect, pixmap);
- } else {
- tf |= Qt::AlignHCenter;
- }
- if (button->state & (State_On | State_Sunken))
- textRect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt),
- proxy()->pixelMetric(PM_ButtonShiftVertical, opt));
-
- if (button->features & QStyleOptionButton::HasMenu) {
- int indicatorSize = proxy()->pixelMetric(PM_MenuButtonIndicator, button);
- if (button->direction == Qt::LeftToRight)
- textRect = textRect.adjusted(0, 0, -indicatorSize, 0);
- else
- textRect = textRect.adjusted(indicatorSize, 0, 0, 0);
- }
- proxy()->drawItemText(p, textRect, tf, button->palette, (button->state & State_Enabled),
- button->text, QPalette::ButtonText);
- }
- break;
- case CE_RadioButton:
- case CE_CheckBox:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- bool isRadio = (element == CE_RadioButton);
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonIndicator
- : SE_CheckBoxIndicator, btn);
- proxy()->drawPrimitive(isRadio ? PE_IndicatorRadioButton : PE_IndicatorCheckBox,
- &subopt, p);
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonContents
- : SE_CheckBoxContents, btn);
- proxy()->drawControl(isRadio ? CE_RadioButtonLabel : CE_CheckBoxLabel, &subopt, p);
- if (btn->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*btn);
- fropt.rect = subElementRect(isRadio ? SE_RadioButtonFocusRect
- : SE_CheckBoxFocusRect, btn);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
- case CE_RadioButtonLabel:
- case CE_CheckBoxLabel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- uint alignment = visualAlignment(btn->direction, Qt::AlignLeft | Qt::AlignVCenter);
-
- if (!proxy()->styleHint(SH_UnderlineShortcut, btn))
- alignment |= Qt::TextHideMnemonic;
- QPixmap pix;
- QRect textRect = btn->rect;
- if (!btn->icon.isNull()) {
- pix = btn->icon.pixmap(btn->iconSize, dpr(opt->window), btn->state & State_Enabled ? QIcon::Normal : QIcon::Disabled);
- proxy()->drawItemPixmap(p, btn->rect, alignment, pix);
- if (btn->direction == Qt::RightToLeft)
- textRect.setRight(textRect.right() - btn->iconSize.width() - 4);
- else
- textRect.setLeft(textRect.left() + btn->iconSize.width() + 4);
- }
- if (!btn->text.isEmpty()){
- proxy()->drawItemText(p, textRect, alignment | Qt::TextShowMnemonic,
- btn->palette, btn->state & State_Enabled, btn->text, QPalette::WindowText);
- }
- }
- break;
- case CE_MenuScroller: {
- QStyleOption arrowOpt = *opt;
- arrowOpt.state |= State_Enabled;
- proxy()->drawPrimitive(((opt->state & State_DownArrow) ? PE_IndicatorArrowDown : PE_IndicatorArrowUp), &arrowOpt, p);
- break; }
- case CE_MenuTearoff:
- if (opt->state & State_Selected)
- p->fillRect(opt->rect, opt->palette.brush(QPalette::Highlight));
- else
- p->fillRect(opt->rect, opt->palette.brush(QPalette::Button));
- p->setPen(QPen(opt->palette.dark().color(), 1, Qt::DashLine));
- p->drawLine(opt->rect.x() + 2, opt->rect.y() + opt->rect.height() / 2 - 1,
- opt->rect.x() + opt->rect.width() - 4,
- opt->rect.y() + opt->rect.height() / 2 - 1);
- p->setPen(QPen(opt->palette.light().color(), 1, Qt::DashLine));
- p->drawLine(opt->rect.x() + 2, opt->rect.y() + opt->rect.height() / 2,
- opt->rect.x() + opt->rect.width() - 4, opt->rect.y() + opt->rect.height() / 2);
- break;
- case CE_MenuBarItem:
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip
- | Qt::TextSingleLine;
- if (!proxy()->styleHint(SH_UnderlineShortcut, mbi))
- alignment |= Qt::TextHideMnemonic;
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- QPixmap pix = mbi->icon.pixmap(QSize(iconExtent, iconExtent), dpr(opt->window),
- mbi->state.testFlag(State_Enabled) ? QIcon::Normal : QIcon::Disabled);
- if (!pix.isNull())
- proxy()->drawItemPixmap(p,mbi->rect, alignment, pix);
- else
- proxy()->drawItemText(p, mbi->rect, alignment, mbi->palette, mbi->state & State_Enabled,
- mbi->text, QPalette::ButtonText);
- }
- break;
- case CE_MenuBarEmptyArea:
- break;
- case CE_ProgressBar:
- if (const QStyleOptionProgressBar *pb
- = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- QStyleOptionProgressBar subopt = *pb;
- subopt.rect = subElementRect(SE_ProgressBarGroove, pb);
- proxy()->drawControl(CE_ProgressBarGroove, &subopt, p);
- subopt.rect = subElementRect(SE_ProgressBarContents, pb);
- proxy()->drawControl(CE_ProgressBarContents, &subopt, p);
- if (pb->textVisible) {
- subopt.rect = subElementRect(SE_ProgressBarLabel, pb);
- proxy()->drawControl(CE_ProgressBarLabel, &subopt, p);
- }
- }
- break;
- case CE_ProgressBarGroove:
- if (opt->rect.isValid())
- qDrawShadePanel(p, opt->rect, opt->palette, true, 1,
- &opt->palette.brush(QPalette::Window));
- break;
- case CE_ProgressBarLabel:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- QPalette::ColorRole textRole = QPalette::NoRole;
- if ((pb->textAlignment & Qt::AlignCenter) && pb->textVisible
- && ((qint64(pb->progress) - qint64(pb->minimum)) * 2 >= (qint64(pb->maximum) - qint64(pb->minimum)))) {
- textRole = QPalette::HighlightedText;
- //Draw text shadow, This will increase readability when the background of same color
- QRect shadowRect(pb->rect);
- shadowRect.translate(1,1);
- QColor shadowColor = (pb->palette.color(textRole).value() <= 128)
- ? QColor(255,255,255,160) : QColor(0,0,0,160);
- QPalette shadowPalette = pb->palette;
- shadowPalette.setColor(textRole, shadowColor);
- proxy()->drawItemText(p, shadowRect, Qt::AlignCenter | Qt::TextSingleLine, shadowPalette,
- pb->state & State_Enabled, pb->text, textRole);
- }
- proxy()->drawItemText(p, pb->rect, Qt::AlignCenter | Qt::TextSingleLine, pb->palette,
- pb->state & State_Enabled, pb->text, textRole);
- }
- break;
- case CE_ProgressBarContents:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
-
- QRect rect = pb->rect;
- const bool inverted = pb->invertedAppearance;
- qint64 minimum = qint64(pb->minimum);
- qint64 maximum = qint64(pb->maximum);
- qint64 progress = qint64(pb->progress);
-
- QPalette pal2 = pb->palette;
- // Correct the highlight color if it is the same as the background
- if (pal2.highlight() == pal2.window())
- pal2.setColor(QPalette::Highlight, pb->palette.color(QPalette::Active,
- QPalette::Highlight));
- bool reverse = pb->direction == Qt::RightToLeft;
- if (inverted)
- reverse = !reverse;
- int w = rect.width();
- if (pb->minimum == 0 && pb->maximum == 0) {
- // draw busy indicator
- int x = (progress - minimum) % (w * 2);
- if (x > w)
- x = 2 * w - x;
- x = reverse ? rect.right() - x : x + rect.x();
- p->setPen(QPen(pal2.highlight().color(), 4));
- p->drawLine(x, rect.y(), x, rect.height());
- } else {
- const int unit_width = proxy()->pixelMetric(PM_ProgressBarChunkWidth, pb);
- if (!unit_width)
- return;
-
- int u;
- if (unit_width > 1)
- u = ((rect.width() + unit_width) / unit_width);
- else
- u = w / unit_width;
- qint64 p_v = progress - minimum;
- qint64 t_s = (maximum - minimum) ? (maximum - minimum) : qint64(1);
-
- if (u > 0 && p_v >= INT_MAX / u && t_s >= u) {
- // scale down to something usable.
- p_v /= u;
- t_s /= u;
- }
-
- // nu < tnu, if last chunk is only a partial chunk
- int tnu, nu;
- tnu = nu = p_v * u / t_s;
-
- if (nu * unit_width > w)
- --nu;
-
- // Draw nu units out of a possible u of unit_width
- // width, each a rectangle bordered by background
- // color, all in a sunken panel with a percentage text
- // display at the end.
- int x = 0;
- int x0 = reverse ? rect.right() - ((unit_width > 1) ? unit_width : 0)
- : rect.x();
-
- QStyleOptionProgressBar pbBits = *pb;
- pbBits.rect = rect;
- pbBits.palette = pal2;
- int myY = pbBits.rect.y();
- int myHeight = pbBits.rect.height();
- pbBits.state = State_Horizontal;
- for (int i = 0; i < nu; ++i) {
- pbBits.rect.setRect(x0 + x, myY, unit_width, myHeight);
- proxy()->drawPrimitive(PE_IndicatorProgressChunk, &pbBits, p);
- x += reverse ? -unit_width : unit_width;
- }
-
- // Draw the last partial chunk to fill up the
- // progress bar entirely
- if (nu < tnu) {
- int pixels_left = w - (nu * unit_width);
- int offset = reverse ? x0 + x + unit_width-pixels_left : x0 + x;
- pbBits.rect.setRect(offset, myY, pixels_left, myHeight);
- proxy()->drawPrimitive(PE_IndicatorProgressChunk, &pbBits, p);
- }
- }
- }
- break;
- case CE_HeaderLabel:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QRect rect = header->rect;
- if (!header->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- QPixmap pixmap
- = header->icon.pixmap(QSize(iconExtent, iconExtent), dpr(opt->window),
- header->state.testFlag(State_Enabled) ? QIcon::Normal : QIcon::Disabled);
- int pixw = pixmap.width() / pixmap.devicePixelRatio();
-
- QRect aligned = alignedRect(header->direction, QFlag(header->iconAlignment), pixmap.size() / pixmap.devicePixelRatio(), rect);
- QRect inter = aligned.intersected(rect);
- p->drawPixmap(inter.x(), inter.y(), pixmap,
- inter.x() - aligned.x(), inter.y() - aligned.y(),
- aligned.width() * pixmap.devicePixelRatio(),
- pixmap.height() * pixmap.devicePixelRatio());
-
- const int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
- if (header->direction == Qt::LeftToRight)
- rect.setLeft(rect.left() + pixw + margin);
- else
- rect.setRight(rect.right() - pixw - margin);
- }
- if (header->state & QStyle::State_On) {
- QFont fnt = p->font();
- fnt.setBold(true);
- p->setFont(fnt);
- }
- proxy()->drawItemText(p, rect, header->textAlignment, header->palette,
- (header->state & State_Enabled), header->text, QPalette::ButtonText);
- }
- break;
- case CE_ToolButtonLabel:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QRect rect = toolbutton->rect;
- int shiftX = 0;
- int shiftY = 0;
- if (toolbutton->state & (State_Sunken | State_On)) {
- shiftX = proxy()->pixelMetric(PM_ButtonShiftHorizontal, toolbutton);
- shiftY = proxy()->pixelMetric(PM_ButtonShiftVertical, toolbutton);
- }
- // Arrow type always overrules and is always shown
- bool hasArrow = toolbutton->features & QStyleOptionToolButton::Arrow;
- if (((!hasArrow && toolbutton->icon.isNull()) && !toolbutton->text.isEmpty())
- || toolbutton->toolButtonStyle == Qt::ToolButtonTextOnly) {
- int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
- rect.translate(shiftX, shiftY);
- p->setFont(toolbutton->font);
- proxy()->drawItemText(p, rect, alignment, toolbutton->palette,
- opt->state & State_Enabled, toolbutton->text,
- QPalette::ButtonText);
- } else {
- QPixmap pm;
- QSize pmSize = toolbutton->iconSize;
- if (!toolbutton->icon.isNull()) {
- QIcon::State state = toolbutton->state & State_On ? QIcon::On : QIcon::Off;
- QIcon::Mode mode;
- if (!(toolbutton->state & State_Enabled))
- mode = QIcon::Disabled;
- else if ((opt->state & State_MouseOver) && (opt->state & State_AutoRaise))
- mode = QIcon::Active;
- else
- mode = QIcon::Normal;
- pm = toolbutton->icon.pixmap(toolbutton->rect.size().boundedTo(toolbutton->iconSize),
- dpr(opt->window), mode, state);
- pmSize = pm.size() / pm.devicePixelRatio();
- }
-
- if (toolbutton->toolButtonStyle != Qt::ToolButtonIconOnly) {
- p->setFont(toolbutton->font);
- QRect pr = rect,
- tr = rect;
- int alignment = Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
-
- if (toolbutton->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
- pr.setHeight(pmSize.height() + 4); //### 4 is currently hardcoded in QToolButton::sizeHint()
- tr.adjust(0, pr.height() - 1, 0, -1);
- pr.translate(shiftX, shiftY);
- if (!hasArrow) {
- proxy()->drawItemPixmap(p, pr, Qt::AlignCenter, pm);
- } else {
- drawArrow(proxy(), toolbutton, pr, p);
- }
- alignment |= Qt::AlignCenter;
- } else {
- pr.setWidth(pmSize.width() + 4); //### 4 is currently hardcoded in QToolButton::sizeHint()
- tr.adjust(pr.width(), 0, 0, 0);
- pr.translate(shiftX, shiftY);
- if (!hasArrow) {
- proxy()->drawItemPixmap(p, QStyle::visualRect(opt->direction, rect, pr), Qt::AlignCenter, pm);
- } else {
- drawArrow(proxy(), toolbutton, pr, p);
- }
- alignment |= Qt::AlignLeft | Qt::AlignVCenter;
- }
- tr.translate(shiftX, shiftY);
- const QString text = d->toolButtonElideText(toolbutton, tr, alignment);
- proxy()->drawItemText(p, QStyle::visualRect(opt->direction, rect, tr), alignment, toolbutton->palette,
- toolbutton->state & State_Enabled, text,
- QPalette::ButtonText);
- } else {
- rect.translate(shiftX, shiftY);
- if (hasArrow) {
- drawArrow(proxy(), toolbutton, rect, p);
- } else {
- proxy()->drawItemPixmap(p, rect, Qt::AlignCenter, pm);
- }
- }
- }
- }
- break;
- case CE_ToolBoxTab:
- if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
- proxy()->drawControl(CE_ToolBoxTabShape, tb, p);
- proxy()->drawControl(CE_ToolBoxTabLabel, tb, p);
- }
- break;
- case CE_ToolBoxTabShape:
- if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
- p->setPen(tb->palette.mid().color().darker(150));
- int d = 20 + tb->rect.height() - 3;
- if (tb->direction != Qt::RightToLeft) {
- const QPoint points[] = {
- QPoint(-1, tb->rect.height() + 1),
- QPoint(-1, 1),
- QPoint(tb->rect.width() - d, 1),
- QPoint(tb->rect.width() - 20, tb->rect.height() - 2),
- QPoint(tb->rect.width() - 1, tb->rect.height() - 2),
- QPoint(tb->rect.width() - 1, tb->rect.height() + 1),
- QPoint(-1, tb->rect.height() + 1),
- };
- p->drawPolygon(points, sizeof points / sizeof *points);
- } else {
- const QPoint points[] = {
- QPoint(tb->rect.width(), tb->rect.height() + 1),
- QPoint(tb->rect.width(), 1),
- QPoint(d - 1, 1),
- QPoint(20 - 1, tb->rect.height() - 2),
- QPoint(0, tb->rect.height() - 2),
- QPoint(0, tb->rect.height() + 1),
- QPoint(tb->rect.width(), tb->rect.height() + 1),
- };
- p->drawPolygon(points, sizeof points / sizeof *points);
- }
- p->setPen(tb->palette.light().color());
- if (tb->direction != Qt::RightToLeft) {
- p->drawLine(0, 2, tb->rect.width() - d, 2);
- p->drawLine(tb->rect.width() - d - 1, 2, tb->rect.width() - 21, tb->rect.height() - 1);
- p->drawLine(tb->rect.width() - 20, tb->rect.height() - 1,
- tb->rect.width(), tb->rect.height() - 1);
- } else {
- p->drawLine(tb->rect.width() - 1, 2, d - 1, 2);
- p->drawLine(d, 2, 20, tb->rect.height() - 1);
- p->drawLine(19, tb->rect.height() - 1,
- -1, tb->rect.height() - 1);
- }
- p->setBrush(Qt::NoBrush);
- }
- break;
- case CE_TabBarTab:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- proxy()->drawControl(CE_TabBarTabShape, tab, p);
- proxy()->drawControl(CE_TabBarTabLabel, tab, p);
- }
- break;
- case CE_TabBarTabShape:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- p->save();
-
- QRect rect(tab->rect);
- bool selected = tab->state & State_Selected;
- bool onlyOne = tab->position == QStyleOptionTab::OnlyOneTab;
- int tabOverlap = onlyOne ? 0 : proxy()->pixelMetric(PM_TabBarTabOverlap, opt);
-
- if (!selected) {
- switch (tab->shape) {
- case QStyleOptionTab::TriangularNorth:
- rect.adjust(0, 0, 0, -tabOverlap);
- if(!selected)
- rect.adjust(1, 1, -1, 0);
- break;
- case QStyleOptionTab::TriangularSouth:
- rect.adjust(0, tabOverlap, 0, 0);
- if(!selected)
- rect.adjust(1, 0, -1, -1);
- break;
- case QStyleOptionTab::TriangularEast:
- rect.adjust(tabOverlap, 0, 0, 0);
- if(!selected)
- rect.adjust(0, 1, -1, -1);
- break;
- case QStyleOptionTab::TriangularWest:
- rect.adjust(0, 0, -tabOverlap, 0);
- if(!selected)
- rect.adjust(1, 1, 0, -1);
- break;
- default:
- break;
- }
- }
-
- p->setPen(QPen(tab->palette.windowText(), 0));
- if (selected) {
- p->setBrush(tab->palette.base());
- } else {
- p->setBrush(tab->palette.window());
- }
-
- int y;
- int x;
- QPolygon a(10);
- switch (tab->shape) {
- case QStyleOptionTab::TriangularNorth:
- case QStyleOptionTab::TriangularSouth: {
- a.setPoint(0, 0, -1);
- a.setPoint(1, 0, 0);
- y = rect.height() - 2;
- x = y / 3;
- a.setPoint(2, x++, y - 1);
- ++x;
- a.setPoint(3, x++, y++);
- a.setPoint(4, x, y);
-
- int i;
- int right = rect.width() - 1;
- for (i = 0; i < 5; ++i)
- a.setPoint(9 - i, right - a.point(i).x(), a.point(i).y());
- if (tab->shape == QStyleOptionTab::TriangularNorth)
- for (i = 0; i < 10; ++i)
- a.setPoint(i, a.point(i).x(), rect.height() - 1 - a.point(i).y());
-
- a.translate(rect.left(), rect.top());
- p->setRenderHint(QPainter::Antialiasing);
- p->translate(0, 0.5);
-
- QPainterPath path;
- path.addPolygon(a);
- p->drawPath(path);
- break; }
- case QStyleOptionTab::TriangularEast:
- case QStyleOptionTab::TriangularWest: {
- a.setPoint(0, -1, 0);
- a.setPoint(1, 0, 0);
- x = rect.width() - 2;
- y = x / 3;
- a.setPoint(2, x - 1, y++);
- ++y;
- a.setPoint(3, x++, y++);
- a.setPoint(4, x, y);
- int i;
- int bottom = rect.height() - 1;
- for (i = 0; i < 5; ++i)
- a.setPoint(9 - i, a.point(i).x(), bottom - a.point(i).y());
- if (tab->shape == QStyleOptionTab::TriangularWest)
- for (i = 0; i < 10; ++i)
- a.setPoint(i, rect.width() - 1 - a.point(i).x(), a.point(i).y());
- a.translate(rect.left(), rect.top());
- p->setRenderHint(QPainter::Antialiasing);
- p->translate(0.5, 0);
- QPainterPath path;
- path.addPolygon(a);
- p->drawPath(path);
- break; }
- default:
- break;
- }
- p->restore();
- }
- break;
- case CE_ToolBoxTabLabel:
- if (const QStyleOptionToolBox *tb = qstyleoption_cast<const QStyleOptionToolBox *>(opt)) {
- bool enabled = tb->state & State_Enabled;
- bool selected = tb->state & State_Selected;
- int iconExtent = proxy()->pixelMetric(QStyle::PM_SmallIconSize, tb);
- QPixmap pm = tb->icon.pixmap(QSize(iconExtent, iconExtent), dpr(opt->window),
- enabled ? QIcon::Normal : QIcon::Disabled);
-
- QRect cr = subElementRect(QStyle::SE_ToolBoxTabContents, tb);
- QRect tr, ir;
- int ih = 0;
- if (pm.isNull()) {
- tr = cr;
- tr.adjust(4, 0, -8, 0);
- } else {
- int iw = pm.width() / pm.devicePixelRatio() + 4;
- ih = pm.height()/ pm.devicePixelRatio();
- ir = QRect(cr.left() + 4, cr.top(), iw + 2, ih);
- tr = QRect(ir.right(), cr.top(), cr.width() - ir.right() - 4, cr.height());
- }
-
- if (selected && proxy()->styleHint(QStyle::SH_ToolBox_SelectedPageTitleBold, tb)) {
- QFont f(p->font());
- f.setBold(true);
- p->setFont(f);
- }
-
- QString txt = tb->fontMetrics.elidedText(tb->text, Qt::ElideRight, tr.width());
-
- if (ih)
- p->drawPixmap(ir.left(), (tb->rect.height() - ih) / 2, pm);
-
- int alignment = Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, tb))
- alignment |= Qt::TextHideMnemonic;
- proxy()->drawItemText(p, tr, alignment, tb->palette, enabled, txt, QPalette::ButtonText);
-
- if (!txt.isEmpty() && opt->state & State_HasFocus) {
- QStyleOptionFocusRect opt;
- opt.rect = tr;
- opt.palette = tb->palette;
- opt.state = QStyle::State_None;
- proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &opt, p);
- }
- }
- break;
- case CE_TabBarTabLabel:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- QRect tr = tab->rect;
- bool verticalTabs = tab->shape == QStyleOptionTab::RoundedEast
- || tab->shape == QStyleOptionTab::RoundedWest
- || tab->shape == QStyleOptionTab::TriangularEast
- || tab->shape == QStyleOptionTab::TriangularWest;
-
- int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
- if (!proxy()->styleHint(SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
-
- if (verticalTabs) {
- p->save();
- int newX, newY, newRot;
- if (tab->shape == QStyleOptionTab::RoundedEast || tab->shape == QStyleOptionTab::TriangularEast) {
- newX = tr.width() + tr.x();
- newY = tr.y();
- newRot = 90;
- } else {
- newX = tr.x();
- newY = tr.y() + tr.height();
- newRot = -90;
- }
- QTransform m = QTransform::fromTranslate(newX, newY);
- m.rotate(newRot);
- p->setTransform(m, true);
- }
- QRect iconRect;
- d->tabLayout(tab, &tr, &iconRect);
- tr = proxy()->subElementRect(SE_TabBarTabText, opt); //we compute tr twice because the style may override subElementRect
-
- if (!tab->icon.isNull()) {
- QPixmap tabIcon = tab->icon.pixmap(tab->iconSize, dpr(opt->window),
- (tab->state & State_Enabled) ? QIcon::Normal
- : QIcon::Disabled,
- (tab->state & State_Selected) ? QIcon::On
- : QIcon::Off);
- p->drawPixmap(iconRect.x(), iconRect.y(), tabIcon);
- }
-
- proxy()->drawItemText(p, tr, alignment, tab->palette, tab->state & State_Enabled, tab->text, QPalette::WindowText);
- if (verticalTabs)
- p->restore();
-
- if (tab->state & State_HasFocus) {
- const int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth);
-
- int x1, x2;
- x1 = tab->rect.left();
- x2 = tab->rect.right() - 1;
-
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*tab);
- fropt.rect.setRect(x1 + 1 + OFFSET, tab->rect.y() + OFFSET,
- x2 - x1 - 2*OFFSET, tab->rect.height() - 2*OFFSET);
- drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
- case CE_SizeGrip: {
- p->save();
- int x, y, w, h;
- opt->rect.getRect(&x, &y, &w, &h);
-
- int sw = qMin(h, w);
- if (h > w)
- p->translate(0, h - w);
- else
- p->translate(w - h, 0);
-
- int sx = x;
- int sy = y;
- int s = sw / 3;
-
- Qt::Corner corner;
- if (const QStyleOptionSizeGrip *sgOpt = qstyleoption_cast<const QStyleOptionSizeGrip *>(opt))
- corner = sgOpt->corner;
- else if (opt->direction == Qt::RightToLeft)
- corner = Qt::BottomLeftCorner;
- else
- corner = Qt::BottomRightCorner;
-
- if (corner == Qt::BottomLeftCorner) {
- sx = x + sw;
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(x, sy - 1 , sx + 1, sw);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy, sx, sw);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy + 1, sx - 1, sw);
- sx -= s;
- sy += s;
- }
- } else if (corner == Qt::BottomRightCorner) {
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(sx - 1, sw, sw, sy - 1);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx, sw, sw, sy);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx + 1, sw, sw, sy + 1);
- sx += s;
- sy += s;
- }
- } else if (corner == Qt::TopRightCorner) {
- sy = y + sw;
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(sx - 1, y, sw, sy + 1);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx, y, sw, sy);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(sx + 1, y, sw, sy - 1);
- sx += s;
- sy -= s;
- }
- } else if (corner == Qt::TopLeftCorner) {
- for (int i = 0; i < 4; ++i) {
- p->setPen(QPen(opt->palette.light().color(), 1));
- p->drawLine(x, sy - 1, sx - 1, y);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy, sx, y);
- p->setPen(QPen(opt->palette.dark().color(), 1));
- p->drawLine(x, sy + 1, sx + 1, y);
- sx += s;
- sy += s;
- }
- }
- p->restore();
- break; }
- case CE_RubberBand: {
- if (const QStyleOptionRubberBand *rbOpt = qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- QPixmap tiledPixmap(16, 16);
- QPainter pixmapPainter(&tiledPixmap);
- pixmapPainter.setPen(Qt::NoPen);
- pixmapPainter.setBrush(Qt::Dense4Pattern);
- pixmapPainter.setBackground(QBrush(opt->palette.base()));
- pixmapPainter.setBackgroundMode(Qt::OpaqueMode);
- pixmapPainter.drawRect(0, 0, tiledPixmap.width(), tiledPixmap.height());
- pixmapPainter.end();
- // ### workaround for borked XRENDER
- tiledPixmap = QPixmap::fromImage(tiledPixmap.toImage());
-
- p->save();
- QRect r = opt->rect;
- QStyleHintReturnMask mask;
- if (proxy()->styleHint(QStyle::SH_RubberBand_Mask, opt, &mask))
- p->setClipRegion(mask.region);
- p->drawTiledPixmap(r.x(), r.y(), r.width(), r.height(), tiledPixmap);
- p->setPen(opt->palette.color(QPalette::Active, QPalette::WindowText));
- p->setBrush(Qt::NoBrush);
- p->drawRect(r.adjusted(0, 0, -1, -1));
- if (rbOpt->shape == QStyleOptionRubberBand::Rectangle)
- p->drawRect(r.adjusted(3, 3, -4, -4));
- p->restore();
- }
- break; }
- case CE_DockWidgetTitle:
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(opt)) {
- QRect r = dwOpt->rect.adjusted(0, 0, -1, -1);
- if (dwOpt->movable) {
- p->setPen(dwOpt->palette.color(QPalette::Dark));
- p->drawRect(r);
- }
-
- if (!dwOpt->title.isEmpty()) {
- const bool verticalTitleBar = dwOpt->verticalTitleBar;
-
- if (verticalTitleBar) {
- r = r.transposed();
-
- p->save();
- p->translate(r.left(), r.top() + r.width());
- p->rotate(-90);
- p->translate(-r.left(), -r.top());
- }
-
- const int indent = p->fontMetrics().descent();
- proxy()->drawItemText(p, r.adjusted(indent + 1, 1, -indent - 1, -1),
- Qt::AlignLeft | Qt::AlignVCenter, dwOpt->palette,
- dwOpt->state & State_Enabled, dwOpt->title,
- QPalette::WindowText);
-
- if (verticalTitleBar)
- p->restore();
- }
- }
- break;
- case CE_Header:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- QRegion clipRegion = p->clipRegion();
- p->setClipRect(opt->rect);
- proxy()->drawControl(CE_HeaderSection, header, p);
- QStyleOptionHeader subopt = *header;
- subopt.rect = subElementRect(SE_HeaderLabel, header);
- if (subopt.rect.isValid())
- proxy()->drawControl(CE_HeaderLabel, &subopt, p);
- if (header->sortIndicator != QStyleOptionHeader::None) {
- subopt.rect = subElementRect(SE_HeaderArrow, opt);
- proxy()->drawPrimitive(PE_IndicatorHeaderArrow, &subopt, p);
- }
- p->setClipRegion(clipRegion);
- }
- break;
- case CE_FocusFrame:
- p->fillRect(opt->rect, opt->palette.windowText());
- break;
- case CE_HeaderSection:
- qDrawShadePanel(p, opt->rect, opt->palette,
- opt->state & State_Sunken, 1,
- &opt->palette.brush(QPalette::Button));
- break;
- case CE_HeaderEmptyArea:
- p->fillRect(opt->rect, opt->palette.window());
- break;
- case CE_ComboBoxLabel:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField);
- p->save();
- p->setClipRect(editRect);
- if (!cb->currentIcon.isNull()) {
- QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
- : QIcon::Disabled;
- QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, dpr(opt->window), mode);
- QRect iconRect(editRect);
- iconRect.setWidth(cb->iconSize.width() + 4);
- iconRect = alignedRect(cb->direction,
- Qt::AlignLeft | Qt::AlignVCenter,
- iconRect.size(), editRect);
- if (cb->editable)
- p->fillRect(iconRect, opt->palette.brush(QPalette::Base));
- proxy()->drawItemPixmap(p, iconRect, Qt::AlignCenter, pixmap);
-
- if (cb->direction == Qt::RightToLeft)
- editRect.translate(-4 - cb->iconSize.width(), 0);
- else
- editRect.translate(cb->iconSize.width() + 4, 0);
- }
- if (!cb->currentText.isEmpty() && !cb->editable) {
- proxy()->drawItemText(p, editRect.adjusted(1, 0, -1, 0),
- visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
- cb->palette, cb->state & State_Enabled, cb->currentText);
- }
- p->restore();
- }
- break;
- case CE_ToolBar:
- if (const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt)) {
- // Compatibility with styles that use PE_PanelToolBar
- QStyleOptionFrame frame;
- frame.QStyleOption::operator=(*toolBar);
- frame.lineWidth = toolBar->lineWidth;
- frame.midLineWidth = toolBar->midLineWidth;
- proxy()->drawPrimitive(PE_PanelToolBar, opt, p);
-
- qDrawShadePanel(p, toolBar->rect, toolBar->palette, false, toolBar->lineWidth,
- &toolBar->palette.brush(QPalette::Button));
- }
- break;
- case CE_ColumnViewGrip: {
- // draw background gradients
- QLinearGradient g(0, 0, opt->rect.width(), 0);
- g.setColorAt(0, opt->palette.color(QPalette::Active, QPalette::Mid));
- g.setColorAt(0.5, Qt::white);
- p->fillRect(QRect(0, 0, opt->rect.width(), opt->rect.height()), g);
-
- // draw the two lines
- QPen pen(p->pen());
- pen.setWidth(opt->rect.width()/20);
- pen.setColor(opt->palette.color(QPalette::Active, QPalette::Dark));
- p->setPen(pen);
-
- int line1starting = opt->rect.width()*8 / 20;
- int line2starting = opt->rect.width()*13 / 20;
- int top = opt->rect.height()*20/75;
- int bottom = opt->rect.height() - 1 - top;
- p->drawLine(line1starting, top, line1starting, bottom);
- p->drawLine(line2starting, top, line2starting, bottom);
- }
- break;
- case CE_ItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- p->save();
- p->setClipRect(opt->rect);
-
- QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt);
- QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt);
- QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt);
-
- // draw the background
- proxy()->drawPrimitive(PE_PanelItemViewItem, opt, p);
-
- // draw the check mark
- if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) {
- QStyleOptionViewItem option(*vopt);
- option.rect = checkRect;
- option.state = option.state & ~QStyle::State_HasFocus;
-
- switch (vopt->checkState) {
- case Qt::Unchecked:
- option.state |= QStyle::State_Off;
- break;
- case Qt::PartiallyChecked:
- option.state |= QStyle::State_NoChange;
- break;
- case Qt::Checked:
- option.state |= QStyle::State_On;
- break;
- }
- proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, p);
- }
-
- // draw the icon
- QIcon::Mode mode = QIcon::Normal;
- if (!(vopt->state & QStyle::State_Enabled))
- mode = QIcon::Disabled;
- else if (vopt->state & QStyle::State_Selected)
- mode = QIcon::Selected;
- QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
- vopt->icon.paint(p, iconRect, vopt->decorationAlignment, mode, state);
-
- // draw the text
- if (!vopt->text.isEmpty()) {
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled
- ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- if (vopt->state & QStyle::State_Selected) {
- p->setPen(vopt->palette.color(cg, QPalette::HighlightedText));
- } else {
- p->setPen(vopt->palette.color(cg, QPalette::Text));
- }
- if (vopt->state & QStyle::State_Editing) {
- p->setPen(vopt->palette.color(cg, QPalette::Text));
- p->drawRect(textRect.adjusted(0, 0, -1, -1));
- }
-
- d->viewItemDrawText(p, vopt, textRect);
- }
-
- // draw the focus rect
- if (vopt->state & QStyle::State_HasFocus) {
- QStyleOptionFocusRect o;
- o.QStyleOption::operator=(*vopt);
- o.rect = proxy()->subElementRect(SE_ItemViewItemFocusRect, vopt);
- o.state |= QStyle::State_KeyboardFocusChange;
- o.state |= QStyle::State_Item;
- QPalette::ColorGroup cg = (vopt->state & QStyle::State_Enabled)
- ? QPalette::Normal : QPalette::Disabled;
- o.backgroundColor = vopt->palette.color(cg, (vopt->state & QStyle::State_Selected)
- ? QPalette::Highlight : QPalette::Window);
- proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, p);
- }
-
- p->restore();
- }
- break;
- case CE_ShapedFrame:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int frameShape = f->frameShape;
- int frameShadow = QStyleOptionFrame::Plain;
- if (f->state & QStyle::State_Sunken) {
- frameShadow = QStyleOptionFrame::Sunken;
- } else if (f->state & QStyle::State_Raised) {
- frameShadow = QStyleOptionFrame::Raised;
- }
-
- int lw = f->lineWidth;
- int mlw = f->midLineWidth;
- QPalette::ColorRole foregroundRole = QPalette::WindowText;
-
- switch (frameShape) {
- case QStyleOptionFrame::Box:
- if (frameShadow == QStyleOptionFrame::Plain) {
- qDrawPlainRect(p, f->rect, f->palette.color(foregroundRole), lw);
- } else {
- qDrawShadeRect(p, f->rect, f->palette, frameShadow == QStyleOptionFrame::Sunken, lw, mlw);
- }
- break;
- case QStyleOptionFrame::StyledPanel:
- proxy()->drawPrimitive(QStyle::PE_Frame, opt, p);
- break;
- case QStyleOptionFrame::Panel:
- if (frameShadow == QStyleOptionFrame::Plain) {
- qDrawPlainRect(p, f->rect, f->palette.color(foregroundRole), lw);
- } else {
- qDrawShadePanel(p, f->rect, f->palette, frameShadow == QStyleOptionFrame::Sunken, lw);
- }
- break;
- case QStyleOptionFrame::WinPanel:
- if (frameShadow == QStyleOptionFrame::Plain) {
- qDrawPlainRect(p, f->rect, f->palette.color(foregroundRole), lw);
- } else {
- qDrawWinPanel(p, f->rect, f->palette, frameShadow == QStyleOptionFrame::Sunken);
- }
- break;
- case QStyleOptionFrame::HLine:
- case QStyleOptionFrame::VLine: {
- QPoint p1, p2;
- if (frameShape == QStyleOptionFrame::HLine) {
- p1 = QPoint(opt->rect.x(), opt->rect.y() + opt->rect.height() / 2);
- p2 = QPoint(opt->rect.x() + opt->rect.width(), p1.y());
- } else {
- p1 = QPoint(opt->rect.x() + opt->rect.width() / 2, opt->rect.y());
- p2 = QPoint(p1.x(), p1.y() + opt->rect.height());
- }
- if (frameShadow == QStyleOptionFrame::Plain) {
- QPen oldPen = p->pen();
- p->setPen(QPen(opt->palette.brush(foregroundRole), lw));
- p->drawLine(p1, p2);
- p->setPen(oldPen);
- } else {
- qDrawShadeLine(p, p1, p2, f->palette, frameShadow == QStyleOptionFrame::Sunken, lw, mlw);
- }
- break;
- }
- }
- }
- break;
- default:
- break;
- }
-}
-
-QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt) const
-{
- Q_D(const QCommonStyle);
- QRect r;
- switch (sr) {
- case SE_PushButtonContents:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- int dx1, dx2;
- dx1 = proxy()->pixelMetric(PM_DefaultFrameWidth, btn);
- if (btn->features & QStyleOptionButton::AutoDefaultButton)
- dx1 += proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- dx2 = dx1 * 2;
- r.setRect(opt->rect.x() + dx1, opt->rect.y() + dx1, opt->rect.width() - dx2,
- opt->rect.height() - dx2);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_PushButtonFocusRect:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- int dbw1 = 0, dbw2 = 0;
- if (btn->features & QStyleOptionButton::AutoDefaultButton){
- dbw1 = proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- dbw2 = dbw1 * 2;
- }
-
- int dfw1 = proxy()->pixelMetric(PM_DefaultFrameWidth, btn) + 1,
- dfw2 = dfw1 * 2;
-
- r.setRect(btn->rect.x() + dfw1 + dbw1, btn->rect.y() + dfw1 + dbw1,
- btn->rect.width() - dfw2 - dbw2, btn->rect.height()- dfw2 - dbw2);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_CheckBoxIndicator:
- {
- int h = proxy()->pixelMetric(PM_IndicatorHeight, opt);
- r.setRect(opt->rect.x(), opt->rect.y() + ((opt->rect.height() - h) / 2),
- proxy()->pixelMetric(PM_IndicatorWidth, opt), h);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
-
- case SE_CheckBoxContents:
- {
- // Deal with the logical first, then convert it back to screen coords.
- QRect ir = visualRect(opt->direction, opt->rect,
- subElementRect(SE_CheckBoxIndicator, opt));
- int spacing = proxy()->pixelMetric(PM_CheckBoxLabelSpacing, opt);
- r.setRect(ir.right() + spacing, opt->rect.y(), opt->rect.width() - ir.width() - spacing,
- opt->rect.height());
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
-
- case SE_CheckBoxFocusRect:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- if (btn->icon.isNull() && btn->text.isEmpty()) {
- r = subElementRect(SE_CheckBoxIndicator, opt);
- r.adjust(1, 1, -1, -1);
- break;
- }
- // As above, deal with the logical first, then convert it back to screen coords.
- QRect cr = visualRect(btn->direction, btn->rect, subElementRect(SE_CheckBoxContents, btn));
-
- QRect iconRect, textRect;
- if (!btn->text.isEmpty()) {
- textRect = itemTextRect(opt->fontMetrics, cr, Qt::AlignAbsolute | Qt::AlignLeft
- | Qt::AlignVCenter | Qt::TextShowMnemonic,
- btn->state & State_Enabled, btn->text);
- }
- if (!btn->icon.isNull()) {
- iconRect = itemPixmapRect(cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter
- | Qt::TextShowMnemonic,
- btn->icon.pixmap(btn->iconSize, dpr(opt->window), QIcon::Normal));
- if (!textRect.isEmpty())
- textRect.translate(iconRect.right() + 4, 0);
- }
- r = iconRect | textRect;
- r.adjust(-3, -2, 3, 2);
- r = r.intersected(btn->rect);
- r = visualRect(btn->direction, btn->rect, r);
- }
- break;
-
- case SE_RadioButtonIndicator:
- {
- int h = proxy()->pixelMetric(PM_ExclusiveIndicatorHeight, opt);
- r.setRect(opt->rect.x(), opt->rect.y() + ((opt->rect.height() - h) / 2),
- proxy()->pixelMetric(PM_ExclusiveIndicatorWidth, opt), h);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
-
- case SE_RadioButtonContents:
- {
- QRect ir = visualRect(opt->direction, opt->rect,
- subElementRect(SE_RadioButtonIndicator, opt));
- int spacing = proxy()->pixelMetric(PM_RadioButtonLabelSpacing, opt);
- r.setRect(ir.left() + ir.width() + spacing, opt->rect.y(), opt->rect.width() - ir.width() - spacing,
- opt->rect.height());
- r = visualRect(opt->direction, opt->rect, r);
- break;
- }
-
- case SE_RadioButtonFocusRect:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- if (btn->icon.isNull() && btn->text.isEmpty()) {
- r = subElementRect(SE_RadioButtonIndicator, opt);
- r.adjust(1, 1, -1, -1);
- break;
- }
- QRect cr = visualRect(btn->direction, btn->rect, subElementRect(SE_RadioButtonContents, opt));
-
- QRect iconRect, textRect;
- if (!btn->text.isEmpty()){
- textRect = itemTextRect(opt->fontMetrics, cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter
- | Qt::TextShowMnemonic, btn->state & State_Enabled, btn->text);
- }
- if (!btn->icon.isNull()) {
- iconRect = itemPixmapRect(cr, Qt::AlignAbsolute | Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic,
- btn->icon.pixmap(btn->iconSize, dpr(opt->window), QIcon::Normal));
- if (!textRect.isEmpty())
- textRect.translate(iconRect.right() + 4, 0);
- }
- r = iconRect | textRect;
- r.adjust(-3, -2, 3, 2);
- r = r.intersected(btn->rect);
- r = visualRect(btn->direction, btn->rect, r);
- }
- break;
- case SE_SliderFocusRect:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
- if (slider->orientation == Qt::Horizontal)
- r.setRect(0, tickOffset - 1, slider->rect.width(), thickness + 2);
- else
- r.setRect(tickOffset - 1, 0, thickness + 2, slider->rect.height());
- r = r.intersected(slider->rect);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_ProgressBarGroove:
- case SE_ProgressBarContents:
- case SE_ProgressBarLabel:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- int textw = 0;
- if (pb->textVisible)
- textw = qMax(pb->fontMetrics.horizontalAdvance(pb->text), pb->fontMetrics.horizontalAdvance(QLatin1String("100%"))) + 6;
-
- if ((pb->textAlignment & Qt::AlignCenter) == 0) {
- if (sr != SE_ProgressBarLabel)
- r.setCoords(pb->rect.left(), pb->rect.top(),
- pb->rect.right() - textw, pb->rect.bottom());
- else
- r.setCoords(pb->rect.right() - textw, pb->rect.top(),
- pb->rect.right(), pb->rect.bottom());
- } else {
- r = pb->rect;
- }
- r = visualRect(pb->direction, pb->rect, r);
- }
- break;
- case SE_ComboBoxFocusRect:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- int margin = cb->frame ? 3 : 0;
- r.setRect(opt->rect.left() + margin, opt->rect.top() + margin,
- opt->rect.width() - 2*margin - 16, opt->rect.height() - 2*margin);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_ToolBoxTabContents:
- r = opt->rect;
- r.adjust(0, 0, -30, 0);
- break;
- case SE_HeaderLabel: {
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
- r.setRect(opt->rect.x() + margin, opt->rect.y() + margin,
- opt->rect.width() - margin * 2, opt->rect.height() - margin * 2);
-
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- // Subtract width needed for arrow, if there is one
- if (header->sortIndicator != QStyleOptionHeader::None) {
- if (opt->state & State_Horizontal)
- r.setWidth(r.width() - (opt->rect.height() / 2) - (margin * 2));
- else
- r.setHeight(r.height() - (opt->rect.width() / 2) - (margin * 2));
- }
- }
- r = visualRect(opt->direction, opt->rect, r);
- break; }
- case SE_HeaderArrow: {
- int h = opt->rect.height();
- int w = opt->rect.width();
- int x = opt->rect.x();
- int y = opt->rect.y();
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, opt);
-
- if (opt->state & State_Horizontal) {
- int horiz_size = h / 2;
- r.setRect(x + w - margin * 2 - horiz_size, y + 5,
- horiz_size, h - margin * 2 - 5);
- } else {
- int vert_size = w / 2;
- r.setRect(x + 5, y + h - margin * 2 - vert_size,
- w - margin * 2 - 5, vert_size);
- }
- r = visualRect(opt->direction, opt->rect, r);
- break; }
-
- case SE_RadioButtonClickRect:
- r = subElementRect(SE_RadioButtonFocusRect, opt);
- r |= subElementRect(SE_RadioButtonIndicator, opt);
- break;
- case SE_CheckBoxClickRect:
- r = subElementRect(SE_CheckBoxFocusRect, opt);
- r |= subElementRect(SE_CheckBoxIndicator, opt);
- break;
- case SE_TabWidgetTabBar:
- if (const QStyleOptionTabWidgetFrame *twf
- = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- r.setSize(twf->tabBarSize);
- const uint alingMask = Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter;
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- // Constrain the size now, otherwise, center could get off the page
- // This of course repeated for all the other directions
- r.setWidth(qMin(r.width(), twf->rect.width()
- - twf->leftCornerWidgetSize.width()
- - twf->rightCornerWidgetSize.width()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(twf->leftCornerWidgetSize.width(), 0));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(twf->rect.center().x() - qRound(r.width() / 2.0f)
- + (twf->leftCornerWidgetSize.width() / 2)
- - (twf->rightCornerWidgetSize.width() / 2), 0));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width()
- - twf->rightCornerWidgetSize.width(), 0));
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r.setWidth(qMin(r.width(), twf->rect.width()
- - twf->leftCornerWidgetSize.width()
- - twf->rightCornerWidgetSize.width()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(twf->leftCornerWidgetSize.width(),
- twf->rect.height() - twf->tabBarSize.height()));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(twf->rect.center().x() - qRound(r.width() / 2.0f)
- + (twf->leftCornerWidgetSize.width() / 2)
- - (twf->rightCornerWidgetSize.width() / 2),
- twf->rect.height() - twf->tabBarSize.height()));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width()
- - twf->rightCornerWidgetSize.width(),
- twf->rect.height() - twf->tabBarSize.height()));
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- r.setHeight(qMin(r.height(), twf->rect.height()
- - twf->leftCornerWidgetSize.height()
- - twf->rightCornerWidgetSize.height()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width(),
- twf->leftCornerWidgetSize.height()));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width(),
- twf->rect.center().y() - r.height() / 2));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(twf->rect.width() - twf->tabBarSize.width(),
- twf->rect.height() - twf->tabBarSize.height()
- - twf->rightCornerWidgetSize.height()));
- break;
- }
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- r.setHeight(qMin(r.height(), twf->rect.height()
- - twf->leftCornerWidgetSize.height()
- - twf->rightCornerWidgetSize.height()));
- switch (proxy()->styleHint(SH_TabBar_Alignment, twf) & alingMask) {
- default:
- case Qt::AlignLeft:
- r.moveTopLeft(QPoint(0, twf->leftCornerWidgetSize.height()));
- break;
- case Qt::AlignHCenter:
- r.moveTopLeft(QPoint(0, twf->rect.center().y() - r.height() / 2));
- break;
- case Qt::AlignRight:
- r.moveTopLeft(QPoint(0, twf->rect.height() - twf->tabBarSize.height()
- - twf->rightCornerWidgetSize.height()));
- break;
- }
- break;
- }
- }
- break;
- case SE_TabWidgetTabPane:
- case SE_TabWidgetTabContents:
- if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QStyleOptionTab tabopt;
- tabopt.shape = twf->shape;
- int overlap = proxy()->pixelMetric(PM_TabBarBaseOverlap, &tabopt);
- if (twf->lineWidth == 0)
- overlap = 0;
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- r = QRect(QPoint(0,qMax(twf->tabBarSize.height() - overlap, 0)),
- QSize(twf->rect.width(), qMin(twf->rect.height() - twf->tabBarSize.height() + overlap, twf->rect.height())));
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r = QRect(QPoint(0,0), QSize(twf->rect.width(), qMin(twf->rect.height() - twf->tabBarSize.height() + overlap, twf->rect.height())));
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- r = QRect(QPoint(0, 0), QSize(qMin(twf->rect.width() - twf->tabBarSize.width() + overlap, twf->rect.width()), twf->rect.height()));
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- r = QRect(QPoint(qMax(twf->tabBarSize.width() - overlap, 0), 0),
- QSize(qMin(twf->rect.width() - twf->tabBarSize.width() + overlap, twf->rect.width()), twf->rect.height()));
- break;
- }
- if (sr == SE_TabWidgetTabContents && twf->lineWidth > 0)
- r.adjust(2, 2, -2, -2);
- }
- break;
- case SE_TabWidgetLeftCorner:
- if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QRect paneRect = subElementRect(SE_TabWidgetTabPane, twf);
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- r = QRect(QPoint(paneRect.x(), paneRect.y() - twf->leftCornerWidgetSize.height()),
- twf->leftCornerWidgetSize);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r = QRect(QPoint(paneRect.x(), paneRect.height()), twf->leftCornerWidgetSize);
- break;
- default:
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- }
- break;
- case SE_TabWidgetRightCorner:
- if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
- QRect paneRect = subElementRect(SE_TabWidgetTabPane, twf);
- switch (twf->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- r = QRect(QPoint(paneRect.width() - twf->rightCornerWidgetSize.width(),
- paneRect.y() - twf->rightCornerWidgetSize.height()),
- twf->rightCornerWidgetSize);
- break;
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r = QRect(QPoint(paneRect.width() - twf->rightCornerWidgetSize.width(),
- paneRect.height()), twf->rightCornerWidgetSize);
- break;
- default:
- break;
- }
- r = visualRect(twf->direction, twf->rect, r);
- }
- break;
- case SE_TabBarTabText:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- QRect dummyIconRect;
- d->tabLayout(tab, &r, &dummyIconRect);
- }
- break;
- case SE_TabBarTabLeftButton:
- case SE_TabBarTabRightButton:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- bool selected = tab->state & State_Selected;
- int verticalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab);
- int horizontalShift = proxy()->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab);
- int hpadding = proxy()->pixelMetric(QStyle::PM_TabBarTabHSpace, opt) / 2;
- hpadding = qMax(hpadding, 4); //workaround KStyle returning 0 because they workaround an old bug in Qt
-
- bool verticalTabs = tab->shape == QStyleOptionTab::RoundedEast
- || tab->shape == QStyleOptionTab::RoundedWest
- || tab->shape == QStyleOptionTab::TriangularEast
- || tab->shape == QStyleOptionTab::TriangularWest;
-
- QRect tr = tab->rect;
- if (tab->shape == QStyleOptionTab::RoundedSouth || tab->shape == QStyleOptionTab::TriangularSouth)
- verticalShift = -verticalShift;
- if (verticalTabs) {
- qSwap(horizontalShift, verticalShift);
- horizontalShift *= -1;
- verticalShift *= -1;
- }
- if (tab->shape == QStyleOptionTab::RoundedWest || tab->shape == QStyleOptionTab::TriangularWest)
- horizontalShift = -horizontalShift;
-
- tr.adjust(0, 0, horizontalShift, verticalShift);
- if (selected)
- {
- tr.setBottom(tr.bottom() - verticalShift);
- tr.setRight(tr.right() - horizontalShift);
- }
-
- QSize size = (sr == SE_TabBarTabLeftButton) ? tab->leftButtonSize : tab->rightButtonSize;
- int w = size.width();
- int h = size.height();
- int midHeight = static_cast<int>(qCeil(float(tr.height() - h) / 2));
- int midWidth = ((tr.width() - w) / 2);
-
- bool atTheTop = true;
- switch (tab->shape) {
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- atTheTop = (sr == SE_TabBarTabLeftButton);
- break;
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- atTheTop = (sr == SE_TabBarTabRightButton);
- break;
- default:
- if (sr == SE_TabBarTabLeftButton)
- r = QRect(tab->rect.x() + hpadding, midHeight, w, h);
- else
- r = QRect(tab->rect.right() - w - hpadding, midHeight, w, h);
- r = visualRect(tab->direction, tab->rect, r);
- }
- if (verticalTabs) {
- if (atTheTop)
- r = QRect(midWidth, tr.y() + tab->rect.height() - hpadding - h, w, h);
- else
- r = QRect(midWidth, tr.y() + hpadding, w, h);
- }
- }
-
- break;
- case SE_TabBarTearIndicator:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- switch (tab->shape) {
- case QStyleOptionTab::RoundedNorth:
- case QStyleOptionTab::TriangularNorth:
- case QStyleOptionTab::RoundedSouth:
- case QStyleOptionTab::TriangularSouth:
- r.setRect(tab->rect.left(), tab->rect.top(), 8, opt->rect.height());
- break;
- case QStyleOptionTab::RoundedWest:
- case QStyleOptionTab::TriangularWest:
- case QStyleOptionTab::RoundedEast:
- case QStyleOptionTab::TriangularEast:
- r.setRect(tab->rect.left(), tab->rect.top(), opt->rect.width(), 8);
- break;
- default:
- break;
- }
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_TabBarScrollLeftButton: {
- const bool vertical = opt->rect.width() < opt->rect.height();
- const Qt::LayoutDirection ld = opt->direction;
- const int buttonWidth = proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr);
- const int buttonOverlap = proxy()->pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, nullptr);
-
- r = vertical ? QRect(0, opt->rect.height() - (buttonWidth * 2) + buttonOverlap, opt->rect.width(), buttonWidth)
- : QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - (buttonWidth * 2) + buttonOverlap, 0, buttonWidth, opt->rect.height()));
- break; }
- case SE_TabBarScrollRightButton: {
- const bool vertical = opt->rect.width() < opt->rect.height();
- const Qt::LayoutDirection ld = opt->direction;
- const int buttonWidth = proxy()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, nullptr);
-
- r = vertical ? QRect(0, opt->rect.height() - buttonWidth, opt->rect.width(), buttonWidth)
- : QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - buttonWidth, 0, buttonWidth, opt->rect.height()));
- break; }
- case SE_TreeViewDisclosureItem:
- r = opt->rect;
- break;
- case SE_LineEditContents:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- r = f->rect.adjusted(f->lineWidth, f->lineWidth, -f->lineWidth, -f->lineWidth);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_FrameContents:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, f);
- r = opt->rect.adjusted(fw, fw, -fw, -fw);
- r = visualRect(opt->direction, opt->rect, r);
- }
- break;
- case SE_ShapedFrameContents:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- int frameShape = f->frameShape;
- int frameShadow = QStyleOptionFrame::Plain;
- if (f->state & QStyle::State_Sunken) {
- frameShadow = QStyleOptionFrame::Sunken;
- } else if (f->state & QStyle::State_Raised) {
- frameShadow = QStyleOptionFrame::Raised;
- }
-
- int frameWidth = 0;
-
- switch (frameShape) {
- case QStyleOptionFrame::NoFrame:
- frameWidth = 0;
- break;
-
- case QStyleOptionFrame::Box:
- case QStyleOptionFrame::HLine:
- case QStyleOptionFrame::VLine:
- switch (frameShadow) {
- case QStyleOptionFrame::Plain:
- frameWidth = f->lineWidth;
- break;
- case QStyleOptionFrame::Raised:
- case QStyleOptionFrame::Sunken:
- frameWidth = (short)(f->lineWidth*2 + f->midLineWidth);
- break;
- }
- break;
-
- case QStyleOptionFrame::StyledPanel:
- //keep the compatibility with Qt 4.4 if there is a proxy style.
- //be sure to call drawPrimitive(QStyle::SE_FrameContents) on the proxy style
- return subElementRect(QStyle::SE_FrameContents, opt);
-
- case QStyleOptionFrame::WinPanel:
- frameWidth = 2;
- break;
-
- case QStyleOptionFrame::Panel:
- switch (frameShadow) {
- case QStyleOptionFrame::Plain:
- case QStyleOptionFrame::Raised:
- case QStyleOptionFrame::Sunken:
- frameWidth = f->lineWidth;
- break;
- }
- break;
- }
- r = f->rect.adjusted(frameWidth, frameWidth, -frameWidth, -frameWidth);
- }
- break;
- case SE_DockWidgetCloseButton:
- case SE_DockWidgetFloatButton:
- case SE_DockWidgetTitleBarText:
- case SE_DockWidgetIcon: {
- int iconSize = proxy()->pixelMetric(PM_SmallIconSize, opt);
- int buttonMargin = proxy()->pixelMetric(PM_DockWidgetTitleBarButtonMargin, opt);
- QRect rect = opt->rect;
-
- const QStyleOptionDockWidget *dwOpt
- = qstyleoption_cast<const QStyleOptionDockWidget*>(opt);
- bool canClose = dwOpt == nullptr ? true : dwOpt->closable;
- bool canFloat = dwOpt == nullptr ? false : dwOpt->floatable;
-
- const bool verticalTitleBar = dwOpt && dwOpt->verticalTitleBar;
-
- // If this is a vertical titlebar, we transpose and work as if it was
- // horizontal, then transpose again.
-
- if (verticalTitleBar)
- rect = rect.transposed();
-
- do {
- int right = rect.right();
- int left = rect.left();
-
- QRect closeRect;
- if (canClose) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarCloseButton,
- opt).actualSize(QSize(iconSize, iconSize));
- sz += QSize(buttonMargin, buttonMargin);
- if (verticalTitleBar)
- sz = sz.transposed();
- closeRect = QRect(right - sz.width(),
- rect.center().y() - sz.height()/2,
- sz.width(), sz.height());
- right = closeRect.left() - 1;
- }
- if (sr == SE_DockWidgetCloseButton) {
- r = closeRect;
- break;
- }
-
- QRect floatRect;
- if (canFloat) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarNormalButton,
- opt).actualSize(QSize(iconSize, iconSize));
- sz += QSize(buttonMargin, buttonMargin);
- if (verticalTitleBar)
- sz = sz.transposed();
- floatRect = QRect(right - sz.width(),
- rect.center().y() - sz.height()/2,
- sz.width(), sz.height());
- right = floatRect.left() - 1;
- }
- if (sr == SE_DockWidgetFloatButton) {
- r = floatRect;
- break;
- }
-
- QRect iconRect;
- if (sr == SE_DockWidgetIcon) {
- r = iconRect;
- break;
- }
-
- QRect textRect = QRect(left, rect.top(),
- right - left, rect.height());
- if (sr == SE_DockWidgetTitleBarText) {
- r = textRect;
- break;
- }
-
- } while (false);
-
- if (verticalTitleBar) {
- r = QRect(rect.left() + r.top() - rect.top(),
- rect.top() + rect.right() - r.right(),
- r.height(), r.width());
- } else {
- r = visualRect(opt->direction, rect, r);
- }
- break;
- }
- case SE_ItemViewItemCheckIndicator:
- if (!qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- r = subElementRect(SE_CheckBoxIndicator, opt);
- break;
- }
- Q_FALLTHROUGH();
- case SE_ItemViewItemDecoration:
- case SE_ItemViewItemText:
- case SE_ItemViewItemFocusRect:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- if (!d->isViewItemCached(*vopt)) {
- d->viewItemLayout(vopt, &d->checkRect, &d->decorationRect, &d->displayRect, false);
- if (d->cachedOption) {
- delete d->cachedOption;
- d->cachedOption = nullptr;
- }
- d->cachedOption = new QStyleOptionViewItem(*vopt);
- }
- if (sr == SE_ItemViewItemCheckIndicator)
- r = d->checkRect;
- else if (sr == SE_ItemViewItemDecoration)
- r = d->decorationRect;
- else if (sr == SE_ItemViewItemText || sr == SE_ItemViewItemFocusRect)
- r = d->displayRect;
- }
- break;
- case SE_ToolBarHandle:
- if (const QStyleOptionToolBar *tbopt = qstyleoption_cast<const QStyleOptionToolBar *>(opt)) {
- if (tbopt->features & QStyleOptionToolBar::Movable) {
- ///we need to access the widget here because the style option doesn't
- //have all the information we need (ie. the layout's margin)
- const QMargins margins(2, 2, 2, 2);
- const int handleExtent = proxy()->pixelMetric(QStyle::PM_ToolBarHandleExtent, opt);
- if (tbopt->state & QStyle::State_Horizontal) {
- r = QRect(margins.left(), margins.top(),
- handleExtent,
- tbopt->rect.height() - (margins.top() + margins.bottom()));
- r = QStyle::visualRect(tbopt->direction, tbopt->rect, r);
- } else {
- r = QRect(margins.left(), margins.top(),
- tbopt->rect.width() - (margins.left() + margins.right()),
- handleExtent);
- }
- }
- }
- break;
- default:
- break;
- }
- return r;
-}
-
-// in lieu of std::array, minimal API
-template <int N>
-struct StaticPolygonF
-{
- QPointF data[N];
-
- Q_DECL_CONSTEXPR int size() const { return N; }
- Q_DECL_CONSTEXPR const QPointF *cbegin() const { return data; }
- Q_DECL_CONSTEXPR const QPointF &operator[](int idx) const { return data[idx]; }
-};
-
-static StaticPolygonF<3> calcArrow(const QStyleOptionSlider *dial, qreal &a)
-{
- int width = dial->rect.width();
- int height = dial->rect.height();
- int r = qMin(width, height) / 2;
- int currentSliderPosition = dial->upsideDown ? dial->sliderPosition : (dial->maximum - dial->sliderPosition);
-
- if (dial->maximum == dial->minimum)
- a = Q_PI / 2;
- else if (dial->dialWrapping)
- a = Q_PI * 3 / 2 - (currentSliderPosition - dial->minimum) * 2 * Q_PI
- / (dial->maximum - dial->minimum);
- else
- a = (Q_PI * 8 - (currentSliderPosition - dial->minimum) * 10 * Q_PI
- / (dial->maximum - dial->minimum)) / 6;
-
- int xc = width / 2;
- int yc = height / 2;
-
- int len = r - QStyleHelper::calcBigLineSize(r) - 5;
- if (len < 5)
- len = 5;
- int back = len / 2;
-
- StaticPolygonF<3> arrow = {{
- QPointF(0.5 + xc + len * qCos(a),
- 0.5 + yc - len * qSin(a)),
- QPointF(0.5 + xc + back * qCos(a + Q_PI * 5 / 6),
- 0.5 + yc - back * qSin(a + Q_PI * 5 / 6)),
- QPointF(0.5 + xc + back * qCos(a - Q_PI * 5 / 6),
- 0.5 + yc - back * qSin(a - Q_PI * 5 / 6)),
- }};
- return arrow;
-}
-
-void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const
-{
- switch (cc) {
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (slider->subControls == SC_SliderTickmarks) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int ticks = slider->tickPosition;
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
- int len = proxy()->pixelMetric(PM_SliderLength, slider);
- int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider);
- int interval = slider->tickInterval;
- if (interval <= 0) {
- interval = slider->singleStep;
- if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval,
- available)
- - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- 0, available) < 3)
- interval = slider->pageStep;
- }
- if (!interval)
- interval = 1;
- int fudge = len / 2;
- int pos;
- // Since there is no subrect for tickmarks do a translation here.
- p->save();
- p->translate(slider->rect.x(), slider->rect.y());
- p->setPen(slider->palette.windowText().color());
- int v = slider->minimum;
- while (v <= slider->maximum + 1) {
- if (v == slider->maximum + 1 && interval == 1)
- break;
- const int v_ = qMin(v, slider->maximum);
- pos = QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- v_, available) + fudge;
- if (slider->orientation == Qt::Horizontal) {
- if (ticks & QStyleOptionSlider::TicksAbove)
- p->drawLine(pos, 0, pos, tickOffset - 2);
- if (ticks & QStyleOptionSlider::TicksBelow)
- p->drawLine(pos, tickOffset + thickness + 1, pos,
- slider->rect.height()-1);
- } else {
- if (ticks & QStyleOptionSlider::TicksAbove)
- p->drawLine(0, pos, tickOffset - 2, pos);
- if (ticks & QStyleOptionSlider::TicksBelow)
- p->drawLine(tickOffset + thickness + 1, pos,
- slider->rect.width()-1, pos);
- }
- // in the case where maximum is max int
- int nextInterval = v + interval;
- if (nextInterval < v)
- break;
- v = nextInterval;
- }
- p->restore();
- }
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- // Make a copy here and reset it for each primitive.
- QStyleOptionSlider newScrollbar = *scrollbar;
- State saveFlags = scrollbar->state;
-
- if (scrollbar->subControls & SC_ScrollBarSubLine) {
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarSubLine);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarSubLine))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarSubLine, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarAddLine) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarAddLine);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarAddLine))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarAddLine, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarSubPage) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarSubPage);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarSubPage))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarSubPage, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarAddPage) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarAddPage);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarAddPage))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarAddPage, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarFirst) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarFirst);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarFirst))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarFirst, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarLast) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarLast);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarLast))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarLast, &newScrollbar, p);
- }
- }
- if (scrollbar->subControls & SC_ScrollBarSlider) {
- newScrollbar.rect = scrollbar->rect;
- newScrollbar.state = saveFlags;
- newScrollbar.rect = proxy()->subControlRect(cc, &newScrollbar, SC_ScrollBarSlider);
- if (newScrollbar.rect.isValid()) {
- if (!(scrollbar->activeSubControls & SC_ScrollBarSlider))
- newScrollbar.state &= ~(State_Sunken | State_MouseOver);
- proxy()->drawControl(CE_ScrollBarSlider, &newScrollbar, p);
-
- if (scrollbar->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(newScrollbar);
- fropt.rect.setRect(newScrollbar.rect.x() + 2, newScrollbar.rect.y() + 2,
- newScrollbar.rect.width() - 5,
- newScrollbar.rect.height() - 5);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- }
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QStyleOptionSpinBox copy = *sb;
- PrimitiveElement pe;
-
- if (sb->frame && (sb->subControls & SC_SpinBoxFrame)) {
- QRect r = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxFrame);
- qDrawWinPanel(p, r, sb->palette, true);
- }
-
- if (sb->subControls & SC_SpinBoxUp) {
- copy.subControls = SC_SpinBoxUp;
- QPalette pal2 = sb->palette;
- if (!(sb->stepEnabled & QStyleOptionSpinBox::StepUpEnabled)) {
- pal2.setCurrentColorGroup(QPalette::Disabled);
- copy.state &= ~State_Enabled;
- }
-
- copy.palette = pal2;
-
- if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_Sunken)) {
- copy.state |= State_On;
- copy.state |= State_Sunken;
- } else {
- copy.state |= State_Raised;
- copy.state &= ~State_Sunken;
- }
- pe = (sb->buttonSymbols == QStyleOptionSpinBox::PlusMinus ? PE_IndicatorSpinPlus
- : PE_IndicatorSpinUp);
-
- copy.rect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxUp);
- proxy()->drawPrimitive(PE_PanelButtonBevel, &copy, p);
- copy.rect.adjust(3, 0, -4, 0);
- proxy()->drawPrimitive(pe, &copy, p);
- }
-
- if (sb->subControls & SC_SpinBoxDown) {
- copy.subControls = SC_SpinBoxDown;
- copy.state = sb->state;
- QPalette pal2 = sb->palette;
- if (!(sb->stepEnabled & QStyleOptionSpinBox::StepDownEnabled)) {
- pal2.setCurrentColorGroup(QPalette::Disabled);
- copy.state &= ~State_Enabled;
- }
- copy.palette = pal2;
-
- if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_Sunken)) {
- copy.state |= State_On;
- copy.state |= State_Sunken;
- } else {
- copy.state |= State_Raised;
- copy.state &= ~State_Sunken;
- }
- pe = (sb->buttonSymbols == QStyleOptionSpinBox::PlusMinus ? PE_IndicatorSpinMinus
- : PE_IndicatorSpinDown);
-
- copy.rect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxDown);
- proxy()->drawPrimitive(PE_PanelButtonBevel, &copy, p);
- copy.rect.adjust(3, 0, -4, 0);
- proxy()->drawPrimitive(pe, &copy, p);
- }
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QRect button, menuarea;
- button = proxy()->subControlRect(cc, toolbutton, SC_ToolButton);
- menuarea = proxy()->subControlRect(cc, toolbutton, SC_ToolButtonMenu);
-
- State bflags = toolbutton->state & ~State_Sunken;
-
- if (bflags & State_AutoRaise) {
- if (!(bflags & State_MouseOver) || !(bflags & State_Enabled)) {
- bflags &= ~State_Raised;
- }
- }
- State mflags = bflags;
- if (toolbutton->state & State_Sunken) {
- if (toolbutton->activeSubControls & SC_ToolButton)
- bflags |= State_Sunken;
- mflags |= State_Sunken;
- }
-
- QStyleOption tool = *toolbutton;
- if (toolbutton->subControls & SC_ToolButton) {
- if (bflags & (State_Sunken | State_On | State_Raised)) {
- tool.rect = button;
- tool.state = bflags;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- }
- }
-
- if (toolbutton->state & State_HasFocus) {
- QStyleOptionFocusRect fr;
- fr.QStyleOption::operator=(*toolbutton);
- fr.rect.adjust(3, 3, -3, -3);
- if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup)
- fr.rect.adjust(0, 0, -proxy()->pixelMetric(QStyle::PM_MenuButtonIndicator,
- toolbutton), 0);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fr, p);
- }
- QStyleOptionToolButton label = *toolbutton;
- label.state = bflags;
- int fw = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- label.rect = button.adjusted(fw, fw, -fw, -fw);
- proxy()->drawControl(CE_ToolButtonLabel, &label, p);
-
- if (toolbutton->subControls & SC_ToolButtonMenu) {
- tool.rect = menuarea;
- tool.state = mflags;
- if (mflags & (State_Sunken | State_On | State_Raised))
- proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, p);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, p);
- } else if (toolbutton->features & QStyleOptionToolButton::HasMenu) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, toolbutton);
- QRect ir = toolbutton->rect;
- QStyleOptionToolButton newBtn = *toolbutton;
- newBtn.rect = QRect(ir.right() + 5 - mbi, ir.y() + ir.height() - mbi + 4, mbi - 6, mbi - 6);
- newBtn.rect = visualRect(toolbutton->direction, button, newBtn.rect);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, p);
- }
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- QRect ir;
- if (opt->subControls & SC_TitleBarLabel) {
- QColor left = tb->palette.highlight().color();
- QColor right = tb->palette.base().color();
-
- QBrush fillBrush(left);
- if (left != right) {
- QPoint p1(tb->rect.x(), tb->rect.top() + tb->rect.height()/2);
- QPoint p2(tb->rect.right(), tb->rect.top() + tb->rect.height()/2);
- QLinearGradient lg(p1, p2);
- lg.setColorAt(0, left);
- lg.setColorAt(1, right);
- fillBrush = lg;
- }
-
- p->fillRect(opt->rect, fillBrush);
-
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarLabel);
-
- p->setPen(tb->palette.highlightedText().color());
- p->drawText(ir.x() + 2, ir.y(), ir.width() - 2, ir.height(),
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, tb->text);
- }
-
- bool down = false;
- QPixmap pm;
-
- QStyleOption tool = *tb;
- if (tb->subControls & SC_TitleBarCloseButton && tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarCloseButton);
- down = tb->activeSubControls & SC_TitleBarCloseButton && (opt->state & State_Sunken);
- if ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool)
- pm = proxy()->standardIcon(SP_DockWidgetCloseButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- else
- pm = proxy()->standardIcon(SP_TitleBarCloseButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarMaxButton
- && tb->titleBarFlags & Qt::WindowMaximizeButtonHint
- && !(tb->titleBarState & Qt::WindowMaximized)) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarMaxButton);
-
- down = tb->activeSubControls & SC_TitleBarMaxButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarMaxButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarMinButton
- && tb->titleBarFlags & Qt::WindowMinimizeButtonHint
- && !(tb->titleBarState & Qt::WindowMinimized)) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarMinButton);
- down = tb->activeSubControls & SC_TitleBarMinButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarMinButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- bool drawNormalButton = (tb->subControls & SC_TitleBarNormalButton)
- && (((tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
- && (tb->titleBarState & Qt::WindowMinimized))
- || ((tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
- && (tb->titleBarState & Qt::WindowMaximized)));
-
- if (drawNormalButton) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarNormalButton);
- down = tb->activeSubControls & SC_TitleBarNormalButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarNormalButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
-
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarShadeButton
- && tb->titleBarFlags & Qt::WindowShadeButtonHint
- && !(tb->titleBarState & Qt::WindowMinimized)) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarShadeButton);
- down = (tb->activeSubControls & SC_TitleBarShadeButton && (opt->state & State_Sunken));
- pm = proxy()->standardIcon(SP_TitleBarShadeButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
-
- if (tb->subControls & SC_TitleBarUnshadeButton
- && tb->titleBarFlags & Qt::WindowShadeButtonHint
- && tb->titleBarState & Qt::WindowMinimized) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarUnshadeButton);
-
- down = tb->activeSubControls & SC_TitleBarUnshadeButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarUnshadeButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
- if (tb->subControls & SC_TitleBarContextHelpButton
- && tb->titleBarFlags & Qt::WindowContextHelpButtonHint) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarContextHelpButton);
-
- down = tb->activeSubControls & SC_TitleBarContextHelpButton && (opt->state & State_Sunken);
- pm = proxy()->standardIcon(SP_TitleBarContextHelpButton, &tool).pixmap(QSize(10, 10), dpr(opt->window));
- tool.rect = ir;
- tool.state = down ? State_Sunken : State_Raised;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- p->save();
- if (down)
- p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb),
- proxy()->pixelMetric(PM_ButtonShiftVertical, tb));
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
- if (tb->subControls & SC_TitleBarSysMenu && tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarSysMenu);
- if (!tb->icon.isNull()) {
- tb->icon.paint(p, ir);
- } else {
- int iconSize = proxy()->pixelMetric(PM_SmallIconSize, tb);
- pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool).pixmap(QSize(iconSize, iconSize), dpr(opt->window));
- tool.rect = ir;
- p->save();
- proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm);
- p->restore();
- }
- }
- }
- break;
- case CC_Dial:
- if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- // OK, this is more a port of things over
- p->save();
-
- // avoid dithering
- if (p->paintEngine()->hasFeature(QPaintEngine::Antialiasing))
- p->setRenderHint(QPainter::Antialiasing);
-
- int width = dial->rect.width();
- int height = dial->rect.height();
- qreal r = qMin(width, height) / 2;
- qreal d_ = r / 6;
- qreal dx = dial->rect.x() + d_ + (width - 2 * r) / 2 + 1;
- qreal dy = dial->rect.y() + d_ + (height - 2 * r) / 2 + 1;
- QRect br = QRect(int(dx), int(dy), int(r * 2 - 2 * d_ - 2), int(r * 2 - 2 * d_ - 2));
-
- QPalette pal = opt->palette;
- // draw notches
- if (dial->subControls & QStyle::SC_DialTickmarks) {
- p->setPen(pal.windowText().color());
- p->drawLines(QStyleHelper::calcLines(dial));
- }
-
- if (dial->state & State_Enabled) {
- p->setBrush(pal.brush(QPalette::ColorRole(proxy()->styleHint(SH_Dial_BackgroundRole, dial))));
- p->setPen(Qt::NoPen);
- p->drawEllipse(br);
- p->setBrush(Qt::NoBrush);
- }
- p->setPen(QPen(pal.dark().color()));
- p->drawArc(br, 60 * 16, 180 * 16);
- p->setPen(QPen(pal.light().color()));
- p->drawArc(br, 240 * 16, 180 * 16);
-
- qreal a;
- const StaticPolygonF<3> arrow = calcArrow(dial, a);
-
- p->setPen(Qt::NoPen);
- p->setBrush(pal.button());
- p->drawPolygon(arrow.cbegin(), arrow.size());
-
- a = QStyleHelper::angle(QPointF(width / 2, height / 2), arrow[0]);
- p->setBrush(Qt::NoBrush);
-
- if (a <= 0 || a > 200) {
- p->setPen(pal.light().color());
- p->drawLine(arrow[2], arrow[0]);
- p->drawLine(arrow[1], arrow[2]);
- p->setPen(pal.dark().color());
- p->drawLine(arrow[0], arrow[1]);
- } else if (a > 0 && a < 45) {
- p->setPen(pal.light().color());
- p->drawLine(arrow[2], arrow[0]);
- p->setPen(pal.dark().color());
- p->drawLine(arrow[1], arrow[2]);
- p->drawLine(arrow[0], arrow[1]);
- } else if (a >= 45 && a < 135) {
- p->setPen(pal.dark().color());
- p->drawLine(arrow[2], arrow[0]);
- p->drawLine(arrow[1], arrow[2]);
- p->setPen(pal.light().color());
- p->drawLine(arrow[0], arrow[1]);
- } else if (a >= 135 && a < 200) {
- p->setPen(pal.dark().color());
- p->drawLine(arrow[2], arrow[0]);
- p->setPen(pal.light().color());
- p->drawLine(arrow[0], arrow[1]);
- p->drawLine(arrow[1], arrow[2]);
- }
-
- // draw focus rect around the dial
- QStyleOptionFocusRect fropt;
- fropt.rect = dial->rect;
- fropt.state = dial->state;
- fropt.palette = dial->palette;
- if (fropt.state & QStyle::State_HasFocus) {
- br.adjust(0, 0, 2, 2);
- if (dial->subControls & SC_DialTickmarks) {
- int r = qMin(width, height) / 2;
- br.translate(-r / 6, - r / 6);
- br.setWidth(br.width() + r / 3);
- br.setHeight(br.height() + r / 3);
- }
- fropt.rect = br.adjusted(-2, -2, 2, 2);
- proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &fropt, p);
- }
- p->restore();
- }
- break;
- case CC_GroupBox:
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- // Draw frame
- QRect textRect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxLabel);
- QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxCheckBox);
- if (groupBox->subControls & QStyle::SC_GroupBoxFrame) {
- QStyleOptionFrame frame;
- frame.QStyleOption::operator=(*groupBox);
- frame.features = groupBox->features;
- frame.lineWidth = groupBox->lineWidth;
- frame.midLineWidth = groupBox->midLineWidth;
- frame.rect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxFrame);
- p->save();
- QRegion region(groupBox->rect);
- if (!groupBox->text.isEmpty()) {
- bool ltr = groupBox->direction == Qt::LeftToRight;
- QRect finalRect;
- if (groupBox->subControls & QStyle::SC_GroupBoxCheckBox) {
- finalRect = checkBoxRect.united(textRect);
- finalRect.adjust(ltr ? -4 : 0, 0, ltr ? 0 : 4, 0);
- } else {
- finalRect = textRect;
- }
- region -= finalRect;
- }
- p->setClipRegion(region);
- proxy()->drawPrimitive(PE_FrameGroupBox, &frame, p);
- p->restore();
- }
-
- // Draw title
- if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
- QColor textColor = groupBox->textColor;
- if (textColor.isValid())
- p->setPen(textColor);
- int alignment = int(groupBox->textAlignment);
- if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, opt))
- alignment |= Qt::TextHideMnemonic;
-
- proxy()->drawItemText(p, textRect, Qt::TextShowMnemonic | Qt::AlignHCenter | alignment,
- groupBox->palette, groupBox->state & State_Enabled, groupBox->text,
- textColor.isValid() ? QPalette::NoRole : QPalette::WindowText);
-
- if (groupBox->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*groupBox);
- fropt.rect = textRect;
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
-
- // Draw checkbox
- if (groupBox->subControls & SC_GroupBoxCheckBox) {
- QStyleOptionButton box;
- box.QStyleOption::operator=(*groupBox);
- box.rect = checkBoxRect;
- proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, p);
- }
- }
- break;
- case CC_MdiControls:
- {
- QStyleOptionButton btnOpt;
- btnOpt.QStyleOption::operator=(*opt);
- btnOpt.state &= ~State_MouseOver;
- int bsx = 0;
- int bsy = 0;
- const int buttonIconMetric = proxy()->pixelMetric(PM_TitleBarButtonIconSize, &btnOpt);
- const QSize buttonIconSize(buttonIconMetric, buttonIconMetric);
- if (opt->subControls & QStyle::SC_MdiCloseButton) {
- if (opt->activeSubControls & QStyle::SC_MdiCloseButton && (opt->state & State_Sunken)) {
- btnOpt.state |= State_Sunken;
- btnOpt.state &= ~State_Raised;
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- } else {
- btnOpt.state |= State_Raised;
- btnOpt.state &= ~State_Sunken;
- bsx = 0;
- bsy = 0;
- }
- btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiCloseButton);
- proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarCloseButton).pixmap(buttonIconSize, dpr(opt->window));
- proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
- }
- if (opt->subControls & QStyle::SC_MdiNormalButton) {
- if (opt->activeSubControls & QStyle::SC_MdiNormalButton && (opt->state & State_Sunken)) {
- btnOpt.state |= State_Sunken;
- btnOpt.state &= ~State_Raised;
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- } else {
- btnOpt.state |= State_Raised;
- btnOpt.state &= ~State_Sunken;
- bsx = 0;
- bsy = 0;
- }
- btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiNormalButton);
- proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarNormalButton).pixmap(buttonIconSize, dpr(opt->window));
- proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
- }
- if (opt->subControls & QStyle::SC_MdiMinButton) {
- if (opt->activeSubControls & QStyle::SC_MdiMinButton && (opt->state & State_Sunken)) {
- btnOpt.state |= State_Sunken;
- btnOpt.state &= ~State_Raised;
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- } else {
- btnOpt.state |= State_Raised;
- btnOpt.state &= ~State_Sunken;
- bsx = 0;
- bsy = 0;
- }
- btnOpt.rect = proxy()->subControlRect(CC_MdiControls, opt, SC_MdiMinButton);
- proxy()->drawPrimitive(PE_PanelButtonCommand, &btnOpt, p);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarMinButton).pixmap(buttonIconSize, dpr(opt->window));
- proxy()->drawItemPixmap(p, btnOpt.rect.translated(bsx, bsy), Qt::AlignCenter, pm);
- }
- }
- break;
- default:
- qWarning("QCommonStyle::drawComplexControl: Control %d not handled", cc);
- }
-}
-
-/*!
- \reimp
-*/
-QStyle::SubControl QCommonStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt) const
-{
- SubControl sc = SC_None;
- switch (cc) {
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- QRect r = proxy()->subControlRect(cc, slider, SC_SliderHandle);
- if (r.isValid() && r.contains(pt)) {
- sc = SC_SliderHandle;
- } else {
- r = proxy()->subControlRect(cc, slider, SC_SliderGroove);
- if (r.isValid() && r.contains(pt))
- sc = SC_SliderGroove;
- }
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- QRect r;
- uint ctrl = SC_ScrollBarAddLine;
- while (ctrl <= SC_ScrollBarGroove) {
- r = proxy()->subControlRect(cc, scrollbar, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- QRect r;
- uint ctrl = SC_ToolButton;
- while (ctrl <= SC_ToolButtonMenu) {
- r = proxy()->subControlRect(cc, toolbutton, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QRect r;
- uint ctrl = SC_SpinBoxUp;
- while (ctrl <= SC_SpinBoxEditField) {
- r = proxy()->subControlRect(cc, spinbox, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- QRect r;
- uint ctrl = SC_TitleBarSysMenu;
-
- while (ctrl <= SC_TitleBarLabel) {
- r = proxy()->subControlRect(cc, tb, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- QRect r;
- uint ctrl = SC_ComboBoxArrow; // Start here and go down.
- while (ctrl > 0) {
- r = proxy()->subControlRect(cc, cb, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl >>= 1;
- }
- }
- break;
- case CC_GroupBox:
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- QRect r;
- uint ctrl = SC_GroupBoxCheckBox;
- while (ctrl <= SC_GroupBoxFrame) {
- r = proxy()->subControlRect(cc, groupBox, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt)) {
- sc = QStyle::SubControl(ctrl);
- break;
- }
- ctrl <<= 1;
- }
- }
- break;
- case CC_MdiControls:
- {
- QRect r;
- uint ctrl = SC_MdiMinButton;
- while (ctrl <= SC_MdiCloseButton) {
- r = proxy()->subControlRect(CC_MdiControls, opt, QStyle::SubControl(ctrl));
- if (r.isValid() && r.contains(pt) && (opt->subControls & ctrl)) {
- sc = QStyle::SubControl(ctrl);
- return sc;
- }
- ctrl <<= 1;
- }
- }
- break;
- default:
- qWarning("QCommonStyle::hitTestComplexControl: Case %d not handled", cc);
- }
- return sc;
-}
-
-/*!
- \reimp
-*/
-QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc) const
-{
- QRect ret;
- switch (cc) {
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
-
- switch (sc) {
- case SC_SliderHandle: {
- int sliderPos = 0;
- int len = proxy()->pixelMetric(PM_SliderLength, slider);
- bool horizontal = slider->orientation == Qt::Horizontal;
- sliderPos = sliderPositionFromValue(slider->minimum, slider->maximum,
- slider->sliderPosition,
- (horizontal ? slider->rect.width()
- : slider->rect.height()) - len,
- slider->upsideDown);
- if (horizontal)
- ret.setRect(slider->rect.x() + sliderPos, slider->rect.y() + tickOffset, len, thickness);
- else
- ret.setRect(slider->rect.x() + tickOffset, slider->rect.y() + sliderPos, thickness, len);
- break; }
- case SC_SliderGroove:
- if (slider->orientation == Qt::Horizontal)
- ret.setRect(slider->rect.x(), slider->rect.y() + tickOffset,
- slider->rect.width(), thickness);
- else
- ret.setRect(slider->rect.x() + tickOffset, slider->rect.y(),
- thickness, slider->rect.height());
- break;
- default:
- break;
- }
- ret = visualRect(slider->direction, slider->rect, ret);
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- const QRect scrollBarRect = scrollbar->rect;
- int sbextent = 0;
- if (!proxy()->styleHint(SH_ScrollBar_Transient, scrollbar))
- sbextent = proxy()->pixelMetric(PM_ScrollBarExtent, scrollbar);
- int maxlen = ((scrollbar->orientation == Qt::Horizontal) ?
- scrollBarRect.width() : scrollBarRect.height()) - (sbextent * 2);
- int sliderlen;
-
- // calculate slider length
- if (scrollbar->maximum != scrollbar->minimum) {
- uint range = scrollbar->maximum - scrollbar->minimum;
- sliderlen = (qint64(scrollbar->pageStep) * maxlen) / (range + scrollbar->pageStep);
-
- int slidermin = proxy()->pixelMetric(PM_ScrollBarSliderMin, scrollbar);
- if (sliderlen < slidermin || range > INT_MAX / 2)
- sliderlen = slidermin;
- if (sliderlen > maxlen)
- sliderlen = maxlen;
- } else {
- sliderlen = maxlen;
- }
-
- int sliderstart = sbextent + sliderPositionFromValue(scrollbar->minimum,
- scrollbar->maximum,
- scrollbar->sliderPosition,
- maxlen - sliderlen,
- scrollbar->upsideDown);
-
- switch (sc) {
- case SC_ScrollBarSubLine: // top/left button
- if (scrollbar->orientation == Qt::Horizontal) {
- int buttonWidth = qMin(scrollBarRect.width() / 2, sbextent);
- ret.setRect(0, 0, buttonWidth, scrollBarRect.height());
- } else {
- int buttonHeight = qMin(scrollBarRect.height() / 2, sbextent);
- ret.setRect(0, 0, scrollBarRect.width(), buttonHeight);
- }
- break;
- case SC_ScrollBarAddLine: // bottom/right button
- if (scrollbar->orientation == Qt::Horizontal) {
- int buttonWidth = qMin(scrollBarRect.width()/2, sbextent);
- ret.setRect(scrollBarRect.width() - buttonWidth, 0, buttonWidth, scrollBarRect.height());
- } else {
- int buttonHeight = qMin(scrollBarRect.height()/2, sbextent);
- ret.setRect(0, scrollBarRect.height() - buttonHeight, scrollBarRect.width(), buttonHeight);
- }
- break;
- case SC_ScrollBarSubPage: // between top/left button and slider
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sbextent, 0, sliderstart - sbextent, scrollBarRect.height());
- else
- ret.setRect(0, sbextent, scrollBarRect.width(), sliderstart - sbextent);
- break;
- case SC_ScrollBarAddPage: // between bottom/right button and slider
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sliderstart + sliderlen, 0,
- maxlen - sliderstart - sliderlen + sbextent, scrollBarRect.height());
- else
- ret.setRect(0, sliderstart + sliderlen, scrollBarRect.width(),
- maxlen - sliderstart - sliderlen + sbextent);
- break;
- case SC_ScrollBarGroove:
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sbextent, 0, scrollBarRect.width() - sbextent * 2,
- scrollBarRect.height());
- else
- ret.setRect(0, sbextent, scrollBarRect.width(),
- scrollBarRect.height() - sbextent * 2);
- break;
- case SC_ScrollBarSlider:
- if (scrollbar->orientation == Qt::Horizontal)
- ret.setRect(sliderstart, 0, sliderlen, scrollBarRect.height());
- else
- ret.setRect(0, sliderstart, scrollBarRect.width(), sliderlen);
- break;
- default:
- break;
- }
- ret = visualRect(scrollbar->direction, scrollBarRect, ret);
- }
- break;
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QSize bs;
- int fw = spinbox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, spinbox) : 0;
- bs.setHeight(qMax(8, spinbox->rect.height()/2 - fw));
- // 1.6 -approximate golden mean
- bs.setWidth(qMax(16, qMin(bs.height() * 8 / 5, spinbox->rect.width() / 4)));
- int y = fw + spinbox->rect.y();
- int x, lx, rx;
- x = spinbox->rect.x() + spinbox->rect.width() - fw - bs.width();
- lx = fw;
- rx = x - fw;
- switch (sc) {
- case SC_SpinBoxUp:
- if (spinbox->buttonSymbols == QStyleOptionSpinBox::NoButtons)
- return QRect();
- ret = QRect(x, y, bs.width(), bs.height());
- break;
- case SC_SpinBoxDown:
- if (spinbox->buttonSymbols == QStyleOptionSpinBox::NoButtons)
- return QRect();
-
- ret = QRect(x, y + bs.height(), bs.width(), bs.height());
- break;
- case SC_SpinBoxEditField:
- if (spinbox->buttonSymbols == QStyleOptionSpinBox::NoButtons) {
- ret = QRect(lx, fw, spinbox->rect.width() - 2*fw, spinbox->rect.height() - 2*fw);
- } else {
- ret = QRect(lx, fw, rx, spinbox->rect.height() - 2*fw);
- }
- break;
- case SC_SpinBoxFrame:
- ret = spinbox->rect;
- default:
- break;
- }
- ret = visualRect(spinbox->direction, spinbox->rect, ret);
- }
- break;
- case CC_ToolButton:
- if (const QStyleOptionToolButton *tb = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, tb);
- ret = tb->rect;
- switch (sc) {
- case SC_ToolButton:
- if ((tb->features
- & (QStyleOptionToolButton::MenuButtonPopup | QStyleOptionToolButton::PopupDelay))
- == QStyleOptionToolButton::MenuButtonPopup)
- ret.adjust(0, 0, -mbi, 0);
- break;
- case SC_ToolButtonMenu:
- if ((tb->features
- & (QStyleOptionToolButton::MenuButtonPopup | QStyleOptionToolButton::PopupDelay))
- == QStyleOptionToolButton::MenuButtonPopup)
- ret.adjust(ret.width() - mbi, 0, 0, 0);
- break;
- default:
- break;
- }
- ret = visualRect(tb->direction, tb->rect, ret);
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- const qreal dpi = QStyleHelper::dpi(opt);
- const int x = cb->rect.x(), y = cb->rect.y(), wi = cb->rect.width(), he = cb->rect.height();
- const int margin = cb->frame ? qRound(QStyleHelper::dpiScaled(3, dpi)) : 0;
- const int bmarg = cb->frame ? qRound(QStyleHelper::dpiScaled(2, dpi)) : 0;
- const int xpos = x + wi - bmarg - qRound(QStyleHelper::dpiScaled(16, dpi));
-
-
- switch (sc) {
- case SC_ComboBoxFrame:
- ret = cb->rect;
- break;
- case SC_ComboBoxArrow:
- ret.setRect(xpos, y + bmarg, qRound(QStyleHelper::dpiScaled(16, opt)), he - 2*bmarg);
- break;
- case SC_ComboBoxEditField:
- ret.setRect(x + margin, y + margin, wi - 2 * margin - qRound(QStyleHelper::dpiScaled(16, dpi)), he - 2 * margin);
- break;
- case SC_ComboBoxListBoxPopup:
- ret = cb->rect;
- break;
- default:
- break;
- }
- ret = visualRect(cb->direction, cb->rect, ret);
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- const int controlMargin = 2;
- const int controlHeight = tb->rect.height() - controlMargin *2;
- const int delta = controlHeight + controlMargin;
- int offset = 0;
-
- bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
- bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
-
- switch (sc) {
- case SC_TitleBarLabel:
- if (tb->titleBarFlags & (Qt::WindowTitleHint | Qt::WindowSystemMenuHint)) {
- ret = tb->rect;
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- ret.adjust(delta, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowShadeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- ret.adjust(0, 0, -delta, 0);
- }
- break;
- case SC_TitleBarContextHelpButton:
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- offset += delta;
- Q_FALLTHROUGH();
- case SC_TitleBarMinButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMinButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarNormalButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarNormalButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarMaxButton:
- if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMaxButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarShadeButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarShadeButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarUnshadeButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarUnshadeButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarCloseButton:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- offset += delta;
- else if (sc == SC_TitleBarCloseButton)
- break;
- ret.setRect(tb->rect.right() - offset, tb->rect.top() + controlMargin,
- controlHeight, controlHeight);
- break;
- case SC_TitleBarSysMenu:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ret.setRect(tb->rect.left() + controlMargin, tb->rect.top() + controlMargin,
- controlHeight, controlHeight);
- }
- break;
- default:
- break;
- }
- ret = visualRect(tb->direction, tb->rect, ret);
- }
- break;
- case CC_GroupBox: {
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- switch (sc) {
- case SC_GroupBoxFrame:
- case SC_GroupBoxContents: {
- int topMargin = 0;
- int topHeight = 0;
- int verticalAlignment = proxy()->styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox);
- bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox;
- if (groupBox->text.size() || hasCheckBox) {
- int checkBoxHeight = hasCheckBox ? proxy()->pixelMetric(PM_IndicatorHeight, groupBox) : 0;
- topHeight = qMax(groupBox->fontMetrics.height(), checkBoxHeight);
- if (verticalAlignment & Qt::AlignVCenter)
- topMargin = topHeight / 2;
- else if (verticalAlignment & Qt::AlignTop)
- topMargin = topHeight;
- }
-
- QRect frameRect = groupBox->rect;
- frameRect.setTop(topMargin);
-
- if (sc == SC_GroupBoxFrame) {
- ret = frameRect;
- break;
- }
-
- int frameWidth = 0;
- if ((groupBox->features & QStyleOptionFrame::Flat) == 0)
- frameWidth = proxy()->pixelMetric(PM_DefaultFrameWidth, groupBox);
- ret = frameRect.adjusted(frameWidth, frameWidth + topHeight - topMargin,
- -frameWidth, -frameWidth);
- break;
- }
- case SC_GroupBoxCheckBox:
- case SC_GroupBoxLabel: {
- QFontMetrics fontMetrics = groupBox->fontMetrics;
- int th = fontMetrics.height();
- int tw = fontMetrics.size(Qt::TextShowMnemonic, groupBox->text + QLatin1Char(' ')).width();
- int marg = (groupBox->features & QStyleOptionFrame::Flat) ? 0 : 8;
- ret = groupBox->rect.adjusted(marg, 0, -marg, 0);
-
- int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, opt);
- int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, opt);
- int indicatorSpace = proxy()->pixelMetric(PM_CheckBoxLabelSpacing, opt) - 1;
- bool hasCheckBox = groupBox->subControls & QStyle::SC_GroupBoxCheckBox;
- int checkBoxWidth = hasCheckBox ? (indicatorWidth + indicatorSpace) : 0;
- int checkBoxHeight = hasCheckBox ? indicatorHeight : 0;
-
- int h = qMax(th, checkBoxHeight);
- ret.setHeight(h);
-
- // Adjusted rect for label + indicatorWidth + indicatorSpace
- QRect totalRect = alignedRect(groupBox->direction, groupBox->textAlignment,
- QSize(tw + checkBoxWidth, h), ret);
-
- // Adjust totalRect if checkbox is set
- if (hasCheckBox) {
- bool ltr = groupBox->direction == Qt::LeftToRight;
- int left = 0;
- // Adjust for check box
- if (sc == SC_GroupBoxCheckBox) {
- left = ltr ? totalRect.left() : (totalRect.right() - indicatorWidth);
- int top = totalRect.top() + (h - checkBoxHeight) / 2;
- totalRect.setRect(left, top, indicatorWidth, indicatorHeight);
- // Adjust for label
- } else {
- left = ltr ? (totalRect.left() + checkBoxWidth - 2) : totalRect.left();
- int top = totalRect.top() + (h - th) / 2;
- totalRect.setRect(left, top, totalRect.width() - checkBoxWidth, th);
- }
- }
- ret = totalRect;
- break;
- }
- default:
- break;
- }
- }
- break;
- }
- case CC_MdiControls:
- {
- int numSubControls = 0;
- if (opt->subControls & SC_MdiCloseButton)
- ++numSubControls;
- if (opt->subControls & SC_MdiMinButton)
- ++numSubControls;
- if (opt->subControls & SC_MdiNormalButton)
- ++numSubControls;
- if (numSubControls == 0)
- break;
-
- int buttonWidth = opt->rect.width() / numSubControls - 1;
- int offset = 0;
- switch (sc) {
- case SC_MdiCloseButton:
- // Only one sub control, no offset needed.
- if (numSubControls == 1)
- break;
- offset += buttonWidth + 2;
- Q_FALLTHROUGH();
- case SC_MdiNormalButton:
- // No offset needed if
- // 1) There's only one sub control
- // 2) We have a close button and a normal button (offset already added in SC_MdiClose)
- if (numSubControls == 1 || (numSubControls == 2 && !(opt->subControls & SC_MdiMinButton)))
- break;
- if (opt->subControls & SC_MdiNormalButton)
- offset += buttonWidth;
- break;
- default:
- break;
- }
-
- // Subtract one pixel if we only have one sub control. At this point
- // buttonWidth is the actual width + 1 pixel margin, but we don't want the
- // margin when there are no other controllers.
- if (numSubControls == 1)
- --buttonWidth;
- ret = QRect(offset, 0, buttonWidth, opt->rect.height());
- break; }
- default:
- qWarning("QCommonStyle::subControlRect: Case %d not handled", cc);
- }
-
- return ret;
-}
-
-int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt) const
-{
- int ret;
-
- switch (m) {
- case PM_FocusFrameVMargin:
- case PM_FocusFrameHMargin:
- ret = 2;
- break;
- case PM_MenuBarVMargin:
- case PM_MenuBarHMargin:
- ret = 0;
- break;
- case PM_DialogButtonsSeparator:
- ret = int(QStyleHelper::dpiScaled(5, opt));
- break;
- case PM_DialogButtonsButtonWidth:
- ret = int(QStyleHelper::dpiScaled(70, opt));
- break;
- case PM_DialogButtonsButtonHeight:
- ret = int(QStyleHelper::dpiScaled(30, opt));
- break;
- case PM_TitleBarHeight: {
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- if ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool) {
- ret = qMax(opt->fontMetrics.height(), 16);
- } else {
- ret = qMax(opt->fontMetrics.height(), 18);
- }
- } else {
- ret = int(QStyleHelper::dpiScaled(18., opt));
- }
-
- break; }
- case PM_TitleBarButtonSize:
- ret = int(QStyleHelper::dpiScaled(16., opt));
- break;
- case PM_TitleBarButtonIconSize:
- ret = int(QStyleHelper::dpiScaled(16., opt));
- break;
-
- case PM_ScrollBarSliderMin:
- ret = int(QStyleHelper::dpiScaled(9., opt));
- break;
-
- case PM_ButtonMargin:
- ret = int(QStyleHelper::dpiScaled(6., opt));
- break;
-
- case PM_DockWidgetTitleBarButtonMargin:
- ret = int(QStyleHelper::dpiScaled(2., opt));
- break;
-
- case PM_ButtonDefaultIndicator:
- ret = 0;
- break;
-
- case PM_MenuButtonIndicator:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_ButtonShiftHorizontal:
- case PM_ButtonShiftVertical:
-
- case PM_DefaultFrameWidth:
- ret = 2;
- break;
-
- case PM_ComboBoxFrameWidth:
- case PM_SpinBoxFrameWidth:
- case PM_MenuPanelWidth:
- case PM_TabBarBaseOverlap:
- case PM_TabBarBaseHeight:
- ret = proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- break;
- case PM_MdiSubWindowFrameWidth:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
- case PM_MdiSubWindowMinimizedWidth:
- ret = int(QStyleHelper::dpiScaled(196, opt));
- break;
- case PM_ScrollBarExtent:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_MaximumDragDistance:
- ret = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::MaximumScrollBarDragDistance).toInt();
- break;
- case PM_SliderThickness:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_SliderTickmarkOffset:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int space = (sl->orientation == Qt::Horizontal) ? sl->rect.height()
- : sl->rect.width();
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, sl);
- int ticks = sl->tickPosition;
-
- if (ticks == QStyleOptionSlider::TicksBothSides)
- ret = (space - thickness) / 2;
- else if (ticks == QStyleOptionSlider::TicksAbove)
- ret = space - thickness;
- else
- ret = 0;
- } else {
- ret = 0;
- }
- break;
- case PM_SliderSpaceAvailable:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (sl->orientation == Qt::Horizontal)
- ret = sl->rect.width() - proxy()->pixelMetric(PM_SliderLength, sl);
- else
- ret = sl->rect.height() - proxy()->pixelMetric(PM_SliderLength, sl);
- } else {
- ret = 0;
- }
- break;
- case PM_DockWidgetSeparatorExtent:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
-
- case PM_DockWidgetHandleExtent:
- ret = int(QStyleHelper::dpiScaled(8, opt));
- break;
- case PM_DockWidgetTitleMargin:
- ret = 0;
- break;
- case PM_DockWidgetFrameWidth:
- ret = 1;
- break;
- case PM_SpinBoxSliderHeight:
- case PM_MenuBarPanelWidth:
- ret = 2;
- break;
- case PM_MenuBarItemSpacing:
- ret = 0;
- break;
- case PM_ToolBarFrameWidth:
- ret = 1;
- break;
-
- case PM_ToolBarItemMargin:
- ret = 0;
- break;
-
- case PM_ToolBarItemSpacing:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
-
- case PM_ToolBarHandleExtent:
- ret = int(QStyleHelper::dpiScaled(8, opt));
- break;
-
- case PM_ToolBarSeparatorExtent:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
-
- case PM_ToolBarExtensionExtent:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_TabBarTabOverlap:
- ret = 3;
- break;
-
- case PM_TabBarTabHSpace:
- ret = int(QStyleHelper::dpiScaled(24, opt));
- break;
-
- case PM_TabBarTabShiftHorizontal:
- ret = 0;
- break;
-
- case PM_TabBarTabShiftVertical:
- ret = 2;
- break;
-
- case PM_TabBarTabVSpace: {
- const QStyleOptionTab *tb = qstyleoption_cast<const QStyleOptionTab *>(opt);
- if (tb && (tb->shape == QStyleOptionTab::RoundedNorth || tb->shape == QStyleOptionTab::RoundedSouth
- || tb->shape == QStyleOptionTab::RoundedWest || tb->shape == QStyleOptionTab::RoundedEast))
- ret = 8;
- else
- if(tb && (tb->shape == QStyleOptionTab::TriangularWest || tb->shape == QStyleOptionTab::TriangularEast))
- ret = 3;
- else
- ret = 2;
- break; }
-
- case PM_ProgressBarChunkWidth:
- ret = 9;
- break;
-
- case PM_IndicatorWidth:
- ret = int(QStyleHelper::dpiScaled(13, opt));
- break;
-
- case PM_IndicatorHeight:
- ret = int(QStyleHelper::dpiScaled(13, opt));
- break;
-
- case PM_ExclusiveIndicatorWidth:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_ExclusiveIndicatorHeight:
- ret = int(QStyleHelper::dpiScaled(12, opt));
- break;
-
- case PM_MenuTearoffHeight:
- ret = int(QStyleHelper::dpiScaled(10, opt));
- break;
-
- case PM_MenuScrollerHeight:
- ret = int(QStyleHelper::dpiScaled(10, opt));
- break;
-
- case PM_MenuDesktopFrameWidth:
- case PM_MenuHMargin:
- case PM_MenuVMargin:
- ret = 0;
- break;
-
- case PM_HeaderMargin:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
- case PM_HeaderMarkSize:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_HeaderGripMargin:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
- case PM_HeaderDefaultSectionSizeHorizontal:
- ret = int(QStyleHelper::dpiScaled(100, opt));
- break;
- case PM_HeaderDefaultSectionSizeVertical:
- ret = int(QStyleHelper::dpiScaled(30, opt));
- break;
- case PM_TabBarScrollButtonWidth:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_LayoutLeftMargin:
- case PM_LayoutTopMargin:
- case PM_LayoutRightMargin:
- case PM_LayoutBottomMargin:
- {
- bool isWindow = opt ? (opt->state & State_Window) : false;
- ret = proxy()->pixelMetric(isWindow ? PM_DefaultTopLevelMargin : PM_DefaultChildMargin);
- }
- break;
- case PM_LayoutHorizontalSpacing:
- case PM_LayoutVerticalSpacing:
- ret = proxy()->pixelMetric(PM_DefaultLayoutSpacing);
- break;
-
- case PM_DefaultTopLevelMargin:
- ret = int(QStyleHelper::dpiScaled(11, opt));
- break;
- case PM_DefaultChildMargin:
- ret = int(QStyleHelper::dpiScaled(9, opt));
- break;
- case PM_DefaultLayoutSpacing:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
-
- case PM_ToolBarIconSize:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::ToolBarIconSize).toInt();
- if (ret <= 0)
- ret = int(QStyleHelper::dpiScaled(24, opt));
- break;
-
- case PM_TabBarIconSize:
- case PM_ListViewIconSize:
- ret = proxy()->pixelMetric(PM_SmallIconSize, opt);
- break;
-
- case PM_ButtonIconSize:
- case PM_SmallIconSize:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_IconViewIconSize:
- ret = proxy()->pixelMetric(PM_LargeIconSize, opt);
- break;
-
- case PM_LargeIconSize:
- ret = int(QStyleHelper::dpiScaled(32, opt));
- break;
-
- case PM_ToolTipLabelFrameWidth:
- ret = 1;
- break;
- case PM_CheckBoxLabelSpacing:
- case PM_RadioButtonLabelSpacing:
- ret = int(QStyleHelper::dpiScaled(6, opt));
- break;
- case PM_SizeGripSize:
- ret = int(QStyleHelper::dpiScaled(13, opt));
- break;
- case PM_MessageBoxIconSize:
-#ifdef Q_OS_MAC
- if (QGuiApplication::desktopSettingsAware()) {
- ret = 64; // No DPI scaling, it's handled elsewhere.
- } else
-#endif
- {
- ret = int(QStyleHelper::dpiScaled(32, opt));
- }
- break;
- case PM_TextCursorWidth:
- ret = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::TextCursorWidth).toInt();
- break;
- case PM_TabBar_ScrollButtonOverlap:
- ret = 1;
- break;
- case PM_TabCloseIndicatorWidth:
- case PM_TabCloseIndicatorHeight:
- ret = int(QStyleHelper::dpiScaled(16, opt));
- break;
- case PM_ScrollView_ScrollBarSpacing:
- ret = 2 * proxy()->pixelMetric(PM_DefaultFrameWidth, opt);
- break;
- case PM_ScrollView_ScrollBarOverlap:
- ret = 0;
- break;
- case PM_SubMenuOverlap:
- ret = -proxy()->pixelMetric(QStyle::PM_MenuPanelWidth, opt);
- break;
- case PM_TreeViewIndentation:
- ret = int(QStyleHelper::dpiScaled(20, opt));
- break;
- default:
- ret = 0;
- break;
- }
-
- return ret;
-}
-
-QSize QCommonStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &csz) const
-{
- Q_D(const QCommonStyle);
- QSize sz(csz);
- switch (ct) {
- case CT_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- int w = csz.width(),
- h = csz.height(),
- bm = proxy()->pixelMetric(PM_ButtonMargin, btn),
- fw = proxy()->pixelMetric(PM_DefaultFrameWidth, btn) * 2;
- w += bm + fw;
- h += bm + fw;
- if (btn->features & QStyleOptionButton::AutoDefaultButton){
- int dbw = proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn) * 2;
- w += dbw;
- h += dbw;
- }
- sz = QSize(w, h);
- }
- break;
- case CT_RadioButton:
- case CT_CheckBox:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- bool isRadio = (ct == CT_RadioButton);
-
- int w = proxy()->pixelMetric(isRadio ? PM_ExclusiveIndicatorWidth
- : PM_IndicatorWidth, btn);
- int h = proxy()->pixelMetric(isRadio ? PM_ExclusiveIndicatorHeight
- : PM_IndicatorHeight, btn);
-
- int margins = 0;
- // we add 4 pixels for label margins
- if (!btn->icon.isNull() || !btn->text.isEmpty())
- margins = 4 + proxy()->pixelMetric(isRadio ? PM_RadioButtonLabelSpacing
- : PM_CheckBoxLabelSpacing, opt);
- sz += QSize(w + margins, 4);
- sz.setHeight(qMax(sz.height(), h));
- }
- break;
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- bool checkable = mi->menuHasCheckableItems;
- int maxpmw = mi->maxIconWidth;
- int w = sz.width(), h = sz.height();
- if (mi->menuItemType == QStyleOptionMenuItem::Separator) {
- w = 10;
- h = 2;
- } else {
- h = mi->fontMetrics.height() + 8;
- if (!mi->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize);
- h = qMax(h, mi->icon.actualSize(QSize(iconExtent, iconExtent)).height() + 4);
- }
- }
- if (mi->text.contains(QLatin1Char('\t')))
- w += 12;
- if (maxpmw > 0)
- w += maxpmw + 6;
- if (checkable && maxpmw < 20)
- w += 20 - maxpmw;
- if (checkable || maxpmw > 0)
- w += 2;
- w += 12;
- sz = QSize(w, h);
- }
- break;
- case CT_ToolButton:
- sz = QSize(sz.width() + 6, sz.height() + 5);
- break;
- case CT_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- int fw = cmb->frame ? proxy()->pixelMetric(PM_ComboBoxFrameWidth, opt) * 2 : 0;
- const int textMargins = 2*(proxy()->pixelMetric(PM_FocusFrameHMargin) + 1);
- // QItemDelegate::sizeHint expands the textMargins two times, thus the 2*textMargins...
- int other = qMax(23, 2*textMargins + proxy()->pixelMetric(QStyle::PM_ScrollBarExtent, opt));
- sz = QSize(sz.width() + fw + other, sz.height() + fw);
- }
- break;
- case CT_HeaderSection:
- if (const QStyleOptionHeader *hdr = qstyleoption_cast<const QStyleOptionHeader *>(opt)) {
- bool nullIcon = hdr->icon.isNull();
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, hdr);
- int iconSize = nullIcon ? 0 : proxy()->pixelMetric(QStyle::PM_SmallIconSize, hdr);
- QSize txt = hdr->fontMetrics.size(0, hdr->text);
- sz.setHeight(margin + qMax(iconSize, txt.height()) + margin);
- sz.setWidth((nullIcon ? 0 : margin) + iconSize
- + (hdr->text.isNull() ? 0 : margin) + txt.width() + margin);
- if (hdr->sortIndicator != QStyleOptionHeader::None) {
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, hdr);
- if (hdr->orientation == Qt::Horizontal)
- sz.rwidth() += sz.height() + margin;
- else
- sz.rheight() += sz.width() + margin;
- }
- }
- break;
- case CT_TabWidget:
- sz += QSize(4, 4);
- break;
- case CT_LineEdit:
- if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- const int borderSize = 2 * f->lineWidth;
- sz += QSize(borderSize, borderSize);
- const int minSize = 10;
- if (sz.width() < minSize)
- sz.rwidth() = minSize;
- if (sz.height() < minSize)
- sz.rheight() = minSize;
- }
- break;
- case CT_GroupBox:
- if (const QStyleOptionGroupBox *styleOpt = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) {
- if (sz.isEmpty())
- sz = QSize(20, 20);
- sz += QSize(styleOpt->features.testFlag(QStyleOptionFrame::Flat) ? 0 : 16, 0);
- }
- break;
- case CT_MdiControls:
- if (const QStyleOptionComplex *styleOpt = qstyleoption_cast<const QStyleOptionComplex *>(opt)) {
- const int buttonSize = proxy()->pixelMetric(PM_TitleBarButtonSize, styleOpt);
- int width = 1;
- if (styleOpt->subControls & SC_MdiMinButton)
- width += buttonSize + 1;
- if (styleOpt->subControls & SC_MdiNormalButton)
- width += buttonSize + 1;
- if (styleOpt->subControls & SC_MdiCloseButton)
- width += buttonSize + 1;
- sz = QSize(width, buttonSize);
- } else {
- const int buttonSize = proxy()->pixelMetric(PM_TitleBarButtonSize, opt);
- sz = QSize(1 + 3 * (buttonSize + 1), buttonSize);
- }
- break;
- case CT_ItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) {
- QRect decorationRect, displayRect, checkRect;
- d->viewItemLayout(vopt, &checkRect, &decorationRect, &displayRect, true);
- sz = (decorationRect|displayRect|checkRect).size();
- if (decorationRect.isValid() && sz.height() == decorationRect.height())
- sz.rheight() += 2; // Prevent icons from overlapping.
- }
- break;
- case CT_SpinBox:
- if (const QStyleOptionSpinBox *vopt = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- // Add button + frame widths
- if (vopt->subControls == SC_SpinBoxFrame) {
- const qreal dpi = QStyleHelper::dpi(opt);
- const bool hasButtons = (vopt->buttonSymbols != QStyleOptionSpinBox::NoButtons);
- const int buttonWidth = hasButtons ? qRound(QStyleHelper::dpiScaled(16, dpi)) : 0;
- const int fw = vopt->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, vopt) : 0;
- sz += QSize(buttonWidth + 2*fw, 1 + 2*fw);
- } else {
- const QSize buttonSize = proxy()->subControlRect(CC_SpinBox, vopt, SC_SpinBoxUp).size();
- const int upAndDownTogetherHeight = buttonSize.height() * 2;
- sz += QSize(buttonSize.width(), upAndDownTogetherHeight);
- }
- }
- break;
- case CT_Slider:
- if (const QStyleOptionSlider *option = qstyleoption_cast<const QStyleOptionSlider *>(opt))
- sz = subControlRect(QStyle::CC_Slider, option, QStyle::SC_SliderHandle).size();
- break;
- case CT_Dial:
- sz = QSize(20, 20);
- break;
- case CT_Frame:
- if (const QStyleOptionFrame *option = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- const int ninePatchSplit = 1;
- int w = qMax(10, (option->lineWidth * 2) + ninePatchSplit);
- sz = QSize(w, w);
- }
- break;
- case CT_ProgressBar:
- if (sz.isNull()) {
- // Special case: return minimum nine patch image size
- sz = QSize(10, 10);
- }
- break;
- case CT_ScrollBar:
- case CT_MenuBar:
- case CT_Menu:
- case CT_MenuBarItem:
- case CT_TabBarTab:
- // just return the contentsSize for now
- Q_FALLTHROUGH();
- default:
- break;
- }
- return sz;
-}
-
-QFont QCommonStyle::font(QStyle::ControlElement element, const QStyle::State state) const
-{
- Q_UNUSED(element);
- Q_UNUSED(state);
- return QGuiApplication::font();
-}
-
-QMargins QCommonStyle::ninePatchMargins(QStyle::ControlElement /*ce*/, const QStyleOption * /*opt*/, const QSize &imageSize) const
-{
- // By default, we just divide the image at the center
- int w = imageSize.width() / 2;
- int h = imageSize.height() / 2;
- return QMargins(w, h, w, h);
-}
-
-QMargins QCommonStyle::ninePatchMargins(QStyle::ComplexControl /*cc*/, const QStyleOptionComplex * /*opt*/, const QSize &imageSize) const
-{
- // By default, we just divide the image at the center
- int w = imageSize.width() / 2;
- int h = imageSize.height() / 2;
- return QMargins(w, h, w, h);
-}
-
-int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, QStyleHintReturn *hret) const
-{
- int ret = 0;
-
- switch (sh) {
- case SH_Menu_KeyboardSearch:
- ret = false;
- break;
- case SH_Slider_AbsoluteSetButtons:
- ret = Qt::MiddleButton;
- break;
- case SH_Slider_PageSetButtons:
- ret = Qt::LeftButton;
- break;
- case SH_ScrollBar_ContextMenu:
- ret = true;
- break;
- case SH_GroupBox_TextLabelVerticalAlignment:
- ret = Qt::AlignVCenter;
- break;
- case SH_GroupBox_TextLabelColor:
- ret = opt ? int(opt->palette.color(QPalette::Text).rgba()) : 0;
- break;
-
- case SH_ListViewExpand_SelectMouseType:
- case SH_TabBar_SelectMouseType:
- ret = QEvent::MouseButtonPress;
- break;
-
- case SH_TabBar_Alignment:
- ret = Qt::AlignLeft;
- break;
-
- case SH_Header_ArrowAlignment:
- ret = Qt::AlignRight | Qt::AlignVCenter;
- break;
-
- case SH_TitleBar_AutoRaise:
- ret = false;
- break;
-
- case SH_Menu_SubMenuPopupDelay:
- ret = 256;
- break;
-
- case SH_Menu_SloppySubMenus:
- ret = true;
- break;
-
- case SH_Menu_SubMenuUniDirection:
- ret = false;
- break;
- case SH_Menu_SubMenuUniDirectionFailCount:
- ret = 1;
- break;
- case SH_Menu_SubMenuSloppySelectOtherActions:
- ret = true;
- break;
- case SH_Menu_SubMenuSloppyCloseTimeout:
- ret = 1000;
- break;
- case SH_Menu_SubMenuResetWhenReenteringParent:
- ret = false;
- break;
- case SH_Menu_SubMenuDontStartSloppyOnLeave:
- ret = false;
- break;
-
- case SH_ProgressDialog_TextLabelAlignment:
- ret = Qt::AlignCenter;
- break;
-
- case SH_BlinkCursorWhenTextSelected:
-#if defined(Q_OS_DARWIN)
- ret = 0;
-#else
- ret = 1;
-#endif
- break;
-
- case SH_Table_GridLineColor:
- if (opt)
- ret = opt->palette.color(QPalette::Mid).rgba();
- else
- ret = -1;
- break;
- case SH_LineEdit_PasswordCharacter: {
- const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme();
- const QPlatformTheme::ThemeHint hintType = QPlatformTheme::PasswordMaskCharacter;
- const QVariant hint = theme ? theme->themeHint(hintType) : QPlatformTheme::defaultThemeHint(hintType);
- ret = hint.toChar().unicode();
- break;
- }
- case SH_LineEdit_PasswordMaskDelay:
- ret = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::PasswordMaskDelay).toInt();
- break;
- case SH_ToolBox_SelectedPageTitleBold:
- ret = 1;
- break;
-
- case SH_UnderlineShortcut:
- ret = 1;
- break;
-
- case SH_SpinBox_ClickAutoRepeatRate:
- ret = 150;
- break;
-
- case SH_SpinBox_ClickAutoRepeatThreshold:
- ret = 500;
- break;
-
- case SH_SpinBox_KeyPressAutoRepeatRate:
- ret = 75;
- break;
-
- case SH_Menu_SelectionWrap:
- ret = true;
- break;
-
- case SH_Menu_FillScreenWithScroll:
- ret = true;
- break;
-
- case SH_ToolTipLabel_Opacity:
- ret = 255;
- break;
-
- case SH_Button_FocusPolicy:
- ret = Qt::StrongFocus;
- break;
-
- case SH_MessageBox_UseBorderForButtonSpacing:
- ret = 0;
- break;
-
- case SH_ToolButton_PopupDelay:
- ret = 600;
- break;
-
- case SH_FocusFrame_Mask:
- ret = 1;
- break;
- case SH_RubberBand_Mask:
- if (const QStyleOptionRubberBand *rbOpt = qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- ret = 0;
- if (rbOpt->shape == QStyleOptionRubberBand::Rectangle) {
- ret = true;
- if(QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(hret)) {
- mask->region = opt->rect;
- int margin = proxy()->pixelMetric(PM_DefaultFrameWidth) * 2;
- mask->region -= opt->rect.adjusted(margin, margin, -margin, -margin);
- }
- }
- }
- break;
- case SH_SpinControls_DisableOnBounds:
- ret = 1;
- break;
-
- case SH_Dial_BackgroundRole:
- ret = QPalette::Window;
- break;
-
- case SH_ComboBox_LayoutDirection:
- ret = opt ? opt->direction : Qt::LeftToRight;
- break;
-
- case SH_ItemView_EllipsisLocation:
- ret = Qt::AlignTrailing;
- break;
-
- case SH_ItemView_ShowDecorationSelected:
- ret = false;
- break;
-
- case SH_ItemView_ActivateItemOnSingleClick:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::ItemViewActivateItemOnSingleClick).toBool() ? 1 : 0;
- break;
- case SH_TitleBar_ModifyNotification:
- ret = true;
- break;
- case SH_ScrollBar_RollBetweenButtons:
- ret = false;
- break;
- case SH_TabBar_ElideMode:
- ret = Qt::ElideNone;
- break;
- case SH_DialogButtonLayout:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::DialogButtonBoxLayout).toInt();
- break;
- case SH_ComboBox_PopupFrameStyle:
- ret = QStyleOptionFrame::StyledPanel | QStyleOptionFrame::Plain;
- break;
- case SH_MessageBox_TextInteractionFlags:
- ret = Qt::LinksAccessibleByMouse;
- break;
- case SH_DialogButtonBox_ButtonsHaveIcons:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::DialogButtonBoxButtonsHaveIcons).toBool() ? 1 : 0;
- break;
- case SH_SpellCheckUnderlineStyle:
- ret = QTextCharFormat::WaveUnderline;
- break;
- case SH_MessageBox_CenterButtons:
- ret = true;
- break;
- case SH_ItemView_MovementWithoutUpdatingSelection:
- ret = true;
- break;
- case SH_FocusFrame_AboveWidget:
- ret = false;
- break;
- case SH_TabWidget_DefaultTabPosition:
- ret = QStyleOptionTabBarBase::North;
- break;
- case SH_ToolBar_Movable:
- ret = true;
- break;
- case SH_TextControl_FocusIndicatorTextCharFormat:
- ret = true;
- if (QStyleHintReturnVariant *vret = qstyleoption_cast<QStyleHintReturnVariant*>(hret)) {
- QPen outline(opt->palette.color(QPalette::Text), 1, Qt::DotLine);
- QTextCharFormat fmt;
- fmt.setProperty(QTextFormat::OutlinePen, outline);
- vret->variant = fmt;
- }
- break;
- case SH_WizardStyle:
- break;
- case SH_FormLayoutWrapPolicy:
- break;
- case SH_FormLayoutFieldGrowthPolicy:
- break;
- case SH_FormLayoutFormAlignment:
- ret = Qt::AlignLeft | Qt::AlignTop;
- break;
- case SH_FormLayoutLabelAlignment:
- ret = Qt::AlignLeft;
- break;
- case SH_ItemView_ArrowKeysNavigateIntoChildren:
- ret = false;
- break;
- case SH_ItemView_DrawDelegateFrame:
- ret = 0;
- break;
- case SH_TabBar_CloseButtonPosition:
- ret = QStyleOptionTabBarBase::RightSide;
- break;
- case SH_TabBar_ChangeCurrentDelay:
- ret = 500;
- break;
- case SH_DockWidget_ButtonsHaveFrame:
- ret = true;
- break;
- case SH_ToolButtonStyle:
- ret = 0;
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
- ret = theme->themeHint(QPlatformTheme::ToolButtonStyle).toInt();
- break;
- case SH_RequestSoftwareInputPanel:
- ret = RSIP_OnMouseClick;
- break;
- case SH_ScrollBar_Transient:
- ret = false;
- break;
- case SH_Menu_SupportsSections:
- ret = false;
- break;
- case SH_ToolTip_WakeUpDelay:
- ret = 700;
- break;
- case SH_ToolTip_FallAsleepDelay:
- ret = 2000;
- break;
- case SH_Widget_Animate:
- ret = true;
- break;
- case SH_Splitter_OpaqueResize:
- ret = true;
- break;
- case SH_ItemView_ScrollMode:
- ret = QStyleOptionViewItem::ScrollPerItem;
- break;
- case SH_TitleBar_ShowToolTipsOnButtons:
- ret = true;
- break;
- case SH_Widget_Animation_Duration:
- ret = styleHint(SH_Widget_Animate, opt, hret) ? 200 : 0;
- break;
- case SH_ComboBox_AllowWheelScrolling:
- ret = true;
- break;
- case SH_SpinBox_ButtonsInsideFrame:
- ret = true;
- break;
- case SH_SpinBox_StepModifier:
- ret = Qt::ControlModifier;
- break;
- default:
- ret = 0;
- break;
- }
-
- return ret;
-}
-
-#if QT_CONFIG(imageformat_xpm)
-static QPixmap cachedPixmapFromXPM(const char * const *xpm)
-{
- QPixmap result;
- const QString tag = QString::asprintf("xpm:0x%p", static_cast<const void*>(xpm));
- if (!QPixmapCache::find(tag, &result)) {
- result = QPixmap(xpm);
- QPixmapCache::insert(tag, result);
- }
- return result;
-}
-
-static inline QPixmap titleBarMenuCachedPixmapFromXPM() { return cachedPixmapFromXPM(qt_menu_xpm); }
-#endif
-
-static inline QString clearText16IconPath()
-{
- return QStringLiteral(":/qt-project.org/styles/commonstyle/images/cleartext-16.png");
-}
-
-#if defined(Q_OS_WIN) || QT_CONFIG(imageformat_png)
-static QIcon clearTextIcon(bool rtl)
-{
- const QString directionalThemeName = rtl
- ? QStringLiteral("edit-clear-locationbar-ltr") : QStringLiteral("edit-clear-locationbar-rtl");
- if (QIcon::hasThemeIcon(directionalThemeName))
- return QIcon::fromTheme(directionalThemeName);
- const QString themeName = QStringLiteral("edit-clear");
- if (QIcon::hasThemeIcon(themeName))
- return QIcon::fromTheme(themeName);
-
- QIcon icon;
-#ifndef QT_NO_IMAGEFORMAT_PNG
- QPixmap clearText16(clearText16IconPath());
- Q_ASSERT(!clearText16.size().isEmpty());
- icon.addPixmap(clearText16);
- QPixmap clearText32(QStringLiteral(":/qt-project.org/styles/commonstyle/images/cleartext-32.png"));
- Q_ASSERT(!clearText32.size().isEmpty());
- icon.addPixmap(clearText32);
- clearText32.setDevicePixelRatio(2); // The 32x32 pixmap can also be used for 16x16/devicePixelRatio=2
- icon.addPixmap(clearText32);
-#endif // !QT_NO_IMAGEFORMAT_PNG
- return icon;
-}
-#endif
-
-QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option) const
-{
- const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft());
-#if QT_CONFIG(imageformat_png)
- QPixmap pixmap;
-
- if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) {
- switch (sp) {
- case SP_DialogYesButton:
- case SP_DialogOkButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-ok")).pixmap(16);
- break;
- case SP_DialogApplyButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-ok-apply")).pixmap(16);
- break;
- case SP_DialogDiscardButton:
- pixmap = QIcon::fromTheme(QLatin1String("edit-delete")).pixmap(16);
- break;
- case SP_DialogCloseButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-close")).pixmap(16);
- break;
- case SP_DirHomeIcon:
- pixmap = QIcon::fromTheme(QLatin1String("user-home")).pixmap(16);
- break;
- case SP_MessageBoxInformation:
- pixmap = QIcon::fromTheme(QLatin1String("messagebox_info")).pixmap(16);
- break;
- case SP_MessageBoxWarning:
- pixmap = QIcon::fromTheme(QLatin1String("messagebox_warning")).pixmap(16);
- break;
- case SP_MessageBoxCritical:
- pixmap = QIcon::fromTheme(QLatin1String("messagebox_critical")).pixmap(16);
- break;
- case SP_MessageBoxQuestion:
- pixmap = QIcon::fromTheme(QLatin1String("help")).pixmap(16);
- break;
- case SP_DialogOpenButton:
- case SP_DirOpenIcon:
- pixmap = QIcon::fromTheme(QLatin1String("folder-open")).pixmap(16);
- break;
- case SP_FileIcon:
- pixmap = QIcon::fromTheme(QLatin1String("text-x-generic"),
- QIcon::fromTheme(QLatin1String("empty"))).pixmap(16);
- break;
- case SP_DirClosedIcon:
- case SP_DirIcon:
- pixmap = QIcon::fromTheme(QLatin1String("folder")).pixmap(16);
- break;
- case SP_DriveFDIcon:
- pixmap = QIcon::fromTheme(QLatin1String("media-floppy"),
- QIcon::fromTheme(QLatin1String("3floppy_unmount"))).pixmap(16);
- break;
- case SP_ComputerIcon:
- pixmap = QIcon::fromTheme(QLatin1String("computer"),
- QIcon::fromTheme(QLatin1String("system"))).pixmap(16);
- break;
- case SP_DesktopIcon:
- pixmap = QIcon::fromTheme(QLatin1String("user-desktop"),
- QIcon::fromTheme(QLatin1String("desktop"))).pixmap(16);
- break;
- case SP_TrashIcon:
- pixmap = QIcon::fromTheme(QLatin1String("user-trash"),
- QIcon::fromTheme(QLatin1String("trashcan_empty"))).pixmap(16);
- break;
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- pixmap = QIcon::fromTheme(QLatin1String("media-optical"),
- QIcon::fromTheme(QLatin1String("cdrom_unmount"))).pixmap(16);
- break;
- case SP_DriveHDIcon:
- pixmap = QIcon::fromTheme(QLatin1String("drive-harddisk"),
- QIcon::fromTheme(QLatin1String("hdd_unmount"))).pixmap(16);
- break;
- case SP_FileDialogToParent:
- pixmap = QIcon::fromTheme(QLatin1String("go-up"),
- QIcon::fromTheme(QLatin1String("up"))).pixmap(16);
- break;
- case SP_FileDialogNewFolder:
- pixmap = QIcon::fromTheme(QLatin1String("folder_new")).pixmap(16);
- break;
- case SP_ArrowUp:
- pixmap = QIcon::fromTheme(QLatin1String("go-up"),
- QIcon::fromTheme(QLatin1String("up"))).pixmap(16);
- break;
- case SP_ArrowDown:
- pixmap = QIcon::fromTheme(QLatin1String("go-down"),
- QIcon::fromTheme(QLatin1String("down"))).pixmap(16);
- break;
- case SP_ArrowRight:
- pixmap = QIcon::fromTheme(QLatin1String("go-next"),
- QIcon::fromTheme(QLatin1String("forward"))).pixmap(16);
- break;
- case SP_ArrowLeft:
- pixmap = QIcon::fromTheme(QLatin1String("go-previous"),
- QIcon::fromTheme(QLatin1String("back"))).pixmap(16);
- break;
- case SP_FileDialogDetailedView:
- pixmap = QIcon::fromTheme(QLatin1String("view_detailed")).pixmap(16);
- break;
- case SP_FileDialogListView:
- pixmap = QIcon::fromTheme(QLatin1String("view_icon")).pixmap(16);
- break;
- case SP_BrowserReload:
- pixmap = QIcon::fromTheme(QLatin1String("reload")).pixmap(16);
- break;
- case SP_BrowserStop:
- pixmap = QIcon::fromTheme(QLatin1String("process-stop")).pixmap(16);
- break;
- case SP_MediaPlay:
- pixmap = QIcon::fromTheme(QLatin1String("media-playback-start")).pixmap(16);
- break;
- case SP_MediaPause:
- pixmap = QIcon::fromTheme(QLatin1String("media-playback-pause")).pixmap(16);
- break;
- case SP_MediaStop:
- pixmap = QIcon::fromTheme(QLatin1String("media-playback-stop")).pixmap(16);
- break;
- case SP_MediaSeekForward:
- pixmap = QIcon::fromTheme(QLatin1String("media-seek-forward")).pixmap(16);
- break;
- case SP_MediaSeekBackward:
- pixmap = QIcon::fromTheme(QLatin1String("media-seek-backward")).pixmap(16);
- break;
- case SP_MediaSkipForward:
- pixmap = QIcon::fromTheme(QLatin1String("media-skip-forward")).pixmap(16);
- break;
- case SP_MediaSkipBackward:
- pixmap = QIcon::fromTheme(QLatin1String("media-skip-backward")).pixmap(16);
- break;
- case SP_DialogResetButton:
- pixmap = QIcon::fromTheme(QLatin1String("edit-clear")).pixmap(24);
- break;
- case SP_DialogHelpButton:
- pixmap = QIcon::fromTheme(QLatin1String("help-contents")).pixmap(24);
- break;
- case SP_DialogNoButton:
- case SP_DialogCancelButton:
- pixmap = QIcon::fromTheme(QLatin1String("dialog-cancel"),
- QIcon::fromTheme(QLatin1String("process-stop"))).pixmap(24);
- break;
- case SP_DialogSaveButton:
- pixmap = QIcon::fromTheme(QLatin1String("document-save")).pixmap(24);
- break;
- case SP_FileLinkIcon:
- pixmap = QIcon::fromTheme(QLatin1String("emblem-symbolic-link")).pixmap(16);
- if (!pixmap.isNull()) {
- QPixmap fileIcon = QIcon::fromTheme(QLatin1String("text-x-generic")).pixmap(16);
- if (fileIcon.isNull())
- fileIcon = QIcon::fromTheme(QLatin1String("empty")).pixmap(16);
- if (!fileIcon.isNull()) {
- QPainter painter(&fileIcon);
- painter.drawPixmap(0, 0, 16, 16, pixmap);
- return fileIcon;
- }
- }
- break;
- case SP_DirLinkIcon:
- pixmap = QIcon::fromTheme(QLatin1String("emblem-symbolic-link")).pixmap(16);
- if (!pixmap.isNull()) {
- QPixmap dirIcon = QIcon::fromTheme(QLatin1String("folder")).pixmap(16);
- if (!dirIcon.isNull()) {
- QPainter painter(&dirIcon);
- painter.drawPixmap(0, 0, 16, 16, pixmap);
- return dirIcon;
- }
- }
- break;
- case SP_LineEditClearButton:
- pixmap = clearTextIcon(rtl).pixmap(16);
- break;
- default:
- break;
- }
- }
-
- if (!pixmap.isNull())
- return pixmap;
-#endif // QT_CONFIG(imageformat_png)
- switch (sp) {
-#ifndef QT_NO_IMAGEFORMAT_XPM
- case SP_ToolBarHorizontalExtensionButton:
- if (rtl) {
- QImage im(tb_extension_arrow_h_xpm);
- im = im.convertToFormat(QImage::Format_ARGB32).mirrored(true, false);
- return QPixmap::fromImage(im);
- }
- return cachedPixmapFromXPM(tb_extension_arrow_h_xpm);
- case SP_ToolBarVerticalExtensionButton:
- return cachedPixmapFromXPM(tb_extension_arrow_v_xpm);
- case SP_FileDialogStart:
- return cachedPixmapFromXPM(filedialog_start_xpm);
- case SP_FileDialogEnd:
- return cachedPixmapFromXPM(filedialog_end_xpm);
-#endif
-#ifndef QT_NO_IMAGEFORMAT_PNG
- case SP_CommandLink:
- case SP_ArrowForward:
- if (rtl)
- return proxy()->standardPixmap(SP_ArrowLeft, option);
- return proxy()->standardPixmap(SP_ArrowRight, option);
- case SP_ArrowBack:
- if (rtl)
- return proxy()->standardPixmap(SP_ArrowRight, option);
- return proxy()->standardPixmap(SP_ArrowLeft, option);
- case SP_ArrowLeft:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-16.png"));
- case SP_ArrowRight:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-16.png"));
- case SP_ArrowUp:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-16.png"));
- case SP_ArrowDown:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-16.png"));
- case SP_FileDialogToParent:
- return proxy()->standardPixmap(SP_ArrowUp, option);
- case SP_FileDialogNewFolder:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"));
- case SP_FileDialogDetailedView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"));
- case SP_FileDialogInfoView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"));
- case SP_FileDialogContentsView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"));
- case SP_FileDialogListView:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"));
- case SP_FileDialogBack:
- return proxy()->standardPixmap(SP_ArrowBack, option);
- case SP_DriveHDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/harddrive-16.png"));
- case SP_TrashIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-16.png"));
- case SP_DriveFDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/floppy-16.png"));
- case SP_DriveNetIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/networkdrive-16.png"));
- case SP_DesktopIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/desktop-16.png"));
- case SP_ComputerIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/computer-16.png"));
- case SP_DriveCDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-16.png"));
- case SP_DriveDVDIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-16.png"));
- case SP_DirHomeIcon:
- case SP_DirOpenIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-16.png"));
- case SP_DirIcon:
- case SP_DirClosedIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"));
- case SP_DirLinkIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirlink-16.png"));
- case SP_FileIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
- case SP_FileLinkIcon:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-16.png"));
- case SP_DialogOkButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"));
- case SP_DialogCancelButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"));
- case SP_DialogHelpButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"));
- case SP_DialogOpenButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"));
- case SP_DialogSaveButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"));
- case SP_DialogCloseButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"));
- case SP_DialogApplyButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"));
- case SP_DialogResetButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"));
- case SP_DialogDiscardButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"));
- case SP_DialogYesButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"));
- case SP_DialogNoButton:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"));
- case SP_BrowserReload:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/refresh-24.png"));
- case SP_BrowserStop:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/stop-24.png"));
- case SP_MediaPlay:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-play-32.png"));
- case SP_MediaPause:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"));
- case SP_MediaStop:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"));
- case SP_MediaSeekForward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"));
- case SP_MediaSeekBackward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"));
- case SP_MediaSkipForward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"));
- case SP_MediaSkipBackward:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"));
- case SP_MediaVolume:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"));
- case SP_MediaVolumeMuted:
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"));
- case SP_LineEditClearButton:
- return QPixmap(clearText16IconPath());
-#endif // QT_NO_IMAGEFORMAT_PNG
- default:
- break;
- }
-
-#ifndef QT_NO_IMAGEFORMAT_XPM
- switch (sp) {
- case SP_TitleBarMenuButton:
- return titleBarMenuCachedPixmapFromXPM();
- case SP_TitleBarShadeButton:
- return cachedPixmapFromXPM(qt_shade_xpm);
- case SP_TitleBarUnshadeButton:
- return cachedPixmapFromXPM(qt_unshade_xpm);
- case SP_TitleBarNormalButton:
- return cachedPixmapFromXPM(qt_normalizeup_xpm);
- case SP_TitleBarMinButton:
- return cachedPixmapFromXPM(qt_minimize_xpm);
- case SP_TitleBarMaxButton:
- return cachedPixmapFromXPM(qt_maximize_xpm);
- case SP_TitleBarCloseButton:
- return cachedPixmapFromXPM(qt_close_xpm);
- case SP_TitleBarContextHelpButton:
- return cachedPixmapFromXPM(qt_help_xpm);
- case SP_DockWidgetCloseButton:
- return cachedPixmapFromXPM(dock_widget_close_xpm);
- case SP_MessageBoxInformation:
- return cachedPixmapFromXPM(information_xpm);
- case SP_MessageBoxWarning:
- return cachedPixmapFromXPM(warning_xpm);
- case SP_MessageBoxCritical:
- return cachedPixmapFromXPM(critical_xpm);
- case SP_MessageBoxQuestion:
- return cachedPixmapFromXPM(question_xpm);
- default:
- break;
- }
-#endif //QT_NO_IMAGEFORMAT_XPM
-
-#if !QT_CONFIG(imageformat_png) && !QT_CONFIG(imageformat_xpm)
- Q_UNUSED(rtl);
-#endif
-
- return QPixmap();
-}
-
-#if QT_CONFIG(imageformat_png)
-static inline QString iconResourcePrefix() { return QStringLiteral(":/qt-project.org/styles/commonstyle/images/"); }
-static inline QString iconPngSuffix() { return QStringLiteral(".png"); }
-
-static void addIconFiles(const QString &prefix, const int sizes[], size_t count, QIcon &icon)
-{
- for (size_t i = 0; i < count; ++i)
- icon.addFile(prefix + QString::number(sizes[i]) + iconPngSuffix());
-}
-
-static const int dockTitleIconSizes[] = {10, 16, 20, 32, 48, 64};
-static const int titleBarSizes[] = {16, 32, 48};
-static const int toolBarExtHSizes[] = {8, 16, 32};
-static const int toolBarExtVSizes[] = {5, 10, 20};
-#endif // imageformat_png
-
-/*!
- \internal
-*/
-QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option) const
-{
- QIcon icon;
- const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft());
-
-#ifdef Q_OS_WIN
- switch (standardIcon) {
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- case SP_DriveNetIcon:
- case SP_DriveHDIcon:
- case SP_DriveFDIcon:
- case SP_FileIcon:
- case SP_FileLinkIcon:
- case SP_DesktopIcon:
- case SP_ComputerIcon:
- case SP_VistaShield:
- case SP_MessageBoxInformation:
- case SP_MessageBoxWarning:
- case SP_MessageBoxCritical:
- case SP_MessageBoxQuestion:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
- for (int size = 16 ; size <= 32 ; size += 16) {
- QPixmap pixmap = theme->standardPixmap(sp, QSizeF(size, size));
- icon.addPixmap(pixmap, QIcon::Normal);
- }
- }
- break;
- case SP_DirIcon:
- case SP_DirLinkIcon:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap spOff = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
- QPlatformTheme::StandardPixmap spOn = standardIcon == SP_DirIcon ? QPlatformTheme::DirOpenIcon :
- QPlatformTheme::DirLinkOpenIcon;
- for (int size = 16 ; size <= 32 ; size += 16) {
- QSizeF pixSize(size, size);
- QPixmap pixmap = theme->standardPixmap(spOff, pixSize);
- icon.addPixmap(pixmap, QIcon::Normal, QIcon::Off);
- pixmap = theme->standardPixmap(spOn, pixSize);
- icon.addPixmap(pixmap, QIcon::Normal, QIcon::On);
- }
- }
- break;
- case SP_LineEditClearButton:
- icon = clearTextIcon(rtl);
- break;
- default:
- break;
- }
- if (!icon.isNull())
- return icon;
-
-#endif
-
- if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) {
- switch (standardIcon) {
- case SP_DirHomeIcon:
- icon = QIcon::fromTheme(QLatin1String("user-home"));
- break;
- case SP_MessageBoxInformation:
- icon = QIcon::fromTheme(QLatin1String("dialog-information"));
- break;
- case SP_MessageBoxWarning:
- icon = QIcon::fromTheme(QLatin1String("dialog-warning"));
- break;
- case SP_MessageBoxCritical:
- icon = QIcon::fromTheme(QLatin1String("dialog-error"));
- break;
- case SP_MessageBoxQuestion:
- icon = QIcon::fromTheme(QLatin1String("dialog-question"));
- break;
- case SP_DialogOpenButton:
- case SP_DirOpenIcon:
- icon = QIcon::fromTheme(QLatin1String("folder-open"));
- break;
- case SP_DialogSaveButton:
- icon = QIcon::fromTheme(QLatin1String("document-save"));
- break;
- case SP_DialogApplyButton:
- icon = QIcon::fromTheme(QLatin1String("dialog-ok-apply"));
- break;
- case SP_DialogYesButton:
- case SP_DialogOkButton:
- icon = QIcon::fromTheme(QLatin1String("dialog-ok"));
- break;
- case SP_DialogDiscardButton:
- icon = QIcon::fromTheme(QLatin1String("edit-delete"));
- break;
- case SP_DialogResetButton:
- icon = QIcon::fromTheme(QLatin1String("edit-clear"));
- break;
- case SP_DialogHelpButton:
- icon = QIcon::fromTheme(QLatin1String("help-contents"));
- break;
- case SP_FileIcon:
- icon = QIcon::fromTheme(QLatin1String("text-x-generic"));
- break;
- case SP_DirClosedIcon:
- case SP_DirIcon:
- icon = QIcon::fromTheme(QLatin1String("folder"));
- break;
- case SP_DriveFDIcon:
- icon = QIcon::fromTheme(QLatin1String("floppy_unmount"));
- break;
- case SP_ComputerIcon:
- icon = QIcon::fromTheme(QLatin1String("computer"),
- QIcon::fromTheme(QLatin1String("system")));
- break;
- case SP_DesktopIcon:
- icon = QIcon::fromTheme(QLatin1String("user-desktop"));
- break;
- case SP_TrashIcon:
- icon = QIcon::fromTheme(QLatin1String("user-trash"));
- break;
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- icon = QIcon::fromTheme(QLatin1String("media-optical"));
- break;
- case SP_DriveHDIcon:
- icon = QIcon::fromTheme(QLatin1String("drive-harddisk"));
- break;
- case SP_FileDialogToParent:
- icon = QIcon::fromTheme(QLatin1String("go-up"));
- break;
- case SP_FileDialogNewFolder:
- icon = QIcon::fromTheme(QLatin1String("folder-new"));
- break;
- case SP_ArrowUp:
- icon = QIcon::fromTheme(QLatin1String("go-up"));
- break;
- case SP_ArrowDown:
- icon = QIcon::fromTheme(QLatin1String("go-down"));
- break;
- case SP_ArrowRight:
- icon = QIcon::fromTheme(QLatin1String("go-next"));
- break;
- case SP_ArrowLeft:
- icon = QIcon::fromTheme(QLatin1String("go-previous"));
- break;
- case SP_DialogNoButton:
- case SP_DialogCancelButton:
- icon = QIcon::fromTheme(QLatin1String("dialog-cancel"),
- QIcon::fromTheme(QLatin1String("process-stop")));
- break;
- case SP_DialogCloseButton:
- icon = QIcon::fromTheme(QLatin1String("window-close"));
- break;
- case SP_FileDialogDetailedView:
- icon = QIcon::fromTheme(QLatin1String("view-list-details"));
- break;
- case SP_FileDialogListView:
- icon = QIcon::fromTheme(QLatin1String("view-list-icons"));
- break;
- case SP_BrowserReload:
- icon = QIcon::fromTheme(QLatin1String("view-refresh"));
- break;
- case SP_BrowserStop:
- icon = QIcon::fromTheme(QLatin1String("process-stop"));
- break;
- case SP_MediaPlay:
- icon = QIcon::fromTheme(QLatin1String("media-playback-start"));
- break;
- case SP_MediaPause:
- icon = QIcon::fromTheme(QLatin1String("media-playback-pause"));
- break;
- case SP_MediaStop:
- icon = QIcon::fromTheme(QLatin1String("media-playback-stop"));
- break;
- case SP_MediaSeekForward:
- icon = QIcon::fromTheme(QLatin1String("media-seek-forward"));
- break;
- case SP_MediaSeekBackward:
- icon = QIcon::fromTheme(QLatin1String("media-seek-backward"));
- break;
- case SP_MediaSkipForward:
- icon = QIcon::fromTheme(QLatin1String("media-skip-forward"));
- break;
- case SP_MediaSkipBackward:
- icon = QIcon::fromTheme(QLatin1String("media-skip-backward"));
- break;
- case SP_MediaVolume:
- icon = QIcon::fromTheme(QLatin1String("audio-volume-medium"));
- break;
- case SP_MediaVolumeMuted:
- icon = QIcon::fromTheme(QLatin1String("audio-volume-muted"));
- break;
- case SP_ArrowForward:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- case SP_ArrowBack:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- case SP_FileLinkIcon:
- {
- QIcon linkIcon = QIcon::fromTheme(QLatin1String("emblem-symbolic-link"));
- if (!linkIcon.isNull()) {
- QIcon baseIcon = QCommonStyle::standardIcon(SP_FileIcon, option);
- const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off);
- const qreal devicePixelRatio = option ? dpr(option->window) : 1.;
- for (int i = 0 ; i < sizes.size() ; ++i) {
- int size = sizes[i].width();
- QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), devicePixelRatio);
- QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), devicePixelRatio);
- QPainter painter(&basePixmap);
- painter.drawPixmap(size/2, size/2, linkPixmap);
- icon.addPixmap(basePixmap);
- }
- }
- }
- break;
- case SP_DirLinkIcon:
- {
- QIcon linkIcon = QIcon::fromTheme(QLatin1String("emblem-symbolic-link"));
- if (!linkIcon.isNull()) {
- QIcon baseIcon = QCommonStyle::standardIcon(SP_DirIcon, option);
- const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off);
- const qreal devicePixelRatio = option ? dpr(option->window) : 1.;
- for (int i = 0 ; i < sizes.size() ; ++i) {
- int size = sizes[i].width();
- QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), devicePixelRatio);
- QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), devicePixelRatio);
- QPainter painter(&basePixmap);
- painter.drawPixmap(size/2, size/2, linkPixmap);
- icon.addPixmap(basePixmap);
- }
- }
- }
- break;
- default:
- break;
- }
- } // if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty())
-
- if (!icon.isNull())
- return icon;
-
-#if defined(Q_OS_MAC)
- if (QGuiApplication::desktopSettingsAware()) {
- switch (standardIcon) {
- case SP_DirIcon: {
- // A rather special case
- QIcon closeIcon = QCommonStyle::standardIcon(SP_DirClosedIcon, option);
- QIcon openIcon = QCommonStyle::standardIcon(SP_DirOpenIcon, option);
- closeIcon.addPixmap(openIcon.pixmap(16, 16), QIcon::Normal, QIcon::On);
- closeIcon.addPixmap(openIcon.pixmap(32, 32), QIcon::Normal, QIcon::On);
- closeIcon.addPixmap(openIcon.pixmap(64, 64), QIcon::Normal, QIcon::On);
- closeIcon.addPixmap(openIcon.pixmap(128, 128), QIcon::Normal, QIcon::On);
- return closeIcon;
- }
-
- case SP_TitleBarNormalButton:
- case SP_TitleBarCloseButton: {
- QIcon titleBarIcon;
- if (standardIcon == SP_TitleBarCloseButton) {
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/closedock-16.png"));
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/closedock-down-16.png"), QSize(16, 16), QIcon::Normal, QIcon::On);
- } else {
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/dockdock-16.png"));
- titleBarIcon.addFile(QLatin1String(":/qt-project.org/styles/macstyle/images/dockdock-down-16.png"), QSize(16, 16), QIcon::Normal, QIcon::On);
- }
- return titleBarIcon;
- }
-
- case SP_MessageBoxQuestion:
- case SP_MessageBoxInformation:
- case SP_MessageBoxWarning:
- case SP_MessageBoxCritical:
- case SP_DesktopIcon:
- case SP_TrashIcon:
- case SP_ComputerIcon:
- case SP_DriveFDIcon:
- case SP_DriveHDIcon:
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- case SP_DriveNetIcon:
- case SP_DirOpenIcon:
- case SP_DirClosedIcon:
- case SP_DirLinkIcon:
- case SP_FileLinkIcon:
- case SP_FileIcon:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon);
- QIcon retIcon;
- const QList<QSize> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<QSize> >();
- for (const QSize &size : sizes) {
- QPixmap mainIcon;
- const QString cacheKey = QLatin1String("qt_mac_constructQIconFromIconRef") + QString::number(standardIcon) + QString::number(size.width());
- if (standardIcon >= QStyle::SP_CustomBase) {
- mainIcon = theme->standardPixmap(sp, QSizeF(size));
- } else if (QPixmapCache::find(cacheKey, &mainIcon) == false) {
- mainIcon = theme->standardPixmap(sp, QSizeF(size));
- QPixmapCache::insert(cacheKey, mainIcon);
- }
-
- retIcon.addPixmap(mainIcon);
- }
- if (!retIcon.isNull())
- return retIcon;
- }
-
- default:
- break;
- }
- } // if (QGuiApplication::desktopSettingsAware())
-#endif // Q_OS_MAC
-
- switch (standardIcon) {
-#ifndef QT_NO_IMAGEFORMAT_PNG
- case SP_TitleBarMinButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-min-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_TitleBarMaxButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-max-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_TitleBarShadeButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-shade-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
-
- break;
- case SP_TitleBarUnshadeButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-unshade-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_TitleBarContextHelpButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-contexthelp-"),
- titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon);
- break;
- case SP_FileDialogNewFolder:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/newdirectory-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogBack:
- return QCommonStyle::standardIcon(SP_ArrowBack, option);
- case SP_FileDialogToParent:
- return QCommonStyle::standardIcon(SP_ArrowUp, option);
- case SP_FileDialogDetailedView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewdetailed-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogInfoView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/fileinfo-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogContentsView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filecontents-128.png"), QSize(128, 128));
- break;
- case SP_FileDialogListView:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/viewlist-128.png"), QSize(128, 128));
- break;
- case SP_DialogOkButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-128.png"), QSize(128, 128));
- break;
- case SP_DialogCancelButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-128.png"), QSize(128, 128));
- break;
- case SP_DialogHelpButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-help-128.png"), QSize(128, 128));
- break;
- case SP_DialogOpenButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-open-128.png"), QSize(128, 128));
- break;
- case SP_DialogSaveButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-save-128.png"), QSize(128, 128));
- break;
- case SP_DialogCloseButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-close-128.png"), QSize(128, 128));
- break;
- case SP_DialogApplyButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-128.png"), QSize(128, 128));
- break;
- case SP_DialogResetButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-128.png"), QSize(128, 128));
- break;
- case SP_DialogDiscardButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-128.png"), QSize(128, 128));
- break;
- case SP_DialogYesButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-128.png"), QSize(128, 128));
- break;
- case SP_DialogNoButton:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/standardbutton-no-128.png"), QSize(128, 128));
- break;
- case SP_ArrowForward:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- case SP_ArrowBack:
- if (rtl)
- return QCommonStyle::standardIcon(SP_ArrowRight, option);
- return QCommonStyle::standardIcon(SP_ArrowLeft, option);
- case SP_ArrowLeft:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/left-128.png"), QSize(128, 128));
- break;
- case SP_ArrowRight:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/right-128.png"), QSize(128, 128));
- break;
- case SP_ArrowUp:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/up-128.png"), QSize(128, 128));
- break;
- case SP_ArrowDown:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/down-128.png"), QSize(128, 128));
- break;
- case SP_DirHomeIcon:
- case SP_DirIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"),
- QSize(), QIcon::Normal, QIcon::Off);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-16.png"),
- QSize(), QIcon::Normal, QIcon::On);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-32.png"),
- QSize(32, 32), QIcon::Normal, QIcon::Off);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-32.png"),
- QSize(32, 32), QIcon::Normal, QIcon::On);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dirclosed-128.png"),
- QSize(128, 128), QIcon::Normal, QIcon::Off);
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/diropen-128.png"),
- QSize(128, 128), QIcon::Normal, QIcon::On);
- break;
- case SP_DriveCDIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/cdr-128.png"), QSize(128, 128));
- break;
- case SP_DriveDVDIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/dvd-128.png"), QSize(128, 128));
- break;
- case SP_FileIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-128.png"), QSize(128, 128));
- break;
- case SP_FileLinkIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/filelink-128.png"), QSize(128, 128));
- break;
- case SP_TrashIcon:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-32.png"), QSize(32, 32));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/trash-128.png"), QSize(128, 128));
- break;
- case SP_BrowserReload:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/refresh-24.png"), QSize(24, 24));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/refresh-32.png"), QSize(32, 32));
- break;
- case SP_BrowserStop:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/stop-24.png"), QSize(24, 24));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/stop-32.png"), QSize(32, 32));
- break;
- case SP_MediaPlay:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-play-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-play-32.png"), QSize(32, 32));
- break;
- case SP_MediaPause:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-pause-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"), QSize(32, 32));
- break;
- case SP_MediaStop:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-stop-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"), QSize(32, 32));
- break;
- case SP_MediaSeekForward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-forward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"), QSize(32, 32));
- break;
- case SP_MediaSeekBackward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-backward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"), QSize(32, 32));
- break;
- case SP_MediaSkipForward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-forward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"), QSize(32, 32));
- break;
- case SP_MediaSkipBackward:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-backward-16.png"), QSize(16, 16));
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"), QSize(32, 32));
- break;
- case SP_MediaVolume:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"), QSize(16, 16));
- break;
- case SP_MediaVolumeMuted:
- icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"), QSize(16, 16));
- break;
- case SP_TitleBarCloseButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("closedock-"),
- dockTitleIconSizes, sizeof(dockTitleIconSizes)/sizeof(dockTitleIconSizes[0]), icon);
- break;
- case SP_TitleBarMenuButton:
-# ifndef QT_NO_IMAGEFORMAT_XPM
- icon.addPixmap(titleBarMenuCachedPixmapFromXPM());
-# endif
- icon.addFile(QLatin1String(":/qt-project.org/qmessagebox/images/qtlogo-64.png"));
- break;
- case SP_TitleBarNormalButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("normalizedockup-"),
- dockTitleIconSizes, sizeof(dockTitleIconSizes)/sizeof(dockTitleIconSizes[0]), icon);
- break;
- case SP_ToolBarHorizontalExtensionButton: {
- QString prefix = iconResourcePrefix() + QStringLiteral("toolbar-ext-h-");
- if (rtl)
- prefix += QStringLiteral("rtl-");
- addIconFiles(prefix, toolBarExtHSizes, sizeof(toolBarExtHSizes)/sizeof(toolBarExtHSizes[0]), icon);
- }
- break;
- case SP_ToolBarVerticalExtensionButton:
- addIconFiles(iconResourcePrefix() + QStringLiteral("toolbar-ext-v-"),
- toolBarExtVSizes, sizeof(toolBarExtVSizes)/sizeof(toolBarExtVSizes[0]), icon);
- break;
-#endif // QT_NO_IMAGEFORMAT_PNG
- default:
- icon.addPixmap(proxy()->standardPixmap(standardIcon, option));
- break;
- }
- return icon;
-}
-
-static inline uint qt_intensity(uint r, uint g, uint b)
-{
- // 30% red, 59% green, 11% blue
- return (77 * r + 150 * g + 28 * b) / 255;
-}
-
-/*! \reimp */
-QPixmap QCommonStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const
-{
- switch (iconMode) {
- case QIcon::Disabled: {
- QImage im = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
-
- // Create a colortable based on the background (black -> bg -> white)
- QColor bg = opt->palette.color(QPalette::Disabled, QPalette::Window);
- int red = bg.red();
- int green = bg.green();
- int blue = bg.blue();
- uchar reds[256], greens[256], blues[256];
- for (int i=0; i<128; ++i) {
- reds[i] = uchar((red * (i<<1)) >> 8);
- greens[i] = uchar((green * (i<<1)) >> 8);
- blues[i] = uchar((blue * (i<<1)) >> 8);
- }
- for (int i=0; i<128; ++i) {
- reds[i+128] = uchar(qMin(red + (i << 1), 255));
- greens[i+128] = uchar(qMin(green + (i << 1), 255));
- blues[i+128] = uchar(qMin(blue + (i << 1), 255));
- }
-
- int intensity = qt_intensity(red, green, blue);
- const int factor = 191;
-
- // High intensity colors needs dark shifting in the color table, while
- // low intensity colors needs light shifting. This is to increase the
- // perceived contrast.
- if ((red - factor > green && red - factor > blue)
- || (green - factor > red && green - factor > blue)
- || (blue - factor > red && blue - factor > green))
- intensity = qMin(255, intensity + 91);
- else if (intensity <= 128)
- intensity -= 51;
-
- for (int y=0; y<im.height(); ++y) {
- QRgb *scanLine = (QRgb*)im.scanLine(y);
- for (int x=0; x<im.width(); ++x) {
- QRgb pixel = *scanLine;
- // Calculate color table index, taking intensity adjustment
- // and a magic offset into account.
- uint ci = uint(qGray(pixel)/3 + (130 - intensity / 3));
- *scanLine = qRgba(reds[ci], greens[ci], blues[ci], qAlpha(pixel));
- ++scanLine;
- }
- }
-
- return QPixmap::fromImage(im);
- }
- case QIcon::Selected: {
- QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
- QColor color = opt->palette.color(QPalette::Normal, QPalette::Highlight);
- color.setAlphaF(0.3f);
- QPainter painter(&img);
- painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
- painter.fillRect(0, 0, img.width(), img.height(), color);
- painter.end();
- return QPixmap::fromImage(img); }
- case QIcon::Active:
- return pixmap;
- default:
- break;
- }
- return pixmap;
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#include "moc_qquickcommonstyle.cpp"
diff --git a/src/quicknativestyle/qstyle/qquickcommonstyle.h b/src/quicknativestyle/qstyle/qquickcommonstyle.h
deleted file mode 100644
index 894194a0..00000000
--- a/src/quicknativestyle/qstyle/qquickcommonstyle.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOMMONSTYLE_H
-#define QCOMMONSTYLE_H
-
-#include "qquickstyle.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-class QCommonStylePrivate;
-
-class QCommonStyle: public QStyle
-{
- Q_OBJECT
-
-public:
- QCommonStyle();
- ~QCommonStyle() override;
-
- void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const override;
- void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p) const override;
- void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const override;
-
- QRect subElementRect(SubElement r, const QStyleOption *opt) const override;
- QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc) const override;
-
- QSize sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &contentsSize) const override;
- QFont font(ControlElement element, const QStyle::State state) const override;
- QMargins ninePatchMargins(ControlElement ce, const QStyleOption *opt, const QSize &imageSize) const override;
- QMargins ninePatchMargins(ComplexControl cc, const QStyleOptionComplex *opt, const QSize &imageSize) const override;
-
- int pixelMetric(PixelMetric m, const QStyleOption *opt = nullptr) const override;
- int styleHint(StyleHint sh, const QStyleOption *opt = nullptr, QStyleHintReturn *shret = nullptr) const override;
-
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *opt = nullptr) const override;
- QPixmap standardPixmap(StandardPixmap sp, const QStyleOption *opt = nullptr) const override;
- QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const override;
-
- SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt) const override;
-
-protected:
- QCommonStyle(QCommonStylePrivate &dd);
-
-private:
- Q_DECLARE_PRIVATE(QCommonStyle)
- Q_DISABLE_COPY(QCommonStyle)
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QCOMMONSTYLE_H
diff --git a/src/quicknativestyle/qstyle/qquickcommonstyle_p.h b/src/quicknativestyle/qstyle/qquickcommonstyle_p.h
deleted file mode 100644
index ba2b8689..00000000
--- a/src/quicknativestyle/qstyle/qquickcommonstyle_p.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOMMONSTYLE_P_H
-#define QCOMMONSTYLE_P_H
-
-#include "qquickcommonstyle.h"
-#include "qquickstyle_p.h"
-#include "qquickstyleoption.h"
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
-// file may change from version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QTextOption;
-
-namespace QQC2 {
-
-class QCommonStylePrivate : public QStylePrivate
-{
- Q_DECLARE_PUBLIC(QCommonStyle)
-public:
-
- ~QCommonStylePrivate()
- {
- delete cachedOption;
- }
-
- QString calculateElidedText(const QString &text, const QTextOption &textOption,
- const QFont &font, const QRect &textRect, const Qt::Alignment valign,
- Qt::TextElideMode textElideMode, int flags,
- bool lastVisibleLineShouldBeElided, QPointF *paintStartPosition) const;
- void viewItemDrawText(QPainter *p, const QStyleOptionViewItem *option, const QRect &rect) const;
- void viewItemLayout(const QStyleOptionViewItem *opt, QRect *checkRect,
- QRect *pixmapRect, QRect *textRect, bool sizehint) const;
- QSize viewItemSize(const QStyleOptionViewItem *option, int role) const;
-
- mutable QRect decorationRect, displayRect, checkRect;
- mutable QStyleOptionViewItem *cachedOption = nullptr;
- bool isViewItemCached(const QStyleOptionViewItem &option) const {
- return cachedOption
- && option.index == cachedOption->index
- && option.state == cachedOption->state
- && option.rect == cachedOption->rect
- && option.text == cachedOption->text
- && option.direction == cachedOption->direction
- && option.displayAlignment == cachedOption->displayAlignment
- && option.decorationAlignment == cachedOption->decorationAlignment
- && option.decorationPosition == cachedOption->decorationPosition
- && option.decorationSize == cachedOption->decorationSize
- && option.features == cachedOption->features
- && option.icon.isNull() == cachedOption->icon.isNull()
- && option.font == cachedOption->font
- && option.viewItemPosition == cachedOption->viewItemPosition;
- }
- QString toolButtonElideText(const QStyleOptionToolButton *toolbutton,
- const QRect &textRect, int flags) const;
-
- mutable QIcon tabBarcloseButtonIcon;
- virtual void tabLayout(const QStyleOptionTab *opt, QRect *textRect, QRect *pixmapRect) const;
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif //QCOMMONSTYLE_P_H
diff --git a/src/quicknativestyle/qstyle/qquickcommonstylepixmaps_p.h b/src/quicknativestyle/qstyle/qquickcommonstylepixmaps_p.h
deleted file mode 100644
index 59f1afac..00000000
--- a/src/quicknativestyle/qstyle/qquickcommonstylepixmaps_p.h
+++ /dev/null
@@ -1,532 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QT_NO_IMAGEFORMAT_XPM
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-static const char * const check_list_controller_xpm[] = {
-"16 16 4 1",
-" c None",
-". c #000000000000",
-"X c #FFFFFFFF0000",
-"o c #C71BC30BC71B",
-" ",
-" ",
-" .......... ",
-" .XXXXXXXX. ",
-" .XXXXXXXX.oo ",
-" .XXXXXXXX.oo ",
-" .XXXXXXXX.oo ",
-" .XXXXXXXX.oo ",
-" .XXXXXXXX.oo ",
-" .XXXXXXXX.oo ",
-" .XXXXXXXX.oo ",
-" ..........oo ",
-" oooooooooo ",
-" oooooooooo ",
-" ",
-" "};
-
-
-static const char * const tb_extension_arrow_v_xpm[] = {
- "5 8 3 1",
- " c None",
- ". c #000000",
- "+ c none",
- ".+++.",
- "..+..",
- "+...+",
- "++.++",
- ".+++.",
- "..+..",
- "+...+",
- "++.++"
-};
-
-static const char * const tb_extension_arrow_h_xpm[] = {
- "8 5 3 1",
- " c None",
- ". c #000000",
- "+ c none",
- "..++..++",
- "+..++..+",
- "++..++..",
- "+..++..+",
- "..++..++",
-};
-
-static const char * const filedialog_start_xpm[]={
- "16 15 8 1",
- "a c #cec6bd",
- "# c #000000",
- "e c #ffff00",
- "b c #999999",
- "f c #cccccc",
- "d c #dcdcdc",
- "c c #ffffff",
- ". c None",
- ".....######aaaaa",
- "...bb#cccc##aaaa",
- "..bcc#cccc#d#aaa",
- ".bcef#cccc#dd#aa",
- ".bcfe#cccc#####a",
- ".bcef#ccccccccc#",
- "bbbbbbbbbbbbccc#",
- "bccccccccccbbcc#",
- "bcefefefefee#bc#",
- ".bcefefefefef#c#",
- ".bcfefefefefe#c#",
- "..bcfefefefeeb##",
- "..bbbbbbbbbbbbb#",
- "...#############",
- "................"};
-
-static const char * const filedialog_end_xpm[]={
- "16 15 9 1",
- "d c #a0a0a0",
- "c c #c3c3c3",
- "# c #cec6bd",
- ". c #000000",
- "f c #ffff00",
- "e c #999999",
- "g c #cccccc",
- "b c #ffffff",
- "a c None",
- "......####aaaaaa",
- ".bbbb..###aaaaaa",
- ".bbbb.c.##aaaaaa",
- ".bbbb....ddeeeea",
- ".bbbbbbb.bbbbbe.",
- ".bbbbbbb.bcfgfe.",
- "eeeeeeeeeeeeefe.",
- "ebbbbbbbbbbeege.",
- "ebfgfgfgfgff.ee.",
- "aebfgfgfgfgfg.e.",
- "aebgfgfgfgfgf.e.",
- "aaebgfgfgfgffe..",
- "aaeeeeeeeeeeeee.",
- "aaa.............",
- "aaaaaaaaaaaaaaaa"};
-
-
-/* XPM */
-static const char * const qt_menu_xpm[] = {
-"16 16 72 1",
-" c None",
-". c #65AF36",
-"+ c #66B036",
-"@ c #77B94C",
-"# c #A7D28C",
-"$ c #BADBA4",
-"% c #A4D088",
-"& c #72B646",
-"* c #9ACB7A",
-"= c #7FBD56",
-"- c #85C05F",
-"; c #F4F9F0",
-"> c #FFFFFF",
-", c #E5F1DC",
-"' c #ECF5E7",
-") c #7ABA50",
-"! c #83BF5C",
-"~ c #AED595",
-"{ c #D7EACA",
-"] c #A9D28D",
-"^ c #BCDDA8",
-"/ c #C4E0B1",
-"( c #81BE59",
-"_ c #D0E7C2",
-": c #D4E9C6",
-"< c #6FB542",
-"[ c #6EB440",
-"} c #88C162",
-"| c #98CA78",
-"1 c #F4F9F1",
-"2 c #8FC56C",
-"3 c #F1F8EC",
-"4 c #E8F3E1",
-"5 c #D4E9C7",
-"6 c #74B748",
-"7 c #80BE59",
-"8 c #73B747",
-"9 c #6DB43F",
-"0 c #CBE4BA",
-"a c #80BD58",
-"b c #6DB33F",
-"c c #FEFFFE",
-"d c #68B138",
-"e c #F9FCF7",
-"f c #91C66F",
-"g c #E8F3E0",
-"h c #DCEDD0",
-"i c #91C66E",
-"j c #A3CF86",
-"k c #C9E3B8",
-"l c #B0D697",
-"m c #E3F0DA",
-"n c #95C873",
-"o c #E6F2DE",
-"p c #9ECD80",
-"q c #BEDEAA",
-"r c #C7E2B6",
-"s c #79BA4F",
-"t c #6EB441",
-"u c #BCDCA7",
-"v c #FAFCF8",
-"w c #F6FAF3",
-"x c #84BF5D",
-"y c #EDF6E7",
-"z c #FAFDF9",
-"A c #88C263",
-"B c #98CA77",
-"C c #CDE5BE",
-"D c #67B037",
-"E c #D9EBCD",
-"F c #6AB23C",
-"G c #77B94D",
-" .++++++++++++++",
-".+++++++++++++++",
-"+++@#$%&+++*=+++",
-"++-;>,>')+!>~+++",
-"++{>]+^>/(_>:~<+",
-"+[>>}+|>123>456+",
-"+7>>8+->>90>~+++",
-"+a>>b+a>c[0>~+++",
-"+de>=+f>g+0>~+++",
-"++h>i+j>k+0>~+++",
-"++l>mno>p+q>rst+",
-"++duv>wl++xy>zA+",
-"++++B>Cb++++&D++",
-"+++++0zE++++++++",
-"++++++FG+++++++.",
-"++++++++++++++. "};
-
-static const char * const qt_close_xpm[] = {
-"10 10 2 1",
-"# c #000000",
-". c None",
-"..........",
-".##....##.",
-"..##..##..",
-"...####...",
-"....##....",
-"...####...",
-"..##..##..",
-".##....##.",
-"..........",
-".........."};
-
-static const char * const qt_maximize_xpm[]={
-"10 10 2 1",
-"# c #000000",
-". c None",
-"#########.",
-"#########.",
-"#.......#.",
-"#.......#.",
-"#.......#.",
-"#.......#.",
-"#.......#.",
-"#.......#.",
-"#########.",
-".........."};
-
-static const char * const qt_minimize_xpm[] = {
-"10 10 2 1",
-"# c #000000",
-". c None",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".#######..",
-".#######..",
-".........."};
-
-static const char * const qt_normalizeup_xpm[] = {
-"10 10 2 1",
-"# c #000000",
-". c None",
-"...######.",
-"...######.",
-"...#....#.",
-".######.#.",
-".######.#.",
-".#....###.",
-".#....#...",
-".#....#...",
-".######...",
-".........."};
-
-static const char * const qt_help_xpm[] = {
-"10 10 2 1",
-". c None",
-"# c #000000",
-"..........",
-"..######..",
-".##....##.",
-"......##..",
-".....##...",
-"....##....",
-"....##....",
-"..........",
-"....##....",
-".........."};
-
-static const char * const qt_shade_xpm[] = {
-"10 10 2 1",
-"# c #000000",
-". c None",
-"..........",
-"..........",
-"..........",
-"..........",
-"....#.....",
-"...###....",
-"..#####...",
-".#######..",
-"..........",
-".........."};
-
-static const char * const qt_unshade_xpm[] = {
-"10 10 2 1",
-"# c #000000",
-". c None",
-"..........",
-"..........",
-"..........",
-".#######..",
-"..#####...",
-"...###....",
-"....#.....",
-"..........",
-"..........",
-".........."};
-
-static const char * const dock_widget_close_xpm[] = {
-"8 8 2 1",
-"# c #000000",
-". c None",
-"........",
-".##..##.",
-"..####..",
-"...##...",
-"..####..",
-".##..##.",
-"........",
-"........"};
-
-/* XPM */
-static const char * const information_xpm[]={
-"32 32 5 1",
-". c None",
-"c c #000000",
-"* c #999999",
-"a c #ffffff",
-"b c #0000ff",
-"...........********.............",
-"........***aaaaaaaa***..........",
-"......**aaaaaaaaaaaaaa**........",
-".....*aaaaaaaaaaaaaaaaaa*.......",
-"....*aaaaaaaabbbbaaaaaaaac......",
-"...*aaaaaaaabbbbbbaaaaaaaac.....",
-"..*aaaaaaaaabbbbbbaaaaaaaaac....",
-".*aaaaaaaaaaabbbbaaaaaaaaaaac...",
-".*aaaaaaaaaaaaaaaaaaaaaaaaaac*..",
-"*aaaaaaaaaaaaaaaaaaaaaaaaaaaac*.",
-"*aaaaaaaaaabbbbbbbaaaaaaaaaaac*.",
-"*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
-"*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
-"*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
-"*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
-"*aaaaaaaaaaaabbbbbaaaaaaaaaaac**",
-".*aaaaaaaaaaabbbbbaaaaaaaaaac***",
-".*aaaaaaaaaaabbbbbaaaaaaaaaac***",
-"..*aaaaaaaaaabbbbbaaaaaaaaac***.",
-"...caaaaaaabbbbbbbbbaaaaaac****.",
-"....caaaaaaaaaaaaaaaaaaaac****..",
-".....caaaaaaaaaaaaaaaaaac****...",
-"......ccaaaaaaaaaaaaaacc****....",
-".......*cccaaaaaaaaccc*****.....",
-"........***cccaaaac*******......",
-"..........****caaac*****........",
-".............*caaac**...........",
-"...............caac**...........",
-"................cac**...........",
-".................cc**...........",
-"..................***...........",
-"...................**..........."};
-/* XPM */
-static const char* const warning_xpm[]={
-"32 32 4 1",
-". c None",
-"a c #ffff00",
-"* c #000000",
-"b c #999999",
-".............***................",
-"............*aaa*...............",
-"...........*aaaaa*b.............",
-"...........*aaaaa*bb............",
-"..........*aaaaaaa*bb...........",
-"..........*aaaaaaa*bb...........",
-".........*aaaaaaaaa*bb..........",
-".........*aaaaaaaaa*bb..........",
-"........*aaaaaaaaaaa*bb.........",
-"........*aaaa***aaaa*bb.........",
-".......*aaaa*****aaaa*bb........",
-".......*aaaa*****aaaa*bb........",
-"......*aaaaa*****aaaaa*bb.......",
-"......*aaaaa*****aaaaa*bb.......",
-".....*aaaaaa*****aaaaaa*bb......",
-".....*aaaaaa*****aaaaaa*bb......",
-"....*aaaaaaaa***aaaaaaaa*bb.....",
-"....*aaaaaaaa***aaaaaaaa*bb.....",
-"...*aaaaaaaaa***aaaaaaaaa*bb....",
-"...*aaaaaaaaaa*aaaaaaaaaa*bb....",
-"..*aaaaaaaaaaa*aaaaaaaaaaa*bb...",
-"..*aaaaaaaaaaaaaaaaaaaaaaa*bb...",
-".*aaaaaaaaaaaa**aaaaaaaaaaa*bb..",
-".*aaaaaaaaaaa****aaaaaaaaaa*bb..",
-"*aaaaaaaaaaaa****aaaaaaaaaaa*bb.",
-"*aaaaaaaaaaaaa**aaaaaaaaaaaa*bb.",
-"*aaaaaaaaaaaaaaaaaaaaaaaaaaa*bbb",
-"*aaaaaaaaaaaaaaaaaaaaaaaaaaa*bbb",
-".*aaaaaaaaaaaaaaaaaaaaaaaaa*bbbb",
-"..*************************bbbbb",
-"....bbbbbbbbbbbbbbbbbbbbbbbbbbb.",
-".....bbbbbbbbbbbbbbbbbbbbbbbbb.."};
-/* XPM */
-static const char* const critical_xpm[]={
-"32 32 4 1",
-". c None",
-"a c #999999",
-"* c #ff0000",
-"b c #ffffff",
-"...........********.............",
-".........************...........",
-".......****************.........",
-"......******************........",
-".....********************a......",
-"....**********************a.....",
-"...************************a....",
-"..*******b**********b*******a...",
-"..******bbb********bbb******a...",
-".******bbbbb******bbbbb******a..",
-".*******bbbbb****bbbbb*******a..",
-"*********bbbbb**bbbbb*********a.",
-"**********bbbbbbbbbb**********a.",
-"***********bbbbbbbb***********aa",
-"************bbbbbb************aa",
-"************bbbbbb************aa",
-"***********bbbbbbbb***********aa",
-"**********bbbbbbbbbb**********aa",
-"*********bbbbb**bbbbb*********aa",
-".*******bbbbb****bbbbb*******aa.",
-".******bbbbb******bbbbb******aa.",
-"..******bbb********bbb******aaa.",
-"..*******b**********b*******aa..",
-"...************************aaa..",
-"....**********************aaa...",
-"....a********************aaa....",
-".....a******************aaa.....",
-"......a****************aaa......",
-".......aa************aaaa.......",
-".........aa********aaaaa........",
-"...........aaaaaaaaaaa..........",
-".............aaaaaaa............"};
-/* XPM */
-static const char *const question_xpm[] = {
-"32 32 5 1",
-". c None",
-"c c #000000",
-"* c #999999",
-"a c #ffffff",
-"b c #0000ff",
-"...........********.............",
-"........***aaaaaaaa***..........",
-"......**aaaaaaaaaaaaaa**........",
-".....*aaaaaaaaaaaaaaaaaa*.......",
-"....*aaaaaaaaaaaaaaaaaaaac......",
-"...*aaaaaaaabbbbbbaaaaaaaac.....",
-"..*aaaaaaaabaaabbbbaaaaaaaac....",
-".*aaaaaaaabbaaaabbbbaaaaaaaac...",
-".*aaaaaaaabbbbaabbbbaaaaaaaac*..",
-"*aaaaaaaaabbbbaabbbbaaaaaaaaac*.",
-"*aaaaaaaaaabbaabbbbaaaaaaaaaac*.",
-"*aaaaaaaaaaaaabbbbaaaaaaaaaaac**",
-"*aaaaaaaaaaaaabbbaaaaaaaaaaaac**",
-"*aaaaaaaaaaaaabbaaaaaaaaaaaaac**",
-"*aaaaaaaaaaaaabbaaaaaaaaaaaaac**",
-"*aaaaaaaaaaaaaaaaaaaaaaaaaaaac**",
-".*aaaaaaaaaaaabbaaaaaaaaaaaac***",
-".*aaaaaaaaaaabbbbaaaaaaaaaaac***",
-"..*aaaaaaaaaabbbbaaaaaaaaaac***.",
-"...caaaaaaaaaabbaaaaaaaaaac****.",
-"....caaaaaaaaaaaaaaaaaaaac****..",
-".....caaaaaaaaaaaaaaaaaac****...",
-"......ccaaaaaaaaaaaaaacc****....",
-".......*cccaaaaaaaaccc*****.....",
-"........***cccaaaac*******......",
-"..........****caaac*****........",
-".............*caaac**...........",
-"...............caac**...........",
-"................cac**...........",
-".................cc**...........",
-"..................***...........",
-"...................**..........."};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif //QT_NO_IMAGEFORMAT_XPM
diff --git a/src/quicknativestyle/qstyle/qquickdrawutil.cpp b/src/quicknativestyle/qstyle/qquickdrawutil.cpp
deleted file mode 100644
index d5290a7b..00000000
--- a/src/quicknativestyle/qstyle/qquickdrawutil.cpp
+++ /dev/null
@@ -1,1145 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickdrawutil.h"
-
-#include "qbitmap.h"
-#include "qpixmapcache.h"
-#include "qpainter.h"
-#include "qpalette.h"
-#include <private/qpaintengineex_p.h>
-#include <qvarlengtharray.h>
-#include <qmath.h>
-#include <private/qhexstring_p.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-namespace {
-class PainterStateGuard {
- Q_DISABLE_COPY_MOVE(PainterStateGuard)
-public:
- explicit PainterStateGuard(QPainter *p) : m_painter(p) {}
- ~PainterStateGuard()
- {
- for ( ; m_level > 0; --m_level)
- m_painter->restore();
- }
-
- void save()
- {
- m_painter->save();
- ++m_level;
- }
-
- void restore()
- {
- m_painter->restore();
- --m_level;
- }
-
-private:
- QPainter *m_painter;
- int m_level= 0;
-};
-} // namespace
-
-/*!
- \headerfile <qdrawutil.h>
- \title Drawing Utility Functions
-
- \sa QPainter
-*/
-
-/*!
- \fn void qDrawShadeLine(QPainter *painter, int x1, int y1, int x2, int y2,
- const QPalette &palette, bool sunken,
- int lineWidth, int midLineWidth)
- \relates <qdrawutil.h>
-
- Draws a horizontal (\a y1 == \a y2) or vertical (\a x1 == \a x2)
- shaded line using the given \a painter. Note that nothing is
- drawn if \a y1 != \a y2 and \a x1 != \a x2 (i.e. the line is
- neither horizontal nor vertical).
-
- The provided \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors). The given \a lineWidth
- specifies the line width for each of the lines; it is not the
- total line width. The given \a midLineWidth specifies the width of
- a middle line drawn in the QPalette::mid() color.
-
- The line appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to
- make widgets that follow the current GUI style.
-
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded line:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 0
-
- \sa qDrawShadeRect(), qDrawShadePanel(), QStyle
-*/
-
-void qDrawShadeLine(QPainter *p, int x1, int y1, int x2, int y2,
- const QPalette &pal, bool sunken,
- int lineWidth, int midLineWidth)
-{
- if (Q_UNLIKELY(!p || lineWidth < 0 || midLineWidth < 0)) {
- qWarning("qDrawShadeLine: Invalid parameters");
- return;
- }
- int tlw = lineWidth*2 + midLineWidth; // total line width
- QPen oldPen = p->pen(); // save pen
- if (sunken)
- p->setPen(pal.color(QPalette::Dark));
- else
- p->setPen(pal.light().color());
- QPolygon a;
- int i;
- if (y1 == y2) { // horizontal line
- int y = y1 - tlw/2;
- if (x1 > x2) { // swap x1 and x2
- int t = x1;
- x1 = x2;
- x2 = t;
- }
- x2--;
- for (i=0; i<lineWidth; i++) { // draw top shadow
- a.setPoints(3, x1+i, y+tlw-1-i,
- x1+i, y+i,
- x2-i, y+i);
- p->drawPolyline(a);
- }
- if (midLineWidth > 0) {
- p->setPen(pal.mid().color());
- for (i=0; i<midLineWidth; i++) // draw lines in the middle
- p->drawLine(x1+lineWidth, y+lineWidth+i,
- x2-lineWidth, y+lineWidth+i);
- }
- if (sunken)
- p->setPen(pal.light().color());
- else
- p->setPen(pal.dark().color());
- for (i=0; i<lineWidth; i++) { // draw bottom shadow
- a.setPoints(3, x1+i, y+tlw-i-1,
- x2-i, y+tlw-i-1,
- x2-i, y+i+1);
- p->drawPolyline(a);
- }
- }
- else if (x1 == x2) { // vertical line
- int x = x1 - tlw/2;
- if (y1 > y2) { // swap y1 and y2
- int t = y1;
- y1 = y2;
- y2 = t;
- }
- y2--;
- for (i=0; i<lineWidth; i++) { // draw left shadow
- a.setPoints(3, x+i, y2,
- x+i, y1+i,
- x+tlw-1, y1+i);
- p->drawPolyline(a);
- }
- if (midLineWidth > 0) {
- p->setPen(pal.mid().color());
- for (i=0; i<midLineWidth; i++) // draw lines in the middle
- p->drawLine(x+lineWidth+i, y1+lineWidth, x+lineWidth+i, y2);
- }
- if (sunken)
- p->setPen(pal.light().color());
- else
- p->setPen(pal.dark().color());
- for (i=0; i<lineWidth; i++) { // draw right shadow
- a.setPoints(3, x+lineWidth, y2-i,
- x+tlw-i-1, y2-i,
- x+tlw-i-1, y1+lineWidth);
- p->drawPolyline(a);
- }
- }
- p->setPen(oldPen);
-}
-
-/*!
- \fn void qDrawShadeRect(QPainter *painter, int x, int y, int width, int height,
- const QPalette &palette, bool sunken,
- int lineWidth, int midLineWidth,
- const QBrush *fill)
- \relates <qdrawutil.h>
-
- Draws the shaded rectangle beginning at (\a x, \a y) with the
- given \a width and \a height using the provided \a painter.
-
- The provide \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors. The given \a lineWidth
- specifies the line width for each of the lines; it is not the
- total line width. The \a midLineWidth specifies the width of a
- middle line drawn in the QPalette::mid() color. The rectangle's
- interior is filled with the \a fill brush unless \a fill is 0.
-
- The rectangle appears sunken if \a sunken is true, otherwise
- raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded rectangle:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 1
-
- \sa qDrawShadeLine(), qDrawShadePanel(), qDrawPlainRect(), QStyle
-*/
-
-void qDrawShadeRect(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken,
- int lineWidth, int midLineWidth,
- const QBrush *fill)
-{
- if (w == 0 || h == 0)
- return;
- if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0 || midLineWidth < 0)) {
- qWarning("qDrawShadeRect: Invalid parameters");
- return;
- }
-
- PainterStateGuard painterGuard(p);
- const qreal devicePixelRatio = p->device()->devicePixelRatioF();
- if (!qFuzzyCompare(devicePixelRatio, qreal(1))) {
- painterGuard.save();
- const qreal inverseScale = qreal(1) / devicePixelRatio;
- p->scale(inverseScale, inverseScale);
- x = qRound(devicePixelRatio * x);
- y = qRound(devicePixelRatio * y);
- w = qRound(devicePixelRatio * w);
- h = qRound(devicePixelRatio * h);
- lineWidth = qRound(devicePixelRatio * lineWidth);
- midLineWidth = qRound(devicePixelRatio * midLineWidth);
- }
-
- QPen oldPen = p->pen();
- if (sunken)
- p->setPen(pal.dark().color());
- else
- p->setPen(pal.light().color());
- int x1=x, y1=y, x2=x+w-1, y2=y+h-1;
-
- if (lineWidth == 1 && midLineWidth == 0) {// standard shade rectangle
- p->drawRect(x1, y1, w-2, h-2);
- if (sunken)
- p->setPen(pal.light().color());
- else
- p->setPen(pal.dark().color());
- QLineF lines[4] = { QLineF(x1+1, y1+1, x2-2, y1+1),
- QLineF(x1+1, y1+2, x1+1, y2-2),
- QLineF(x1, y2, x2, y2),
- QLineF(x2,y1, x2,y2-1) };
- p->drawLines(lines, 4); // draw bottom/right lines
- } else { // more complicated
- int m = lineWidth+midLineWidth;
- int i, j=0, k=m;
- for (i=0; i<lineWidth; i++) { // draw top shadow
- QLineF lines[4] = { QLineF(x1+i, y2-i, x1+i, y1+i),
- QLineF(x1+i, y1+i, x2-i, y1+i),
- QLineF(x1+k, y2-k, x2-k, y2-k),
- QLineF(x2-k, y2-k, x2-k, y1+k) };
- p->drawLines(lines, 4);
- k++;
- }
- p->setPen(pal.mid().color());
- j = lineWidth*2;
- for (i=0; i<midLineWidth; i++) { // draw lines in the middle
- p->drawRect(x1+lineWidth+i, y1+lineWidth+i, w-j-1, h-j-1);
- j += 2;
- }
- if (sunken)
- p->setPen(pal.light().color());
- else
- p->setPen(pal.dark().color());
- k = m;
- for (i=0; i<lineWidth; i++) { // draw bottom shadow
- QLineF lines[4] = { QLineF(x1+1+i, y2-i, x2-i, y2-i),
- QLineF(x2-i, y2-i, x2-i, y1+i+1),
- QLineF(x1+k, y2-k, x1+k, y1+k),
- QLineF(x1+k, y1+k, x2-k, y1+k) };
- p->drawLines(lines, 4);
- k++;
- }
- }
- if (fill) {
- QBrush oldBrush = p->brush();
- int tlw = lineWidth + midLineWidth;
- p->setPen(Qt::NoPen);
- p->setBrush(*fill);
- p->drawRect(x+tlw, y+tlw, w-2*tlw, h-2*tlw);
- p->setBrush(oldBrush);
- }
- p->setPen(oldPen); // restore pen
-}
-
-
-/*!
- \fn void qDrawShadePanel(QPainter *painter, int x, int y, int width, int height,
- const QPalette &palette, bool sunken,
- int lineWidth, const QBrush *fill)
- \relates <qdrawutil.h>
-
- Draws the shaded panel beginning at (\a x, \a y) with the given \a
- width and \a height using the provided \a painter and the given \a
- lineWidth.
-
- The given \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors). The panel's interior is filled
- with the \a fill brush unless \a fill is 0.
-
- The panel appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded panel:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 2
-
- \sa qDrawWinPanel(), qDrawShadeLine(), qDrawShadeRect(), QStyle
-*/
-
-void qDrawShadePanel(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken,
- int lineWidth, const QBrush *fill)
-{
- if (w == 0 || h == 0)
- return;
- if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0)) {
- qWarning("qDrawShadePanel: Invalid parameters");
- }
-
- PainterStateGuard painterGuard(p);
- const qreal devicePixelRatio = p->device()->devicePixelRatioF();
- if (!qFuzzyCompare(devicePixelRatio, qreal(1))) {
- painterGuard.save();
- const qreal inverseScale = qreal(1) / devicePixelRatio;
- p->scale(inverseScale, inverseScale);
- x = qRound(devicePixelRatio * x);
- y = qRound(devicePixelRatio * y);
- w = qRound(devicePixelRatio * w);
- h = qRound(devicePixelRatio * h);
- lineWidth = qRound(devicePixelRatio * lineWidth);
- }
-
- QColor shade = pal.dark().color();
- QColor light = pal.light().color();
- if (fill) {
- if (fill->color() == shade)
- shade = pal.shadow().color();
- if (fill->color() == light)
- light = pal.midlight().color();
- }
- QPen oldPen = p->pen(); // save pen
- QVector<QLineF> lines;
- lines.reserve(2*lineWidth);
-
- if (sunken)
- p->setPen(shade);
- else
- p->setPen(light);
- int x1, y1, x2, y2;
- int i;
- x1 = x;
- y1 = y2 = y;
- x2 = x+w-2;
- for (i=0; i<lineWidth; i++) { // top shadow
- lines << QLineF(x1, y1++, x2--, y2++);
- }
- x2 = x1;
- y1 = y+h-2;
- for (i=0; i<lineWidth; i++) { // left shado
- lines << QLineF(x1++, y1, x2++, y2--);
- }
- p->drawLines(lines);
- lines.clear();
- if (sunken)
- p->setPen(light);
- else
- p->setPen(shade);
- x1 = x;
- y1 = y2 = y+h-1;
- x2 = x+w-1;
- for (i=0; i<lineWidth; i++) { // bottom shadow
- lines << QLineF(x1++, y1--, x2, y2--);
- }
- x1 = x2;
- y1 = y;
- y2 = y+h-lineWidth-1;
- for (i=0; i<lineWidth; i++) { // right shadow
- lines << QLineF(x1--, y1++, x2--, y2);
- }
- p->drawLines(lines);
- if (fill) // fill with fill color
- p->fillRect(x+lineWidth, y+lineWidth, w-lineWidth*2, h-lineWidth*2, *fill);
- p->setPen(oldPen); // restore pen
-}
-
-
-/*!
- \internal
- This function draws a rectangle with two pixel line width.
- It is called from qDrawWinButton() and qDrawWinPanel().
-
- c1..c4 and fill are used:
-
- 1 1 1 1 1 2
- 1 3 3 3 4 2
- 1 3 F F 4 2
- 1 3 F F 4 2
- 1 4 4 4 4 2
- 2 2 2 2 2 2
-*/
-
-static void qDrawWinShades(QPainter *p,
- int x, int y, int w, int h,
- const QColor &c1, const QColor &c2,
- const QColor &c3, const QColor &c4,
- const QBrush *fill)
-{
- if (w < 2 || h < 2) // can't do anything with that
- return;
-
- PainterStateGuard painterGuard(p);
- const qreal devicePixelRatio = p->device()->devicePixelRatioF();
- if (!qFuzzyCompare(devicePixelRatio, qreal(1))) {
- painterGuard.save();
- const qreal inverseScale = qreal(1) / devicePixelRatio;
- p->scale(inverseScale, inverseScale);
- x = qRound(devicePixelRatio * x);
- y = qRound(devicePixelRatio * y);
- w = qRound(devicePixelRatio * w);
- h = qRound(devicePixelRatio * h);
- }
-
- QPen oldPen = p->pen();
- QPoint a[3] = { QPoint(x, y+h-2), QPoint(x, y), QPoint(x+w-2, y) };
- p->setPen(c1);
- p->drawPolyline(a, 3);
- QPoint b[3] = { QPoint(x, y+h-1), QPoint(x+w-1, y+h-1), QPoint(x+w-1, y) };
- p->setPen(c2);
- p->drawPolyline(b, 3);
- if (w > 4 && h > 4) {
- QPoint c[3] = { QPoint(x+1, y+h-3), QPoint(x+1, y+1), QPoint(x+w-3, y+1) };
- p->setPen(c3);
- p->drawPolyline(c, 3);
- QPoint d[3] = { QPoint(x+1, y+h-2), QPoint(x+w-2, y+h-2), QPoint(x+w-2, y+1) };
- p->setPen(c4);
- p->drawPolyline(d, 3);
- if (fill)
- p->fillRect(QRect(x+2, y+2, w-4, h-4), *fill);
- }
- p->setPen(oldPen);
-}
-
-
-/*!
- \fn void qDrawWinButton(QPainter *painter, int x, int y, int width, int height,
- const QPalette &palette, bool sunken,
- const QBrush *fill)
- \relates <qdrawutil.h>
-
- Draws the Windows-style button specified by the given point (\a x,
- \a y}, \a width and \a height using the provided \a painter with a
- line width of 2 pixels. The button's interior is filled with the
- \a{fill} brush unless \a fill is 0.
-
- The given \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors).
-
- The button appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style()-> Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- \sa qDrawWinPanel(), QStyle
-*/
-
-void qDrawWinButton(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken,
- const QBrush *fill)
-{
- if (sunken)
- qDrawWinShades(p, x, y, w, h,
- pal.shadow().color(), pal.light().color(), pal.dark().color(),
- pal.button().color(), fill);
- else
- qDrawWinShades(p, x, y, w, h,
- pal.light().color(), pal.shadow().color(), pal.button().color(),
- pal.dark().color(), fill);
-}
-
-/*!
- \fn void qDrawWinPanel(QPainter *painter, int x, int y, int width, int height,
- const QPalette &palette, bool sunken,
- const QBrush *fill)
- \relates <qdrawutil.h>
-
- Draws the Windows-style panel specified by the given point(\a x,
- \a y), \a width and \a height using the provided \a painter with a
- line width of 2 pixels. The button's interior is filled with the
- \a fill brush unless \a fill is 0.
-
- The given \a palette specifies the shading colors. The panel
- appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded panel:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 3
-
- \sa qDrawShadePanel(), qDrawWinButton(), QStyle
-*/
-
-void qDrawWinPanel(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken,
- const QBrush *fill)
-{
- if (sunken)
- qDrawWinShades(p, x, y, w, h,
- pal.dark().color(), pal.light().color(), pal.shadow().color(),
- pal.midlight().color(), fill);
- else
- qDrawWinShades(p, x, y, w, h,
- pal.light().color(), pal.shadow().color(), pal.midlight().color(),
- pal.dark().color(), fill);
-}
-
-/*!
- \fn void qDrawPlainRect(QPainter *painter, int x, int y, int width, int height, const QColor &lineColor,
- int lineWidth, const QBrush *fill)
- \relates <qdrawutil.h>
-
- Draws the plain rectangle beginning at (\a x, \a y) with the given
- \a width and \a height, using the specified \a painter, \a lineColor
- and \a lineWidth. The rectangle's interior is filled with the \a
- fill brush unless \a fill is 0.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a plain rectangle:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 4
-
- \sa qDrawShadeRect(), QStyle
-*/
-
-void qDrawPlainRect(QPainter *p, int x, int y, int w, int h, const QColor &c,
- int lineWidth, const QBrush *fill)
-{
- if (w == 0 || h == 0)
- return;
- if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0)) {
- qWarning("qDrawPlainRect: Invalid parameters");
- }
-
- PainterStateGuard painterGuard(p);
- const qreal devicePixelRatio = p->device()->devicePixelRatioF();
- if (!qFuzzyCompare(devicePixelRatio, qreal(1))) {
- painterGuard.save();
- const qreal inverseScale = qreal(1) / devicePixelRatio;
- p->scale(inverseScale, inverseScale);
- x = qRound(devicePixelRatio * x);
- y = qRound(devicePixelRatio * y);
- w = qRound(devicePixelRatio * w);
- h = qRound(devicePixelRatio * h);
- lineWidth = qRound(devicePixelRatio * lineWidth);
- }
-
- QPen oldPen = p->pen();
- QBrush oldBrush = p->brush();
- p->setPen(c);
- p->setBrush(Qt::NoBrush);
- for (int i=0; i<lineWidth; i++)
- p->drawRect(x+i, y+i, w-i*2 - 1, h-i*2 - 1);
- if (fill) { // fill with fill color
- p->setPen(Qt::NoPen);
- p->setBrush(*fill);
- p->drawRect(x+lineWidth, y+lineWidth, w-lineWidth*2, h-lineWidth*2);
- }
- p->setPen(oldPen);
- p->setBrush(oldBrush);
-}
-
-/*****************************************************************************
- Overloaded functions.
- *****************************************************************************/
-
-/*!
- \fn void qDrawShadeLine(QPainter *painter, const QPoint &p1, const QPoint &p2,
- const QPalette &palette, bool sunken, int lineWidth, int midLineWidth)
- \relates <qdrawutil.h>
- \overload
-
- Draws a horizontal or vertical shaded line between \a p1 and \a p2
- using the given \a painter. Note that nothing is drawn if the line
- between the points would be neither horizontal nor vertical.
-
- The provided \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors). The given \a lineWidth
- specifies the line width for each of the lines; it is not the
- total line width. The given \a midLineWidth specifies the width of
- a middle line drawn in the QPalette::mid() color.
-
- The line appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to
- make widgets that follow the current GUI style.
-
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded line:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 5
-
- \sa qDrawShadeRect(), qDrawShadePanel(), QStyle
-*/
-
-void qDrawShadeLine(QPainter *p, const QPoint &p1, const QPoint &p2,
- const QPalette &pal, bool sunken,
- int lineWidth, int midLineWidth)
-{
- qDrawShadeLine(p, p1.x(), p1.y(), p2.x(), p2.y(), pal, sunken,
- lineWidth, midLineWidth);
-}
-
-/*!
- \fn void qDrawShadeRect(QPainter *painter, const QRect &rect, const QPalette &palette,
- bool sunken, int lineWidth, int midLineWidth, const QBrush *fill)
- \relates <qdrawutil.h>
- \overload
-
- Draws the shaded rectangle specified by \a rect using the given \a painter.
-
- The provide \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors. The given \a lineWidth
- specifies the line width for each of the lines; it is not the
- total line width. The \a midLineWidth specifies the width of a
- middle line drawn in the QPalette::mid() color. The rectangle's
- interior is filled with the \a fill brush unless \a fill is 0.
-
- The rectangle appears sunken if \a sunken is true, otherwise
- raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded rectangle:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 6
-
- \sa qDrawShadeLine(), qDrawShadePanel(), qDrawPlainRect(), QStyle
-*/
-
-void qDrawShadeRect(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken,
- int lineWidth, int midLineWidth,
- const QBrush *fill)
-{
- qDrawShadeRect(p, r.x(), r.y(), r.width(), r.height(), pal, sunken,
- lineWidth, midLineWidth, fill);
-}
-
-/*!
- \fn void qDrawShadePanel(QPainter *painter, const QRect &rect, const QPalette &palette,
- bool sunken, int lineWidth, const QBrush *fill)
- \relates <qdrawutil.h>
- \overload
-
- Draws the shaded panel at the rectangle specified by \a rect using the
- given \a painter and the given \a lineWidth.
-
- The given \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors). The panel's interior is filled
- with the \a fill brush unless \a fill is 0.
-
- The panel appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded panel:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 7
-
- \sa qDrawWinPanel(), qDrawShadeLine(), qDrawShadeRect(), QStyle
-*/
-
-void qDrawShadePanel(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken,
- int lineWidth, const QBrush *fill)
-{
- qDrawShadePanel(p, r.x(), r.y(), r.width(), r.height(), pal, sunken,
- lineWidth, fill);
-}
-
-/*!
- \fn void qDrawWinButton(QPainter *painter, const QRect &rect, const QPalette &palette,
- bool sunken, const QBrush *fill)
- \relates <qdrawutil.h>
- \overload
-
- Draws the Windows-style button at the rectangle specified by \a rect using
- the given \a painter with a line width of 2 pixels. The button's interior
- is filled with the \a{fill} brush unless \a fill is 0.
-
- The given \a palette specifies the shading colors (\l
- {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l
- {QPalette::mid()}{middle} colors).
-
- The button appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style()-> Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- \sa qDrawWinPanel(), QStyle
-*/
-
-void qDrawWinButton(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken, const QBrush *fill)
-{
- qDrawWinButton(p, r.x(), r.y(), r.width(), r.height(), pal, sunken, fill);
-}
-
-/*!
- \fn void qDrawWinPanel(QPainter *painter, const QRect &rect, const QPalette &palette,
- bool sunken, const QBrush *fill)
- \overload
-
- Draws the Windows-style panel at the rectangle specified by \a rect using
- the given \a painter with a line width of 2 pixels. The button's interior
- is filled with the \a fill brush unless \a fill is 0.
-
- The given \a palette specifies the shading colors. The panel
- appears sunken if \a sunken is true, otherwise raised.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a shaded panel:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 8
-
- \sa qDrawShadePanel(), qDrawWinButton(), QStyle
-*/
-
-void qDrawWinPanel(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken, const QBrush *fill)
-{
- qDrawWinPanel(p, r.x(), r.y(), r.width(), r.height(), pal, sunken, fill);
-}
-
-/*!
- \fn void qDrawPlainRect(QPainter *painter, const QRect &rect, const QColor &lineColor, int lineWidth, const QBrush *fill)
- \relates <qdrawutil.h>
- \overload
-
- Draws the plain rectangle specified by \a rect using the given \a painter,
- \a lineColor and \a lineWidth. The rectangle's interior is filled with the
- \a fill brush unless \a fill is 0.
-
- \warning This function does not look at QWidget::style() or
- QApplication::style(). Use the drawing functions in QStyle to make
- widgets that follow the current GUI style.
-
- Alternatively you can use a QFrame widget and apply the
- QFrame::setFrameStyle() function to display a plain rectangle:
-
- \snippet code/src_gui_painting_qdrawutil.cpp 9
-
- \sa qDrawShadeRect(), QStyle
-*/
-
-void qDrawPlainRect(QPainter *p, const QRect &r, const QColor &c,
- int lineWidth, const QBrush *fill)
-{
- qDrawPlainRect(p, r.x(), r.y(), r.width(), r.height(), c,
- lineWidth, fill);
-}
-
-
-/*!
- \class QTileRules
- \since 4.6
-
- \inmodule QtWidgets
-
- \brief The QTileRules class provides the rules used to draw a
- pixmap or image split into nine segments.
-
- Spliiting is similar to \l{http://www.w3.org/TR/css3-background/}{CSS3 border-images}.
-
- \sa Qt::TileRule, QMargins
-*/
-
-/*! \fn QTileRules::QTileRules(Qt::TileRule horizontalRule, Qt::TileRule verticalRule)
- Constructs a QTileRules with the given \a horizontalRule and
- \a verticalRule.
- */
-
-/*! \fn QTileRules::QTileRules(Qt::TileRule rule)
- Constructs a QTileRules with the given \a rule used for both
- the horizontal rule and the vertical rule.
- */
-
-/*!
- \fn void qDrawBorderPixmap(QPainter *painter, const QRect &target, const QMargins &margins, const QPixmap &pixmap)
- \relates <qdrawutil.h>
- \since 4.6
-
- \brief The qDrawBorderPixmap function is for drawing a pixmap into
- the margins of a rectangle.
-
- Draws the given \a pixmap into the given \a target rectangle, using the
- given \a painter. The pixmap will be split into nine segments and drawn
- according to the \a margins structure.
-*/
-
-typedef QVarLengthArray<QPainter::PixmapFragment, 16> QPixmapFragmentsArray;
-
-/*!
- \since 4.6
-
- Draws the indicated \a sourceRect rectangle from the given \a pixmap into
- the given \a targetRect rectangle, using the given \a painter. The pixmap
- will be split into nine segments according to the given \a targetMargins
- and \a sourceMargins structures. Finally, the pixmap will be drawn
- according to the given \a rules.
-
- This function is used to draw a scaled pixmap, similar to
- \l{http://www.w3.org/TR/css3-background/}{CSS3 border-images}
-
- \sa Qt::TileRule, QTileRules, QMargins
-*/
-
-void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargins &targetMargins,
- const QPixmap &pixmap, const QRect &sourceRect,const QMargins &sourceMargins,
- const QTileRules &rules
-#ifndef Q_CLANG_QDOC
- , QDrawBorderPixmap::DrawingHints hints
-#endif
- )
-{
- QPainter::PixmapFragment d;
- d.opacity = 1.0;
- d.rotation = 0.0;
-
- QPixmapFragmentsArray opaqueData;
- QPixmapFragmentsArray translucentData;
-
- // source center
- const int sourceCenterTop = sourceRect.top() + sourceMargins.top();
- const int sourceCenterLeft = sourceRect.left() + sourceMargins.left();
- const int sourceCenterBottom = sourceRect.bottom() - sourceMargins.bottom() + 1;
- const int sourceCenterRight = sourceRect.right() - sourceMargins.right() + 1;
- const int sourceCenterWidth = sourceCenterRight - sourceCenterLeft;
- const int sourceCenterHeight = sourceCenterBottom - sourceCenterTop;
- // target center
- const int targetCenterTop = targetRect.top() + targetMargins.top();
- const int targetCenterLeft = targetRect.left() + targetMargins.left();
- const int targetCenterBottom = targetRect.bottom() - targetMargins.bottom() + 1;
- const int targetCenterRight = targetRect.right() - targetMargins.right() + 1;
- const int targetCenterWidth = targetCenterRight - targetCenterLeft;
- const int targetCenterHeight = targetCenterBottom - targetCenterTop;
-
- QVarLengthArray<qreal, 16> xTarget; // x-coordinates of target rectangles
- QVarLengthArray<qreal, 16> yTarget; // y-coordinates of target rectangles
-
- int columns = 3;
- int rows = 3;
- if (rules.horizontal != Qt::StretchTile && sourceCenterWidth != 0)
- columns = qMax(3, 2 + qCeil(targetCenterWidth / qreal(sourceCenterWidth)));
- if (rules.vertical != Qt::StretchTile && sourceCenterHeight != 0)
- rows = qMax(3, 2 + qCeil(targetCenterHeight / qreal(sourceCenterHeight)));
-
- xTarget.resize(columns + 1);
- yTarget.resize(rows + 1);
-
- bool oldAA = painter->testRenderHint(QPainter::Antialiasing);
- if (painter->paintEngine()->type() != QPaintEngine::OpenGL
- && painter->paintEngine()->type() != QPaintEngine::OpenGL2
- && oldAA && painter->combinedTransform().type() != QTransform::TxNone) {
- painter->setRenderHint(QPainter::Antialiasing, false);
- }
-
- xTarget[0] = targetRect.left();
- xTarget[1] = targetCenterLeft;
- xTarget[columns - 1] = targetCenterRight;
- xTarget[columns] = targetRect.left() + targetRect.width();
-
- yTarget[0] = targetRect.top();
- yTarget[1] = targetCenterTop;
- yTarget[rows - 1] = targetCenterBottom;
- yTarget[rows] = targetRect.top() + targetRect.height();
-
- qreal dx = targetCenterWidth;
- qreal dy = targetCenterHeight;
-
- switch (rules.horizontal) {
- case Qt::StretchTile:
- dx = targetCenterWidth;
- break;
- case Qt::RepeatTile:
- dx = sourceCenterWidth;
- break;
- case Qt::RoundTile:
- dx = targetCenterWidth / qreal(columns - 2);
- break;
- }
-
- for (int i = 2; i < columns - 1; ++i)
- xTarget[i] = xTarget[i - 1] + dx;
-
- switch (rules.vertical) {
- case Qt::StretchTile:
- dy = targetCenterHeight;
- break;
- case Qt::RepeatTile:
- dy = sourceCenterHeight;
- break;
- case Qt::RoundTile:
- dy = targetCenterHeight / qreal(rows - 2);
- break;
- }
-
- for (int i = 2; i < rows - 1; ++i)
- yTarget[i] = yTarget[i - 1] + dy;
-
- // corners
- if (targetMargins.top() > 0 && targetMargins.left() > 0 && sourceMargins.top() > 0 && sourceMargins.left() > 0) { // top left
- d.x = (0.5 * (xTarget[1] + xTarget[0]));
- d.y = (0.5 * (yTarget[1] + yTarget[0]));
- d.sourceLeft = sourceRect.left();
- d.sourceTop = sourceRect.top();
- d.width = sourceMargins.left();
- d.height = sourceMargins.top();
- d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.width;
- d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.height;
- if (hints & QDrawBorderPixmap::OpaqueTopLeft)
- opaqueData.append(d);
- else
- translucentData.append(d);
- }
- if (targetMargins.top() > 0 && targetMargins.right() > 0 && sourceMargins.top() > 0 && sourceMargins.right() > 0) { // top right
- d.x = (0.5 * (xTarget[columns] + xTarget[columns - 1]));
- d.y = (0.5 * (yTarget[1] + yTarget[0]));
- d.sourceLeft = sourceCenterRight;
- d.sourceTop = sourceRect.top();
- d.width = sourceMargins.right();
- d.height = sourceMargins.top();
- d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.width;
- d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.height;
- if (hints & QDrawBorderPixmap::OpaqueTopRight)
- opaqueData.append(d);
- else
- translucentData.append(d);
- }
- if (targetMargins.bottom() > 0 && targetMargins.left() > 0 && sourceMargins.bottom() > 0 && sourceMargins.left() > 0) { // bottom left
- d.x = (0.5 * (xTarget[1] + xTarget[0]));
- d.y =(0.5 * (yTarget[rows] + yTarget[rows - 1]));
- d.sourceLeft = sourceRect.left();
- d.sourceTop = sourceCenterBottom;
- d.width = sourceMargins.left();
- d.height = sourceMargins.bottom();
- d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.width;
- d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.height;
- if (hints & QDrawBorderPixmap::OpaqueBottomLeft)
- opaqueData.append(d);
- else
- translucentData.append(d);
- }
- if (targetMargins.bottom() > 0 && targetMargins.right() > 0 && sourceMargins.bottom() > 0 && sourceMargins.right() > 0) { // bottom right
- d.x = (0.5 * (xTarget[columns] + xTarget[columns - 1]));
- d.y = (0.5 * (yTarget[rows] + yTarget[rows - 1]));
- d.sourceLeft = sourceCenterRight;
- d.sourceTop = sourceCenterBottom;
- d.width = sourceMargins.right();
- d.height = sourceMargins.bottom();
- d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.width;
- d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.height;
- if (hints & QDrawBorderPixmap::OpaqueBottomRight)
- opaqueData.append(d);
- else
- translucentData.append(d);
- }
-
- // horizontal edges
- if (targetCenterWidth > 0 && sourceCenterWidth > 0) {
- if (targetMargins.top() > 0 && sourceMargins.top() > 0) { // top
- QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueTop ? opaqueData : translucentData;
- d.sourceLeft = sourceCenterLeft;
- d.sourceTop = sourceRect.top();
- d.width = sourceCenterWidth;
- d.height = sourceMargins.top();
- d.y = (0.5 * (yTarget[1] + yTarget[0]));
- d.scaleX = dx / d.width;
- d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.height;
- for (int i = 1; i < columns - 1; ++i) {
- d.x = (0.5 * (xTarget[i + 1] + xTarget[i]));
- data.append(d);
- }
- if (rules.horizontal == Qt::RepeatTile)
- data[data.size() - 1].width = ((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX);
- }
- if (targetMargins.bottom() > 0 && sourceMargins.bottom() > 0) { // bottom
- QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueBottom ? opaqueData : translucentData;
- d.sourceLeft = sourceCenterLeft;
- d.sourceTop = sourceCenterBottom;
- d.width = sourceCenterWidth;
- d.height = sourceMargins.bottom();
- d.y = (0.5 * (yTarget[rows] + yTarget[rows - 1]));
- d.scaleX = dx / d.width;
- d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.height;
- for (int i = 1; i < columns - 1; ++i) {
- d.x = (0.5 * (xTarget[i + 1] + xTarget[i]));
- data.append(d);
- }
- if (rules.horizontal == Qt::RepeatTile)
- data[data.size() - 1].width = ((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX);
- }
- }
-
- // vertical edges
- if (targetCenterHeight > 0 && sourceCenterHeight > 0) {
- if (targetMargins.left() > 0 && sourceMargins.left() > 0) { // left
- QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueLeft ? opaqueData : translucentData;
- d.sourceLeft = sourceRect.left();
- d.sourceTop = sourceCenterTop;
- d.width = sourceMargins.left();
- d.height = sourceCenterHeight;
- d.x = (0.5 * (xTarget[1] + xTarget[0]));
- d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.width;
- d.scaleY = dy / d.height;
- for (int i = 1; i < rows - 1; ++i) {
- d.y = (0.5 * (yTarget[i + 1] + yTarget[i]));
- data.append(d);
- }
- if (rules.vertical == Qt::RepeatTile)
- data[data.size() - 1].height = ((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY);
- }
- if (targetMargins.right() > 0 && sourceMargins.right() > 0) { // right
- QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueRight ? opaqueData : translucentData;
- d.sourceLeft = sourceCenterRight;
- d.sourceTop = sourceCenterTop;
- d.width = sourceMargins.right();
- d.height = sourceCenterHeight;
- d.x = (0.5 * (xTarget[columns] + xTarget[columns - 1]));
- d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.width;
- d.scaleY = dy / d.height;
- for (int i = 1; i < rows - 1; ++i) {
- d.y = (0.5 * (yTarget[i + 1] + yTarget[i]));
- data.append(d);
- }
- if (rules.vertical == Qt::RepeatTile)
- data[data.size() - 1].height = ((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY);
- }
- }
-
- // center
- if (targetCenterWidth > 0 && targetCenterHeight > 0 && sourceCenterWidth > 0 && sourceCenterHeight > 0) {
- QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueCenter ? opaqueData : translucentData;
- d.sourceLeft = sourceCenterLeft;
- d.sourceTop = sourceCenterTop;
- d.width = sourceCenterWidth;
- d.height = sourceCenterHeight;
- d.scaleX = dx / d.width;
- d.scaleY = dy / d.height;
-
- qreal repeatWidth = (xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX;
- qreal repeatHeight = (yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY;
-
- for (int j = 1; j < rows - 1; ++j) {
- d.y = (0.5 * (yTarget[j + 1] + yTarget[j]));
- for (int i = 1; i < columns - 1; ++i) {
- d.x = (0.5 * (xTarget[i + 1] + xTarget[i]));
- data.append(d);
- }
- if (rules.horizontal == Qt::RepeatTile)
- data[data.size() - 1].width = repeatWidth;
- }
- if (rules.vertical == Qt::RepeatTile) {
- for (int i = 1; i < columns - 1; ++i)
- data[data.size() - i].height = repeatHeight;
- }
- }
-
- if (opaqueData.size())
- painter->drawPixmapFragments(opaqueData.data(), opaqueData.size(), pixmap, QPainter::OpaqueHint);
- if (translucentData.size())
- painter->drawPixmapFragments(translucentData.data(), translucentData.size(), pixmap);
-
- if (oldAA)
- painter->setRenderHint(QPainter::Antialiasing, true);
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/qquickdrawutil.h b/src/quicknativestyle/qstyle/qquickdrawutil.h
deleted file mode 100644
index 4f7a6c2e..00000000
--- a/src/quicknativestyle/qstyle/qquickdrawutil.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDRAWUTIL_H
-#define QDRAWUTIL_H
-
-#include <QtCore/qnamespace.h>
-#include <QtCore/qstring.h> // char*->QString conversion
-#include <QtCore/qmargins.h>
-#include <QtGui/qpixmap.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QPainter;
-class QPalette;
-class QPoint;
-class QColor;
-class QBrush;
-class QRect;
-
-namespace QQC2 {
-
-//
-// Standard shade drawing
-//
-
-void qDrawShadeLine(QPainter *p, int x1, int y1, int x2, int y2,
- const QPalette &pal, bool sunken = true,
- int lineWidth = 1, int midLineWidth = 0);
-
-void qDrawShadeLine(QPainter *p, const QPoint &p1, const QPoint &p2,
- const QPalette &pal, bool sunken = true,
- int lineWidth = 1, int midLineWidth = 0);
-
-void qDrawShadeRect(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken = false,
- int lineWidth = 1, int midLineWidth = 0,
- const QBrush *fill = nullptr);
-
-void qDrawShadeRect(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken = false,
- int lineWidth = 1, int midLineWidth = 0,
- const QBrush *fill = nullptr);
-
-void qDrawShadePanel(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken = false,
- int lineWidth = 1, const QBrush *fill = nullptr);
-
-void qDrawShadePanel(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken = false,
- int lineWidth = 1, const QBrush *fill = nullptr);
-
-void qDrawWinButton(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken = false,
- const QBrush *fill = nullptr);
-
-void qDrawWinButton(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken = false,
- const QBrush *fill = nullptr);
-
-void qDrawWinPanel(QPainter *p, int x, int y, int w, int h,
- const QPalette &pal, bool sunken = false,
- const QBrush *fill = nullptr);
-
-void qDrawWinPanel(QPainter *p, const QRect &r,
- const QPalette &pal, bool sunken = false,
- const QBrush *fill = nullptr);
-
-void qDrawPlainRect(QPainter *p, int x, int y, int w, int h, const QColor &,
- int lineWidth = 1, const QBrush *fill = nullptr);
-
-void qDrawPlainRect(QPainter *p, const QRect &r, const QColor &,
- int lineWidth = 1, const QBrush *fill = nullptr);
-
-
-
-struct QTileRules
-{
- inline QTileRules(Qt::TileRule horizontalRule, Qt::TileRule verticalRule)
- : horizontal(horizontalRule), vertical(verticalRule) {}
- inline QTileRules(Qt::TileRule rule = Qt::StretchTile)
- : horizontal(rule), vertical(rule) {}
- Qt::TileRule horizontal;
- Qt::TileRule vertical;
-};
-
-#ifndef Q_CLANG_QDOC
-// For internal use only.
-namespace QDrawBorderPixmap
-{
- enum DrawingHint
- {
- OpaqueTopLeft = 0x0001,
- OpaqueTop = 0x0002,
- OpaqueTopRight = 0x0004,
- OpaqueLeft = 0x0008,
- OpaqueCenter = 0x0010,
- OpaqueRight = 0x0020,
- OpaqueBottomLeft = 0x0040,
- OpaqueBottom = 0x0080,
- OpaqueBottomRight = 0x0100,
- OpaqueCorners = OpaqueTopLeft | OpaqueTopRight | OpaqueBottomLeft | OpaqueBottomRight,
- OpaqueEdges = OpaqueTop | OpaqueLeft | OpaqueRight | OpaqueBottom,
- OpaqueFrame = OpaqueCorners | OpaqueEdges,
- OpaqueAll = OpaqueCenter | OpaqueFrame
- };
-
- Q_DECLARE_FLAGS(DrawingHints, DrawingHint)
-}
-#endif
-
-void qDrawBorderPixmap(QPainter *painter,
- const QRect &targetRect,
- const QMargins &targetMargins,
- const QPixmap &pixmap,
- const QRect &sourceRect,
- const QMargins &sourceMargins,
- const QTileRules &rules = QTileRules()
-#ifndef Q_CLANG_QDOC
- , QDrawBorderPixmap::DrawingHints hints = QDrawBorderPixmap::DrawingHints()
-#endif
- );
-
-inline void qDrawBorderPixmap(QPainter *painter,
- const QRect &target,
- const QMargins &margins,
- const QPixmap &pixmap)
-{
- qDrawBorderPixmap(painter, target, margins, pixmap, pixmap.rect(), margins);
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QDRAWUTIL_H
diff --git a/src/quicknativestyle/qstyle/qquicknativestyle.cpp b/src/quicknativestyle/qstyle/qquicknativestyle.cpp
deleted file mode 100644
index 7a2030e0..00000000
--- a/src/quicknativestyle/qstyle/qquicknativestyle.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquicknativestyle.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-QStyle *QQuickNativeStyle::s_style = nullptr;
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/qquicknativestyle.h b/src/quicknativestyle/qstyle/qquicknativestyle.h
deleted file mode 100644
index 13c313f0..00000000
--- a/src/quicknativestyle/qstyle/qquicknativestyle.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKNATIVESTYLE_H
-#define QQUICKNATIVESTYLE_H
-
-#include "qquickstyle.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-class QQuickNativeStyle
-{
-public:
- static void setStyle(QStyle *style)
- {
- if (s_style)
- delete s_style;
- s_style = style;
- }
-
- inline static QStyle *style()
- {
- return s_style;
- }
-
-private:
- static QStyle *s_style;
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QQUICKNATIVESTYLE_H
diff --git a/src/quicknativestyle/qstyle/qquickstyle.cpp b/src/quicknativestyle/qstyle/qquickstyle.cpp
deleted file mode 100644
index 2278fb65..00000000
--- a/src/quicknativestyle/qstyle/qquickstyle.cpp
+++ /dev/null
@@ -1,412 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyle.h"
-#include "qquickstyle_p.h"
-#include "qquickstyleoption.h"
-
-#include <QtGui/qpainter.h>
-#include <QtGui/qbitmap.h>
-#include <QtGui/qpixmapcache.h>
-#include <QtGui/qpa/qplatformtheme.h>
-
-#include <QtGui/private/qguiapplication_p.h>
-
-#ifndef QT_NO_DEBUG
-# include <QtCore/qdebug.h>
-#endif
-
-#include <limits.h>
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-/*!
- Constructs a style object.
-*/
-QStyle::QStyle()
- : QObject(*new QStylePrivate)
-{
- Q_D(QStyle);
- d->proxyStyle = this;
-}
-
-/*!
- \internal
-
- Constructs a style object.
-*/
-QStyle::QStyle(QStylePrivate &dd)
- : QObject(dd)
-{
- Q_D(QStyle);
- d->proxyStyle = this;
-}
-
-/*!
- Destroys the style object.
-*/
-QStyle::~QStyle()
-{
-}
-
-/*!
- \fn QRect QStyle::itemTextRect(const QFontMetrics &metrics, const QRect &rectangle, int alignment, bool enabled, const QString &text) const
-
- Returns the area within the given \a rectangle in which to draw
- the provided \a text according to the specified font \a metrics
- and \a alignment. The \a enabled parameter indicates whether or
- not the associated item is enabled.
-
- If the given \a rectangle is larger than the area needed to render
- the \a text, the rectangle that is returned will be offset within
- \a rectangle according to the specified \a alignment. For
- example, if \a alignment is Qt::AlignCenter, the returned
- rectangle will be centered within \a rectangle. If the given \a
- rectangle is smaller than the area needed, the returned rectangle
- will be the smallest rectangle large enough to render the \a text.
-
- \sa Qt::Alignment
-*/
-QRect QStyle::itemTextRect(const QFontMetrics &metrics, const QRect &rect, int alignment, bool enabled,
- const QString &text) const
-{
- QRect result;
- int x, y, w, h;
- rect.getRect(&x, &y, &w, &h);
- if (!text.isEmpty()) {
- result = metrics.boundingRect(x, y, w, h, alignment, text);
- if (!enabled && proxy()->styleHint(SH_EtchDisabledText)) {
- result.setWidth(result.width()+1);
- result.setHeight(result.height()+1);
- }
- } else {
- result = QRect(x, y, w, h);
- }
- return result;
-}
-
-/*!
- \fn QRect QStyle::itemPixmapRect(const QRect &rectangle, int alignment, const QPixmap &pixmap) const
-
- Returns the area within the given \a rectangle in which to draw
- the specified \a pixmap according to the defined \a alignment.
-*/
-QRect QStyle::itemPixmapRect(const QRect &rect, int alignment, const QPixmap &pixmap) const
-{
- QRect result;
- int x, y, w, h;
- rect.getRect(&x, &y, &w, &h);
-
- const int pixmapWidth = pixmap.width()/pixmap.devicePixelRatio();
- const int pixmapHeight = pixmap.height()/pixmap.devicePixelRatio();
-
- if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
- y += h/2 - pixmapHeight/2;
- else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
- y += h - pixmapHeight;
- if ((alignment & Qt::AlignRight) == Qt::AlignRight)
- x += w - pixmapWidth;
- else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
- x += w/2 - pixmapWidth/2;
- else if ((alignment & Qt::AlignLeft) != Qt::AlignLeft && QGuiApplication::isRightToLeft())
- x += w - pixmapWidth;
- result = QRect(x, y, pixmapWidth, pixmapHeight);
- return result;
-}
-
-/*!
- \fn void QStyle::drawItemText(QPainter *painter, const QRect &rectangle, int alignment, const QPalette &palette, bool enabled, const QString& text, QPalette::ColorRole textRole) const
-
- Draws the given \a text in the specified \a rectangle using the
- provided \a painter and \a palette.
-
- The text is drawn using the painter's pen, and aligned and wrapped
- according to the specified \a alignment. If an explicit \a
- textRole is specified, the text is drawn using the \a palette's
- color for the given role. The \a enabled parameter indicates
- whether or not the item is enabled; when reimplementing this
- function, the \a enabled parameter should influence how the item is
- drawn.
-
- \sa Qt::Alignment, drawItemPixmap()
-*/
-void QStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
- bool enabled, const QString& text, QPalette::ColorRole textRole) const
-{
- if (text.isEmpty())
- return;
- QPen savedPen;
- if (textRole != QPalette::NoRole) {
- savedPen = painter->pen();
- painter->setPen(QPen(pal.brush(textRole), savedPen.widthF()));
- }
- if (!enabled) {
- if (proxy()->styleHint(SH_DitherDisabledText)) {
- QRect br;
- painter->drawText(rect, alignment, text, &br);
- painter->fillRect(br, QBrush(painter->background().color(), Qt::Dense5Pattern));
- return;
- } else if (proxy()->styleHint(SH_EtchDisabledText)) {
- QPen pen = painter->pen();
- painter->setPen(pal.light().color());
- painter->drawText(rect.adjusted(1, 1, 1, 1), alignment, text);
- painter->setPen(pen);
- }
- }
- painter->drawText(rect, alignment, text);
- if (textRole != QPalette::NoRole)
- painter->setPen(savedPen);
-}
-
-/*!
- \fn void QStyle::drawItemPixmap(QPainter *painter, const QRect &rectangle, int alignment,
- const QPixmap &pixmap) const
-
- Draws the given \a pixmap in the specified \a rectangle, according
- to the specified \a alignment, using the provided \a painter.
-
- \sa drawItemText()
-*/
-
-void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
- const QPixmap &pixmap) const
-{
- qreal scale = pixmap.devicePixelRatio();
- QRect aligned = alignedRect(QGuiApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect);
- QRect inter = aligned.intersected(rect);
-
- painter->drawPixmap(inter.x(), inter.y(), pixmap, inter.x() - aligned.x(), inter.y() - aligned.y(), inter.width() * scale, inter.height() *scale);
-}
-
-/*!
- \fn QRect QStyle::visualRect(Qt::LayoutDirection direction, const QRect &boundingRectangle, const QRect &logicalRectangle)
-
- Returns the given \a logicalRectangle converted to screen
- coordinates based on the specified \a direction. The \a
- boundingRectangle is used when performing the translation.
-
- This function is provided to support right-to-left desktops, and
- is typically used in implementations of the subControlRect()
- function.
-
- \sa QWidget::layoutDirection
-*/
-QRect QStyle::visualRect(Qt::LayoutDirection direction, const QRect &boundingRect, const QRect &logicalRect)
-{
- if (direction == Qt::LeftToRight)
- return logicalRect;
- QRect rect = logicalRect;
- rect.translate(2 * (boundingRect.right() - logicalRect.right()) +
- logicalRect.width() - boundingRect.width(), 0);
- return rect;
-}
-
-/*!
- \fn QPoint QStyle::visualPos(Qt::LayoutDirection direction, const QRect &boundingRectangle, const QPoint &logicalPosition)
-
- Returns the given \a logicalPosition converted to screen
- coordinates based on the specified \a direction. The \a
- boundingRectangle is used when performing the translation.
-
- \sa QWidget::layoutDirection
-*/
-QPoint QStyle::visualPos(Qt::LayoutDirection direction, const QRect &boundingRect, const QPoint &logicalPos)
-{
- if (direction == Qt::LeftToRight)
- return logicalPos;
- return QPoint(boundingRect.right() - logicalPos.x(), logicalPos.y());
-}
-
-/*!
- Returns a new rectangle of the specified \a size that is aligned to the given \a
- rectangle according to the specified \a alignment and \a direction.
- */
-QRect QStyle::alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment, const QSize &size, const QRect &rectangle)
-{
- alignment = visualAlignment(direction, alignment);
- int x = rectangle.x();
- int y = rectangle.y();
- int w = size.width();
- int h = size.height();
- if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
- y += rectangle.size().height()/2 - h/2;
- else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
- y += rectangle.size().height() - h;
- if ((alignment & Qt::AlignRight) == Qt::AlignRight)
- x += rectangle.size().width() - w;
- else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
- x += rectangle.size().width()/2 - w/2;
- return QRect(x, y, w, h);
-}
-
-/*!
- Transforms an \a alignment of Qt::AlignLeft or Qt::AlignRight
- without Qt::AlignAbsolute into Qt::AlignLeft or Qt::AlignRight with
- Qt::AlignAbsolute according to the layout \a direction. The other
- alignment flags are left untouched.
-
- If no horizontal alignment was specified, the function returns the
- default alignment for the given layout \a direction.
-
- QWidget::layoutDirection
-*/
-Qt::Alignment QStyle::visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment)
-{
- return QGuiApplicationPrivate::visualAlignment(direction, alignment);
-}
-
-/*!
- Converts the given \a logicalValue to a pixel position. The \a min
- parameter maps to 0, \a max maps to \a span and other values are
- distributed evenly in-between.
-
- This function can handle the entire integer range without
- overflow, providing that \a span is less than 4096.
-
- By default, this function assumes that the maximum value is on the
- right for horizontal items and on the bottom for vertical items.
- Set the \a upsideDown parameter to true to reverse this behavior.
-
- \sa sliderValueFromPosition()
-*/
-
-int QStyle::sliderPositionFromValue(int min, int max, int logicalValue, int span, bool upsideDown)
-{
- if (span <= 0 || logicalValue < min || max <= min)
- return 0;
- if (logicalValue > max)
- return upsideDown ? span : min;
-
- uint range = max - min;
- uint p = upsideDown ? max - logicalValue : logicalValue - min;
-
- if (range > (uint)INT_MAX/4096) {
- double dpos = (double(p))/(double(range)/span);
- return int(dpos);
- } else if (range > (uint)span) {
- return (2 * p * span + range) / (2*range);
- } else {
- uint div = span / range;
- uint mod = span % range;
- return p * div + (2 * p * mod + range) / (2 * range);
- }
- // equiv. to (p * span) / range + 0.5
- // no overflow because of this implicit assumption:
- // span <= 4096
-}
-
-/*!
- \fn int QStyle::sliderValueFromPosition(int min, int max, int position, int span, bool upsideDown)
-
- Converts the given pixel \a position to a logical value. 0 maps to
- the \a min parameter, \a span maps to \a max and other values are
- distributed evenly in-between.
-
- This function can handle the entire integer range without
- overflow.
-
- By default, this function assumes that the maximum value is on the
- right for horizontal items and on the bottom for vertical
- items. Set the \a upsideDown parameter to true to reverse this
- behavior.
-
- \sa sliderPositionFromValue()
-*/
-
-int QStyle::sliderValueFromPosition(int min, int max, int pos, int span, bool upsideDown)
-{
- if (span <= 0 || pos <= 0)
- return upsideDown ? max : min;
- if (pos >= span)
- return upsideDown ? min : max;
-
- uint range = max - min;
-
- if ((uint)span > range) {
- int tmp = (2 * pos * range + span) / (2 * span);
- return upsideDown ? max - tmp : tmp + min;
- } else {
- uint div = range / span;
- uint mod = range % span;
- int tmp = pos * div + (2 * pos * mod + span) / (2 * span);
- return upsideDown ? max - tmp : tmp + min;
- }
- // equiv. to min + (pos*range)/span + 0.5
- // no overflow because of this implicit assumption:
- // pos <= span < sqrt(INT_MAX+0.0625)+0.25 ~ sqrt(INT_MAX)
-}
-
-/*!
- Returns the style's standard palette.
-
- Note that on systems that support system colors, the style's
- standard palette is not used. In particular, the Windows
- Vista and Mac styles do not use the standard palette, but make
- use of native theme engines. With these styles, you should not set
- the palette with QApplication::setPalette().
-
- \sa QApplication::setPalette()
- */
-QPalette QStyle::standardPalette() const
-{
- QColor background = QColor(0xd4, 0xd0, 0xc8); // win 2000 grey
-
- QColor light(background.lighter());
- QColor dark(background.darker());
- QColor mid(Qt::gray);
- QPalette palette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
- palette.setBrush(QPalette::Disabled, QPalette::WindowText, dark);
- palette.setBrush(QPalette::Disabled, QPalette::Text, dark);
- palette.setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
- palette.setBrush(QPalette::Disabled, QPalette::Base, background);
- return palette;
-}
-
-//Windows and KDE allow menus to cover the taskbar, while GNOME and macOS don't
-bool QStylePrivate::useFullScreenForPopup()
-{
- auto theme = QGuiApplicationPrivate::platformTheme();
- return theme && theme->themeHint(QPlatformTheme::UseFullScreenForPopupMenu).toBool();
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#include "moc_qquickstyle.cpp"
diff --git a/src/quicknativestyle/qstyle/qquickstyle.h b/src/quicknativestyle/qstyle/qquickstyle.h
deleted file mode 100644
index 38a0dcf5..00000000
--- a/src/quicknativestyle/qstyle/qquickstyle.h
+++ /dev/null
@@ -1,839 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTYLE_H
-#define QSTYLE_H
-
-#include <QtCore/qobject.h>
-#include <QtCore/qrect.h>
-#include <QtCore/qsize.h>
-#include <QtGui/qwindow.h>
-#include <QtGui/qicon.h>
-#include <QtGui/qpixmap.h>
-#include <QtGui/qpalette.h>
-
-QT_BEGIN_NAMESPACE
-
-class QAction;
-class QDebug;
-class QFontMetrics;
-
-namespace QQC2 {
-
-class QStyleHintReturn;
-class QStyleOption;
-class QStyleOptionComplex;
-class QStylePrivate;
-
-class QStyle : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QStyle)
-
-protected:
- QStyle(QStylePrivate &dd);
-
-public:
- QStyle();
- virtual ~QStyle();
-
- enum StateFlag {
- State_None = 0x00000000,
- State_Enabled = 0x00000001,
- State_Raised = 0x00000002,
- State_Sunken = 0x00000004,
- State_Off = 0x00000008,
- State_NoChange = 0x00000010,
- State_On = 0x00000020,
- State_DownArrow = 0x00000040,
- State_Horizontal = 0x00000080,
- State_HasFocus = 0x00000100,
- State_Top = 0x00000200,
- State_Bottom = 0x00000400,
- State_FocusAtBorder = 0x00000800,
- State_AutoRaise = 0x00001000,
- State_MouseOver = 0x00002000,
- State_UpArrow = 0x00004000,
- State_Selected = 0x00008000,
- State_Active = 0x00010000,
- State_Window = 0x00020000,
- State_Open = 0x00040000,
- State_Children = 0x00080000,
- State_Item = 0x00100000,
- State_Sibling = 0x00200000,
- State_Editing = 0x00400000,
- State_KeyboardFocusChange = 0x00800000,
-#ifdef QT_KEYPAD_NAVIGATION
- State_HasEditFocus = 0x01000000,
-#endif
- State_ReadOnly = 0x02000000,
- State_Small = 0x04000000,
- State_Mini = 0x08000000
- };
- Q_ENUM(StateFlag)
- Q_DECLARE_FLAGS(State, StateFlag)
-
- enum PrimitiveElement {
- PE_Frame,
- PE_FrameDefaultButton,
- PE_FrameDockWidget,
- PE_FrameFocusRect,
- PE_FrameGroupBox,
- PE_FrameLineEdit,
- PE_FrameMenu,
- PE_FrameStatusBarItem,
- PE_FrameTabWidget,
- PE_FrameWindow,
- PE_FrameButtonBevel,
- PE_FrameButtonTool,
- PE_FrameTabBarBase,
-
- PE_PanelButtonCommand,
- PE_PanelButtonBevel,
- PE_PanelButtonTool,
- PE_PanelMenuBar,
- PE_PanelToolBar,
- PE_PanelLineEdit,
-
- PE_IndicatorArrowDown,
- PE_IndicatorArrowLeft,
- PE_IndicatorArrowRight,
- PE_IndicatorArrowUp,
- PE_IndicatorBranch,
- PE_IndicatorButtonDropDown,
- PE_IndicatorItemViewItemCheck,
- PE_IndicatorCheckBox,
- PE_IndicatorDockWidgetResizeHandle,
- PE_IndicatorHeaderArrow,
- PE_IndicatorMenuCheckMark,
- PE_IndicatorProgressChunk,
- PE_IndicatorRadioButton,
- PE_IndicatorSpinDown,
- PE_IndicatorSpinMinus,
- PE_IndicatorSpinPlus,
- PE_IndicatorSpinUp,
- PE_IndicatorToolBarHandle,
- PE_IndicatorToolBarSeparator,
- PE_PanelTipLabel,
- PE_IndicatorTabTear,
- PE_IndicatorTabTearLeft = PE_IndicatorTabTear,
- PE_PanelScrollAreaCorner,
-
- PE_Widget,
-
- PE_IndicatorColumnViewArrow,
- PE_IndicatorItemViewItemDrop,
-
- PE_PanelItemViewItem,
- PE_PanelItemViewRow, // ### Qt 6: remove
-
- PE_PanelStatusBar,
-
- PE_IndicatorTabClose,
- PE_PanelMenu,
-
- PE_IndicatorTabTearRight,
-
- // do not add any values below/greater this
- PE_CustomBase = 0xf000000
- };
- Q_ENUM(PrimitiveElement)
-
- enum ControlElement {
- CE_PushButton,
- CE_PushButtonBevel,
- CE_PushButtonLabel,
-
- CE_CheckBox,
- CE_CheckBoxLabel,
-
- CE_RadioButton,
- CE_RadioButtonLabel,
-
- CE_TabBarTab,
- CE_TabBarTabShape,
- CE_TabBarTabLabel,
-
- CE_ProgressBar,
- CE_ProgressBarGroove,
- CE_ProgressBarContents,
- CE_ProgressBarLabel,
-
- CE_MenuItem,
- CE_MenuScroller,
- CE_MenuVMargin,
- CE_MenuHMargin,
- CE_MenuTearoff,
- CE_MenuEmptyArea,
-
- CE_MenuBarItem,
- CE_MenuBarEmptyArea,
-
- CE_ToolButtonLabel,
-
- CE_Header,
- CE_HeaderSection,
- CE_HeaderLabel,
-
- CE_ToolBoxTab,
- CE_SizeGrip,
- CE_Splitter,
- CE_RubberBand,
- CE_DockWidgetTitle,
-
- CE_ScrollBarAddLine,
- CE_ScrollBarSubLine,
- CE_ScrollBarAddPage,
- CE_ScrollBarSubPage,
- CE_ScrollBarSlider,
- CE_ScrollBarFirst,
- CE_ScrollBarLast,
-
- CE_FocusFrame,
- CE_ComboBoxLabel,
-
- CE_ToolBar,
- CE_ToolBoxTabShape,
- CE_ToolBoxTabLabel,
- CE_HeaderEmptyArea,
-
- CE_ColumnViewGrip,
-
- CE_ItemViewItem,
-
- CE_ShapedFrame,
-
- // do not add any values below/greater than this
- CE_CustomBase = 0xf0000000
- };
- Q_ENUM(ControlElement)
-
- enum SubElement {
- SE_PushButtonContents,
- SE_PushButtonFocusRect,
-
- SE_CheckBoxIndicator,
- SE_CheckBoxContents,
- SE_CheckBoxFocusRect,
- SE_CheckBoxClickRect,
-
- SE_RadioButtonIndicator,
- SE_RadioButtonContents,
- SE_RadioButtonFocusRect,
- SE_RadioButtonClickRect,
-
- SE_ComboBoxFocusRect,
-
- SE_SliderFocusRect,
-
- SE_ProgressBarGroove,
- SE_ProgressBarContents,
- SE_ProgressBarLabel,
-
- SE_ToolBoxTabContents,
-
- SE_HeaderLabel,
- SE_HeaderArrow,
-
- SE_TabWidgetTabBar,
- SE_TabWidgetTabPane,
- SE_TabWidgetTabContents,
- SE_TabWidgetLeftCorner,
- SE_TabWidgetRightCorner,
-
- SE_ItemViewItemCheckIndicator,
- SE_TabBarTearIndicator,
- SE_TabBarTearIndicatorLeft = SE_TabBarTearIndicator,
-
- SE_TreeViewDisclosureItem,
-
- SE_LineEditContents,
- SE_FrameContents,
-
- SE_DockWidgetCloseButton,
- SE_DockWidgetFloatButton,
- SE_DockWidgetTitleBarText,
- SE_DockWidgetIcon,
-
- SE_CheckBoxLayoutItem,
- SE_ComboBoxLayoutItem,
- SE_DateTimeEditLayoutItem,
- SE_LabelLayoutItem,
- SE_ProgressBarLayoutItem,
- SE_PushButtonLayoutItem,
- SE_RadioButtonLayoutItem,
- SE_SliderLayoutItem,
- SE_ScrollBarLayoutItem,
- SE_SpinBoxLayoutItem,
- SE_ToolButtonLayoutItem,
-
- SE_FrameLayoutItem,
- SE_GroupBoxLayoutItem,
- SE_TabWidgetLayoutItem,
-
- SE_ItemViewItemDecoration,
- SE_ItemViewItemText,
- SE_ItemViewItemFocusRect,
-
- SE_TabBarTabLeftButton,
- SE_TabBarTabRightButton,
- SE_TabBarTabText,
-
- SE_ShapedFrameContents,
-
- SE_ToolBarHandle,
-
- SE_TabBarScrollLeftButton,
- SE_TabBarScrollRightButton,
- SE_TabBarTearIndicatorRight,
-
- // do not add any values below/greater than this
- SE_CustomBase = 0xf0000000
- };
- Q_ENUM(SubElement)
-
- enum ComplexControl {
- CC_SpinBox,
- CC_ComboBox,
- CC_ScrollBar,
- CC_Slider,
- CC_ToolButton,
- CC_TitleBar,
- CC_Dial,
- CC_GroupBox,
- CC_MdiControls,
-
- // do not add any values below/greater than this
- CC_CustomBase = 0xf0000000
- };
- Q_ENUM(ComplexControl)
-
- enum SubControl {
- SC_None = 0x00000000,
-
- SC_ScrollBarAddLine = 0x00000001,
- SC_ScrollBarSubLine = 0x00000002,
- SC_ScrollBarAddPage = 0x00000004,
- SC_ScrollBarSubPage = 0x00000008,
- SC_ScrollBarFirst = 0x00000010,
- SC_ScrollBarLast = 0x00000020,
- SC_ScrollBarSlider = 0x00000040,
- SC_ScrollBarGroove = 0x00000080,
-
- SC_SpinBoxUp = 0x00000001,
- SC_SpinBoxDown = 0x00000002,
- SC_SpinBoxFrame = 0x00000004,
- SC_SpinBoxEditField = 0x00000008,
-
- SC_ComboBoxFrame = 0x00000001,
- SC_ComboBoxEditField = 0x00000002,
- SC_ComboBoxArrow = 0x00000004,
- SC_ComboBoxListBoxPopup = 0x00000008,
-
- SC_SliderGroove = 0x00000001,
- SC_SliderHandle = 0x00000002,
- SC_SliderTickmarks = 0x00000004,
-
- SC_ToolButton = 0x00000001,
- SC_ToolButtonMenu = 0x00000002,
-
- SC_TitleBarSysMenu = 0x00000001,
- SC_TitleBarMinButton = 0x00000002,
- SC_TitleBarMaxButton = 0x00000004,
- SC_TitleBarCloseButton = 0x00000008,
- SC_TitleBarNormalButton = 0x00000010,
- SC_TitleBarShadeButton = 0x00000020,
- SC_TitleBarUnshadeButton = 0x00000040,
- SC_TitleBarContextHelpButton = 0x00000080,
- SC_TitleBarLabel = 0x00000100,
-
- SC_DialGroove = 0x00000001,
- SC_DialHandle = 0x00000002,
- SC_DialTickmarks = 0x00000004,
-
- SC_GroupBoxCheckBox = 0x00000001,
- SC_GroupBoxLabel = 0x00000002,
- SC_GroupBoxContents = 0x00000004,
- SC_GroupBoxFrame = 0x00000008,
-
- SC_MdiMinButton = 0x00000001,
- SC_MdiNormalButton = 0x00000002,
- SC_MdiCloseButton = 0x00000004,
-
- SC_CustomBase = 0xf0000000,
- SC_All = 0xffffffff
- };
- Q_ENUM(SubControl)
- Q_DECLARE_FLAGS(SubControls, SubControl)
-
- enum PixelMetric {
- PM_ButtonMargin,
- PM_ButtonDefaultIndicator,
- PM_MenuButtonIndicator,
- PM_ButtonShiftHorizontal,
- PM_ButtonShiftVertical,
-
- PM_DefaultFrameWidth,
- PM_SpinBoxFrameWidth,
- PM_ComboBoxFrameWidth,
-
- PM_MaximumDragDistance,
-
- PM_ScrollBarExtent,
- PM_ScrollBarSliderMin,
-
- PM_SliderThickness, // total slider thickness
- PM_SliderControlThickness, // thickness of the business part
- PM_SliderLength, // total length of slider
- PM_SliderTickmarkOffset, //
- PM_SliderSpaceAvailable, // available space for slider to move
-
- PM_DockWidgetSeparatorExtent,
- PM_DockWidgetHandleExtent,
- PM_DockWidgetFrameWidth,
-
- PM_TabBarTabOverlap,
- PM_TabBarTabHSpace,
- PM_TabBarTabVSpace,
- PM_TabBarBaseHeight,
- PM_TabBarBaseOverlap,
-
- PM_ProgressBarChunkWidth,
-
- PM_SplitterWidth,
- PM_TitleBarHeight,
-
- PM_MenuScrollerHeight,
- PM_MenuHMargin,
- PM_MenuVMargin,
- PM_MenuPanelWidth,
- PM_MenuTearoffHeight,
- PM_MenuDesktopFrameWidth,
-
- PM_MenuBarPanelWidth,
- PM_MenuBarItemSpacing,
- PM_MenuBarVMargin,
- PM_MenuBarHMargin,
-
- PM_IndicatorWidth,
- PM_IndicatorHeight,
- PM_ExclusiveIndicatorWidth,
- PM_ExclusiveIndicatorHeight,
-
- PM_DialogButtonsSeparator,
- PM_DialogButtonsButtonWidth,
- PM_DialogButtonsButtonHeight,
-
- PM_MdiSubWindowFrameWidth,
- PM_MdiSubWindowMinimizedWidth,
-
- PM_HeaderMargin,
- PM_HeaderMarkSize,
- PM_HeaderGripMargin,
- PM_TabBarTabShiftHorizontal,
- PM_TabBarTabShiftVertical,
- PM_TabBarScrollButtonWidth,
-
- PM_ToolBarFrameWidth,
- PM_ToolBarHandleExtent,
- PM_ToolBarItemSpacing,
- PM_ToolBarItemMargin,
- PM_ToolBarSeparatorExtent,
- PM_ToolBarExtensionExtent,
-
- PM_SpinBoxSliderHeight,
-
- PM_DefaultTopLevelMargin,
- PM_DefaultChildMargin,
- PM_DefaultLayoutSpacing,
-
- PM_ToolBarIconSize,
- PM_ListViewIconSize,
- PM_IconViewIconSize,
- PM_SmallIconSize,
- PM_LargeIconSize,
-
- PM_FocusFrameVMargin,
- PM_FocusFrameHMargin,
-
- PM_ToolTipLabelFrameWidth,
- PM_CheckBoxLabelSpacing,
- PM_TabBarIconSize,
- PM_SizeGripSize,
- PM_DockWidgetTitleMargin,
- PM_MessageBoxIconSize,
- PM_ButtonIconSize,
-
- PM_DockWidgetTitleBarButtonMargin,
-
- PM_RadioButtonLabelSpacing,
- PM_LayoutLeftMargin,
- PM_LayoutTopMargin,
- PM_LayoutRightMargin,
- PM_LayoutBottomMargin,
- PM_LayoutHorizontalSpacing,
- PM_LayoutVerticalSpacing,
- PM_TabBar_ScrollButtonOverlap,
-
- PM_TextCursorWidth,
-
- PM_TabCloseIndicatorWidth,
- PM_TabCloseIndicatorHeight,
-
- PM_ScrollView_ScrollBarSpacing,
- PM_ScrollView_ScrollBarOverlap,
- PM_SubMenuOverlap,
- PM_TreeViewIndentation,
-
- PM_HeaderDefaultSectionSizeHorizontal,
- PM_HeaderDefaultSectionSizeVertical,
-
- 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
- };
- Q_ENUM(PixelMetric)
-
- enum ContentsType {
- CT_PushButton,
- CT_CheckBox,
- CT_RadioButton,
- CT_ToolButton,
- CT_ComboBox,
- CT_Splitter,
- CT_ProgressBar,
- CT_MenuItem,
- CT_MenuBarItem,
- CT_MenuBar,
- CT_Menu,
- CT_TabBarTab,
- CT_Slider,
- CT_Dial,
- CT_ScrollBar,
- CT_LineEdit,
- CT_SpinBox,
- CT_SizeGrip,
- CT_TabWidget,
- CT_DialogButtons,
- CT_HeaderSection,
- CT_GroupBox,
- CT_MdiControls,
- CT_ItemViewItem,
- CT_Frame,
- // do not add any values below/greater than this
- CT_CustomBase = 0xf0000000
- };
- Q_ENUM(ContentsType)
-
- enum RequestSoftwareInputPanel {
- RSIP_OnMouseClickAndAlreadyFocused,
- RSIP_OnMouseClick
- };
- Q_ENUM(RequestSoftwareInputPanel)
-
- enum StyleHint {
- SH_EtchDisabledText,
- SH_DitherDisabledText,
- SH_ScrollBar_MiddleClickAbsolutePosition,
- SH_ScrollBar_ScrollWhenPointerLeavesControl,
- SH_TabBar_SelectMouseType,
- SH_TabBar_Alignment,
- SH_Header_ArrowAlignment,
- SH_Slider_SnapToValue,
- SH_Slider_SloppyKeyEvents,
- SH_ProgressDialog_CenterCancelButton,
- SH_ProgressDialog_TextLabelAlignment,
- SH_PrintDialog_RightAlignButtons,
- SH_MainWindow_SpaceBelowMenuBar,
- SH_FontDialog_SelectAssociatedText,
- SH_Menu_AllowActiveAndDisabled,
- SH_Menu_SpaceActivatesItem,
- SH_Menu_SubMenuPopupDelay,
- SH_ScrollView_FrameOnlyAroundContents,
- SH_MenuBar_AltKeyNavigation,
- SH_ComboBox_ListMouseTracking,
- SH_Menu_MouseTracking,
- SH_MenuBar_MouseTracking,
- SH_ItemView_ChangeHighlightOnFocus,
- SH_Widget_ShareActivation,
- SH_Workspace_FillSpaceOnMaximize,
- SH_ComboBox_Popup,
- SH_TitleBar_NoBorder,
- SH_Slider_StopMouseOverSlider,
- SH_BlinkCursorWhenTextSelected,
- SH_RichText_FullWidthSelection,
- SH_Menu_Scrollable,
- SH_GroupBox_TextLabelVerticalAlignment,
- SH_GroupBox_TextLabelColor,
- SH_Menu_SloppySubMenus,
- SH_Table_GridLineColor,
- SH_LineEdit_PasswordCharacter,
- SH_DialogButtons_DefaultButton,
- SH_ToolBox_SelectedPageTitleBold,
- SH_TabBar_PreferNoArrows,
- SH_ScrollBar_LeftClickAbsolutePosition,
- SH_ListViewExpand_SelectMouseType,
- SH_UnderlineShortcut,
- SH_SpinBox_AnimateButton,
- SH_SpinBox_KeyPressAutoRepeatRate,
- SH_SpinBox_ClickAutoRepeatRate,
- SH_Menu_FillScreenWithScroll,
- SH_ToolTipLabel_Opacity,
- SH_DrawMenuBarSeparator,
- SH_TitleBar_ModifyNotification,
- SH_Button_FocusPolicy,
- SH_MessageBox_UseBorderForButtonSpacing,
- SH_TitleBar_AutoRaise,
- SH_ToolButton_PopupDelay,
- SH_FocusFrame_Mask,
- SH_RubberBand_Mask,
- SH_WindowFrame_Mask,
- SH_SpinControls_DisableOnBounds,
- SH_Dial_BackgroundRole,
- SH_ComboBox_LayoutDirection,
- SH_ItemView_EllipsisLocation,
- SH_ItemView_ShowDecorationSelected,
- SH_ItemView_ActivateItemOnSingleClick,
- SH_ScrollBar_ContextMenu,
- SH_ScrollBar_RollBetweenButtons,
- SH_Slider_AbsoluteSetButtons,
- SH_Slider_PageSetButtons,
- SH_Menu_KeyboardSearch,
- SH_TabBar_ElideMode,
- SH_DialogButtonLayout,
- SH_ComboBox_PopupFrameStyle,
- SH_MessageBox_TextInteractionFlags,
- SH_DialogButtonBox_ButtonsHaveIcons,
- SH_SpellCheckUnderlineStyle,
- SH_MessageBox_CenterButtons,
- SH_Menu_SelectionWrap,
- SH_ItemView_MovementWithoutUpdatingSelection,
- SH_ToolTip_Mask,
- SH_FocusFrame_AboveWidget,
- SH_TextControl_FocusIndicatorTextCharFormat,
- SH_WizardStyle,
- SH_ItemView_ArrowKeysNavigateIntoChildren,
- SH_Menu_Mask,
- SH_Menu_FlashTriggeredItem,
- SH_Menu_FadeOutOnHide,
- SH_SpinBox_ClickAutoRepeatThreshold,
- SH_ItemView_PaintAlternatingRowColorsForEmptyArea,
- SH_FormLayoutWrapPolicy,
- SH_TabWidget_DefaultTabPosition,
- SH_ToolBar_Movable,
- SH_FormLayoutFieldGrowthPolicy,
- SH_FormLayoutFormAlignment,
- SH_FormLayoutLabelAlignment,
- SH_ItemView_DrawDelegateFrame,
- SH_TabBar_CloseButtonPosition,
- SH_DockWidget_ButtonsHaveFrame,
- SH_ToolButtonStyle,
- SH_RequestSoftwareInputPanel,
- SH_ScrollBar_Transient,
- SH_Menu_SupportsSections,
- SH_ToolTip_WakeUpDelay,
- SH_ToolTip_FallAsleepDelay,
- SH_Widget_Animate,
- SH_Splitter_OpaqueResize,
- // Whether we should use a native popup.
- // Only supported for non-editable combo boxes on Mac OS X so far.
- SH_ComboBox_UseNativePopup,
- SH_LineEdit_PasswordMaskDelay,
- SH_TabBar_ChangeCurrentDelay,
- SH_Menu_SubMenuUniDirection,
- SH_Menu_SubMenuUniDirectionFailCount,
- SH_Menu_SubMenuSloppySelectOtherActions,
- SH_Menu_SubMenuSloppyCloseTimeout,
- SH_Menu_SubMenuResetWhenReenteringParent,
- SH_Menu_SubMenuDontStartSloppyOnLeave,
- SH_ItemView_ScrollMode,
- SH_TitleBar_ShowToolTipsOnButtons,
- SH_Widget_Animation_Duration,
- SH_ComboBox_AllowWheelScrolling,
- SH_SpinBox_ButtonsInsideFrame,
- SH_SpinBox_StepModifier,
- // Add new style hint values here
-
- SH_CustomBase = 0xf0000000
- };
- Q_ENUM(StyleHint)
-
- enum StandardPixmap {
- SP_TitleBarMenuButton,
- SP_TitleBarMinButton,
- SP_TitleBarMaxButton,
- SP_TitleBarCloseButton,
- SP_TitleBarNormalButton,
- SP_TitleBarShadeButton,
- SP_TitleBarUnshadeButton,
- SP_TitleBarContextHelpButton,
- SP_DockWidgetCloseButton,
- SP_MessageBoxInformation,
- SP_MessageBoxWarning,
- SP_MessageBoxCritical,
- SP_MessageBoxQuestion,
- SP_DesktopIcon,
- SP_TrashIcon,
- SP_ComputerIcon,
- SP_DriveFDIcon,
- SP_DriveHDIcon,
- SP_DriveCDIcon,
- SP_DriveDVDIcon,
- SP_DriveNetIcon,
- SP_DirOpenIcon,
- SP_DirClosedIcon,
- SP_DirLinkIcon,
- SP_DirLinkOpenIcon,
- SP_FileIcon,
- SP_FileLinkIcon,
- SP_ToolBarHorizontalExtensionButton,
- SP_ToolBarVerticalExtensionButton,
- SP_FileDialogStart,
- SP_FileDialogEnd,
- SP_FileDialogToParent,
- SP_FileDialogNewFolder,
- SP_FileDialogDetailedView,
- SP_FileDialogInfoView,
- SP_FileDialogContentsView,
- SP_FileDialogListView,
- SP_FileDialogBack,
- SP_DirIcon,
- SP_DialogOkButton,
- SP_DialogCancelButton,
- SP_DialogHelpButton,
- SP_DialogOpenButton,
- SP_DialogSaveButton,
- SP_DialogCloseButton,
- SP_DialogApplyButton,
- SP_DialogResetButton,
- SP_DialogDiscardButton,
- SP_DialogYesButton,
- SP_DialogNoButton,
- SP_ArrowUp,
- SP_ArrowDown,
- SP_ArrowLeft,
- SP_ArrowRight,
- SP_ArrowBack,
- SP_ArrowForward,
- SP_DirHomeIcon,
- SP_CommandLink,
- SP_VistaShield,
- SP_BrowserReload,
- SP_BrowserStop,
- SP_MediaPlay,
- SP_MediaStop,
- SP_MediaPause,
- SP_MediaSkipForward,
- SP_MediaSkipBackward,
- SP_MediaSeekForward,
- SP_MediaSeekBackward,
- SP_MediaVolume,
- SP_MediaVolumeMuted,
- SP_LineEditClearButton,
- SP_DialogYesToAllButton,
- SP_DialogNoToAllButton,
- SP_DialogSaveAllButton,
- SP_DialogAbortButton,
- SP_DialogRetryButton,
- SP_DialogIgnoreButton,
- SP_RestoreDefaultsButton,
- // do not add any values below/greater than this
- SP_CustomBase = 0xf0000000
- };
- Q_ENUM(StandardPixmap)
-
- virtual QRect itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const;
- virtual QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const;
- virtual QRect subElementRect(SubElement subElement, const QStyleOption *option) const = 0;
- virtual QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc) const = 0;
-
- virtual QSize sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &contentsSize) const = 0;
- virtual QFont font(ControlElement element, const QStyle::State state) const = 0;
- virtual QMargins ninePatchMargins(ControlElement ce, const QStyleOption *opt, const QSize &imageSize) const = 0;
- virtual QMargins ninePatchMargins(ComplexControl cc, const QStyleOptionComplex *opt, const QSize &imageSize) const = 0;
-
- virtual SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, const QPoint &pt) const = 0;
-
- virtual int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr) const = 0;
- virtual int styleHint(StyleHint stylehint, const QStyleOption *opt = nullptr, QStyleHintReturn* returnData = nullptr) const = 0;
-
- virtual void drawItemText(QPainter *painter, const QRect &rect,
- int flags, const QPalette &pal, bool enabled,
- const QString &text, QPalette::ColorRole textRole = QPalette::NoRole) const;
- virtual void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const;
- virtual void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const = 0;
- virtual void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p) const = 0;
- virtual void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const = 0;
-
- virtual QPalette standardPalette() const;
- virtual QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt = nullptr) const = 0;
- virtual QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr) const = 0;
- virtual QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const = 0;
-
- static QRect visualRect(Qt::LayoutDirection direction, const QRect &boundingRect, const QRect &logicalRect);
- static QPoint visualPos(Qt::LayoutDirection direction, const QRect &boundingRect, const QPoint &logicalPos);
- static int sliderPositionFromValue(int min, int max, int val, int space, bool upsideDown = false);
- static int sliderValueFromPosition(int min, int max, int pos, int space, bool upsideDown = false);
- static Qt::Alignment visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment);
- static QRect alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment, const QSize &size, const QRect &rectangle);
-
- // TODO: Remove the concept of proxy (but keep it for now until everything builds)
- const QStyle *proxy() const { return this; }
-
-private:
- Q_DISABLE_COPY(QStyle)
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyle::State)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyle::SubControls)
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QSTYLE_H
diff --git a/src/quicknativestyle/qstyle/qquickstyle_p.h b/src/quicknativestyle/qstyle/qquickstyle_p.h
deleted file mode 100644
index 46f53740..00000000
--- a/src/quicknativestyle/qstyle/qquickstyle_p.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTYLE_P_H
-#define QSTYLE_P_H
-
-#include "qquickstyle.h"
-
-#include <QtCore/private/qobject_p.h>
-#include <QtGui/qguiapplication.h>
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qstyle_*.cpp. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-// Private class
-
-namespace QQC2 {
-
-class QStylePrivate: public QObjectPrivate
-{
- Q_DECLARE_PUBLIC(QStyle)
-
-public:
- static bool useFullScreenForPopup();
- mutable int layoutSpacingIndex = -1;
- QStyle *proxyStyle;
-};
-
-inline QImage styleCacheImage(const QSize &size)
-{
- const qreal pixelRatio = qApp->devicePixelRatio();
- QImage cacheImage = QImage(size * pixelRatio, QImage::Format_ARGB32_Premultiplied);
- cacheImage.setDevicePixelRatio(pixelRatio);
- return cacheImage;
-}
-
-inline QPixmap styleCachePixmap(const QSize &size)
-{
- const qreal pixelRatio = qApp->devicePixelRatio();
- QPixmap cachePixmap = QPixmap(size * pixelRatio);
- cachePixmap.setDevicePixelRatio(pixelRatio);
- return cachePixmap;
-}
-
-#define BEGIN_STYLE_PIXMAPCACHE(a) \
- QRect rect = option->rect; \
- QPixmap internalPixmapCache; \
- QImage imageCache; \
- QPainter *p = painter; \
- QString unique = QStyleHelper::uniqueName((a), option, option->rect.size()); \
- int txType = painter->deviceTransform().type() | painter->worldTransform().type(); \
- bool doPixmapCache = (!option->rect.isEmpty()) \
- && ((txType <= QTransform::TxTranslate) || (painter->deviceTransform().type() == QTransform::TxScale)); \
- if (doPixmapCache && QPixmapCache::find(unique, &internalPixmapCache)) { \
- painter->drawPixmap(option->rect.topLeft(), internalPixmapCache); \
- } else { \
- if (doPixmapCache) { \
- rect.setRect(0, 0, option->rect.width(), option->rect.height()); \
- imageCache = styleCacheImage(option->rect.size()); \
- imageCache.fill(0); \
- p = new QPainter(&imageCache); \
- }
-
-#define END_STYLE_PIXMAPCACHE \
- if (doPixmapCache) { \
- p->end(); \
- delete p; \
- internalPixmapCache = QPixmap::fromImage(imageCache); \
- painter->drawPixmap(option->rect.topLeft(), internalPixmapCache); \
- QPixmapCache::insert(unique, internalPixmapCache); \
- } \
- }
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif //QSTYLE_P_H
diff --git a/src/quicknativestyle/qstyle/qquickstylehelper.cpp b/src/quicknativestyle/qstyle/qquickstylehelper.cpp
deleted file mode 100644
index ebc82864..00000000
--- a/src/quicknativestyle/qstyle/qquickstylehelper.cpp
+++ /dev/null
@@ -1,438 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstylehelper_p.h"
-#include "qquickstyleoption.h"
-#include "qquickstyle_p.h"
-
-#include <QtCore/qmath.h>
-#include <QtGui/qpainter.h>
-#include <QtGui/qpixmapcache.h>
-#include <QtGui/qwindow.h>
-#include <QtGui/private/qhighdpiscaling_p.h>
-#include <QtGui/private/qguiapplication_p.h>
-#include <QtGui/private/qmath_p.h>
-#include <QtGui/private/qhexstring_p.h>
-
-#include <qmetaobject.h>
-#include <qstringbuilder.h>
-
-QT_BEGIN_NAMESPACE
-
-Q_GUI_EXPORT int qt_defaultDpiX();
-
-namespace QQC2 {
-
-namespace QStyleHelper {
-
-QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size)
-{
- const QStyleOptionComplex *complexOption = qstyleoption_cast<const QStyleOptionComplex *>(option);
- QString tmp = key % HexString<uint>(option->state)
- % HexString<uint>(option->direction)
- % HexString<uint>(complexOption ? uint(complexOption->activeSubControls) : 0u)
- % HexString<quint64>(option->palette.cacheKey())
- % HexString<uint>(size.width())
- % HexString<uint>(size.height());
-
- if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
- tmp = tmp % HexString<uint>(spinBox->buttonSymbols)
- % HexString<uint>(spinBox->stepEnabled)
- % QLatin1Char(spinBox->frame ? '1' : '0'); ;
- }
-
- return tmp;
-}
-
-#ifdef Q_OS_DARWIN
-static const qreal qstyleBaseDpi = 72;
-#else
-static const qreal qstyleBaseDpi = 96;
-#endif
-
-qreal dpi(const QStyleOption *option)
-{
-#ifndef Q_OS_DARWIN
- // Prioritize the application override, except for on macOS where
- // we have historically not supported the AA_Use96Dpi flag.
- if (QCoreApplication::testAttribute(Qt::AA_Use96Dpi))
- return 96;
-#endif
-
- // Expect that QStyleOption::QFontMetrics::QFont has the correct DPI set
- if (option)
- return option->fontMetrics.fontDpi();
-
- return qstyleBaseDpi;
-}
-
-qreal dpiScaled(qreal value, qreal dpi)
-{
- return value * dpi / qstyleBaseDpi;
-}
-
-qreal dpiScaled(qreal value, const QPaintDevice *device)
-{
- return dpiScaled(value, device->logicalDpiX());
-}
-
-qreal dpiScaled(qreal value, const QStyleOption *option)
-{
- return dpiScaled(value, dpi(option));
-}
-
-bool isInstanceOf(QObject *obj, QAccessible::Role role)
-{
- bool match = false;
- QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(obj);
- match = iface && iface->role() == role;
- return match;
-}
-
-// Searches for an ancestor of a particular accessible role
-bool hasAncestor(QObject *obj, QAccessible::Role role)
-{
- bool found = false;
- QObject *parent = obj ? obj->parent() : nullptr;
- while (parent && !found) {
- if (isInstanceOf(parent, role))
- found = true;
- parent = parent->parent();
- }
- return found;
-}
-
-
-int calcBigLineSize(int radius)
-{
- int bigLineSize = radius / 6;
- if (bigLineSize < 4)
- bigLineSize = 4;
- if (bigLineSize > radius / 2)
- bigLineSize = radius / 2;
- return bigLineSize;
-}
-
-static QPointF calcRadialPos(const QStyleOptionSlider *dial, qreal offset)
-{
- const int width = dial->rect.width();
- const int height = dial->rect.height();
- const int r = qMin(width, height) / 2;
- const int currentSliderPosition = dial->upsideDown ? dial->sliderPosition : (dial->maximum - dial->sliderPosition);
- qreal a = 0;
- if (dial->maximum == dial->minimum)
- a = Q_PI / 2;
- else if (dial->dialWrapping)
- a = Q_PI * 3 / 2 - (currentSliderPosition - dial->minimum) * 2 * Q_PI
- / (dial->maximum - dial->minimum);
- else
- a = (Q_PI * 8 - (currentSliderPosition - dial->minimum) * 10 * Q_PI
- / (dial->maximum - dial->minimum)) / 6;
- qreal xc = width / 2.0;
- qreal yc = height / 2.0;
- qreal len = r - QStyleHelper::calcBigLineSize(r) - 3;
- qreal back = offset * len;
- QPointF pos(QPointF(xc + back * qCos(a), yc - back * qSin(a)));
- return pos;
-}
-
-qreal angle(const QPointF &p1, const QPointF &p2)
-{
- static const qreal rad_factor = 180 / Q_PI;
- qreal _angle = 0;
-
- if (p1.x() == p2.x()) {
- if (p1.y() < p2.y())
- _angle = 270;
- else
- _angle = 90;
- } else {
- qreal x1, x2, y1, y2;
-
- if (p1.x() <= p2.x()) {
- x1 = p1.x(); y1 = p1.y();
- x2 = p2.x(); y2 = p2.y();
- } else {
- x2 = p1.x(); y2 = p1.y();
- x1 = p2.x(); y1 = p2.y();
- }
-
- qreal m = -(y2 - y1) / (x2 - x1);
- _angle = qAtan(m) * rad_factor;
-
- if (p1.x() < p2.x())
- _angle = 180 - _angle;
- else
- _angle = -_angle;
- }
- return _angle;
-}
-
-QPolygonF calcLines(const QStyleOptionSlider *dial)
-{
- QPolygonF poly;
- int width = dial->rect.width();
- int height = dial->rect.height();
- qreal r = qMin(width, height) / 2;
- int bigLineSize = calcBigLineSize(int(r));
-
- qreal xc = width / 2 + 0.5;
- qreal yc = height / 2 + 0.5;
- const int ns = dial->tickInterval;
- if (!ns) // Invalid values may be set by Qt Designer.
- return poly;
- int notches = (dial->maximum + ns - 1 - dial->minimum) / ns;
- if (notches <= 0)
- return poly;
- if (dial->maximum < dial->minimum || dial->maximum - dial->minimum > 1000) {
- int maximum = dial->minimum + 1000;
- notches = (maximum + ns - 1 - dial->minimum) / ns;
- }
-
- poly.resize(2 + 2 * notches);
- int smallLineSize = bigLineSize / 2;
- for (int i = 0; i <= notches; ++i) {
- qreal angle = dial->dialWrapping ? Q_PI * 3 / 2 - i * 2 * Q_PI / notches
- : (Q_PI * 8 - i * 10 * Q_PI / notches) / 6;
- qreal s = qSin(angle);
- qreal c = qCos(angle);
- if (i == 0 || (((ns * i) % (dial->pageStep ? dial->pageStep : 1)) == 0)) {
- poly[2 * i] = QPointF(xc + (r - bigLineSize) * c,
- yc - (r - bigLineSize) * s);
- poly[2 * i + 1] = QPointF(xc + r * c, yc - r * s);
- } else {
- poly[2 * i] = QPointF(xc + (r - 1 - smallLineSize) * c,
- yc - (r - 1 - smallLineSize) * s);
- poly[2 * i + 1] = QPointF(xc + (r - 1) * c, yc -(r - 1) * s);
- }
- }
- return poly;
-}
-
-// This will draw a nice and shiny QDial for us. We don't want
-// all the shinyness in QWindowsStyle, hence we place it here
-
-void drawDial(const QStyleOptionSlider *option, QPainter *painter)
-{
- QPalette pal = option->palette;
- QColor buttonColor = pal.button().color();
- const int width = option->rect.width();
- const int height = option->rect.height();
- const bool enabled = option->state & QStyle::State_Enabled;
- qreal r = qMin(width, height) / 2;
- r -= r/50;
- const qreal penSize = r/20.0;
-
- painter->save();
- painter->setRenderHint(QPainter::Antialiasing);
-
- // Draw notches
- if (option->subControls & QStyle::SC_DialTickmarks) {
- painter->setPen(option->palette.dark().color().darker(120));
- painter->drawLines(QStyleHelper::calcLines(option));
- }
-
- // setting color before BEGIN_STYLE_PIXMAPCACHE since
- // otherwise it is not set when the image is in the cache
- buttonColor.setHsv(buttonColor .hue(),
- qMin(140, buttonColor .saturation()),
- qMax(180, buttonColor.value()));
-
- // Cache dial background
- BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("qdial"))
- p->setRenderHint(QPainter::Antialiasing);
-
- const qreal d_ = r / 6;
- const qreal dx = option->rect.x() + d_ + (width - 2 * r) / 2 + 1;
- const qreal dy = option->rect.y() + d_ + (height - 2 * r) / 2 + 1;
-
- QRectF br = QRectF(dx + 0.5, dy + 0.5,
- int(r * 2 - 2 * d_ - 2),
- int(r * 2 - 2 * d_ - 2));
-
- if (enabled) {
- // Drop shadow
- qreal shadowSize = qMax(1.0, penSize/2.0);
- QRectF shadowRect= br.adjusted(-2*shadowSize, -2*shadowSize,
- 2*shadowSize, 2*shadowSize);
- QRadialGradient shadowGradient(shadowRect.center().x(),
- shadowRect.center().y(), shadowRect.width()/2.0,
- shadowRect.center().x(), shadowRect.center().y());
- shadowGradient.setColorAt(qreal(0.91), QColor(0, 0, 0, 40));
- shadowGradient.setColorAt(qreal(1.0), Qt::transparent);
- p->setBrush(shadowGradient);
- p->setPen(Qt::NoPen);
- p->translate(shadowSize, shadowSize);
- p->drawEllipse(shadowRect);
- p->translate(-shadowSize, -shadowSize);
-
- // Main gradient
- QRadialGradient gradient(br.center().x() - br.width()/3, dy,
- br.width()*1.3, br.center().x(),
- br.center().y() - br.height()/2);
- gradient.setColorAt(0, buttonColor.lighter(110));
- gradient.setColorAt(qreal(0.5), buttonColor);
- gradient.setColorAt(qreal(0.501), buttonColor.darker(102));
- gradient.setColorAt(1, buttonColor.darker(115));
- p->setBrush(gradient);
- } else {
- p->setBrush(Qt::NoBrush);
- }
-
- p->setPen(QPen(buttonColor.darker(280)));
- p->drawEllipse(br);
- p->setBrush(Qt::NoBrush);
- p->setPen(buttonColor.lighter(110));
- p->drawEllipse(br.adjusted(1, 1, -1, -1));
-
- if (option->state & QStyle::State_HasFocus) {
- QColor highlight = pal.highlight().color();
- highlight.setHsv(highlight.hue(),
- qMin(160, highlight.saturation()),
- qMax(230, highlight.value()));
- highlight.setAlpha(127);
- p->setPen(QPen(highlight, 2.0));
- p->setBrush(Qt::NoBrush);
- p->drawEllipse(br.adjusted(-1, -1, 1, 1));
- }
-
- END_STYLE_PIXMAPCACHE
-
- QPointF dp = calcRadialPos(option, qreal(0.70));
- buttonColor = buttonColor.lighter(104);
- buttonColor.setAlphaF(0.8f);
- const qreal ds = r/qreal(7.0);
- QRectF dialRect(dp.x() - ds, dp.y() - ds, 2*ds, 2*ds);
- QRadialGradient dialGradient(dialRect.center().x() + dialRect.width()/2,
- dialRect.center().y() + dialRect.width(),
- dialRect.width()*2,
- dialRect.center().x(), dialRect.center().y());
- dialGradient.setColorAt(1, buttonColor.darker(140));
- dialGradient.setColorAt(qreal(0.4), buttonColor.darker(120));
- dialGradient.setColorAt(0, buttonColor.darker(110));
- if (penSize > 3.0) {
- painter->setPen(QPen(QColor(0, 0, 0, 25), penSize));
- painter->drawLine(calcRadialPos(option, qreal(0.90)), calcRadialPos(option, qreal(0.96)));
- }
-
- painter->setBrush(dialGradient);
- painter->setPen(QColor(255, 255, 255, 150));
- painter->drawEllipse(dialRect.adjusted(-1, -1, 1, 1));
- painter->setPen(QColor(0, 0, 0, 80));
- painter->drawEllipse(dialRect);
- painter->restore();
-}
-
-void drawBorderPixmap(const QPixmap &pixmap, QPainter *painter, const QRect &rect,
- int left, int top, int right,
- int bottom)
-{
- QSize size = pixmap.size();
- //painter->setRenderHint(QPainter::SmoothPixmapTransform);
-
- //top
- if (top > 0) {
- painter->drawPixmap(QRect(rect.left() + left, rect.top(), rect.width() -right - left, top), pixmap,
- QRect(left, 0, size.width() -right - left, top));
-
- //top-left
- if(left > 0)
- painter->drawPixmap(QRect(rect.left(), rect.top(), left, top), pixmap,
- QRect(0, 0, left, top));
-
- //top-right
- if (right > 0)
- painter->drawPixmap(QRect(rect.left() + rect.width() - right, rect.top(), right, top), pixmap,
- QRect(size.width() - right, 0, right, top));
- }
-
- //left
- if (left > 0)
- painter->drawPixmap(QRect(rect.left(), rect.top()+top, left, rect.height() - top - bottom), pixmap,
- QRect(0, top, left, size.height() - bottom - top));
-
- //center
- painter->drawPixmap(QRect(rect.left() + left, rect.top()+top, rect.width() -right - left,
- rect.height() - bottom - top), pixmap,
- QRect(left, top, size.width() -right -left,
- size.height() - bottom - top));
- //right
- if (right > 0)
- painter->drawPixmap(QRect(rect.left() +rect.width() - right, rect.top()+top, right, rect.height() - top - bottom), pixmap,
- QRect(size.width() - right, top, right, size.height() - bottom - top));
-
- //bottom
- if (bottom > 0) {
- painter->drawPixmap(QRect(rect.left() +left, rect.top() + rect.height() - bottom,
- rect.width() - right - left, bottom), pixmap,
- QRect(left, size.height() - bottom,
- size.width() - right - left, bottom));
- //bottom-left
- if (left > 0)
- painter->drawPixmap(QRect(rect.left(), rect.top() + rect.height() - bottom, left, bottom), pixmap,
- QRect(0, size.height() - bottom, left, bottom));
-
- //bottom-right
- if (right > 0)
- painter->drawPixmap(QRect(rect.left() + rect.width() - right, rect.top() + rect.height() - bottom, right, bottom), pixmap,
- QRect(size.width() - right, size.height() - bottom, right, bottom));
-
- }
-}
-
-WidgetSizePolicy widgetSizePolicy(const QStyleOption *opt)
-{
- if (opt && opt->state & QStyle::State_Mini)
- return SizeMini;
- else if (opt && opt->state & QStyle::State_Small)
- return SizeSmall;
-
- return SizeDefault;
-}
-
-QColor backgroundColor(const QPalette &pal)
-{
-// if (qobject_cast<const QScrollBar *>(widget) && widget->parent() &&
-// qobject_cast<const QAbstractScrollArea *>(widget->parent()->parent()))
-// return widget->parentWidget()->parentWidget()->palette().color(QPalette::Base);
- return pal.color(QPalette::Base);
-}
-
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/qquickstylehelper_p.h b/src/quicknativestyle/qstyle/qquickstylehelper_p.h
deleted file mode 100644
index 757d647d..00000000
--- a/src/quicknativestyle/qstyle/qquickstylehelper_p.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qpoint.h>
-#include <QtCore/qstring.h>
-#include <QtGui/qpaintdevice.h>
-#include <QtGui/qpolygon.h>
-#include <QtCore/qstringbuilder.h>
-#include <QtGui/qaccessible.h>
-
-#ifndef QSTYLEHELPER_P_H
-#define QSTYLEHELPER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-QT_BEGIN_NAMESPACE
-
-class QObject;
-class QPainter;
-class QPixmap;
-
-namespace QQC2 {
-
-class QStyleOptionSlider;
-class QStyleOption;
-
-namespace QStyleHelper
-{
- QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size);
-
- qreal dpi(const QStyleOption *option);
- qreal dpiScaled(qreal value, qreal dpi);
- qreal dpiScaled(qreal value, const QPaintDevice *device);
- qreal dpiScaled(qreal value, const QStyleOption *option);
-
- qreal angle(const QPointF &p1, const QPointF &p2);
- QPolygonF calcLines(const QStyleOptionSlider *dial);
- int calcBigLineSize(int radius);
- void drawDial(const QStyleOptionSlider *dial, QPainter *painter);
-
- void drawBorderPixmap(const QPixmap &pixmap, QPainter *painter, const QRect &rect,
- int left = 0, int top = 0, int right = 0,
- int bottom = 0);
-
- bool isInstanceOf(QObject *obj, QAccessible::Role role);
- bool hasAncestor(QObject *obj, QAccessible::Role role);
- QColor backgroundColor(const QPalette &pal);
-
- enum WidgetSizePolicy { SizeLarge = 0, SizeSmall = 1, SizeMini = 2, SizeDefault = -1 };
- WidgetSizePolicy widgetSizePolicy(const QStyleOption *opt);
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QSTYLEHELPER_P_H
diff --git a/src/quicknativestyle/qstyle/qquickstyleoption.cpp b/src/quicknativestyle/qstyle/qquickstyleoption.cpp
deleted file mode 100644
index c34dddd7..00000000
--- a/src/quicknativestyle/qstyle/qquickstyleoption.cpp
+++ /dev/null
@@ -1,652 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickstyleoption.h"
-
-#include <QtGui/private/qguiapplication_p.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qmath.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-QStyleOption::QStyleOption(int version, int type)
- : version(version), type(type), state(QStyle::State_None),
- direction(QGuiApplication::layoutDirection()), fontMetrics(QFont()),
- styleObject(nullptr), control(nullptr), window(nullptr)
-{
-}
-
-/*!
- Destroys this style option object.
-*/
-QStyleOption::~QStyleOption()
-{
-}
-
-/*!
- Constructs a copy of \a other.
-*/
-QStyleOption::QStyleOption(const QStyleOption &other)
- : version(Version), type(Type), state(other.state),
- direction(other.direction), rect(other.rect), fontMetrics(other.fontMetrics),
- palette(other.palette), styleObject(other.styleObject),
- control(other.control), window(other.window)
-{
-}
-
-/*!
- Assign \a other to this QStyleOption.
-*/
-QStyleOption &QStyleOption::operator=(const QStyleOption &other)
-{
- control = other.control;
- window = other.window;
- state = other.state;
- direction = other.direction;
- rect = other.rect;
- fontMetrics = other.fontMetrics;
- palette = other.palette;
- styleObject = other.styleObject;
- return *this;
-}
-
-/*!
- Constructs a QStyleOptionFocusRect, initializing the members
- variables to their default values.
-*/
-QStyleOptionFocusRect::QStyleOptionFocusRect()
- : QStyleOption(Version, SO_FocusRect)
-{
- state |= QStyle::State_KeyboardFocusChange; // assume we had one, will be corrected in initFrom()
-}
-
-/*!
- \internal
-*/
-QStyleOptionFocusRect::QStyleOptionFocusRect(int versionIn)
- : QStyleOption(versionIn, SO_FocusRect)
-{
- state |= QStyle::State_KeyboardFocusChange; // assume we had one, will be corrected in initFrom()
-}
-
-/*!
- Constructs a QStyleOptionFrame, initializing the members
- variables to their default values.
-*/
-QStyleOptionFrame::QStyleOptionFrame()
- : QStyleOption(Version, SO_Frame), lineWidth(0), midLineWidth(0),
- features(None), frameShape(NoFrame)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionFrame::QStyleOptionFrame(int versionIn)
- : QStyleOption(versionIn, SO_Frame), lineWidth(0), midLineWidth(0),
- features(None)
-{
-}
-
-/*!
- Constructs a QStyleOptionGroupBox, initializing the members
- variables to their default values.
-*/
-QStyleOptionGroupBox::QStyleOptionGroupBox()
- : QStyleOptionComplex(Version, Type), features(QStyleOptionFrame::None),
- textAlignment(Qt::AlignLeft), lineWidth(0), midLineWidth(0)
-{
-}
-
-QStyleOptionGroupBox::QStyleOptionGroupBox(int versionIn)
- : QStyleOptionComplex(versionIn, Type), features(QStyleOptionFrame::None),
- textAlignment(Qt::AlignLeft), lineWidth(0), midLineWidth(0)
-{
-}
-
-/*!
- Constructs a QStyleOptionHeader, initializing the members
- variables to their default values.
-*/
-QStyleOptionHeader::QStyleOptionHeader()
- : QStyleOption(QStyleOptionHeader::Version, SO_Header),
- section(0), textAlignment(Qt::AlignLeft), iconAlignment(Qt::AlignLeft),
- position(QStyleOptionHeader::Beginning),
- selectedPosition(QStyleOptionHeader::NotAdjacent), sortIndicator(None),
- orientation(Qt::Horizontal)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionHeader::QStyleOptionHeader(int versionIn)
- : QStyleOption(versionIn, SO_Header),
- section(0), textAlignment(Qt::AlignLeft), iconAlignment(Qt::AlignLeft),
- position(QStyleOptionHeader::Beginning),
- selectedPosition(QStyleOptionHeader::NotAdjacent), sortIndicator(None),
- orientation(Qt::Horizontal)
-{
-}
-
-/*!
- Constructs a QStyleOptionButton, initializing the members
- variables to their default values.
-*/
-QStyleOptionButton::QStyleOptionButton()
- : QStyleOption(QStyleOptionButton::Version, SO_Button), features(None)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionButton::QStyleOptionButton(int versionIn)
- : QStyleOption(versionIn, SO_Button), features(None)
-{
-}
-
-/*!
- Constructs a QStyleOptionToolBar, initializing the members
- variables to their default values.
-*/
-QStyleOptionToolBar::QStyleOptionToolBar()
- : QStyleOption(Version, SO_ToolBar), positionOfLine(OnlyOne), positionWithinLine(OnlyOne),
- toolBarArea(Qt::TopToolBarArea), features(None), lineWidth(0), midLineWidth(0)
-{
-}
-
-/*!
- \fn QStyleOptionToolBar::QStyleOptionToolBar(const QStyleOptionToolBar &other)
-
- Constructs a copy of the \a other style option.
-*/
-QStyleOptionToolBar::QStyleOptionToolBar(int versionIn)
-: QStyleOption(versionIn, SO_ToolBar), positionOfLine(OnlyOne), positionWithinLine(OnlyOne),
- toolBarArea(Qt::TopToolBarArea), features(None), lineWidth(0), midLineWidth(0)
-{
-
-}
-
-/*!
- Constructs a QStyleOptionTab object, initializing the members
- variables to their default values.
-*/
-QStyleOptionTab::QStyleOptionTab()
- : QStyleOption(QStyleOptionTab::Version, SO_Tab),
- row(0),
- position(Beginning),
- selectedPosition(NotAdjacent), cornerWidgets(QStyleOptionTab::NoCornerWidgets),
- documentMode(false),
- features(QStyleOptionTab::None)
-{
-}
-
-QStyleOptionTab::QStyleOptionTab(int versionIn)
- : QStyleOption(versionIn, SO_Tab),
- row(0),
- position(Beginning),
- selectedPosition(NotAdjacent), cornerWidgets(QStyleOptionTab::NoCornerWidgets),
- documentMode(false),
- features(QStyleOptionTab::None)
-{
-}
-
-/*!
- Constructs a QStyleOptionTabV4 object, initializing the members
- variables to their default values.
- */
-QStyleOptionTabV4::QStyleOptionTabV4() : QStyleOptionTab(QStyleOptionTabV4::Version)
-{
-}
-
-/*!
- Constructs a QStyleOptionProgressBar, initializing the members
- variables to their default values.
-*/
-QStyleOptionProgressBar::QStyleOptionProgressBar()
- : QStyleOption(QStyleOptionProgressBar::Version, SO_ProgressBar),
- minimum(0), maximum(0), progress(0), textAlignment(Qt::AlignLeft), textVisible(false),
- invertedAppearance(false), bottomToTop(false)
-{
-}
-
-QStyleOptionProgressBar::QStyleOptionProgressBar(int versionIn)
- : QStyleOption(versionIn, SO_ProgressBar),
- minimum(0), maximum(0), progress(0), textAlignment(Qt::AlignLeft), textVisible(false),
- invertedAppearance(false), bottomToTop(false)
-{
-}
-
-/*!
- Constructs a QStyleOptionMenuItem, initializing the members
- variables to their default values.
-*/
-QStyleOptionMenuItem::QStyleOptionMenuItem()
- : QStyleOption(QStyleOptionMenuItem::Version, SO_MenuItem), menuItemType(Normal),
- checkType(NotCheckable), checked(false), menuHasCheckableItems(true), maxIconWidth(0), tabWidth(0)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionMenuItem::QStyleOptionMenuItem(int versionIn)
- : QStyleOption(versionIn, SO_MenuItem), menuItemType(Normal),
- checkType(NotCheckable), checked(false), menuHasCheckableItems(true), maxIconWidth(0), tabWidth(0)
-{
-}
-
-/*!
- Constructs a QStyleOptionComplex of the specified \a type and \a
- version, initializing the member variables to their default
- values. This constructor is usually called by subclasses.
-*/
-QStyleOptionComplex::QStyleOptionComplex(int versionIn, int typeIn)
- : QStyleOption(versionIn, typeIn), subControls(QStyle::SC_All), activeSubControls(QStyle::SC_None)
-{
-}
-
-
-/*!
- Constructs a QStyleOptionSlider, initializing the members
- variables to their default values.
-*/
-QStyleOptionSlider::QStyleOptionSlider()
- : QStyleOptionComplex(Version, SO_Slider), orientation(Qt::Horizontal), minimum(0), maximum(0),
- tickPosition(NoTicks), tickInterval(0), upsideDown(false),
- sliderPosition(0), sliderValue(0), singleStep(0), pageStep(0), notchTarget(0.0),
- dialWrapping(false)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionSlider::QStyleOptionSlider(int versionIn)
- : QStyleOptionComplex(versionIn, SO_Slider), orientation(Qt::Horizontal), minimum(0), maximum(0),
- tickPosition(NoTicks), tickInterval(0), upsideDown(false),
- sliderPosition(0), sliderValue(0), singleStep(0), pageStep(0), notchTarget(0.0),
- dialWrapping(false)
-{
-}
-
-/*!
- Constructs a QStyleOptionSpinBox, initializing the members
- variables to their default values.
-*/
-QStyleOptionSpinBox::QStyleOptionSpinBox()
- : QStyleOptionComplex(Version, SO_SpinBox), buttonSymbols(UpDownArrows),
- stepEnabled(StepNone), frame(false)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionSpinBox::QStyleOptionSpinBox(int versionIn)
- : QStyleOptionComplex(versionIn, SO_SpinBox), buttonSymbols(UpDownArrows),
- stepEnabled(StepNone), frame(false)
-{
-}
-
-/*!
- Constructs a QStyleOptionDockWidget, initializing the member
- variables to their default values.
-*/
-QStyleOptionDockWidget::QStyleOptionDockWidget()
- : QStyleOption(Version, SO_DockWidget), closable(false),
- movable(false), floatable(false), verticalTitleBar(false)
-{
-}
-
-/*!
- \internal
-*/
-QStyleOptionDockWidget::QStyleOptionDockWidget(int versionIn)
- : QStyleOption(versionIn, SO_DockWidget), closable(false),
- movable(false), floatable(false), verticalTitleBar(false)
-{
-}
-
-/*!
- Constructs a QStyleOptionToolButton, initializing the members
- variables to their default values.
-*/
-QStyleOptionToolButton::QStyleOptionToolButton()
- : QStyleOptionComplex(Version, SO_ToolButton), features(None), arrowType(Qt::DownArrow)
- , toolButtonStyle(Qt::ToolButtonIconOnly)
-{
-}
-
-QStyleOptionToolButton::QStyleOptionToolButton(int versionIn)
- : QStyleOptionComplex(versionIn, SO_ToolButton), features(None), arrowType(Qt::DownArrow)
- , toolButtonStyle(Qt::ToolButtonIconOnly)
-
-{
-}
-
-/*!
- Creates a QStyleOptionComboBox, initializing the members variables
- to their default values.
-*/
-QStyleOptionComboBox::QStyleOptionComboBox()
- : QStyleOptionComplex(Version, SO_ComboBox), editable(false), frame(true)
-{
-}
-
-QStyleOptionComboBox::QStyleOptionComboBox(int versionIn)
- : QStyleOptionComplex(versionIn, SO_ComboBox), editable(false), frame(true)
-{
-}
-
-/*!
- Creates a QStyleOptionToolBox, initializing the members variables
- to their default values.
-*/
-QStyleOptionToolBox::QStyleOptionToolBox()
- : QStyleOption(Version, SO_ToolBox), position(Beginning), selectedPosition(NotAdjacent)
-{
-}
-
-QStyleOptionToolBox::QStyleOptionToolBox(int versionIn)
- : QStyleOption(versionIn, SO_ToolBox), position(Beginning), selectedPosition(NotAdjacent)
-{
-}
-
-
-/*!
- Creates a QStyleOptionRubberBand, initializing the members
- variables to their default values.
-*/
-QStyleOptionRubberBand::QStyleOptionRubberBand()
- : QStyleOption(Version, SO_RubberBand), opaque(false), shape(Line)
-{
-}
-
-QStyleOptionRubberBand::QStyleOptionRubberBand(int versionIn)
- : QStyleOption(versionIn, SO_RubberBand), opaque(false)
-{
-}
-
-/*!
- Constructs a QStyleOptionTitleBar, initializing the members
- variables to their default values.
-*/
-QStyleOptionTitleBar::QStyleOptionTitleBar()
- : QStyleOptionComplex(Version, SO_TitleBar), titleBarState(0)
-{
-}
-
-QStyleOptionTitleBar::QStyleOptionTitleBar(int versionIn)
- : QStyleOptionComplex(versionIn, SO_TitleBar), titleBarState(0)
-{
-}
-
-/*!
- Constructs a QStyleOptionViewItem, initializing the members
- variables to their default values.
-*/
-QStyleOptionViewItem::QStyleOptionViewItem()
- : QStyleOption(Version, SO_ViewItem),
- displayAlignment(Qt::AlignLeft), decorationAlignment(Qt::AlignLeft),
- textElideMode(Qt::ElideMiddle), decorationPosition(Left),
- showDecorationSelected(false), features(None),
- checkState(Qt::Unchecked), viewItemPosition(QStyleOptionViewItem::Invalid)
-{
-}
-
-QStyleOptionViewItem::QStyleOptionViewItem(int versionIn)
- : QStyleOption(versionIn, SO_ViewItem),
- displayAlignment(Qt::AlignLeft), decorationAlignment(Qt::AlignLeft),
- textElideMode(Qt::ElideMiddle), decorationPosition(Left),
- showDecorationSelected(false), features(None),
- checkState(Qt::Unchecked), viewItemPosition(QStyleOptionViewItem::Invalid)
-{
-}
-
-/*!
- Constructs a QStyleOptionTabWidgetFrame, initializing the members
- variables to their default values.
-*/
-QStyleOptionTabWidgetFrame::QStyleOptionTabWidgetFrame()
- : QStyleOption(Version, SO_TabWidgetFrame), lineWidth(0), midLineWidth(0), shape(QStyleOptionTab::RoundedNorth)
-{
-}
-
-QStyleOptionTabWidgetFrame::QStyleOptionTabWidgetFrame(int versionIn)
- : QStyleOption(versionIn, SO_TabWidgetFrame), lineWidth(0), midLineWidth(0)
-{
-}
-
-/*!
- Construct a QStyleOptionTabBarBase, initializing the members
- vaiables to their default values.
-*/
-QStyleOptionTabBarBase::QStyleOptionTabBarBase()
- : QStyleOption(Version, SO_TabBarBase), documentMode(false), shape(QStyleOptionTab::RoundedNorth)
-{
-}
-
-QStyleOptionTabBarBase::QStyleOptionTabBarBase(int versionIn)
- : QStyleOption(versionIn, SO_TabBarBase), documentMode(false)
-{
-}
-
-/*!
- Constructs a QStyleOptionSizeGrip.
-*/
-QStyleOptionSizeGrip::QStyleOptionSizeGrip()
- : QStyleOptionComplex(Version, Type), corner(Qt::BottomRightCorner)
-{
-}
-
-QStyleOptionSizeGrip::QStyleOptionSizeGrip(int versionIn)
- : QStyleOptionComplex(versionIn, Type), corner(Qt::BottomRightCorner)
-{
-}
-
-/*!
- Constructs a QStyleOptionGraphicsItem.
-*/
-QStyleOptionGraphicsItem::QStyleOptionGraphicsItem()
- : QStyleOption(Version, Type), levelOfDetail(1)
-{
-}
-
-QStyleOptionGraphicsItem::QStyleOptionGraphicsItem(int versionIn)
- : QStyleOption(versionIn, Type), levelOfDetail(1)
-{
-}
-
-/*!
- \since 4.6
-
- Returns the level of detail from the \a worldTransform.
-
- Its value represents the maximum value of the height and
- width of a unity rectangle, mapped using the \a worldTransform
- of the painter used to draw the item. By default, if no
- transformations are applied, its value is 1. If zoomed out 1:2, the level
- of detail will be 0.5, and if zoomed in 2:1, its value is 2.
-
- \sa QGraphicsScene::minimumRenderSize()
-*/
-qreal QStyleOptionGraphicsItem::levelOfDetailFromTransform(const QTransform &worldTransform)
-{
- if (worldTransform.type() <= QTransform::TxTranslate)
- return 1; // Translation only? The LOD is 1.
-
- // Two unit vectors.
- QLineF v1(0, 0, 1, 0);
- QLineF v2(0, 0, 0, 1);
- // LOD is the transformed area of a 1x1 rectangle.
- return qSqrt(worldTransform.map(v1).length() * worldTransform.map(v2).length());
-}
-
-/*!
- Constructs a QStyleHintReturn with version \a version and type \a
- type.
-
- The version has no special meaning for QStyleHintReturn; it can be
- used by subclasses to distinguish between different version of
- the same hint type.
-
- \sa QStyleOption::version, QStyleOption::type
-*/
-QStyleHintReturn::QStyleHintReturn(int versionIn, int type)
- : version(versionIn), type(type)
-{
-}
-
-/*!
- \internal
-*/
-
-QStyleHintReturn::~QStyleHintReturn()
-{
-}
-
-/*!
- Constructs a QStyleHintReturnMask. The member variables are
- initialized to default values.
-*/
-QStyleHintReturnMask::QStyleHintReturnMask() : QStyleHintReturn(Version, Type)
-{
-}
-
-QStyleHintReturnMask::~QStyleHintReturnMask()
-{
-}
-
-/*!
- Constructs a QStyleHintReturnVariant. The member variables are
- initialized to default values.
-*/
-QStyleHintReturnVariant::QStyleHintReturnVariant() : QStyleHintReturn(Version, Type)
-{
-}
-
-QStyleHintReturnVariant::~QStyleHintReturnVariant()
-{
-}
-
-#if !defined(QT_NO_DEBUG_STREAM)
-QDebug operator<<(QDebug debug, const QStyleOption::OptionType &optionType)
-{
-#if !defined(QT_NO_DEBUG)
- switch (optionType) {
- case QStyleOption::SO_Default:
- debug << "SO_Default"; break;
- case QStyleOption::SO_FocusRect:
- debug << "SO_FocusRect"; break;
- case QStyleOption::SO_Button:
- debug << "SO_Button"; break;
- case QStyleOption::SO_Tab:
- debug << "SO_Tab"; break;
- case QStyleOption::SO_MenuItem:
- debug << "SO_MenuItem"; break;
- case QStyleOption::SO_Frame:
- debug << "SO_Frame"; break;
- case QStyleOption::SO_ProgressBar:
- debug << "SO_ProgressBar"; break;
- case QStyleOption::SO_ToolBox:
- debug << "SO_ToolBox"; break;
- case QStyleOption::SO_Header:
- debug << "SO_Header"; break;
- case QStyleOption::SO_DockWidget:
- debug << "SO_DockWidget"; break;
- case QStyleOption::SO_ViewItem:
- debug << "SO_ViewItem"; break;
- case QStyleOption::SO_TabWidgetFrame:
- debug << "SO_TabWidgetFrame"; break;
- case QStyleOption::SO_TabBarBase:
- debug << "SO_TabBarBase"; break;
- case QStyleOption::SO_RubberBand:
- debug << "SO_RubberBand"; break;
- case QStyleOption::SO_Complex:
- debug << "SO_Complex"; break;
- case QStyleOption::SO_Slider:
- debug << "SO_Slider"; break;
- case QStyleOption::SO_SpinBox:
- debug << "SO_SpinBox"; break;
- case QStyleOption::SO_ToolButton:
- debug << "SO_ToolButton"; break;
- case QStyleOption::SO_ComboBox:
- debug << "SO_ComboBox"; break;
- case QStyleOption::SO_TitleBar:
- debug << "SO_TitleBar"; break;
- case QStyleOption::SO_CustomBase:
- debug << "SO_CustomBase"; break;
- case QStyleOption::SO_GroupBox:
- debug << "SO_GroupBox"; break;
- case QStyleOption::SO_ToolBar:
- debug << "SO_ToolBar"; break;
- case QStyleOption::SO_ComplexCustomBase:
- debug << "SO_ComplexCustomBase"; break;
- case QStyleOption::SO_SizeGrip:
- debug << "SO_SizeGrip"; break;
- case QStyleOption::SO_GraphicsItem:
- debug << "SO_GraphicsItem"; break;
- }
-#else
- Q_UNUSED(optionType);
-#endif
- return debug;
-}
-
-QDebug operator<<(QDebug debug, const QStyleOption &option)
-{
-#if !defined(QT_NO_DEBUG)
- debug << "QStyleOption(";
- debug << QStyleOption::OptionType(option.type);
- debug << ',' << (option.direction == Qt::RightToLeft ? "RightToLeft" : "LeftToRight");
- debug << ',' << option.state;
- debug << ',' << option.rect;
- debug << ',' << option.styleObject;
- debug << ')';
-#else
- Q_UNUSED(option);
-#endif
- return debug;
-}
-#endif
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/qquickstyleoption.h b/src/quicknativestyle/qstyle/qquickstyleoption.h
deleted file mode 100644
index 05c9ce57..00000000
--- a/src/quicknativestyle/qstyle/qquickstyleoption.h
+++ /dev/null
@@ -1,795 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTYLEOPTION_H
-#define QSTYLEOPTION_H
-
-#include "qquickstyle.h"
-
-#include <QtCore/qlocale.h>
-#include <QtCore/qvariant.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qabstractitemmodel.h>
-
-#include <QtGui/qicon.h>
-#include <QtGui/qfontmetrics.h>
-
-QT_BEGIN_NAMESPACE
-
-class QQuickItem;
-
-namespace QQC2 {
-
-class QStyleOption
-{
-public:
- enum OptionType {
- SO_Default, SO_FocusRect, SO_Button, SO_Tab, SO_MenuItem,
- SO_Frame, SO_ProgressBar, SO_ToolBox, SO_Header,
- SO_DockWidget, SO_ViewItem, SO_TabWidgetFrame,
- SO_TabBarBase, SO_RubberBand, SO_ToolBar, SO_GraphicsItem,
-
- SO_Complex = 0xf0000, SO_Slider, SO_SpinBox, SO_ToolButton, SO_ComboBox,
- SO_TitleBar, SO_GroupBox, SO_SizeGrip,
-
- SO_CustomBase = 0xf00,
- SO_ComplexCustomBase = 0xf000000
- };
- Q_ENUMS(OptionType)
-
- enum StyleOptionType { Type = SO_Default };
- enum StyleOptionVersion { Version = 1 };
-
- int version; // TODO: Remove version information
- int type;
- QStyle::State state;
- Qt::LayoutDirection direction;
- QRect rect;
- QFontMetrics fontMetrics;
- QPalette palette;
- QObject *styleObject;
-
- // QQC2 additions. Remember to also update copy
- // constructor and assignment operator when adding
- // new variables here.
- QQuickItem *control;
- QWindow *window;
-
- QStyleOption(int version = QStyleOption::Version, int type = SO_Default);
- QStyleOption(const QStyleOption &other);
- ~QStyleOption();
-
- QStyleOption &operator=(const QStyleOption &other);
-};
-
-class QStyleOptionFocusRect : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_FocusRect };
- enum StyleOptionVersion { Version = 1 };
-
- QColor backgroundColor;
-
- QStyleOptionFocusRect();
- QStyleOptionFocusRect(const QStyleOptionFocusRect &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionFocusRect &operator=(const QStyleOptionFocusRect &) = default;
-
-protected:
- QStyleOptionFocusRect(int version);
-};
-
-class QStyleOptionFrame : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_Frame };
- enum StyleOptionVersion { Version = 3 };
- enum FrameFeature {
- None = 0x00,
- Flat = 0x01,
- Rounded = 0x02
- };
- Q_DECLARE_FLAGS(FrameFeatures, FrameFeature)
- enum Shape {
- NoFrame = 0, // no frame
- Box = 0x0001, // rectangular box
- Panel = 0x0002, // rectangular panel
- WinPanel = 0x0003, // rectangular panel (Windows)
- HLine = 0x0004, // horizontal line
- VLine = 0x0005, // vertical line
- StyledPanel = 0x0006 // rectangular panel depending on the GUI style
- };
- enum Shadow {
- Plain = 0x0010, // plain line
- Raised = 0x0020, // raised shadow effect
- Sunken = 0x0030 // sunken shadow effect
- };
-
- int lineWidth;
- int midLineWidth;
- FrameFeatures features;
- Shape frameShape;
-
- QStyleOptionFrame();
- QStyleOptionFrame(const QStyleOptionFrame &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionFrame &operator=(const QStyleOptionFrame &) = default;
-
-protected:
- QStyleOptionFrame(int version);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionFrame::FrameFeatures)
-
-Q_DECL_DEPRECATED typedef QStyleOptionFrame QStyleOptionFrameV2;
-Q_DECL_DEPRECATED typedef QStyleOptionFrame QStyleOptionFrameV3;
-
-class QStyleOptionTab : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_Tab };
- enum StyleOptionVersion { Version = 3 };
-
- enum TabPosition { Beginning, Middle, End, OnlyOneTab };
- enum SelectedPosition { NotAdjacent, NextIsSelected, PreviousIsSelected };
- enum CornerWidget { NoCornerWidgets = 0x00, LeftCornerWidget = 0x01,
- RightCornerWidget = 0x02 };
- enum TabFeature { None = 0x00, HasFrame = 0x01 };
- enum Shape { RoundedNorth, RoundedSouth, RoundedWest, RoundedEast,
- TriangularNorth, TriangularSouth, TriangularWest, TriangularEast
- };
- Q_DECLARE_FLAGS(CornerWidgets, CornerWidget)
- Q_DECLARE_FLAGS(TabFeatures, TabFeature)
-
- QString text;
- QIcon icon;
- int row;
- TabPosition position;
- Shape shape = RoundedNorth;
- SelectedPosition selectedPosition;
- CornerWidgets cornerWidgets;
- QSize iconSize;
- bool documentMode;
- QSize leftButtonSize;
- QSize rightButtonSize;
- TabFeatures features;
-
- QStyleOptionTab();
- QStyleOptionTab(const QStyleOptionTab &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionTab &operator=(const QStyleOptionTab &) = default;
-
-protected:
- QStyleOptionTab(int version);
-};
-
-class QStyleOptionTabWidgetFrame : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_TabWidgetFrame };
- enum StyleOptionVersion { Version = 2 };
-
- int lineWidth;
- int midLineWidth;
- QStyleOptionTab::Shape shape;
- QSize tabBarSize;
- QSize rightCornerWidgetSize;
- QSize leftCornerWidgetSize;
- QRect tabBarRect;
- QRect selectedTabRect;
-
- QStyleOptionTabWidgetFrame();
- inline QStyleOptionTabWidgetFrame(const QStyleOptionTabWidgetFrame &other)
- : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionTabWidgetFrame &operator=(const QStyleOptionTabWidgetFrame &) = default;
-
-protected:
- QStyleOptionTabWidgetFrame(int version);
-};
-
-Q_DECL_DEPRECATED typedef QStyleOptionTabWidgetFrame QStyleOptionTabWidgetFrameV2;
-
-
-class QStyleOptionTabBarBase : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_TabBarBase };
-
- enum TabBarPosition { North, South, West, East };
- enum ButtonPosition { LeftSide, RightSide };
-
- QRect tabBarRect;
- QRect selectedTabRect;
- bool documentMode;
- QStyleOptionTab::Shape shape;
-
- QStyleOptionTabBarBase();
- QStyleOptionTabBarBase(const QStyleOptionTabBarBase &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionTabBarBase &operator=(const QStyleOptionTabBarBase &) = default;
-
-protected:
- QStyleOptionTabBarBase(int version);
-};
-
-class QStyleOptionHeader : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_Header };
- enum StyleOptionVersion { Version = 1 };
- enum SectionPosition { Beginning, Middle, End, OnlyOneSection };
- enum SelectedPosition { NotAdjacent, NextIsSelected, PreviousIsSelected,
- NextAndPreviousAreSelected };
- enum SortIndicator { None, SortUp, SortDown };
-
- int section;
- QString text;
- Qt::Alignment textAlignment;
- QIcon icon;
- Qt::Alignment iconAlignment;
- SectionPosition position;
- SelectedPosition selectedPosition;
- SortIndicator sortIndicator;
- Qt::Orientation orientation;
-
- QStyleOptionHeader();
- QStyleOptionHeader(const QStyleOptionHeader &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionHeader &operator=(const QStyleOptionHeader &) = default;
-
-protected:
- QStyleOptionHeader(int version);
-};
-
-class QStyleOptionButton : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_Button };
- enum StyleOptionVersion { Version = 1 };
-
- enum ButtonFeature { None = 0x00, Flat = 0x01, HasMenu = 0x02, DefaultButton = 0x04,
- AutoDefaultButton = 0x08, CommandLinkButton = 0x10 };
- Q_DECLARE_FLAGS(ButtonFeatures, ButtonFeature)
-
- ButtonFeatures features;
- QString text;
- QIcon icon;
- QSize iconSize;
-
- QStyleOptionButton();
- QStyleOptionButton(const QStyleOptionButton &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionButton &operator=(const QStyleOptionButton &) = default;
-
-protected:
- QStyleOptionButton(int version);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionButton::ButtonFeatures)
-
-class QStyleOptionTabV4 : public QStyleOptionTab
-{
-public:
- enum StyleOptionVersion { Version = 4 };
- QStyleOptionTabV4();
- int tabIndex = -1;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionTab::CornerWidgets)
-
-Q_DECL_DEPRECATED typedef QStyleOptionTab QStyleOptionTabV2;
-Q_DECL_DEPRECATED typedef QStyleOptionTab QStyleOptionTabV3;
-
-
-class QStyleOptionToolBar : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_ToolBar };
- enum StyleOptionVersion { Version = 1 };
- enum ToolBarPosition { Beginning, Middle, End, OnlyOne };
- enum ToolBarFeature { None = 0x0, Movable = 0x1 };
- Q_DECLARE_FLAGS(ToolBarFeatures, ToolBarFeature)
-
- ToolBarPosition positionOfLine; // The toolbar line position
- ToolBarPosition positionWithinLine; // The position within a toolbar
- Qt::ToolBarArea toolBarArea; // The toolbar docking area
- ToolBarFeatures features;
- int lineWidth;
- int midLineWidth;
-
- QStyleOptionToolBar();
- QStyleOptionToolBar(const QStyleOptionToolBar &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionToolBar &operator=(const QStyleOptionToolBar &) = default;
-
-protected:
- QStyleOptionToolBar(int version);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionToolBar::ToolBarFeatures)
-
-class QStyleOptionProgressBar : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_ProgressBar };
- enum StyleOptionVersion { Version = 2 };
-
- int minimum;
- int maximum;
- int progress;
- QString text;
- Qt::Alignment textAlignment;
- bool textVisible;
- bool invertedAppearance;
- bool bottomToTop;
-
- QStyleOptionProgressBar();
- QStyleOptionProgressBar(const QStyleOptionProgressBar &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionProgressBar &operator=(const QStyleOptionProgressBar &) = default;
-
-protected:
- QStyleOptionProgressBar(int version);
-};
-
-class QStyleOptionMenuItem : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_MenuItem };
- enum StyleOptionVersion { Version = 1 };
-
- enum MenuItemType { Normal, DefaultItem, Separator, SubMenu, Scroller, TearOff, Margin,
- EmptyArea };
- enum CheckType { NotCheckable, Exclusive, NonExclusive };
-
- MenuItemType menuItemType;
- CheckType checkType;
- bool checked;
- bool menuHasCheckableItems;
- QRect menuRect;
- QString text;
- QIcon icon;
- int maxIconWidth;
- int tabWidth; // ### Qt 6: rename to reservedShortcutWidth
- QFont font;
-
- QStyleOptionMenuItem();
- QStyleOptionMenuItem(const QStyleOptionMenuItem &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionMenuItem &operator=(const QStyleOptionMenuItem &) = default;
-
-protected:
- QStyleOptionMenuItem(int version);
-};
-
-class QStyleOptionDockWidget : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_DockWidget };
- enum StyleOptionVersion { Version = 2 };
-
- QString title;
- bool closable;
- bool movable;
- bool floatable;
- bool verticalTitleBar;
-
- QStyleOptionDockWidget();
- QStyleOptionDockWidget(const QStyleOptionDockWidget &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionDockWidget &operator=(const QStyleOptionDockWidget &) = default;
-
-protected:
- QStyleOptionDockWidget(int version);
-};
-
-Q_DECL_DEPRECATED typedef QStyleOptionDockWidget QStyleOptionDockWidgetV2;
-
-class QStyleOptionViewItem : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_ViewItem };
- enum StyleOptionVersion { Version = 4 };
-
- enum Position { Left, Right, Top, Bottom };
- enum ScrollMode { ScrollPerItem, ScrollPerPixel }; // Doesn't really belong in this class.
-
- Qt::Alignment displayAlignment;
- Qt::Alignment decorationAlignment;
- Qt::TextElideMode textElideMode;
- Position decorationPosition;
- QSize decorationSize;
- QFont font;
- bool showDecorationSelected;
-
- enum ViewItemFeature {
- None = 0x00,
- WrapText = 0x01,
- Alternate = 0x02,
- HasCheckIndicator = 0x04,
- HasDisplay = 0x08,
- HasDecoration = 0x10
- };
- Q_DECLARE_FLAGS(ViewItemFeatures, ViewItemFeature)
-
- ViewItemFeatures features;
-
- QLocale locale;
-
- enum ViewItemPosition { Invalid, Beginning, Middle, End, OnlyOne };
-
- QModelIndex index;
- Qt::CheckState checkState;
- QIcon icon;
- QString text;
- ViewItemPosition viewItemPosition;
- QBrush backgroundBrush;
-
- QStyleOptionViewItem();
- QStyleOptionViewItem(const QStyleOptionViewItem &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionViewItem &operator=(const QStyleOptionViewItem &) = default;
-
-protected:
- QStyleOptionViewItem(int version);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionViewItem::ViewItemFeatures)
-
-Q_DECL_DEPRECATED typedef QStyleOptionViewItem QStyleOptionViewItemV2;
-Q_DECL_DEPRECATED typedef QStyleOptionViewItem QStyleOptionViewItemV3;
-Q_DECL_DEPRECATED typedef QStyleOptionViewItem QStyleOptionViewItemV4;
-
-class QStyleOptionToolBox : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_ToolBox };
- enum StyleOptionVersion { Version = 2 };
-
- QString text;
- QIcon icon;
-
- enum TabPosition { Beginning, Middle, End, OnlyOneTab };
- enum SelectedPosition { NotAdjacent, NextIsSelected, PreviousIsSelected };
-
- TabPosition position;
- SelectedPosition selectedPosition;
-
- QStyleOptionToolBox();
- QStyleOptionToolBox(const QStyleOptionToolBox &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionToolBox &operator=(const QStyleOptionToolBox &) = default;
-
-protected:
- QStyleOptionToolBox(int version);
-};
-
-Q_DECL_DEPRECATED typedef QStyleOptionToolBox QStyleOptionToolBoxV2;
-
-class QStyleOptionRubberBand : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_RubberBand };
- enum StyleOptionVersion { Version = 1 };
- enum Shape { Line, Rectangle };
-
- bool opaque;
- Shape shape;
-
- QStyleOptionRubberBand();
- QStyleOptionRubberBand(const QStyleOptionRubberBand &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionRubberBand &operator=(const QStyleOptionRubberBand &) = default;
-
-protected:
- QStyleOptionRubberBand(int version);
-};
-
-// -------------------------- Complex style options -------------------------------
-class QStyleOptionComplex : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_Complex };
- enum StyleOptionVersion { Version = 1 };
-
- QStyle::SubControls subControls;
- QStyle::SubControls activeSubControls;
-
- QStyleOptionComplex(int version = QStyleOptionComplex::Version, int type = SO_Complex);
- QStyleOptionComplex(const QStyleOptionComplex &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionComplex &operator=(const QStyleOptionComplex &) = default;
-};
-
-class QStyleOptionSlider : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_Slider };
- enum StyleOptionVersion { Version = 1 };
- enum TickPosition {
- NoTicks = 0,
- TicksAbove = 1,
- TicksLeft = TicksAbove,
- TicksBelow = 2,
- TicksRight = TicksBelow,
- TicksBothSides = 3
- };
-
- Qt::Orientation orientation;
- int minimum;
- int maximum;
- TickPosition tickPosition;
- int tickInterval;
- bool upsideDown;
- int sliderPosition;
- int sliderValue;
- int singleStep;
- int pageStep;
- qreal notchTarget;
- bool dialWrapping;
-
- QStyleOptionSlider();
- QStyleOptionSlider(const QStyleOptionSlider &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionSlider &operator=(const QStyleOptionSlider &) = default;
-
-protected:
- QStyleOptionSlider(int version);
-};
-
-class QStyleOptionSpinBox : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_SpinBox };
- enum StyleOptionVersion { Version = 1 };
- enum StepEnabledFlag { StepNone = 0x00, StepUpEnabled = 0x01, StepDownEnabled = 0x02, StepEnabled = 0xFF };
- enum ButtonSymbols { UpDownArrows, PlusMinus, NoButtons };
-
- ButtonSymbols buttonSymbols;
- StepEnabledFlag stepEnabled;
- bool frame;
-
- QStyleOptionSpinBox();
- QStyleOptionSpinBox(const QStyleOptionSpinBox &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionSpinBox &operator=(const QStyleOptionSpinBox &) = default;
-
-protected:
- QStyleOptionSpinBox(int version);
-};
-
-class QStyleOptionToolButton : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_ToolButton };
- enum StyleOptionVersion { Version = 1 };
-
- enum ToolButtonFeature { None = 0x00, Arrow = 0x01, Menu = 0x04, MenuButtonPopup = Menu, PopupDelay = 0x08,
- HasMenu = 0x10 };
- Q_DECLARE_FLAGS(ToolButtonFeatures, ToolButtonFeature)
-
- ToolButtonFeatures features;
- QIcon icon;
- QSize iconSize;
- QString text;
- Qt::ArrowType arrowType;
- Qt::ToolButtonStyle toolButtonStyle;
- QPoint pos;
- QFont font;
-
- QStyleOptionToolButton();
- QStyleOptionToolButton(const QStyleOptionToolButton &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionToolButton &operator=(const QStyleOptionToolButton &) = default;
-
-protected:
- QStyleOptionToolButton(int version);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionToolButton::ToolButtonFeatures)
-
-class QStyleOptionComboBox : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_ComboBox };
- enum StyleOptionVersion { Version = 1 };
-
- bool editable;
- QRect popupRect;
- bool frame;
- QString currentText;
- QIcon currentIcon;
- QSize iconSize;
-
- QStyleOptionComboBox();
- QStyleOptionComboBox(const QStyleOptionComboBox &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionComboBox &operator=(const QStyleOptionComboBox &) = default;
-
-protected:
- QStyleOptionComboBox(int version);
-};
-
-class QStyleOptionTitleBar : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_TitleBar };
- enum StyleOptionVersion { Version = 1 };
-
- QString text;
- QIcon icon;
- int titleBarState;
- Qt::WindowFlags titleBarFlags;
-
- QStyleOptionTitleBar();
- QStyleOptionTitleBar(const QStyleOptionTitleBar &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionTitleBar &operator=(const QStyleOptionTitleBar &) = default;
-
-protected:
- QStyleOptionTitleBar(int version);
-};
-
-class QStyleOptionGroupBox : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_GroupBox };
- enum StyleOptionVersion { Version = 1 };
-
- QStyleOptionFrame::FrameFeatures features;
- QString text;
- Qt::Alignment textAlignment;
- QColor textColor;
- int lineWidth;
- int midLineWidth;
-
- QStyleOptionGroupBox();
- QStyleOptionGroupBox(const QStyleOptionGroupBox &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionGroupBox &operator=(const QStyleOptionGroupBox &) = default;
-protected:
- QStyleOptionGroupBox(int version);
-};
-
-class QStyleOptionSizeGrip : public QStyleOptionComplex
-{
-public:
- enum StyleOptionType { Type = SO_SizeGrip };
- enum StyleOptionVersion { Version = 1 };
-
- Qt::Corner corner;
-
- QStyleOptionSizeGrip();
- QStyleOptionSizeGrip(const QStyleOptionSizeGrip &other) : QStyleOptionComplex(Version, Type) { *this = other; }
- QStyleOptionSizeGrip &operator=(const QStyleOptionSizeGrip &) = default;
-protected:
- QStyleOptionSizeGrip(int version);
-};
-
-class QStyleOptionGraphicsItem : public QStyleOption
-{
-public:
- enum StyleOptionType { Type = SO_GraphicsItem };
- enum StyleOptionVersion { Version = 1 };
-
- QRectF exposedRect;
- qreal levelOfDetail;
-
- QStyleOptionGraphicsItem();
- QStyleOptionGraphicsItem(const QStyleOptionGraphicsItem &other) : QStyleOption(Version, Type) { *this = other; }
- QStyleOptionGraphicsItem &operator=(const QStyleOptionGraphicsItem &) = default;
- static qreal levelOfDetailFromTransform(const QTransform &worldTransform);
-protected:
- QStyleOptionGraphicsItem(int version);
-};
-
-template <typename T>
-T qstyleoption_cast(const QStyleOption *opt)
-{
- typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
- if (opt && opt->version >= Opt::Version && (opt->type == Opt::Type
- || int(Opt::Type) == QStyleOption::SO_Default
- || (int(Opt::Type) == QStyleOption::SO_Complex
- && opt->type > QStyleOption::SO_Complex)))
- return static_cast<T>(opt);
- return nullptr;
-}
-
-template <typename T>
-T qstyleoption_cast(QStyleOption *opt)
-{
- typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
- if (opt && opt->version >= Opt::Version && (opt->type == Opt::Type
- || int(Opt::Type) == QStyleOption::SO_Default
- || (int(Opt::Type) == QStyleOption::SO_Complex
- && opt->type > QStyleOption::SO_Complex)))
- return static_cast<T>(opt);
- return nullptr;
-}
-
-// -------------------------- QStyleHintReturn -------------------------------
-
-class QStyleHintReturn
-{
-public:
- enum HintReturnType {
- SH_Default=0xf000, SH_Mask, SH_Variant
- };
-
- enum StyleOptionType { Type = SH_Default };
- enum StyleOptionVersion { Version = 1 };
-
- QStyleHintReturn(int version = QStyleOption::Version, int type = SH_Default);
- ~QStyleHintReturn();
-
- int version;
- int type;
-};
-
-class QStyleHintReturnMask : public QStyleHintReturn
-{
-public:
- enum StyleOptionType { Type = SH_Mask };
- enum StyleOptionVersion { Version = 1 };
-
- QStyleHintReturnMask();
- ~QStyleHintReturnMask();
-
- QRegion region;
-};
-
-class QStyleHintReturnVariant : public QStyleHintReturn
-{
-public:
- enum StyleOptionType { Type = SH_Variant };
- enum StyleOptionVersion { Version = 1 };
-
- QStyleHintReturnVariant();
- ~QStyleHintReturnVariant();
-
- QVariant variant;
-};
-
-template <typename T>
-T qstyleoption_cast(const QStyleHintReturn *hint)
-{
- typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
- if (hint && hint->version <= Opt::Version &&
- (hint->type == Opt::Type || int(Opt::Type) == QStyleHintReturn::SH_Default))
- return static_cast<T>(hint);
- return nullptr;
-}
-
-template <typename T>
-T qstyleoption_cast(QStyleHintReturn *hint)
-{
- typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Opt;
- if (hint && hint->version <= Opt::Version &&
- (hint->type == Opt::Type || int(Opt::Type) == QStyleHintReturn::SH_Default))
- return static_cast<T>(hint);
- return nullptr;
-}
-
-#if !defined(QT_NO_DEBUG_STREAM)
-QDebug operator<<(QDebug debug, const QStyleOption::OptionType &optionType);
-QDebug operator<<(QDebug debug, const QStyleOption &option);
-#endif
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QSTYLEOPTION_H
diff --git a/src/quicknativestyle/qstyle/qstyle.pri b/src/quicknativestyle/qstyle/qstyle.pri
deleted file mode 100644
index 4d025498..00000000
--- a/src/quicknativestyle/qstyle/qstyle.pri
+++ /dev/null
@@ -1,23 +0,0 @@
-INCLUDEPATH += $$PWD
-
-HEADERS += \
- $$PWD/qquicknativestyle.h \
- $$PWD/qquickcommonstyle.h \
- $$PWD/qquickcommonstyle_p.h \
- $$PWD/qquickcommonstylepixmaps_p.h \
- $$PWD/qquickdrawutil.h \
- $$PWD/qquickstyle.h \
- $$PWD/qquickstyle_p.h \
- $$PWD/qquickstylehelper_p.h \
- $$PWD/qquickstyleoption.h
-
-SOURCES += \
- $$PWD/qquicknativestyle.cpp \
- $$PWD/qquickcommonstyle.cpp \
- $$PWD/qquickdrawutil.cpp \
- $$PWD/qquickstyle.cpp \
- $$PWD/qquickstylehelper.cpp \
- $$PWD/qquickstyleoption.cpp
-
-macos: include(mac/mac.pri)
-win32: include(windows/windows.pri)
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsstyle.cpp b/src/quicknativestyle/qstyle/windows/qquickwindowsstyle.cpp
deleted file mode 100644
index 242b770d..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsstyle.cpp
+++ /dev/null
@@ -1,2388 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickwindowsstyle_p.h"
-#include "qquickwindowsstyle_p_p.h"
-#include "qquickstyleoption.h"
-#include "qquickstylehelper_p.h"
-#include "qquickdrawutil.h"
-
-#include <QtGui/qbitmap.h>
-#include <QtGui/qevent.h>
-#include <QtGui/qpaintengine.h>
-#include <QtGui/qpainter.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qfile.h>
-#include <QtCore/qtextstream.h>
-#include <QtGui/qpixmapcache.h>
-#include <private/qmath_p.h>
-#include <qmath.h>
-#include <QtGui/qpainterpath.h>
-#include <QtGui/qscreen.h>
-#include <QtGui/qwindow.h>
-#include <qpa/qplatformtheme.h>
-#include <qpa/qplatformscreen.h>
-#include <private/qguiapplication_p.h>
-#include <private/qhighdpiscaling_p.h>
-#include <qpa/qplatformnativeinterface.h>
-
-#if 0 && QT_CONFIG(animation)
-//#include <private/qstyleanimation_p.h>
-#endif
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-#if defined(Q_OS_WIN)
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include "qt_windows.h"
-QT_END_INCLUDE_NAMESPACE
-# ifndef COLOR_GRADIENTACTIVECAPTION
-# define COLOR_GRADIENTACTIVECAPTION 27
-# endif
-# ifndef COLOR_GRADIENTINACTIVECAPTION
-# define COLOR_GRADIENTINACTIVECAPTION 28
-# endif
-
-Q_GUI_EXPORT HICON qt_pixmapToWinHICON(const QPixmap &);
-#endif //Q_OS_WIN
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <limits.h>
-QT_END_INCLUDE_NAMESPACE
-
-namespace QQC2 {
-
-enum QSliderDirection { SlUp, SlDown, SlLeft, SlRight };
-
-/*
- \internal
-*/
-
-QWindowsStylePrivate::QWindowsStylePrivate() = default;
-
-qreal QWindowsStylePrivate::appDevicePixelRatio()
-{
- return qApp->devicePixelRatio();
-}
-
-bool QWindowsStylePrivate::isDarkMode()
-{
- bool result = false;
-#ifdef Q_OS_WIN
- // Windows only: Return whether dark mode style support is desired and
- // dark mode is in effect.
- if (auto ni = QGuiApplication::platformNativeInterface()) {
- const QVariant darkModeStyleP = ni->property("darkModeStyle");
- result = darkModeStyleP.metaType().id() == QMetaType::Bool
- && darkModeStyleP.value<bool>()
- && ni->property("darkMode").value<bool>();
- }
-#endif
- return result;
-}
-
-// ###TODO SH_UnderlineShortcut
-#if 0
-// Returns \c true if the toplevel parent of \a widget has seen the Alt-key
-bool QWindowsStylePrivate::hasSeenAlt(const QWidget *widget) const
-{
- widget = widget->window();
- return seenAlt.contains(widget);
-}
-
-/*!
- \reimp
-*/
-bool QWindowsStyle::eventFilter(QObject *o, QEvent *e)
-{
- // Records Alt- and Focus events
-// if (!o->isWidgetType())
- return QObject::eventFilter(o, e);
- QWidget *widget = qobject_cast<QWidget*>(o);
- Q_D(QWindowsStyle);
- switch (e->type()) {
- case QEvent::KeyPress:
- if (static_cast<QKeyEvent *>(e)->key() == Qt::Key_Alt) {
- widget = widget->window();
-
- // Alt has been pressed - find all widgets that care
- QList<QWidget *> l = widget->findChildren<QWidget *>();
- auto ignorable = [](QWidget *w) {
- return w->isWindow() || !w->isVisible()
- || w->style()->styleHint(SH_UnderlineShortcut, nullptr, w);
- };
- l.erase(std::remove_if (l.begin(), l.end(), ignorable), l.end());
- // Update states before repainting
- d->seenAlt.append(widget);
- d->alt_down = true;
-
- // Repaint all relevant widgets
- for (int pos = 0; pos < l.size(); ++pos)
- l.at(pos)->update();
- }
- break;
- case QEvent::KeyRelease:
- if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Alt) {
- widget = widget->window();
-
- // Update state and repaint the menu bars.
- d->alt_down = false;
-#if 0 && QT_CONFIG(menubar)
- QList<QMenuBar *> l = widget->findChildren<QMenuBar *>();
- for (int i = 0; i < l.size(); ++i)
- l.at(i)->update();
-#endif
- }
- break;
- case QEvent::Close:
- // Reset widget when closing
- d->seenAlt.removeAll(widget);
- d->seenAlt.removeAll(widget->window());
- break;
- default:
- break;
- }
- return QCommonStyle::eventFilter(o, e);
-}
-#endif
-
-/*!
- \class QWindowsStyle
- \brief The QWindowsStyle class provides a Microsoft Windows-like look and feel.
-
- \ingroup appearance
- \inmodule QtWidgets
- \internal
-
- This style is Qt's default GUI style on Windows.
-
- \image qwindowsstyle.png
- \sa QWindowsVistaStyle, QMacStyle, QFusionStyle
-*/
-
-/*!
- Constructs a QWindowsStyle object.
-*/
-QWindowsStyle::QWindowsStyle() : QCommonStyle(*new QWindowsStylePrivate)
-{
-}
-
-/*!
- \internal
-
- Constructs a QWindowsStyle object.
-*/
-QWindowsStyle::QWindowsStyle(QWindowsStylePrivate &dd) : QCommonStyle(dd)
-{
-}
-
-
-/*! Destroys the QWindowsStyle object. */
-QWindowsStyle::~QWindowsStyle()
-{
-}
-
-#ifdef Q_OS_WIN
-static inline QRgb colorref2qrgb(COLORREF col)
-{
- return qRgb(GetRValue(col), GetGValue(col), GetBValue(col));
-}
-#endif
-#if 0
-/*! \reimp */
-void QWindowsStyle::polish(QApplication *app)
-{
- QCommonStyle::polish(app);
- QWindowsStylePrivate *d = const_cast<QWindowsStylePrivate*>(d_func());
- // We only need the overhead when shortcuts are sometimes hidden
- if (!proxy()->styleHint(SH_UnderlineShortcut, nullptr) && app)
- app->installEventFilter(this);
-
- const auto &palette = QGuiApplication::palette();
- d->activeGradientCaptionColor = palette.highlight().color();
- d->activeCaptionColor = d->activeGradientCaptionColor;
- d->inactiveGradientCaptionColor = palette.dark().color();
- d->inactiveCaptionColor = d->inactiveGradientCaptionColor;
- d->inactiveCaptionText = palette.window().color();
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) //fetch native title bar colors
- if (app->desktopSettingsAware()){
- DWORD activeCaption = GetSysColor(COLOR_ACTIVECAPTION);
- DWORD gradientActiveCaption = GetSysColor(COLOR_GRADIENTACTIVECAPTION);
- DWORD inactiveCaption = GetSysColor(COLOR_INACTIVECAPTION);
- DWORD gradientInactiveCaption = GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
- DWORD inactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
- d->activeCaptionColor = colorref2qrgb(activeCaption);
- d->activeGradientCaptionColor = colorref2qrgb(gradientActiveCaption);
- d->inactiveCaptionColor = colorref2qrgb(inactiveCaption);
- d->inactiveGradientCaptionColor = colorref2qrgb(gradientInactiveCaption);
- d->inactiveCaptionText = colorref2qrgb(inactiveCaptionText);
- }
-#endif
-}
-
-/*! \reimp */
-void QWindowsStyle::unpolish(QApplication *app)
-{
- QCommonStyle::unpolish(app);
- app->removeEventFilter(this);
-}
-
-/*! \reimp */
-void QWindowsStyle::polish(QWidget *widget)
-{
- QCommonStyle::polish(widget);
-}
-
-/*! \reimp */
-void QWindowsStyle::unpolish(QWidget *widget)
-{
- QCommonStyle::unpolish(widget);
-}
-
-/*!
- \reimp
-*/
-void QWindowsStyle::polish(QPalette &pal)
-{
- QCommonStyle::polish(pal);
-}
-#endif
-
-int QWindowsStylePrivate::pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *opt)
-{
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
- switch (pm) {
- case QStyle::PM_DockWidgetFrameWidth:
- return GetSystemMetrics(SM_CXFRAME);
-
- case QStyle::PM_TitleBarHeight:
- Q_ASSERT(opt);
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- if ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool) {
- // MS always use one less than they say
- return GetSystemMetrics(SM_CYSMCAPTION) - 1;
- }
- }
- return GetSystemMetrics(SM_CYCAPTION) - 1;
-
- case QStyle::PM_ScrollBarExtent:
- {
- NONCLIENTMETRICS ncm;
- ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, lfMessageFont) + sizeof(LOGFONT);
- if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))
- return qMax(ncm.iScrollHeight, ncm.iScrollWidth);
- }
- break;
-
- case QStyle::PM_MdiSubWindowFrameWidth:
- return GetSystemMetrics(SM_CYFRAME);
-
- default:
- break;
- }
-#else // Q_OS_WIN && !Q_OS_WINRT
- Q_UNUSED(pm);
- Q_UNUSED(widget);
-#endif
- return QWindowsStylePrivate::InvalidMetric;
-}
-
-int QWindowsStylePrivate::fixedPixelMetric(QStyle::PixelMetric pm)
-{
- switch (pm) {
- case QStyle::PM_ToolBarItemSpacing:
- return 0;
- case QStyle::PM_ButtonDefaultIndicator:
- case QStyle::PM_ButtonShiftHorizontal:
- case QStyle::PM_ButtonShiftVertical:
- case QStyle::PM_MenuHMargin:
- case QStyle::PM_MenuVMargin:
- case QStyle::PM_ToolBarItemMargin:
- return 1;
- case QStyle::PM_DockWidgetSeparatorExtent:
- return 4;
-#if 0 && QT_CONFIG(tabbar)
- case QStyle::PM_TabBarTabShiftHorizontal:
- return 0;
- case QStyle::PM_TabBarTabShiftVertical:
- return 2;
-#endif
-
- case QStyle::PM_SliderLength:
- return 11;
-
-#if 0 && QT_CONFIG(menu)
- case QStyle::PM_MenuBarHMargin:
- case QStyle::PM_MenuBarVMargin:
- case QStyle::PM_MenuBarPanelWidth:
- return 0;
- case QStyle::PM_SmallIconSize:
- return 16;
- case QStyle::PM_LargeIconSize:
- return 32;
- case QStyle::PM_DockWidgetTitleMargin:
- return 2;
- case QStyle::PM_DockWidgetTitleBarButtonMargin:
- case QStyle::PM_DockWidgetFrameWidth:
- return 4;
-
-#endif // QT_CONFIG(menu)
- case QStyle::PM_ToolBarHandleExtent:
- return 10;
- default:
- break;
- }
- return QWindowsStylePrivate::InvalidMetric;
-}
-
-static QScreen *screenOf(const QWindow *w)
-{
- if (w) {
- if (auto screen = w->screen())
- return screen;
- }
- return QGuiApplication::primaryScreen();
-}
-
-// Calculate the overall scale factor to obtain Qt Device Independent
-// Pixels from a native Windows size. Divide by devicePixelRatio
-// and account for secondary screens with differing logical DPI.
-qreal QWindowsStylePrivate::nativeMetricScaleFactor(const QStyleOption *opt)
-{
- Q_ASSERT(opt);
- const QWindow *win = opt->window;
- return nativeMetricScaleFactor(win);
-}
-
-qreal QWindowsStylePrivate::nativeMetricScaleFactor(const QWindow *win)
-{
- qreal result = qreal(1) / QWindowsStylePrivate::devicePixelRatio(win);
- if (QGuiApplicationPrivate::screen_list.size() > 1) {
- const QScreen *primaryScreen = QGuiApplication::primaryScreen();
- const QScreen *screen = screenOf(win);
- if (screen != primaryScreen) {
- const qreal primaryLogicalDpi = primaryScreen->handle()->logicalDpi().first;
- const qreal logicalDpi = screen->handle()->logicalDpi().first;
- if (!qFuzzyCompare(primaryLogicalDpi, logicalDpi))
- result *= logicalDpi / primaryLogicalDpi;
- }
- }
- return result;
-}
-
-/*!
- \reimp
-*/
-int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt) const
-{
- int ret = QWindowsStylePrivate::pixelMetricFromSystemDp(pm, opt);
- if (ret != QWindowsStylePrivate::InvalidMetric)
- return qRound(qreal(ret) * QWindowsStylePrivate::nativeMetricScaleFactor(opt));
-
- ret = QWindowsStylePrivate::fixedPixelMetric(pm);
- if (ret != QWindowsStylePrivate::InvalidMetric)
- return int(QStyleHelper::dpiScaled(ret, opt));
-
- ret = 0;
-
- switch (pm) {
- case PM_MaximumDragDistance:
- ret = QCommonStyle::pixelMetric(PM_MaximumDragDistance);
- if (ret == -1)
- ret = 60;
- break;
-
- // Returns the number of pixels to use for the business part of the
- // slider (i.e., the non-tickmark portion). The remaining space is shared
- // equally between the tickmark regions.
- case PM_SliderControlThickness:
- if (const QStyleOptionSlider *sl = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int space = (sl->orientation == Qt::Horizontal) ? sl->rect.height() : sl->rect.width();
- int ticks = sl->tickPosition;
- int n = 0;
- if (ticks & QStyleOptionSlider::TicksAbove)
- ++n;
- if (ticks & QStyleOptionSlider::TicksBelow)
- ++n;
- if (!n) {
- ret = space;
- break;
- }
-
- int thick = 6; // Magic constant to get 5 + 16 + 5
- if (ticks != QStyleOptionSlider::TicksBothSides && ticks != QStyleOptionSlider::NoTicks)
- thick += proxy()->pixelMetric(PM_SliderLength, sl) / 4;
-
- space -= thick;
- if (space > 0)
- thick += (space * 2) / (n + 2);
- ret = thick;
- }
- break;
-
- case PM_IconViewIconSize:
- ret = proxy()->pixelMetric(PM_LargeIconSize, opt);
- break;
-
- case PM_SplitterWidth:
- ret = int(QStyleHelper::dpiScaled(4, opt));
- break;
-
- default:
- ret = QCommonStyle::pixelMetric(pm, opt);
- break;
- }
-
- return ret;
-}
-
-/*!
- \reimp
- */
-QPixmap QWindowsStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt) const
-{
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
- QPixmap desktopIcon;
- switch (standardPixmap) {
- case SP_DriveCDIcon:
- case SP_DriveDVDIcon:
- case SP_DriveNetIcon:
- case SP_DriveHDIcon:
- case SP_DriveFDIcon:
- case SP_FileIcon:
- case SP_FileLinkIcon:
- case SP_DirLinkIcon:
- case SP_DirClosedIcon:
- case SP_DesktopIcon:
- case SP_ComputerIcon:
- case SP_DirOpenIcon:
- case SP_FileDialogNewFolder:
- case SP_DirHomeIcon:
- case SP_TrashIcon:
- case SP_VistaShield:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardPixmap);
- desktopIcon = theme->standardPixmap(sp, QSizeF(16, 16));
- }
- break;
- case SP_MessageBoxInformation:
- case SP_MessageBoxWarning:
- case SP_MessageBoxCritical:
- case SP_MessageBoxQuestion:
- if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) {
- QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardPixmap);
- desktopIcon = theme->standardPixmap(sp, QSizeF());
- }
- break;
- default:
- break;
- }
- if (!desktopIcon.isNull()) {
- return desktopIcon;
- }
-#endif // Q_OS_WIN && !Q_OS_WINRT
- return QCommonStyle::standardPixmap(standardPixmap, opt);
-}
-
-/*! \reimp */
-int QWindowsStyle::styleHint(StyleHint hint, const QStyleOption *opt,
- QStyleHintReturn *returnData) const
-{
- int ret = 0;
-
- switch (hint) {
- case SH_EtchDisabledText:
- ret = d_func()->isDarkMode() ? 0 : 1;
- break;
- case SH_Slider_SnapToValue:
- case SH_PrintDialog_RightAlignButtons:
- case SH_FontDialog_SelectAssociatedText:
- case SH_Menu_AllowActiveAndDisabled:
- case SH_MenuBar_AltKeyNavigation:
- case SH_MenuBar_MouseTracking:
- case SH_Menu_MouseTracking:
- case SH_ComboBox_ListMouseTracking:
- case SH_Slider_StopMouseOverSlider:
- case SH_MainWindow_SpaceBelowMenuBar:
- ret = 1;
-
- break;
- case SH_ItemView_ShowDecorationSelected:
-#if 0 && QT_CONFIG(listview)
- if (qobject_cast<const QListView*>(widget))
- ret = 1;
-#endif
- break;
- case SH_ItemView_ChangeHighlightOnFocus:
- ret = 1;
- break;
- case SH_ToolBox_SelectedPageTitleBold:
- ret = 0;
- break;
-
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) // Option not used on WinRT -> common style
- case SH_UnderlineShortcut:
- {
- ret = 1;
- BOOL cues = false;
- SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &cues, 0);
- ret = int(cues);
- // Do nothing if we always paint underlines
- Q_D(const QWindowsStyle);
- if (!ret && d) {
-#if 0 && QT_CONFIG(menubar)
- const QMenuBar *menuBar = qobject_cast<const QMenuBar *>(widget);
- if (!menuBar && qobject_cast<const QMenu *>(widget)) {
- QWidget *w = QApplication::activeWindow();
- if (w && w != widget)
- menuBar = w->findChild<QMenuBar *>();
- }
- // If we paint a menu bar draw underlines if is in the keyboardState
- if (menuBar) {
- if (menuBar->d_func()->keyboardState || d->altDown())
- ret = 1;
- // Otherwise draw underlines if the toplevel widget has seen an alt-press
- } else
-#endif // QT_CONFIG(menubar)
-// if (d->hasSeenAlt(widget)) {
-// ret = 1;
-// }
- }
-#ifndef QT_NO_ACCESSIBILITY
- if (!ret && opt && opt->type == QStyleOption::SO_MenuItem
- && QStyleHelper::isInstanceOf(opt->styleObject, QAccessible::MenuItem)
- && opt->styleObject->property("_q_showUnderlined").toBool())
- ret = 1;
-#endif // QT_NO_ACCESSIBILITY
- break;
- }
-#endif // Q_OS_WIN && !Q_OS_WINRT
- case SH_Menu_SubMenuSloppyCloseTimeout:
- case SH_Menu_SubMenuPopupDelay: {
-#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
- DWORD delay;
- if (SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &delay, 0))
- ret = delay;
- else
-#endif // Q_OS_WIN && !Q_OS_WINRT
- ret = 400;
- break;
- }
-#if 0 && QT_CONFIG(rubberband)
- case SH_RubberBand_Mask:
- if (const QStyleOptionRubberBand *rbOpt = qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- ret = 0;
- if (rbOpt->shape == QRubberBand::Rectangle) {
- ret = true;
- if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(returnData)) {
- mask->region = opt->rect;
- int size = 1;
- if (widget && widget->isWindow())
- size = 4;
- mask->region -= opt->rect.adjusted(size, size, -size, -size);
- }
- }
- }
- break;
-#endif // QT_CONFIG(rubberband)
-#if 0 && QT_CONFIG(wizard)
- case SH_WizardStyle:
- ret = QWizard::ModernStyle;
- break;
-#endif
- case SH_ItemView_ArrowKeysNavigateIntoChildren:
- ret = true;
- break;
- case SH_DialogButtonBox_ButtonsHaveIcons:
- ret = 0;
- break;
- default:
- ret = QCommonStyle::styleHint(hint, opt, returnData);
- break;
- }
- return ret;
-}
-
-/*! \reimp */
-void QWindowsStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const
-{
- // Used to restore across fallthrough cases. Currently only used in PE_IndicatorCheckBox
- bool doRestore = false;
-
- switch (pe) {
-#if 0 && QT_CONFIG(toolbar)
- case PE_IndicatorToolBarSeparator:
- {
- QRect rect = opt->rect;
- const int margin = 2;
- QPen oldPen = p->pen();
- if (opt->state & State_Horizontal){
- const int offset = rect.width()/2;
- p->setPen(QPen(opt->palette.dark().color()));
- p->drawLine(rect.bottomLeft().x() + offset,
- rect.bottomLeft().y() - margin,
- rect.topLeft().x() + offset,
- rect.topLeft().y() + margin);
- p->setPen(QPen(opt->palette.light().color()));
- p->drawLine(rect.bottomLeft().x() + offset + 1,
- rect.bottomLeft().y() - margin,
- rect.topLeft().x() + offset + 1,
- rect.topLeft().y() + margin);
- }
- else{ //Draw vertical separator
- const int offset = rect.height()/2;
- p->setPen(QPen(opt->palette.dark().color()));
- p->drawLine(rect.topLeft().x() + margin ,
- rect.topLeft().y() + offset,
- rect.topRight().x() - margin,
- rect.topRight().y() + offset);
- p->setPen(QPen(opt->palette.light().color()));
- p->drawLine(rect.topLeft().x() + margin ,
- rect.topLeft().y() + offset + 1,
- rect.topRight().x() - margin,
- rect.topRight().y() + offset + 1);
- }
- p->setPen(oldPen);
- }
- break;
- case PE_IndicatorToolBarHandle:
- p->save();
- p->translate(opt->rect.x(), opt->rect.y());
- if (opt->state & State_Horizontal) {
- int x = opt->rect.width() / 2 - 4;
- if (opt->direction == Qt::RightToLeft)
- x -= 2;
- if (opt->rect.height() > 4) {
- qDrawShadePanel(p, x, 2, 3, opt->rect.height() - 4,
- opt->palette, false, 1, nullptr);
- qDrawShadePanel(p, x + 3, 2, 3, opt->rect.height() - 4,
- opt->palette, false, 1, nullptr);
- }
- } else {
- if (opt->rect.width() > 4) {
- int y = opt->rect.height() / 2 - 4;
- qDrawShadePanel(p, 2, y, opt->rect.width() - 4, 3,
- opt->palette, false, 1, nullptr);
- qDrawShadePanel(p, 2, y + 3, opt->rect.width() - 4, 3,
- opt->palette, false, 1, nullptr);
- }
- }
- p->restore();
- break;
-
-#endif // QT_CONFIG(toolbar)
- case PE_FrameButtonTool:
- case PE_PanelButtonTool: {
- QPen oldPen = p->pen();
-#if 0 && QT_CONFIG(dockwidget)
- if (w && w->inherits("QDockWidgetTitleButton")) {
- if (const QWidget *dw = w->parentWidget())
- if (dw->isWindow()){
- qDrawWinButton(p, opt->rect.adjusted(1, 1, 0, 0), opt->palette, opt->state & (State_Sunken | State_On),
- &opt->palette.button());
-
- return;
- }
- }
-#endif // QT_CONFIG(dockwidget)
- QBrush fill;
- bool stippled;
- bool panel = (pe == PE_PanelButtonTool);
- if ((!(opt->state & State_Sunken ))
- && (!(opt->state & State_Enabled)
- || !(opt->state & State_MouseOver && opt->state & State_AutoRaise))
- && (opt->state & State_On)) {
- fill = QBrush(opt->palette.light().color(), Qt::Dense4Pattern);
- stippled = true;
- } else {
- fill = opt->palette.brush(QPalette::Button);
- stippled = false;
- }
-
- if (opt->state & (State_Raised | State_Sunken | State_On)) {
- if (opt->state & State_AutoRaise) {
- if (opt->state & (State_Enabled | State_Sunken | State_On)){
- if (panel)
- qDrawShadePanel(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1, &fill);
- else
- qDrawShadeRect(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1);
- }
- if (stippled) {
- p->setPen(opt->palette.button().color());
- p->drawRect(opt->rect.adjusted(1,1,-2,-2));
- }
- } else {
- qDrawWinButton(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), panel ? &fill : nullptr);
- }
- } else {
- p->fillRect(opt->rect, fill);
- }
- p->setPen(oldPen);
- break; }
- case PE_PanelButtonCommand:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- QBrush fill;
- State flags = opt->state;
- QPalette pal = opt->palette;
- QRect r = opt->rect;
- if (! (flags & State_Sunken) && (flags & State_On))
- fill = QBrush(pal.light().color(), Qt::Dense4Pattern);
- else
- fill = pal.brush(QPalette::Button);
-
- if (btn->features & QStyleOptionButton::DefaultButton && flags & State_Sunken) {
- p->setPen(pal.dark().color());
- p->setBrush(fill);
- p->drawRect(r.adjusted(0, 0, -1, -1));
- } else if (flags & (State_Raised | State_On | State_Sunken)) {
- qDrawWinButton(p, r, pal, flags & (State_Sunken | State_On),
- &fill);
- } else {
- p->fillRect(r, fill);
- }
- }
- break;
- case PE_FrameDefaultButton: {
- QPen oldPen = p->pen();
- p->setPen(QPen(opt->palette.shadow().color(), 0));
- QRectF rect = opt->rect;
- const qreal dpi = QStyleHelper::dpi(opt);
- const qreal topLevelAdjustment = QStyleHelper::dpiScaled(0.5, dpi);
- const qreal bottomRightAdjustment = QStyleHelper::dpiScaled(-1.5, dpi);
- rect.adjust(topLevelAdjustment, topLevelAdjustment,
- bottomRightAdjustment, bottomRightAdjustment);
- p->drawRect(rect);
- p->setPen(oldPen);
- break;
- }
- case PE_IndicatorCheckBox: {
- QBrush fill;
- if (opt->state & State_NoChange)
- fill = QBrush(opt->palette.base().color(), Qt::Dense4Pattern);
- else if (opt->state & State_Sunken)
- fill = opt->palette.button();
- else if (opt->state & State_Enabled)
- fill = opt->palette.base();
- else
- fill = opt->palette.window();
- p->save();
- doRestore = true;
- qDrawWinPanel(p, opt->rect, opt->palette, true, &fill);
- if (opt->state & State_NoChange)
- p->setPen(opt->palette.dark().color());
- else
- p->setPen(opt->palette.text().color());
- }
- Q_FALLTHROUGH();
- case PE_IndicatorItemViewItemCheck:
- if (!doRestore) {
- p->save();
- doRestore = true;
- }
-#if 0 && QT_CONFIG(itemviews)
- if (pe == PE_IndicatorItemViewItemCheck) {
- const QStyleOptionViewItem *itemViewOpt = qstyleoption_cast<const QStyleOptionViewItem *>(opt);
- p->setPen(itemViewOpt
- && itemViewOpt->showDecorationSelected
- && opt->state & State_Selected
- ? opt->palette.highlightedText().color()
- : opt->palette.text().color());
- if (opt->state & State_NoChange)
- p->setBrush(opt->palette.brush(QPalette::Button));
- p->drawRect(opt->rect.x() + 1, opt->rect.y() + 1, opt->rect.width() - 2, opt->rect.height() - 2);
- }
-#endif // QT_CONFIG(itemviews)
- if (!(opt->state & State_Off)) {
- QPointF points[6];
- qreal scaleh = opt->rect.width() / 12.0;
- qreal scalev = opt->rect.height() / 12.0;
- points[0] = { opt->rect.x() + 3.5 * scaleh, opt->rect.y() + 5.5 * scalev };
- points[1] = { points[0].x(), points[0].y() + 2 * scalev };
- points[2] = { points[1].x() + 2 * scaleh, points[1].y() + 2 * scalev };
- points[3] = { points[2].x() + 4 * scaleh, points[2].y() - 4 * scalev };
- points[4] = { points[3].x(), points[3].y() - 2 * scalev };
- points[5] = { points[4].x() - 4 * scaleh, points[4].y() + 4 * scalev };
- p->setPen(QPen(opt->palette.text().color(), 0));
- p->setBrush(opt->palette.text().color());
- p->drawPolygon(points, 6);
- }
- if (doRestore)
- p->restore();
- break;
- case PE_FrameFocusRect:
- if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(opt)) {
- //### check for d->alt_down
- if (!(fropt->state & State_KeyboardFocusChange) && !proxy()->styleHint(SH_UnderlineShortcut, opt))
- return;
- QRect r = opt->rect;
- p->save();
- p->setBackgroundMode(Qt::TransparentMode);
- QColor bg_col = fropt->backgroundColor;
- if (!bg_col.isValid())
- bg_col = p->background().color();
- // Create an "XOR" color.
- QColor patternCol((bg_col.red() ^ 0xff) & 0xff,
- (bg_col.green() ^ 0xff) & 0xff,
- (bg_col.blue() ^ 0xff) & 0xff);
- p->setBrush(QBrush(patternCol, Qt::Dense4Pattern));
- p->setBrushOrigin(r.topLeft());
- p->setPen(Qt::NoPen);
- p->drawRect(r.left(), r.top(), r.width(), 1); // Top
- p->drawRect(r.left(), r.bottom(), r.width(), 1); // Bottom
- p->drawRect(r.left(), r.top(), 1, r.height()); // Left
- p->drawRect(r.right(), r.top(), 1, r.height()); // Right
- p->restore();
- }
- break;
- case PE_IndicatorRadioButton:
- {
- QRect r = opt->rect;
- p->save();
- p->setRenderHint(QPainter::Antialiasing, true);
-
- QPointF circleCenter = r.center() + QPoint(1, 1);
- qreal radius = (r.width() + (r.width() + 1) % 2) / 2.0 - 1;
-
- QPainterPath path1;
- path1.addEllipse(circleCenter, radius, radius);
- radius *= 0.85;
- QPainterPath path2;
- path2.addEllipse(circleCenter, radius, radius);
- radius *= 0.85;
- QPainterPath path3;
- path3.addEllipse(circleCenter, radius, radius);
- radius *= 0.5;
- QPainterPath path4;
- path4.addEllipse(circleCenter, radius, radius);
-
- QPolygon topLeftPol, bottomRightPol;
- topLeftPol.setPoints(3, r.x(), r.y(), r.x(), r.y() + r.height(), r.x() + r.width(), r.y());
- bottomRightPol.setPoints(3, r.x(), r.y() + r.height(), r.x() + r.width(), r.y() + r.height(), r.x() + r.width(), r.y());
-
- p->setClipRegion(QRegion(topLeftPol));
- p->setPen(opt->palette.dark().color());
- p->setBrush(opt->palette.dark().color());
- p->drawPath(path1);
- p->setPen(opt->palette.shadow().color());
- p->setBrush(opt->palette.shadow().color());
- p->drawPath(path2);
-
- p->setClipRegion(QRegion(bottomRightPol));
- p->setPen(opt->palette.light().color());
- p->setBrush(opt->palette.light().color());
- p->drawPath(path1);
- p->setPen(opt->palette.midlight().color());
- p->setBrush(opt->palette.midlight().color());
- p->drawPath(path2);
-
- QColor fillColor = ((opt->state & State_Sunken) || !(opt->state & State_Enabled)) ?
- opt->palette.button().color() : opt->palette.base().color();
-
- p->setClipping(false);
- p->setPen(fillColor);
- p->setBrush(fillColor);
- p->drawPath(path3);
-
- if (opt->state & State_On) {
- p->setPen(opt->palette.text().color());
- p->setBrush(opt->palette.text());
- p->drawPath(path4);
- }
- p->restore();
- break;
- }
-#ifndef QT_NO_FRAME
- case PE_Frame:
- case PE_FrameMenu:
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- if (frame->lineWidth == 2 || pe == PE_Frame) {
- QPalette popupPal = frame->palette;
- if (pe == PE_FrameMenu) {
- popupPal.setColor(QPalette::Light, frame->palette.window().color());
- popupPal.setColor(QPalette::Midlight, frame->palette.light().color());
- }
- if (pe == PE_Frame && (frame->state & State_Raised))
- qDrawWinButton(p, frame->rect, popupPal, frame->state & State_Sunken);
- else if (pe == PE_Frame && (frame->state & State_Sunken))
- {
- popupPal.setColor(QPalette::Midlight, frame->palette.window().color());
- qDrawWinPanel(p, frame->rect, popupPal, frame->state & State_Sunken);
- }
- else
- qDrawWinPanel(p, frame->rect, popupPal, frame->state & State_Sunken);
- } else {
- QCommonStyle::drawPrimitive(pe, opt, p);
- }
- } else {
- QPalette popupPal = opt->palette;
- popupPal.setColor(QPalette::Light, opt->palette.window().color());
- popupPal.setColor(QPalette::Midlight, opt->palette.light().color());
- qDrawWinPanel(p, opt->rect, popupPal, opt->state & State_Sunken);
- }
- break;
-#endif // QT_NO_FRAME
- case PE_FrameButtonBevel:
- case PE_PanelButtonBevel: {
- QBrush fill;
- bool panel = pe != PE_FrameButtonBevel;
- p->setBrushOrigin(opt->rect.topLeft());
- if (!(opt->state & State_Sunken) && (opt->state & State_On))
- fill = QBrush(opt->palette.light().color(), Qt::Dense4Pattern);
- else
- fill = opt->palette.brush(QPalette::Button);
-
- if (opt->state & (State_Raised | State_On | State_Sunken)) {
- qDrawWinButton(p, opt->rect, opt->palette, opt->state & (State_Sunken | State_On),
- panel ? &fill : nullptr);
- } else {
- if (panel)
- p->fillRect(opt->rect, fill);
- else
- p->drawRect(opt->rect);
- }
- break; }
- case PE_FrameWindow: {
- QPalette popupPal = opt->palette;
- popupPal.setColor(QPalette::Light, opt->palette.window().color());
- popupPal.setColor(QPalette::Midlight, opt->palette.light().color());
- qDrawWinPanel(p, opt->rect, popupPal, opt->state & State_Sunken);
- break; }
-#if 0 && QT_CONFIG(dockwidget)
- case PE_IndicatorDockWidgetResizeHandle:
- break;
- case PE_FrameDockWidget:
- if (qstyleoption_cast<const QStyleOptionFrame *>(opt)) {
- proxy()->drawPrimitive(QStyle::PE_FrameWindow, opt, p, w);
- }
- break;
-#endif // QT_CONFIG(dockwidget)
-
- case PE_FrameStatusBarItem:
- qDrawShadePanel(p, opt->rect, opt->palette, true, 1, nullptr);
- break;
-
- case PE_IndicatorProgressChunk:
- {
- bool vertical = false, inverted = false;
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- vertical = !(pb->state & QStyle::State_Horizontal);
- inverted = pb->invertedAppearance;
- }
-
- int space = 2;
- int chunksize = proxy()->pixelMetric(PM_ProgressBarChunkWidth, opt) - space;
- if (!vertical) {
- if (opt->rect.width() <= chunksize)
- space = 0;
-
- if (inverted)
- p->fillRect(opt->rect.x() + space, opt->rect.y(), opt->rect.width() - space, opt->rect.height(),
- opt->palette.brush(QPalette::Highlight));
- else
- p->fillRect(opt->rect.x(), opt->rect.y(), opt->rect.width() - space, opt->rect.height(),
- opt->palette.brush(QPalette::Highlight));
- } else {
- if (opt->rect.height() <= chunksize)
- space = 0;
-
- if (inverted)
- p->fillRect(opt->rect.x(), opt->rect.y(), opt->rect.width(), opt->rect.height() - space,
- opt->palette.brush(QPalette::Highlight));
- else
- p->fillRect(opt->rect.x(), opt->rect.y() + space, opt->rect.width(), opt->rect.height() - space,
- opt->palette.brush(QPalette::Highlight));
- }
- }
- break;
-
- case PE_FrameTabWidget: {
- qDrawWinButton(p, opt->rect, opt->palette, false, nullptr);
- break;
- }
- default:
- QCommonStyle::drawPrimitive(pe, opt, p);
- }
-}
-
-/*! \reimp */
-void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter *p) const
-{
- switch (ce) {
-#if 0 && QT_CONFIG(rubberband)
- case CE_RubberBand:
- if (qstyleoption_cast<const QStyleOptionRubberBand *>(opt)) {
- // ### workaround for slow general painter path
- QPixmap tiledPixmap(16, 16);
- QPainter pixmapPainter(&tiledPixmap);
- pixmapPainter.setPen(Qt::NoPen);
- pixmapPainter.setBrush(Qt::Dense4Pattern);
- pixmapPainter.setBackground(Qt::white);
- pixmapPainter.setBackgroundMode(Qt::OpaqueMode);
- pixmapPainter.drawRect(0, 0, tiledPixmap.width(), tiledPixmap.height());
- pixmapPainter.end();
- tiledPixmap = QPixmap::fromImage(tiledPixmap.toImage());
- p->save();
- QRect r = opt->rect;
- QStyleHintReturnMask mask;
- if (proxy()->styleHint(QStyle::SH_RubberBand_Mask, opt, widget, &mask))
- p->setClipRegion(mask.region);
- p->drawTiledPixmap(r.x(), r.y(), r.width(), r.height(), tiledPixmap);
- p->restore();
- return;
- }
- break;
-#endif // QT_CONFIG(rubberband)
-
-#if 0 && QT_CONFIG(menu) && QT_CONFIG(mainwindow)
- case CE_MenuBarEmptyArea:
- if (widget && qobject_cast<const QMainWindow *>(widget->parentWidget())) {
- p->fillRect(opt->rect, opt->palette.button());
- QPen oldPen = p->pen();
- p->setPen(QPen(opt->palette.dark().color()));
- p->drawLine(opt->rect.bottomLeft(), opt->rect.bottomRight());
- p->setPen(oldPen);
- }
- break;
-#endif
-#if 0 && QT_CONFIG(menu)
- case CE_MenuItem:
- if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- int x, y, w, h;
- menuitem->rect.getRect(&x, &y, &w, &h);
- int tab = menuitem->tabWidth;
- bool dis = !(menuitem->state & State_Enabled);
- bool checked = menuitem->checkType != QStyleOptionMenuItem::NotCheckable
- ? menuitem->checked : false;
- bool act = menuitem->state & State_Selected;
-
- // windows always has a check column, regardless whether we have an icon or not
- int checkcol = qMax<int>(menuitem->maxIconWidth, QWindowsStylePrivate::windowsCheckMarkWidth);
-
- QBrush fill = menuitem->palette.brush(act ? QPalette::Highlight : QPalette::Button);
- p->fillRect(menuitem->rect.adjusted(0, 0, -1, 0), fill);
-
- if (menuitem->menuItemType == QStyleOptionMenuItem::Separator){
- int yoff = y-1 + h / 2;
- p->setPen(menuitem->palette.dark().color());
- p->drawLine(x + 2, yoff, x + w - 4, yoff);
- p->setPen(menuitem->palette.light().color());
- p->drawLine(x + 2, yoff + 1, x + w - 4, yoff + 1);
- return;
- }
-
- QRect vCheckRect = visualRect(opt->direction, menuitem->rect, QRect(menuitem->rect.x(), menuitem->rect.y(), checkcol, menuitem->rect.height()));
- if (!menuitem->icon.isNull() && checked) {
- if (act) {
- qDrawShadePanel(p, vCheckRect,
- menuitem->palette, true, 1,
- &menuitem->palette.brush(QPalette::Button));
- } else {
- QBrush fill(menuitem->palette.light().color(), Qt::Dense4Pattern);
- qDrawShadePanel(p, vCheckRect, menuitem->palette, true, 1, &fill);
- }
- } else if (!act) {
- p->fillRect(vCheckRect, menuitem->palette.brush(QPalette::Button));
- }
-
- // On Windows Style, if we have a checkable item and an icon we
- // draw the icon recessed to indicate an item is checked. If we
- // have no icon, we draw a checkmark instead.
- if (!menuitem->icon.isNull()) {
- QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
- if (act && !dis)
- mode = QIcon::Active;
- QPixmap pixmap;
- if (checked)
- pixmap = menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, opt, widget), mode, QIcon::On);
- else
- pixmap = menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, opt, widget), mode);
- const int pixw = pixmap.width() / pixmap.devicePixelRatio();
- const int pixh = pixmap.height() / pixmap.devicePixelRatio();
- QRect pmr(0, 0, pixw, pixh);
- pmr.moveCenter(vCheckRect.center());
- p->setPen(menuitem->palette.text().color());
- p->drawPixmap(pmr.topLeft(), pixmap);
- } else if (checked) {
- QStyleOptionMenuItem newMi = *menuitem;
- newMi.state = State_None;
- if (!dis)
- newMi.state |= State_Enabled;
- if (act)
- newMi.state |= State_On;
- newMi.rect = visualRect(opt->direction, menuitem->rect, QRect(menuitem->rect.x() + QWindowsStylePrivate::windowsItemFrame,
- menuitem->rect.y() + QWindowsStylePrivate::windowsItemFrame,
- checkcol - 2 * QWindowsStylePrivate::windowsItemFrame,
- menuitem->rect.height() - 2 * QWindowsStylePrivate::windowsItemFrame));
- proxy()->drawPrimitive(PE_IndicatorMenuCheckMark, &newMi, p, widget);
- }
- p->setPen(act ? menuitem->palette.highlightedText().color() : menuitem->palette.buttonText().color());
-
- QColor discol;
- if (dis) {
- discol = menuitem->palette.text().color();
- p->setPen(discol);
- }
-
- int xm = int(QWindowsStylePrivate::windowsItemFrame) + checkcol + int(QWindowsStylePrivate::windowsItemHMargin);
- int xpos = menuitem->rect.x() + xm;
- QRect textRect(xpos, y + QWindowsStylePrivate::windowsItemVMargin,
- w - xm - QWindowsStylePrivate::windowsRightBorder - tab + 1, h - 2 * QWindowsStylePrivate::windowsItemVMargin);
- QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect);
- QStringRef s(&menuitem->text);
- if (!s.isEmpty()) { // draw text
- p->save();
- int t = s.indexOf(QLatin1Char('\t'));
- int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
- if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem, widget))
- text_flags |= Qt::TextHideMnemonic;
- text_flags |= Qt::AlignLeft;
- if (t >= 0) {
- QRect vShortcutRect = visualRect(opt->direction, menuitem->rect,
- QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom())));
- const QString textToDraw = s.mid(t + 1).toString();
- if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, opt, widget)) {
- p->setPen(menuitem->palette.light().color());
- p->drawText(vShortcutRect.adjusted(1, 1, 1, 1), text_flags, textToDraw);
- p->setPen(discol);
- }
- p->drawText(vShortcutRect, text_flags, textToDraw);
- s = s.left(t);
- }
- QFont font = menuitem->font;
- if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
- font.setBold(true);
- p->setFont(font);
- const QString textToDraw = s.left(t).toString();
- if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, opt, widget)) {
- p->setPen(menuitem->palette.light().color());
- p->drawText(vTextRect.adjusted(1, 1, 1, 1), text_flags, textToDraw);
- p->setPen(discol);
- }
- p->drawText(vTextRect, text_flags, textToDraw);
- p->restore();
- }
- if (menuitem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow
- int dim = (h - 2 * QWindowsStylePrivate::windowsItemFrame) / 2;
- PrimitiveElement arrow;
- arrow = (opt->direction == Qt::RightToLeft) ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight;
- xpos = x + w - QWindowsStylePrivate::windowsArrowHMargin - QWindowsStylePrivate::windowsItemFrame - dim;
- QRect vSubMenuRect = visualRect(opt->direction, menuitem->rect, QRect(xpos, y + h / 2 - dim / 2, dim, dim));
- QStyleOptionMenuItem newMI = *menuitem;
- newMI.rect = vSubMenuRect;
- newMI.state = dis ? State_None : State_Enabled;
- if (act)
- newMI.palette.setColor(QPalette::ButtonText,
- newMI.palette.highlightedText().color());
- proxy()->drawPrimitive(arrow, &newMI, p, widget);
- }
-
- }
- break;
-#endif // QT_CONFIG(menu)
-#if 0 && QT_CONFIG(menubar)
- case CE_MenuBarItem:
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- bool active = mbi->state & State_Selected;
- bool hasFocus = mbi->state & State_HasFocus;
- bool down = mbi->state & State_Sunken;
- QStyleOptionMenuItem newMbi = *mbi;
- p->fillRect(mbi->rect, mbi->palette.brush(QPalette::Button));
- if (active || hasFocus) {
- QBrush b = mbi->palette.brush(QPalette::Button);
- if (active && down)
- p->setBrushOrigin(p->brushOrigin() + QPoint(1, 1));
- if (active && hasFocus)
- qDrawShadeRect(p, mbi->rect.x(), mbi->rect.y(), mbi->rect.width(),
- mbi->rect.height(), mbi->palette, active && down, 1, 0, &b);
- if (active && down) {
- newMbi.rect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, mbi, widget),
- proxy()->pixelMetric(PM_ButtonShiftVertical, mbi, widget));
- p->setBrushOrigin(p->brushOrigin() - QPoint(1, 1));
- }
- }
- QCommonStyle::drawControl(ce, &newMbi, p, widget);
- }
- break;
-#endif // QT_CONFIG(menubar)
-#if 0 && QT_CONFIG(tabbar)
- case CE_TabBarTabShape:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
- bool rtlHorTabs = (tab->direction == Qt::RightToLeft
- && (tab->shape == QTabBar::RoundedNorth
- || tab->shape == QTabBar::RoundedSouth));
- bool selected = tab->state & State_Selected;
- bool lastTab = ((!rtlHorTabs && tab->position == QStyleOptionTab::End)
- || (rtlHorTabs
- && tab->position == QStyleOptionTab::Beginning));
- bool firstTab = ((!rtlHorTabs
- && tab->position == QStyleOptionTab::Beginning)
- || (rtlHorTabs
- && tab->position == QStyleOptionTab::End));
- bool onlyOne = tab->position == QStyleOptionTab::OnlyOneTab;
- bool previousSelected =
- ((!rtlHorTabs
- && tab->selectedPosition == QStyleOptionTab::PreviousIsSelected)
- || (rtlHorTabs
- && tab->selectedPosition == QStyleOptionTab::NextIsSelected));
- bool nextSelected =
- ((!rtlHorTabs
- && tab->selectedPosition == QStyleOptionTab::NextIsSelected)
- || (rtlHorTabs
- && tab->selectedPosition
- == QStyleOptionTab::PreviousIsSelected));
- int tabBarAlignment = proxy()->styleHint(SH_TabBar_Alignment, tab, widget);
- bool leftAligned = (!rtlHorTabs && tabBarAlignment == Qt::AlignLeft)
- || (rtlHorTabs
- && tabBarAlignment == Qt::AlignRight);
-
- bool rightAligned = (!rtlHorTabs && tabBarAlignment == Qt::AlignRight)
- || (rtlHorTabs
- && tabBarAlignment == Qt::AlignLeft);
-
- QColor light = tab->palette.light().color();
- QColor dark = tab->palette.dark().color();
- QColor shadow = tab->palette.shadow().color();
- int borderThinkness = proxy()->pixelMetric(PM_TabBarBaseOverlap, tab, widget);
- if (selected)
- borderThinkness /= 2;
- QRect r2(opt->rect);
- int x1 = r2.left();
- int x2 = r2.right();
- int y1 = r2.top();
- int y2 = r2.bottom();
- switch (tab->shape) {
- default:
- QCommonStyle::drawControl(ce, tab, p, widget);
- break;
- case QTabBar::RoundedNorth: {
- if (!selected) {
- y1 += 2;
- x1 += onlyOne || firstTab ? borderThinkness : 0;
- x2 -= onlyOne || lastTab ? borderThinkness : 0;
- }
-
- p->fillRect(QRect(x1 + 1, y1 + 1, (x2 - x1) - 1, (y2 - y1) - 2), tab->palette.window());
-
- // Delete border
- if (selected) {
- p->fillRect(QRect(x1,y2-1,x2-x1,1), tab->palette.window());
- p->fillRect(QRect(x1,y2,x2-x1,1), tab->palette.window());
- }
- // Left
- if (firstTab || selected || onlyOne || !previousSelected) {
- p->setPen(light);
- p->drawLine(x1, y1 + 2, x1, y2 - ((onlyOne || firstTab) && selected && leftAligned ? 0 : borderThinkness));
- p->drawPoint(x1 + 1, y1 + 1);
- }
- // Top
- {
- int beg = x1 + (previousSelected ? 0 : 2);
- int end = x2 - (nextSelected ? 0 : 2);
- p->setPen(light);
- p->drawLine(beg, y1, end, y1);
- }
- // Right
- if (lastTab || selected || onlyOne || !nextSelected) {
- p->setPen(shadow);
- p->drawLine(x2, y1 + 2, x2, y2 - ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness));
- p->drawPoint(x2 - 1, y1 + 1);
- p->setPen(dark);
- p->drawLine(x2 - 1, y1 + 2, x2 - 1, y2 - ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness));
- }
- break; }
- case QTabBar::RoundedSouth: {
- if (!selected) {
- y2 -= 2;
- x1 += firstTab ? borderThinkness : 0;
- x2 -= lastTab ? borderThinkness : 0;
- }
-
- p->fillRect(QRect(x1 + 1, y1 + 2, (x2 - x1) - 1, (y2 - y1) - 1), tab->palette.window());
-
- // Delete border
- if (selected) {
- p->fillRect(QRect(x1, y1 + 1, (x2 - 1)-x1, 1), tab->palette.window());
- p->fillRect(QRect(x1, y1, (x2 - 1)-x1, 1), tab->palette.window());
- }
- // Left
- if (firstTab || selected || onlyOne || !previousSelected) {
- p->setPen(light);
- p->drawLine(x1, y2 - 2, x1, y1 + ((onlyOne || firstTab) && selected && leftAligned ? 0 : borderThinkness));
- p->drawPoint(x1 + 1, y2 - 1);
- }
- // Bottom
- {
- int beg = x1 + (previousSelected ? 0 : 2);
- int end = x2 - (nextSelected ? 0 : 2);
- p->setPen(shadow);
- p->drawLine(beg, y2, end, y2);
- p->setPen(dark);
- p->drawLine(beg, y2 - 1, end, y2 - 1);
- }
- // Right
- if (lastTab || selected || onlyOne || !nextSelected) {
- p->setPen(shadow);
- p->drawLine(x2, y2 - 2, x2, y1 + ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness));
- p->drawPoint(x2 - 1, y2 - 1);
- p->setPen(dark);
- p->drawLine(x2 - 1, y2 - 2, x2 - 1, y1 + ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness));
- }
- break; }
- case QTabBar::RoundedWest: {
- if (!selected) {
- x1 += 2;
- y1 += firstTab ? borderThinkness : 0;
- y2 -= lastTab ? borderThinkness : 0;
- }
-
- p->fillRect(QRect(x1 + 1, y1 + 1, (x2 - x1) - 2, (y2 - y1) - 1), tab->palette.window());
-
- // Delete border
- if (selected) {
- p->fillRect(QRect(x2 - 1, y1, 1, y2-y1), tab->palette.window());
- p->fillRect(QRect(x2, y1, 1, y2-y1), tab->palette.window());
- }
- // Top
- if (firstTab || selected || onlyOne || !previousSelected) {
- p->setPen(light);
- p->drawLine(x1 + 2, y1, x2 - ((onlyOne || firstTab) && selected && leftAligned ? 0 : borderThinkness), y1);
- p->drawPoint(x1 + 1, y1 + 1);
- }
- // Left
- {
- int beg = y1 + (previousSelected ? 0 : 2);
- int end = y2 - (nextSelected ? 0 : 2);
- p->setPen(light);
- p->drawLine(x1, beg, x1, end);
- }
- // Bottom
- if (lastTab || selected || onlyOne || !nextSelected) {
- p->setPen(shadow);
- p->drawLine(x1 + 3, y2, x2 - ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness), y2);
- p->drawPoint(x1 + 2, y2 - 1);
- p->setPen(dark);
- p->drawLine(x1 + 3, y2 - 1, x2 - ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness), y2 - 1);
- p->drawPoint(x1 + 1, y2 - 1);
- p->drawPoint(x1 + 2, y2);
- }
- break; }
- case QTabBar::RoundedEast: {
- if (!selected) {
- x2 -= 2;
- y1 += firstTab ? borderThinkness : 0;
- y2 -= lastTab ? borderThinkness : 0;
- }
-
- p->fillRect(QRect(x1 + 2, y1 + 1, (x2 - x1) - 1, (y2 - y1) - 1), tab->palette.window());
-
- // Delete border
- if (selected) {
- p->fillRect(QRect(x1 + 1, y1, 1, (y2 - 1)-y1),tab->palette.window());
- p->fillRect(QRect(x1, y1, 1, (y2-1)-y1), tab->palette.window());
- }
- // Top
- if (firstTab || selected || onlyOne || !previousSelected) {
- p->setPen(light);
- p->drawLine(x2 - 2, y1, x1 + ((onlyOne || firstTab) && selected && leftAligned ? 0 : borderThinkness), y1);
- p->drawPoint(x2 - 1, y1 + 1);
- }
- // Right
- {
- int beg = y1 + (previousSelected ? 0 : 2);
- int end = y2 - (nextSelected ? 0 : 2);
- p->setPen(shadow);
- p->drawLine(x2, beg, x2, end);
- p->setPen(dark);
- p->drawLine(x2 - 1, beg, x2 - 1, end);
- }
- // Bottom
- if (lastTab || selected || onlyOne || !nextSelected) {
- p->setPen(shadow);
- p->drawLine(x2 - 2, y2, x1 + ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness), y2);
- p->drawPoint(x2 - 1, y2 - 1);
- p->setPen(dark);
- p->drawLine(x2 - 2, y2 - 1, x1 + ((onlyOne || lastTab) && selected && rightAligned ? 0 : borderThinkness), y2 - 1);
- }
- break; }
- }
- }
- break;
-#endif // QT_CONFIG(tabbar)
- case CE_ToolBoxTabShape:
- qDrawShadePanel(p, opt->rect, opt->palette,
- opt->state & (State_Sunken | State_On), 1,
- &opt->palette.brush(QPalette::Button));
- break;
-#if 0 && QT_CONFIG(splitter)
- case CE_Splitter:
- p->eraseRect(opt->rect);
- break;
-#endif // QT_CONFIG(splitter)
-#if 0 && QT_CONFIG(scrollbar)
- case CE_ScrollBarSubLine:
- case CE_ScrollBarAddLine: {
- if ((opt->state & State_Sunken)) {
- p->setPen(opt->palette.dark().color());
- p->setBrush(opt->palette.brush(QPalette::Button));
- p->drawRect(opt->rect.adjusted(0, 0, -1, -1));
- } else {
- QStyleOption buttonOpt = *opt;
- if (!(buttonOpt.state & State_Sunken))
- buttonOpt.state |= State_Raised;
- QPalette pal(opt->palette);
- pal.setColor(QPalette::Button, opt->palette.light().color());
- pal.setColor(QPalette::Light, opt->palette.button().color());
- qDrawWinButton(p, opt->rect, pal, opt->state & (State_Sunken | State_On),
- &opt->palette.brush(QPalette::Button));
- }
- PrimitiveElement arrow;
- if (opt->state & State_Horizontal) {
- if (ce == CE_ScrollBarAddLine)
- arrow = opt->direction == Qt::LeftToRight ? PE_IndicatorArrowRight : PE_IndicatorArrowLeft;
- else
- arrow = opt->direction == Qt::LeftToRight ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight;
- } else {
- if (ce == CE_ScrollBarAddLine)
- arrow = PE_IndicatorArrowDown;
- else
- arrow = PE_IndicatorArrowUp;
- }
- QStyleOption arrowOpt = *opt;
- arrowOpt.rect = opt->rect.adjusted(4, 4, -4, -4);
- proxy()->drawPrimitive(arrow, &arrowOpt, p, widget);
- break; }
- case CE_ScrollBarAddPage:
- case CE_ScrollBarSubPage: {
- QBrush br;
- QBrush bg = p->background();
- Qt::BGMode bg_mode = p->backgroundMode();
- p->setPen(Qt::NoPen);
- p->setBackgroundMode(Qt::OpaqueMode);
-
- if (opt->state & State_Sunken) {
- br = QBrush(opt->palette.shadow().color(), Qt::Dense4Pattern);
- p->setBackground(opt->palette.dark().color());
- p->setBrush(br);
- } else {
- const QBrush paletteBrush = opt->palette.brush(QPalette::Light);
- if (paletteBrush.style() == Qt::TexturePattern) {
- if (qHasPixmapTexture(paletteBrush))
- br = QBrush(paletteBrush.texture());
- else
- br = QBrush(paletteBrush.textureImage());
- } else
- br = QBrush(opt->palette.light().color(), Qt::Dense4Pattern);
- p->setBackground(opt->palette.window().color());
- p->setBrush(br);
- }
- p->drawRect(opt->rect);
- p->setBackground(bg);
- p->setBackgroundMode(bg_mode);
- break; }
- case CE_ScrollBarSlider:
- if (!(opt->state & State_Enabled)) {
- QBrush br;
- const QBrush paletteBrush = opt->palette.brush(QPalette::Light);
- if (paletteBrush.style() == Qt::TexturePattern) {
- if (qHasPixmapTexture(paletteBrush))
- br = QBrush(paletteBrush.texture());
- else
- br = QBrush(paletteBrush.textureImage());
- } else
- br = QBrush(opt->palette.light().color(), Qt::Dense4Pattern);
- p->setPen(Qt::NoPen);
- p->setBrush(br);
- p->setBackgroundMode(Qt::OpaqueMode);
- p->drawRect(opt->rect);
- } else {
- QStyleOptionButton buttonOpt;
- buttonOpt.QStyleOption::operator=(*opt);
- buttonOpt.state = State_Enabled | State_Raised;
-
- QPalette pal(opt->palette);
- pal.setColor(QPalette::Button, opt->palette.light().color());
- pal.setColor(QPalette::Light, opt->palette.button().color());
- qDrawWinButton(p, opt->rect, pal, false, &opt->palette.brush(QPalette::Button));
- }
- break;
-#endif // QT_CONFIG(scrollbar)
- case CE_HeaderSection: {
- QBrush fill;
- if (opt->state & State_On)
- fill = QBrush(opt->palette.light().color(), Qt::Dense4Pattern);
- else
- fill = opt->palette.brush(QPalette::Button);
-
- if (opt->state & (State_Raised | State_Sunken)) {
- qDrawWinButton(p, opt->rect, opt->palette, opt->state & State_Sunken, &fill);
- } else {
- p->fillRect(opt->rect, fill);
- }
- break; }
-#if 0 && QT_CONFIG(toolbar)
- case CE_ToolBar:
- if (const QStyleOptionToolBar *toolbar = qstyleoption_cast<const QStyleOptionToolBar *>(opt)) {
- // Reserve the beveled appearance only for mainwindow toolbars
- if (!(widget && qobject_cast<const QMainWindow*> (widget->parentWidget())))
- break;
-
- QRect rect = opt->rect;
- bool paintLeftBorder = true;
- bool paintRightBorder = true;
- bool paintBottomBorder = true;
-
- switch (toolbar->toolBarArea){
- case Qt::BottomToolBarArea :
- switch (toolbar->positionOfLine){
- case QStyleOptionToolBar::Beginning:
- case QStyleOptionToolBar::OnlyOne:
- paintBottomBorder = false;
- break;
- default:
- break;
- }
- Q_FALLTHROUGH(); // It continues in the end of the next case
- case Qt::TopToolBarArea :
- switch (toolbar->positionWithinLine){
- case QStyleOptionToolBar::Beginning:
- paintLeftBorder = false;
- break;
- case QStyleOptionToolBar::End:
- paintRightBorder = false;
- break;
- case QStyleOptionToolBar::OnlyOne:
- paintRightBorder = false;
- paintLeftBorder = false;
- break;
- default:
- break;
- }
- if (opt->direction == Qt::RightToLeft){ //reverse layout changes the order of Beginning/end
- bool tmp = paintLeftBorder;
- paintRightBorder=paintLeftBorder;
- paintLeftBorder=tmp;
- }
- break;
- case Qt::RightToolBarArea :
- switch (toolbar->positionOfLine){
- case QStyleOptionToolBar::Beginning:
- case QStyleOptionToolBar::OnlyOne:
- paintRightBorder = false;
- break;
- default:
- break;
- }
- break;
- case Qt::LeftToolBarArea :
- switch (toolbar->positionOfLine){
- case QStyleOptionToolBar::Beginning:
- case QStyleOptionToolBar::OnlyOne:
- paintLeftBorder = false;
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
-
-
- //draw top border
- p->setPen(QPen(opt->palette.light().color()));
- p->drawLine(rect.topLeft().x(),
- rect.topLeft().y(),
- rect.topRight().x(),
- rect.topRight().y());
-
- if (paintLeftBorder){
- p->setPen(QPen(opt->palette.light().color()));
- p->drawLine(rect.topLeft().x(),
- rect.topLeft().y(),
- rect.bottomLeft().x(),
- rect.bottomLeft().y());
- }
-
- if (paintRightBorder){
- p->setPen(QPen(opt->palette.dark().color()));
- p->drawLine(rect.topRight().x(),
- rect.topRight().y(),
- rect.bottomRight().x(),
- rect.bottomRight().y());
- }
-
- if (paintBottomBorder){
- p->setPen(QPen(opt->palette.dark().color()));
- p->drawLine(rect.bottomLeft().x(),
- rect.bottomLeft().y(),
- rect.bottomRight().x(),
- rect.bottomRight().y());
- }
- }
- break;
-
-
-#endif // QT_CONFIG(toolbar)
-
- case CE_ProgressBarContents:
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(opt)) {
- QRect rect = pb->rect;
- if (!rect.isValid())
- return;
-
- const bool vertical = !(pb->state & QStyle::State_Horizontal);
- const bool inverted = pb->invertedAppearance;
-
- QTransform m;
- if (vertical) {
- rect = QRect(rect.y(), rect.x(), rect.height(), rect.width()); // flip width and height
- m.rotate(90);
- m.translate(0, -(rect.height() + rect.y()*2));
- }
- QPalette pal2 = pb->palette;
- // Correct the highlight color if it is the same as the background
- if (pal2.highlight() == pal2.window())
- pal2.setColor(QPalette::Highlight, pb->palette.color(QPalette::Active,
- QPalette::Highlight));
- bool reverse = ((!vertical && (pb->direction == Qt::RightToLeft)) || vertical);
- if (inverted)
- reverse = !reverse;
- int w = rect.width();
- Q_D(const QWindowsStyle);
- if (pb->minimum == 0 && pb->maximum == 0) {
- const int unit_width = proxy()->pixelMetric(PM_ProgressBarChunkWidth, pb);
- QStyleOptionProgressBar pbBits = *pb;
- Q_ASSERT(unit_width >0);
-
- pbBits.rect = rect;
- pbBits.palette = pal2;
-
- int step = 0;
- int chunkCount = w / unit_width + 1;
-#if 0 && QT_CONFIG(animation)
- if (QProgressStyleAnimation *animation = qobject_cast<QProgressStyleAnimation*>(d->animation(opt->styleObject)))
- step = (animation->animationStep() / 3) % chunkCount;
- else
- d->startAnimation(new QProgressStyleAnimation(d->animationFps, opt->styleObject));
-#else
- Q_UNUSED(d);
-#endif
- int chunksInRow = 5;
- int myY = pbBits.rect.y();
- int myHeight = pbBits.rect.height();
- int chunksToDraw = chunksInRow;
-
- if (step > chunkCount - 5)chunksToDraw = (chunkCount - step);
- p->save();
- p->setClipRect(m.mapRect(QRectF(rect)).toRect());
-
- int x0 = reverse ? rect.left() + rect.width() - unit_width*(step) - unit_width : rect.left() + unit_width * step;
- int x = 0;
-
- for (int i = 0; i < chunksToDraw ; ++i) {
- pbBits.rect.setRect(x0 + x, myY, unit_width, myHeight);
- pbBits.rect = m.mapRect(QRectF(pbBits.rect)).toRect();
- proxy()->drawPrimitive(PE_IndicatorProgressChunk, &pbBits, p);
- x += reverse ? -unit_width : unit_width;
- }
- //Draw wrap-around chunks
- if ( step > chunkCount-5){
- x0 = reverse ? rect.left() + rect.width() - unit_width : rect.left() ;
- x = 0;
- int chunksToDraw = step - (chunkCount - chunksInRow);
- for (int i = 0; i < chunksToDraw ; ++i) {
- pbBits.rect.setRect(x0 + x, myY, unit_width, myHeight);
- pbBits.rect = m.mapRect(QRectF(pbBits.rect)).toRect();
- proxy()->drawPrimitive(PE_IndicatorProgressChunk, &pbBits, p);
- x += reverse ? -unit_width : unit_width;
- }
- }
- p->restore(); //restore state
- }
- else {
-#if 0 && QT_CONFIG(animation)
- d->stopAnimation(opt->styleObject);
-#endif
- QCommonStyle::drawControl(ce, opt, p);
- }
- }
- break;
-
-#if 0 && QT_CONFIG(dockwidget)
- case CE_DockWidgetTitle:
-
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(opt)) {
- Q_D(const QWindowsStyle);
-
- const bool verticalTitleBar = dwOpt->verticalTitleBar;
-
- QRect rect = dwOpt->rect;
- QRect r = rect;
-
- if (verticalTitleBar) {
- r = r.transposed();
-
- p->save();
- p->translate(r.left(), r.top() + r.width());
- p->rotate(-90);
- p->translate(-r.left(), -r.top());
- }
-
- bool floating = false;
- bool active = dwOpt->state & State_Active;
- QColor inactiveCaptionTextColor = d->inactiveCaptionText;
- if (dwOpt->movable) {
- QColor left, right;
-
- //Titlebar gradient
- if (opt->state & QStyle::State_Window) {
- floating = true;
- if (active) {
- left = d->activeCaptionColor;
- right = d->activeGradientCaptionColor;
- } else {
- left = d->inactiveCaptionColor;
- right = d->inactiveGradientCaptionColor;
- }
- QBrush fillBrush(left);
- if (left != right) {
- QPoint p1(r.x(), r.top() + r.height()/2);
- QPoint p2(rect.right(), r.top() + r.height()/2);
- QLinearGradient lg(p1, p2);
- lg.setColorAt(0, left);
- lg.setColorAt(1, right);
- fillBrush = lg;
- }
- p->fillRect(r.adjusted(0, 0, 0, -3), fillBrush);
- }
- }
- if (!dwOpt->title.isEmpty()) {
- QFont oldFont = p->font();
- if (floating) {
- QFont font = oldFont;
- font.setBold(true);
- p->setFont(font);
- }
- QPalette palette = dwOpt->palette;
- palette.setColor(QPalette::Window, inactiveCaptionTextColor);
- QRect titleRect = subElementRect(SE_DockWidgetTitleBarText, opt, widget);
- if (verticalTitleBar) {
- titleRect = QRect(r.left() + rect.bottom()
- - titleRect.bottom(),
- r.top() + titleRect.left() - rect.left(),
- titleRect.height(), titleRect.width());
- }
- proxy()->drawItemText(p, titleRect,
- Qt::AlignLeft | Qt::AlignVCenter, palette,
- dwOpt->state & State_Enabled, dwOpt->title,
- floating ? (active ? QPalette::BrightText : QPalette::Window) : QPalette::WindowText);
- p->setFont(oldFont);
- }
- if (verticalTitleBar)
- p->restore();
- }
- return;
-#endif // QT_CONFIG(dockwidget)
-#if 0 && QT_CONFIG(combobox)
- case CE_ComboBoxLabel:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- if (cb->state & State_HasFocus) {
- p->setPen(cb->palette.highlightedText().color());
- p->setBackground(cb->palette.highlight());
- } else {
- p->setPen(cb->palette.text().color());
- p->setBackground(cb->palette.window());
- }
- }
- QCommonStyle::drawControl(ce, opt, p, widget);
- break;
-#endif // QT_CONFIG(combobox)
- default:
- QCommonStyle::drawControl(ce, opt, p);
- }
-}
-
-/*! \reimp */
-QRect QWindowsStyle::subElementRect(SubElement sr, const QStyleOption *opt) const
-{
- QRect r;
- switch (sr) {
- case SE_SliderFocusRect:
- case SE_ToolBoxTabContents:
- r = visualRect(opt->direction, opt->rect, opt->rect);
- break;
- case SE_DockWidgetTitleBarText: {
- r = QCommonStyle::subElementRect(sr, opt);
- const QStyleOptionDockWidget *dwOpt
- = qstyleoption_cast<const QStyleOptionDockWidget*>(opt);
- const bool verticalTitleBar = dwOpt && dwOpt->verticalTitleBar;
- int m = proxy()->pixelMetric(PM_DockWidgetTitleMargin, opt);
- if (verticalTitleBar) {
- r.adjust(0, 0, 0, -m);
- } else {
- if (opt->direction == Qt::LeftToRight)
- r.adjust(m, 0, 0, 0);
- else
- r.adjust(0, 0, -m, 0);
- }
- break;
- }
- case SE_ProgressBarContents:
- r = QCommonStyle::subElementRect(SE_ProgressBarGroove, opt);
- r.adjust(3, 3, -3, -3);
- break;
- default:
- r = QCommonStyle::subElementRect(sr, opt);
- }
- return r;
-}
-
-
-/*! \reimp */
-void QWindowsStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
- QPainter *p) const
-{
-#if 0
- switch (cc) {
-#if QT_CONFIG(slider)
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
- int len = proxy()->pixelMetric(PM_SliderLength, slider);
- int ticks = slider->tickPosition;
- QRect groove = proxy()->subControlRect(CC_Slider, slider, SC_SliderGroove);
- QRect handle = proxy()->subControlRect(CC_Slider, slider, SC_SliderHandle);
-
- if ((slider->subControls & SC_SliderGroove) && groove.isValid()) {
- int mid = thickness / 2;
-
- if (ticks & QStyleOptionSlider::TicksAbove)
- mid += len / 8;
- if (ticks & QStyleOptionSlider::TicksBelow)
- mid -= len / 8;
-
- p->setPen(slider->palette.shadow().color());
- if (slider->orientation == Qt::Horizontal) {
- qDrawWinPanel(p, groove.x(), groove.y() + mid - 2,
- groove.width(), 4, slider->palette, true);
- p->drawLine(groove.x() + 1, groove.y() + mid - 1,
- groove.x() + groove.width() - 3, groove.y() + mid - 1);
- } else {
- qDrawWinPanel(p, groove.x() + mid - 2, groove.y(),
- 4, groove.height(), slider->palette, true);
- p->drawLine(groove.x() + mid - 1, groove.y() + 1,
- groove.x() + mid - 1, groove.y() + groove.height() - 3);
- }
- }
-
- if (slider->subControls & SC_SliderTickmarks) {
- QStyleOptionSlider tmpSlider = *slider;
- tmpSlider.subControls = SC_SliderTickmarks;
- QCommonStyle::drawComplexControl(cc, &tmpSlider, p);
- }
-
- if (slider->subControls & SC_SliderHandle) {
- // 4444440
- // 4333310
- // 4322210
- // 4322210
- // 4322210
- // 4322210
- // *43210*
- // **410**
- // ***0***
- const QColor c0 = slider->palette.shadow().color();
- const QColor c1 = slider->palette.dark().color();
- // const QColor c2 = g.button();
- const QColor c3 = slider->palette.midlight().color();
- const QColor c4 = slider->palette.light().color();
- QBrush handleBrush;
-
- if (slider->state & State_Enabled) {
- handleBrush = slider->palette.color(QPalette::Button);
- } else {
- handleBrush = QBrush(slider->palette.color(QPalette::Button),
- Qt::Dense4Pattern);
- }
-
-
- int x = handle.x(), y = handle.y(),
- wi = handle.width(), he = handle.height();
-
- int x1 = x;
- int x2 = x+wi-1;
- int y1 = y;
- int y2 = y+he-1;
-
- Qt::Orientation orient = slider->orientation;
- bool tickAbove = slider->tickPosition == QStyleOptionSlider::TicksAbove;
- bool tickBelow = slider->tickPosition == QStyleOptionSlider::TicksBelow;
-
- if (slider->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*slider);
- fropt.rect = subElementRect(SE_SliderFocusRect, slider);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
-
- if ((tickAbove && tickBelow) || (!tickAbove && !tickBelow)) {
- Qt::BGMode oldMode = p->backgroundMode();
- p->setBackgroundMode(Qt::OpaqueMode);
- qDrawWinButton(p, QRect(x, y, wi, he), slider->palette, false,
- &handleBrush);
- p->setBackgroundMode(oldMode);
- return;
- }
-
- QSliderDirection dir;
-
- if (orient == Qt::Horizontal)
- if (tickAbove)
- dir = SlUp;
- else
- dir = SlDown;
- else
- if (tickAbove)
- dir = SlLeft;
- else
- dir = SlRight;
-
- QPolygon a;
-
- int d = 0;
- switch (dir) {
- case SlUp:
- y1 = y1 + wi/2;
- d = (wi + 1) / 2 - 1;
- a.setPoints(5, x1,y1, x1,y2, x2,y2, x2,y1, x1+d,y1-d);
- break;
- case SlDown:
- y2 = y2 - wi/2;
- d = (wi + 1) / 2 - 1;
- a.setPoints(5, x1,y1, x1,y2, x1+d,y2+d, x2,y2, x2,y1);
- break;
- case SlLeft:
- d = (he + 1) / 2 - 1;
- x1 = x1 + he/2;
- a.setPoints(5, x1,y1, x1-d,y1+d, x1,y2, x2,y2, x2,y1);
- break;
- case SlRight:
- d = (he + 1) / 2 - 1;
- x2 = x2 - he/2;
- a.setPoints(5, x1,y1, x1,y2, x2,y2, x2+d,y1+d, x2,y1);
- break;
- }
-
- QBrush oldBrush = p->brush();
- p->setPen(Qt::NoPen);
- p->setBrush(handleBrush);
- Qt::BGMode oldMode = p->backgroundMode();
- p->setBackgroundMode(Qt::OpaqueMode);
- p->drawRect(x1, y1, x2-x1+1, y2-y1+1);
- p->drawPolygon(a);
- p->setBrush(oldBrush);
- p->setBackgroundMode(oldMode);
-
- if (dir != SlUp) {
- p->setPen(c4);
- p->drawLine(x1, y1, x2, y1);
- p->setPen(c3);
- p->drawLine(x1, y1+1, x2, y1+1);
- }
- if (dir != SlLeft) {
- p->setPen(c3);
- p->drawLine(x1+1, y1+1, x1+1, y2);
- p->setPen(c4);
- p->drawLine(x1, y1, x1, y2);
- }
- if (dir != SlRight) {
- p->setPen(c0);
- p->drawLine(x2, y1, x2, y2);
- p->setPen(c1);
- p->drawLine(x2-1, y1+1, x2-1, y2-1);
- }
- if (dir != SlDown) {
- p->setPen(c0);
- p->drawLine(x1, y2, x2, y2);
- p->setPen(c1);
- p->drawLine(x1+1, y2-1, x2-1, y2-1);
- }
-
- switch (dir) {
- case SlUp:
- p->setPen(c4);
- p->drawLine(x1, y1, x1+d, y1-d);
- p->setPen(c0);
- d = wi - d - 1;
- p->drawLine(x2, y1, x2-d, y1-d);
- d--;
- p->setPen(c3);
- p->drawLine(x1+1, y1, x1+1+d, y1-d);
- p->setPen(c1);
- p->drawLine(x2-1, y1, x2-1-d, y1-d);
- break;
- case SlDown:
- p->setPen(c4);
- p->drawLine(x1, y2, x1+d, y2+d);
- p->setPen(c0);
- d = wi - d - 1;
- p->drawLine(x2, y2, x2-d, y2+d);
- d--;
- p->setPen(c3);
- p->drawLine(x1+1, y2, x1+1+d, y2+d);
- p->setPen(c1);
- p->drawLine(x2-1, y2, x2-1-d, y2+d);
- break;
- case SlLeft:
- p->setPen(c4);
- p->drawLine(x1, y1, x1-d, y1+d);
- p->setPen(c0);
- d = he - d - 1;
- p->drawLine(x1, y2, x1-d, y2-d);
- d--;
- p->setPen(c3);
- p->drawLine(x1, y1+1, x1-d, y1+1+d);
- p->setPen(c1);
- p->drawLine(x1, y2-1, x1-d, y2-1-d);
- break;
- case SlRight:
- p->setPen(c4);
- p->drawLine(x2, y1, x2+d, y1+d);
- p->setPen(c0);
- d = he - d - 1;
- p->drawLine(x2, y2, x2+d, y2-d);
- d--;
- p->setPen(c3);
- p->drawLine(x2, y1+1, x2+d, y1+1+d);
- p->setPen(c1);
- p->drawLine(x2, y2-1, x2+d, y2-1-d);
- break;
- }
- }
- }
- break;
-#endif // QT_CONFIG(slider)
-#if QT_CONFIG(scrollbar)
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- QStyleOptionSlider newScrollbar = *scrollbar;
- if (scrollbar->minimum == scrollbar->maximum)
- newScrollbar.state &= ~State_Enabled; //do not draw the slider.
- QCommonStyle::drawComplexControl(cc, &newScrollbar, p, widget);
- }
- break;
-#endif // QT_CONFIG(scrollbar)
-#if QT_CONFIG(combobox)
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) {
- QBrush editBrush = cmb->palette.brush(QPalette::Button);
- if ((cmb->subControls & SC_ComboBoxFrame)) {
- if (cmb->frame) {
- QPalette shadePal = opt->palette;
- shadePal.setColor(QPalette::Midlight, shadePal.button().color());
- qDrawWinPanel(p, opt->rect, shadePal, true, &editBrush);
- }
- else {
- p->fillRect(opt->rect, editBrush);
- }
- }
- if (cmb->subControls & SC_ComboBoxArrow) {
- State flags = State_None;
-
- QRect ar = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxArrow, widget);
- bool sunkenArrow = cmb->activeSubControls == SC_ComboBoxArrow
- && cmb->state & State_Sunken;
- if (sunkenArrow) {
- p->setPen(cmb->palette.dark().color());
- p->setBrush(cmb->palette.brush(QPalette::Button));
- p->drawRect(ar.adjusted(0,0,-1,-1));
- } else {
- // Make qDrawWinButton use the right colors for drawing the shade of the button
- QPalette pal(cmb->palette);
- pal.setColor(QPalette::Button, cmb->palette.light().color());
- pal.setColor(QPalette::Light, cmb->palette.button().color());
- qDrawWinButton(p, ar, pal, false,
- &cmb->palette.brush(QPalette::Button));
- }
-
- ar.adjust(2, 2, -2, -2);
- if (opt->state & State_Enabled)
- flags |= State_Enabled;
- if (opt->state & State_HasFocus)
- flags |= State_HasFocus;
-
- if (sunkenArrow)
- flags |= State_Sunken;
- QStyleOption arrowOpt = *cmb;
- arrowOpt.rect = ar.adjusted(1, 1, -1, -1);
- arrowOpt.state = flags;
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, p, widget);
- }
-
- if (cmb->subControls & SC_ComboBoxEditField) {
- QRect re = proxy()->subControlRect(CC_ComboBox, cmb, SC_ComboBoxEditField, widget);
- if (cmb->state & State_HasFocus && !cmb->editable)
- p->fillRect(re.x(), re.y(), re.width(), re.height(),
- cmb->palette.brush(QPalette::Highlight));
-
- if (cmb->state & State_HasFocus) {
- p->setPen(cmb->palette.highlightedText().color());
- p->setBackground(cmb->palette.highlight());
-
- } else {
- p->setPen(cmb->palette.text().color());
- p->setBackground(cmb->palette.window());
- }
-
- if (cmb->state & State_HasFocus && !cmb->editable) {
- QStyleOptionFocusRect focus;
- focus.QStyleOption::operator=(*cmb);
- focus.rect = subElementRect(SE_ComboBoxFocusRect, cmb, widget);
- focus.state |= State_FocusAtBorder;
- focus.backgroundColor = cmb->palette.highlight().color();
- proxy()->drawPrimitive(PE_FrameFocusRect, &focus, p, widget);
- }
- }
- }
- break;
-#endif // QT_CONFIG(combobox)
-#if QT_CONFIG(spinbox)
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) {
- QStyleOptionSpinBox copy = *sb;
- PrimitiveElement pe;
- bool enabled = opt->state & State_Enabled;
- if (sb->frame && (sb->subControls & SC_SpinBoxFrame)) {
- QBrush editBrush = sb->palette.brush(QPalette::Base);
- QRect r = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxFrame, widget);
- QPalette shadePal = sb->palette;
- shadePal.setColor(QPalette::Midlight, shadePal.button().color());
- qDrawWinPanel(p, r, shadePal, true, &editBrush);
- }
-
- QPalette shadePal(opt->palette);
- shadePal.setColor(QPalette::Button, opt->palette.light().color());
- shadePal.setColor(QPalette::Light, opt->palette.button().color());
-
- if (sb->subControls & SC_SpinBoxUp) {
- copy.subControls = SC_SpinBoxUp;
- QPalette pal2 = sb->palette;
- if (!(sb->stepEnabled & QAbstractSpinBox::StepUpEnabled)) {
- pal2.setCurrentColorGroup(QPalette::Disabled);
- copy.state &= ~State_Enabled;
- }
-
- copy.palette = pal2;
-
- if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_Sunken)) {
- copy.state |= State_On;
- copy.state |= State_Sunken;
- } else {
- copy.state |= State_Raised;
- copy.state &= ~State_Sunken;
- }
- pe = (sb->buttonSymbols == QAbstractSpinBox::PlusMinus ? PE_IndicatorSpinPlus
- : PE_IndicatorSpinUp);
-
- copy.rect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxUp, widget);
- qDrawWinButton(p, copy.rect, shadePal, copy.state & (State_Sunken | State_On),
- &copy.palette.brush(QPalette::Button));
- copy.rect.adjust(4, 1, -5, -1);
- if ((!enabled || !(sb->stepEnabled & QAbstractSpinBox::StepUpEnabled))
- && proxy()->styleHint(SH_EtchDisabledText, opt, widget) )
- {
- QStyleOptionSpinBox lightCopy = copy;
- lightCopy.rect.adjust(1, 1, 1, 1);
- lightCopy.palette.setBrush(QPalette::ButtonText, copy.palette.light());
- proxy()->drawPrimitive(pe, &lightCopy, p, widget);
- }
- proxy()->drawPrimitive(pe, &copy, p, widget);
- }
-
- if (sb->subControls & SC_SpinBoxDown) {
- copy.subControls = SC_SpinBoxDown;
- copy.state = sb->state;
- QPalette pal2 = sb->palette;
- if (!(sb->stepEnabled & QAbstractSpinBox::StepDownEnabled)) {
- pal2.setCurrentColorGroup(QPalette::Disabled);
- copy.state &= ~State_Enabled;
- }
- copy.palette = pal2;
-
- if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_Sunken)) {
- copy.state |= State_On;
- copy.state |= State_Sunken;
- } else {
- copy.state |= State_Raised;
- copy.state &= ~State_Sunken;
- }
- pe = (sb->buttonSymbols == QAbstractSpinBox::PlusMinus ? PE_IndicatorSpinMinus
- : PE_IndicatorSpinDown);
-
- copy.rect = proxy()->subControlRect(CC_SpinBox, sb, SC_SpinBoxDown, widget);
- qDrawWinButton(p, copy.rect, shadePal, copy.state & (State_Sunken | State_On),
- &copy.palette.brush(QPalette::Button));
- copy.rect.adjust(4, 0, -5, -1);
- if ((!enabled || !(sb->stepEnabled & QAbstractSpinBox::StepDownEnabled))
- && proxy()->styleHint(SH_EtchDisabledText, opt, widget) )
- {
- QStyleOptionSpinBox lightCopy = copy;
- lightCopy.rect.adjust(1, 1, 1, 1);
- lightCopy.palette.setBrush(QPalette::ButtonText, copy.palette.light());
- proxy()->drawPrimitive(pe, &lightCopy, p, widget);
- }
- proxy()->drawPrimitive(pe, &copy, p, widget);
- }
- }
- break;
-#endif // QT_CONFIG(spinbox)
- default:
- QCommonStyle::drawComplexControl(cc, opt, p);
- }
-#else // 0
- QCommonStyle::drawComplexControl(cc, opt, p);
-#endif
-}
-
-/*! \reimp */
-QSize QWindowsStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &csz) const
-{
- QSize sz(csz);
- switch (ct) {
- case CT_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
- sz = QCommonStyle::sizeFromContents(ct, opt, csz);
- int w = sz.width(),
- h = sz.height();
- int defwidth = 0;
- if (btn->features & QStyleOptionButton::AutoDefaultButton)
- defwidth = 2 * proxy()->pixelMetric(PM_ButtonDefaultIndicator, btn);
- const qreal dpi = QStyleHelper::dpi(opt);
- int minwidth = int(QStyleHelper::dpiScaled(75, dpi));
- int minheight = int(QStyleHelper::dpiScaled(23, dpi));
-
-#ifndef QT_QWS_SMALL_PUSHBUTTON
- if (w < minwidth + defwidth && !btn->text.isEmpty())
- w = minwidth + defwidth;
- if (h < minheight + defwidth)
- h = minheight + defwidth;
-#endif
- sz = QSize(w, h);
- }
- break;
-#if 0 && QT_CONFIG(menu)
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
- int w = sz.width();
- sz = QCommonStyle::sizeFromContents(ct, opt, csz, widget);
-
- if (mi->menuItemType == QStyleOptionMenuItem::Separator) {
- sz = QSize(10, QWindowsStylePrivate::windowsSepHeight);
- }
- else if (mi->icon.isNull()) {
- sz.setHeight(sz.height() - 2);
- w -= 6;
- }
-
- if (mi->menuItemType != QStyleOptionMenuItem::Separator && !mi->icon.isNull()) {
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget);
- sz.setHeight(qMax(sz.height(),
- mi->icon.actualSize(QSize(iconExtent, iconExtent)).height()
- + 2 * QWindowsStylePrivate::windowsItemFrame));
- }
- int maxpmw = mi->maxIconWidth;
- int tabSpacing = 20;
- if (mi->text.contains(QLatin1Char('\t')))
- w += tabSpacing;
- else if (mi->menuItemType == QStyleOptionMenuItem::SubMenu)
- w += 2 * QWindowsStylePrivate::windowsArrowHMargin;
- else if (mi->menuItemType == QStyleOptionMenuItem::DefaultItem) {
- // adjust the font and add the difference in size.
- // it would be better if the font could be adjusted in the initStyleOption qmenu func!!
- QFontMetrics fm(mi->font);
- QFont fontBold = mi->font;
- fontBold.setBold(true);
- QFontMetrics fmBold(fontBold);
- w += fmBold.horizontalAdvance(mi->text) - fm.horizontalAdvance(mi->text);
- }
-
- int checkcol = qMax<int>(maxpmw, QWindowsStylePrivate::windowsCheckMarkWidth); // Windows always shows a check column
- w += checkcol;
- w += int(QWindowsStylePrivate::windowsRightBorder) + 10;
- sz.setWidth(w);
- }
- break;
-#endif // QT_CONFIG(menu)
-#if 0 && QT_CONFIG(menubar)
- case CT_MenuBarItem:
- if (!sz.isEmpty())
- sz += QSize(QWindowsStylePrivate::windowsItemHMargin * 4, QWindowsStylePrivate::windowsItemVMargin * 2);
- break;
-#endif
- case CT_ToolButton:
- if (qstyleoption_cast<const QStyleOptionToolButton *>(opt))
- return sz += QSize(7, 6);
- Q_FALLTHROUGH();
-
- default:
- sz = QCommonStyle::sizeFromContents(ct, opt, csz);
- }
- return sz;
-}
-
-/*!
- \reimp
-*/
-QIcon QWindowsStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option) const
-{
- return QCommonStyle::standardIcon(standardIcon, option);
-}
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#include "moc_qquickwindowsstyle_p.cpp"
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p.h b/src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p.h
deleted file mode 100644
index 92926b71..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKWINDOWSSTYLE_P_H
-#define QQUICKWINDOWSSTYLE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qquickcommonstyle.h"
-
-QT_BEGIN_NAMESPACE
-
-class QPalette;
-
-namespace QQC2 {
-
-class QStyleOptionButton;
-class QWindowsStylePrivate;
-
-class QWindowsStylePrivate;
-
-class QWindowsStyle : public QCommonStyle
-{
- Q_OBJECT
-public:
- QWindowsStyle();
- ~QWindowsStyle() override;
-/*
- void polish(QApplication*) override;
- void unpolish(QApplication*) override;
-
- void polish(QWidget*) override;
- void unpolish(QWidget*) override;
-
- void polish(QPalette &) override;
-*/
- void drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPainter *p) const override;
- void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p) const override;
- void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p) const override;
-
- QRect subElementRect(SubElement r, const QStyleOption *opt) const override;
- QSize sizeFromContents(ContentsType ct, const QStyleOption *opt, const QSize &contentsSize) const override;
-
- int pixelMetric(PixelMetric pm, const QStyleOption *option = nullptr) const override;
-
- int styleHint(StyleHint hint, const QStyleOption *opt = nullptr,
- QStyleHintReturn *returnData = nullptr) const override;
-
- QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt) const override;
-
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr) const override;
-
-protected:
-// bool eventFilter(QObject *o, QEvent *e) override;
- QWindowsStyle(QWindowsStylePrivate &dd);
-
-private:
- Q_DISABLE_COPY_MOVE(QWindowsStyle)
- Q_DECLARE_PRIVATE(QWindowsStyle)
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QQUICKWINDOWSSTYLE_P_H
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p_p.h b/src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p_p.h
deleted file mode 100644
index 64b95a40..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsstyle_p_p.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKWINDOWSSTYLE_P_P_H
-#define QQUICKWINDOWSSTYLE_P_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of XX. This header
-// file may change from version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qquickwindowsstyle_p.h"
-#include "qquickcommonstyle_p.h"
-#include "qquickstylehelper_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-class QStyleOptionButton;
-class QWindowsStylePrivate;
-
-#include <qlist.h>
-
-class QTime;
-
-class QWindowsStylePrivate : public QCommonStylePrivate
-{
- Q_DECLARE_PUBLIC(QWindowsStyle)
-public:
- enum { InvalidMetric = -23576 };
-
- QWindowsStylePrivate();
- static int pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *option = nullptr);
- static int fixedPixelMetric(QStyle::PixelMetric pm);
- static qreal devicePixelRatio(const QStyleOption *option = nullptr)
- {
- return devicePixelRatio(option ? option->window : nullptr);
- }
-
- static qreal devicePixelRatio(const QWindow *win)
- { return win ? win->devicePixelRatio() : QWindowsStylePrivate::appDevicePixelRatio(); }
- static qreal nativeMetricScaleFactor(const QStyleOption *option = nullptr);
- static qreal nativeMetricScaleFactor(const QWindow *win);
- static bool isDarkMode();
-
-#if 0
- bool hasSeenAlt(const QWidget *widget) const;
- bool altDown() const { return alt_down; }
- bool alt_down = false;
-#endif
- QList<const QWidget *> seenAlt;
- int menuBarTimer = 0;
-
- QColor inactiveCaptionText;
- QColor activeCaptionColor;
- QColor activeGradientCaptionColor;
- QColor inactiveCaptionColor;
- QColor inactiveGradientCaptionColor;
-
- enum {
- windowsItemFrame = 2, // menu item frame width
- windowsSepHeight = 9, // separator item height
- windowsItemHMargin = 3, // menu item hor text margin
- windowsItemVMargin = 2, // menu item ver text margin
- windowsArrowHMargin = 6, // arrow horizontal margin
- windowsRightBorder = 15, // right border on windows
- windowsCheckMarkWidth = 12 // checkmarks width on windows
- };
-
-private:
- static qreal appDevicePixelRatio();
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif //QQUICKWINDOWSSTYLE_P_P_H
-
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle.cpp b/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle.cpp
deleted file mode 100644
index 512f8291..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle.cpp
+++ /dev/null
@@ -1,2509 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickwindowsvistastyle_p.h"
-#include "qquickwindowsvistastyle_p_p.h"
-#include <qoperatingsystemversion.h>
-#include <qscreen.h>
-#include <qwindow.h>
-#include <private/qstyleanimation_p.h>
-#include <private/qstylehelper_p.h>
-#include <qpa/qplatformnativeinterface.h>
-
-QT_BEGIN_NAMESPACE
-
-static const int windowsItemFrame = 2; // menu item frame width
-static const int windowsItemHMargin = 3; // menu item hor text margin
-static const int windowsItemVMargin = 4; // menu item ver text margin
-static const int windowsArrowHMargin = 6; // arrow horizontal margin
-static const int windowsRightBorder = 15; // right border on windows
-
-#ifndef TMT_CONTENTMARGINS
-# define TMT_CONTENTMARGINS 3602
-#endif
-#ifndef TMT_SIZINGMARGINS
-# define TMT_SIZINGMARGINS 3601
-#endif
-#ifndef LISS_NORMAL
-# define LISS_NORMAL 1
-# define LISS_HOT 2
-# define LISS_SELECTED 3
-# define LISS_DISABLED 4
-# define LISS_SELECTEDNOTFOCUS 5
-# define LISS_HOTSELECTED 6
-#endif
-#ifndef BP_COMMANDLINK
-# define BP_COMMANDLINK 6
-# define BP_COMMANDLINKGLYPH 7
-# define CMDLGS_NORMAL 1
-# define CMDLGS_HOT 2
-# define CMDLGS_PRESSED 3
-# define CMDLGS_DISABLED 4
-#endif
-
-/* \internal
- Checks if we should use Vista style , or if we should
- fall back to Windows style.
-*/
-bool QWindowsVistaStylePrivate::useVista()
-{
- return QWindowsVistaStylePrivate::useXP();
-}
-
-/* \internal
- Checks and returns the style object
-*/
-inline QObject *styleObject(const QStyleOption *option) {
- return option ? option->styleObject : nullptr;
-}
-
-/* \internal
- Checks if we can animate on a style option
-*/
-bool canAnimate(const QStyleOption *option) {
- return option
- && option->styleObject
- && !option->styleObject->property("_q_no_animation").toBool();
-}
-
-static inline QImage createAnimationBuffer(const QStyleOption *option, const QWidget *widget)
-{
- const int devicePixelRatio = widget ? widget->devicePixelRatio() : 1;
- QImage result(option->rect.size() * devicePixelRatio, QImage::Format_ARGB32_Premultiplied);
- result.setDevicePixelRatio(devicePixelRatio);
- result.fill(0);
- return result;
-}
-
-/* \internal
- Used by animations to clone a styleoption and shift its offset
-*/
-QStyleOption *clonedAnimationStyleOption(const QStyleOption*option) {
- QStyleOption *styleOption = nullptr;
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider*>(option))
- styleOption = new QStyleOptionSlider(*slider);
- else if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox*>(option))
- styleOption = new QStyleOptionSpinBox(*spinbox);
- else if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox*>(option))
- styleOption = new QStyleOptionGroupBox(*groupBox);
- else if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox*>(option))
- styleOption = new QStyleOptionComboBox(*combo);
- else if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option))
- styleOption = new QStyleOptionButton(*button);
- else
- styleOption = new QStyleOption(*option);
- styleOption->rect = QRect(QPoint(0,0), option->rect.size());
- return styleOption;
-}
-
-/* \internal
- Used by animations to delete cloned styleoption
-*/
-void deleteClonedAnimationStyleOption(const QStyleOption *option)
-{
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider*>(option))
- delete slider;
- else if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox*>(option))
- delete spinbox;
- else if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox*>(option))
- delete groupBox;
- else if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox*>(option))
- delete combo;
- else if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option))
- delete button;
- else
- delete option;
-}
-
-/*!
- \class QWindowsVistaStyle
- \brief The QWindowsVistaStyle class provides a look and feel suitable for applications on Microsoft Windows Vista.
- \since 4.3
- \ingroup appearance
- \inmodule QtWidgets
- \internal
-
- \warning This style is only available on the Windows Vista platform
- because it makes use of Windows Vista's style engine.
-
- \sa QMacStyle, QWindowsXPStyle, QFusionStyle
-*/
-
-/*!
- Constructs a QWindowsVistaStyle object.
-*/
-QWindowsVistaStyle::QWindowsVistaStyle()
- : QWindowsXPStyle(*new QWindowsVistaStylePrivate)
-{
-}
-
-/*!
- Destructor.
-*/
-QWindowsVistaStyle::~QWindowsVistaStyle() = default;
-
-//convert Qt state flags to uxtheme button states
-static int buttonStateId(int flags, int partId)
-{
- int stateId = 0;
- if (partId == BP_RADIOBUTTON || partId == BP_CHECKBOX) {
- if (!(flags & QStyle::State_Enabled))
- stateId = RBS_UNCHECKEDDISABLED;
- else if (flags & QStyle::State_Sunken)
- stateId = RBS_UNCHECKEDPRESSED;
- else if (flags & QStyle::State_MouseOver)
- stateId = RBS_UNCHECKEDHOT;
- else
- stateId = RBS_UNCHECKEDNORMAL;
-
- if (flags & QStyle::State_On)
- stateId += RBS_CHECKEDNORMAL-1;
-
- } else if (partId == BP_PUSHBUTTON) {
- if (!(flags & QStyle::State_Enabled))
- stateId = PBS_DISABLED;
- else if (flags & (QStyle::State_Sunken | QStyle::State_On))
- stateId = PBS_PRESSED;
- else if (flags & QStyle::State_MouseOver)
- stateId = PBS_HOT;
- else
- stateId = PBS_NORMAL;
- } else {
- Q_ASSERT(1);
- }
- return stateId;
-}
-
-bool QWindowsVistaAnimation::isUpdateNeeded() const
-{
- return QWindowsVistaStylePrivate::useVista();
-}
-
-void QWindowsVistaAnimation::paint(QPainter *painter, const QStyleOption *option)
-{
- painter->drawImage(option->rect, currentImage());
-}
-
-static inline bool supportsStateTransition(QStyle::PrimitiveElement element,
- const QStyleOption *option,
- const QWidget *widget)
-{
- bool result = false;
- switch (element) {
- case QStyle::PE_IndicatorRadioButton:
- case QStyle::PE_IndicatorCheckBox:
- result = true;
- break;
- // QTBUG-40634, do not animate when color is set in palette for PE_PanelLineEdit.
- case QStyle::PE_FrameLineEdit:
- result = !QWindowsXPStylePrivate::isLineEditBaseColorSet(option, widget);
- break;
- default:
- break;
- }
- return result;
-}
-
-/*!
- \internal
-
- Animations are used for some state transitions on specific widgets.
-
- Only one running animation can exist for a widget at any specific
- time. Animations can be added through
- QWindowsVistaStylePrivate::startAnimation(Animation *) and any
- existing animation on a widget can be retrieved with
- QWindowsVistaStylePrivate::widgetAnimation(Widget *).
-
- Once an animation has been started,
- QWindowsVistaStylePrivate::timerEvent(QTimerEvent *) will
- continuously call update() on the widget until it is stopped,
- meaning that drawPrimitive will be called many times until the
- transition has completed. During this time, the result will be
- retrieved by the Animation::paint(...) function and not by the style
- itself.
-
- To determine if a transition should occur, the style needs to know
- the previous state of the widget as well as the current one. This is
- solved by updating dynamic properties on the widget every time the
- function is called.
-
- Transitions interrupting existing transitions should always be
- smooth, so whenever a hover-transition is started on a pulsating
- button, it uses the current frame of the pulse-animation as the
- starting image for the hover transition.
-
- */
-
-void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
-{
- QWindowsVistaStylePrivate *d = const_cast<QWindowsVistaStylePrivate*>(d_func());
-
- int state = option->state;
- if (!QWindowsVistaStylePrivate::useVista()) {
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
- return;
- }
-
- if ((option->state & State_Enabled) && d->transitionsEnabled() && canAnimate(option)) {
- {
- QRect oldRect;
- QRect newRect;
-
- if (supportsStateTransition(element, option, widget)) {
- // Retrieve and update the dynamic properties tracking
- // the previous state of the widget:
- QObject *styleObject = option->styleObject;
- styleObject->setProperty("_q_no_animation", true);
-
- int oldState = styleObject->property("_q_stylestate").toInt();
- oldRect = styleObject->property("_q_stylerect").toRect();
- newRect = option->rect;
- styleObject->setProperty("_q_stylestate", int(option->state));
- styleObject->setProperty("_q_stylerect", option->rect);
-
- bool doTransition = oldState &&
- ((state & State_Sunken) != (oldState & State_Sunken) ||
- (state & State_On) != (oldState & State_On) ||
- (state & State_MouseOver) != (oldState & State_MouseOver));
-
- if (oldRect != newRect ||
- (state & State_Enabled) != (oldState & State_Enabled) ||
- (state & State_Active) != (oldState & State_Active))
- d->stopAnimation(styleObject);
-
- if (option->state & State_ReadOnly && element == PE_FrameLineEdit) // Do not animate read only line edits
- doTransition = false;
-
- if (doTransition) {
- QStyleOption *styleOption = clonedAnimationStyleOption(option);
- styleOption->state = QStyle::State(oldState);
-
- QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject));
- QWindowsVistaTransition *t = new QWindowsVistaTransition(styleObject);
-
- // We create separate images for the initial and final transition states and store them in the
- // Transition object.
- QImage startImage = createAnimationBuffer(option, widget);
- QPainter startPainter(&startImage);
-
- QImage endImage = createAnimationBuffer(option, widget);
- QPainter endPainter(&endImage);
-
- // If we have a running animation on the widget already, we will use that to paint the initial
- // state of the new transition, this ensures a smooth transition from a current animation such as a
- // pulsating default button into the intended target state.
- if (!anim)
- proxy()->drawPrimitive(element, styleOption, &startPainter, widget);
- else
- anim->paint(&startPainter, styleOption);
-
- t->setStartImage(startImage);
-
- // The end state of the transition is simply the result we would have painted
- // if the style was not animated.
- styleOption->styleObject = nullptr;
- styleOption->state = option->state;
- proxy()->drawPrimitive(element, styleOption, &endPainter, widget);
-
-
- t->setEndImage(endImage);
-
- HTHEME theme;
- int partId;
- DWORD duration;
- int fromState = 0;
- int toState = 0;
-
- //translate state flags to UXTHEME states :
- if (element == PE_FrameLineEdit) {
- theme = OpenThemeData(nullptr, L"Edit");
- partId = EP_EDITBORDER_NOSCROLL;
-
- if (oldState & State_MouseOver)
- fromState = ETS_HOT;
- else if (oldState & State_HasFocus)
- fromState = ETS_FOCUSED;
- else
- fromState = ETS_NORMAL;
-
- if (state & State_MouseOver)
- toState = ETS_HOT;
- else if (state & State_HasFocus)
- toState = ETS_FOCUSED;
- else
- toState = ETS_NORMAL;
-
- } else {
- theme = OpenThemeData(nullptr, L"Button");
- if (element == PE_IndicatorRadioButton)
- partId = BP_RADIOBUTTON;
- else if (element == PE_IndicatorCheckBox)
- partId = BP_CHECKBOX;
- else
- partId = BP_PUSHBUTTON;
-
- fromState = buttonStateId(oldState, partId);
- toState = buttonStateId(option->state, partId);
- }
-
- // Retrieve the transition time between the states from the system.
- if (theme
- && SUCCEEDED(GetThemeTransitionDuration(theme, partId, fromState, toState,
- TMT_TRANSITIONDURATIONS, &duration))) {
- t->setDuration(int(duration));
- }
- t->setStartTime(QTime::currentTime());
-
- deleteClonedAnimationStyleOption(styleOption);
- d->startAnimation(t);
- }
- styleObject->setProperty("_q_no_animation", false);
- }
-
- } // End of animation part
- }
-
- QRect rect = option->rect;
-
- switch (element) {
- case PE_IndicatorHeaderArrow:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- int stateId = HSAS_SORTEDDOWN;
- if (header->sortIndicator & QStyleOptionHeader::SortDown)
- stateId = HSAS_SORTEDUP; //note that the uxtheme sort down indicator is the inverse of ours
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::HeaderTheme,
- HP_HEADERSORTARROW, stateId, option->rect);
- d->drawBackground(theme);
- }
- break;
-
- case PE_IndicatorBranch:
- {
- XPThemeData theme(widget, painter, QWindowsXPStylePrivate::VistaTreeViewTheme);
- static int decoration_size = 0;
- if (!decoration_size && theme.isValid()) {
- XPThemeData themeSize = theme;
- themeSize.partId = TVP_HOTGLYPH;
- themeSize.stateId = GLPS_OPENED;
- const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- decoration_size = qRound(qMax(size.width(), size.height()));
- }
- int mid_h = option->rect.x() + option->rect.width() / 2;
- int mid_v = option->rect.y() + option->rect.height() / 2;
- int bef_h = mid_h;
- int bef_v = mid_v;
- int aft_h = mid_h;
- int aft_v = mid_v;
- if (option->state & State_Children) {
- int delta = decoration_size / 2;
- theme.rect = QRect(bef_h - delta, bef_v - delta, decoration_size, decoration_size);
- theme.partId = option->state & State_MouseOver ? TVP_HOTGLYPH : TVP_GLYPH;
- theme.stateId = option->state & QStyle::State_Open ? GLPS_OPENED : GLPS_CLOSED;
- if (option->direction == Qt::RightToLeft)
- theme.mirrorHorizontally = true;
- d->drawBackground(theme);
- bef_h -= delta + 2;
- bef_v -= delta + 2;
- aft_h += delta - 2;
- aft_v += delta - 2;
- }
-#if 0
- QBrush brush(option->palette.dark().color(), Qt::Dense4Pattern);
- if (option->state & State_Item) {
- if (option->direction == Qt::RightToLeft)
- painter->fillRect(option->rect.left(), mid_v, bef_h - option->rect.left(), 1, brush);
- else
- painter->fillRect(aft_h, mid_v, option->rect.right() - aft_h + 1, 1, brush);
- }
- if (option->state & State_Sibling && option->rect.bottom() > aft_v)
- painter->fillRect(mid_h, aft_v, 1, option->rect.bottom() - aft_v + 1, brush);
- if (option->state & (State_Open | State_Children | State_Item | State_Sibling) && (bef_v > option->rect.y()))
- painter->fillRect(mid_h, option->rect.y(), 1, bef_v - option->rect.y(), brush);
-#endif
- }
- break;
-
- case PE_PanelButtonBevel:
- case PE_IndicatorCheckBox:
- case PE_IndicatorRadioButton:
- {
- if (QWindowsVistaAnimation *a =
- qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject(option)))){
- a->paint(painter, option);
- } else {
- QWindowsXPStyle::drawPrimitive(element, option, painter, widget);
- }
- }
- break;
-
- case PE_FrameMenu:
- {
- int stateId = option->state & State_Active ? MB_ACTIVE : MB_INACTIVE;
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPBORDERS, stateId, option->rect);
- d->drawBackground(theme);
- }
- break;
- case PE_Frame: {
-#ifndef QT_NO_ACCESSIBILITY
- if (QStyleHelper::isInstanceOf(option->styleObject, QAccessible::EditableText)
- || QStyleHelper::isInstanceOf(option->styleObject, QAccessible::StaticText) ||
-#else
- if (
-#endif
- (widget && widget->inherits("QTextEdit"))) {
- painter->save();
- int stateId = ETS_NORMAL;
- if (!(state & State_Enabled))
- stateId = ETS_DISABLED;
- else if (state & State_ReadOnly)
- stateId = ETS_READONLY;
- else if (state & State_HasFocus)
- stateId = ETS_SELECTED;
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::EditTheme,
- EP_EDITBORDER_HVSCROLL, stateId, option->rect);
- // Since EP_EDITBORDER_HVSCROLL does not us borderfill, theme.noContent cannot be used for clipping
- int borderSize = 1;
- GetThemeInt(theme.handle(), theme.partId, theme.stateId, TMT_BORDERSIZE, &borderSize);
- QRegion clipRegion = option->rect;
- QRegion content = option->rect.adjusted(borderSize, borderSize, -borderSize, -borderSize);
- clipRegion ^= content;
- painter->setClipRegion(clipRegion);
- d->drawBackground(theme);
- painter->restore();
- } else {
- QWindowsXPStyle::drawPrimitive(element, option, painter, widget);
- }
- }
- break;
-
- case PE_PanelLineEdit:
- if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- bool isEnabled = option->state & State_Enabled;
- if (QWindowsXPStylePrivate::isLineEditBaseColorSet(option, widget)) {
- painter->fillRect(panel->rect, panel->palette.brush(QPalette::Base));
- } else {
- int partId = EP_BACKGROUND;
- int stateId = EBS_NORMAL;
- if (!isEnabled)
- stateId = EBS_DISABLED;
- else if (state & State_ReadOnly)
- stateId = EBS_READONLY;
- else if (state & State_MouseOver)
- stateId = EBS_HOT;
-
- XPThemeData theme(nullptr, painter, QWindowsXPStylePrivate::EditTheme,
- partId, stateId, rect);
- if (!theme.isValid()) {
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
- return;
- }
- int bgType;
- GetThemeEnumValue(theme.handle(), partId, stateId, TMT_BGTYPE, &bgType);
- if ( bgType == BT_IMAGEFILE ) {
- d->drawBackground(theme);
- } else {
- QBrush fillColor = option->palette.brush(QPalette::Base);
- if (!isEnabled) {
- PROPERTYORIGIN origin = PO_NOTFOUND;
- GetThemePropertyOrigin(theme.handle(), theme.partId, theme.stateId, TMT_FILLCOLOR, &origin);
- // Use only if the fill property comes from our part
- if ((origin == PO_PART || origin == PO_STATE)) {
- COLORREF bgRef;
- GetThemeColor(theme.handle(), partId, stateId, TMT_FILLCOLOR, &bgRef);
- fillColor = QBrush(qRgb(GetRValue(bgRef), GetGValue(bgRef), GetBValue(bgRef)));
- }
- }
- painter->fillRect(option->rect, fillColor);
- }
- }
- if (panel->lineWidth > 0)
- proxy()->drawPrimitive(PE_FrameLineEdit, panel, painter, widget);
- return;
- }
- break;
-
- case PE_FrameLineEdit:
- if (QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject(option)))) {
- anim->paint(painter, option);
- } else {
- QPainter *p = painter;
- if (QWindowsXPStylePrivate::isItemViewDelegateLineEdit(widget)) {
- // we try to check if this lineedit is a delegate on a QAbstractItemView-derived class.
- QPen oldPen = p->pen();
- // Inner white border
- p->setPen(QPen(option->palette.base().color(), 1));
- p->drawRect(option->rect.adjusted(1, 1, -2, -2));
- // Outer dark border
- p->setPen(QPen(option->palette.shadow().color(), 1));
- p->drawRect(option->rect.adjusted(0, 0, -1, -1));
- p->setPen(oldPen);
- return;
- }
- int stateId = ETS_NORMAL;
- if (!(state & State_Enabled))
- stateId = ETS_DISABLED;
- else if (state & State_ReadOnly)
- stateId = ETS_READONLY;
- else if (state & State_MouseOver)
- stateId = ETS_HOT;
- else if (state & State_HasFocus)
- stateId = ETS_SELECTED;
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::EditTheme,
- EP_EDITBORDER_NOSCROLL, stateId, option->rect);
- theme.noContent = true;
- painter->save();
- QRegion clipRegion = option->rect;
- clipRegion -= option->rect.adjusted(2, 2, -2, -2);
- painter->setClipRegion(clipRegion);
- d->drawBackground(theme);
- painter->restore();
- }
- break;
-
- case PE_IndicatorToolBarHandle:
- {
- XPThemeData theme;
- QRect rect;
- if (option->state & State_Horizontal) {
- theme = XPThemeData(widget, painter,
- QWindowsXPStylePrivate::RebarTheme,
- RP_GRIPPER, ETS_NORMAL, option->rect.adjusted(0, 1, -2, -2));
- rect = option->rect.adjusted(0, 1, 0, -2);
- rect.setWidth(4);
- } else {
- theme = XPThemeData(widget, painter, QWindowsXPStylePrivate::RebarTheme,
- RP_GRIPPERVERT, ETS_NORMAL, option->rect.adjusted(0, 1, -2, -2));
- rect = option->rect.adjusted(1, 0, -1, 0);
- rect.setHeight(4);
- }
- theme.rect = rect;
- d->drawBackground(theme);
- }
- break;
-
- case PE_IndicatorToolBarSeparator:
- {
- QPen pen = painter->pen();
- int margin = 3;
- painter->setPen(option->palette.window().color().darker(114));
- if (option->state & State_Horizontal) {
- int x1 = option->rect.center().x();
- painter->drawLine(QPoint(x1, option->rect.top() + margin), QPoint(x1, option->rect.bottom() - margin));
- } else {
- int y1 = option->rect.center().y();
- painter->drawLine(QPoint(option->rect.left() + margin, y1), QPoint(option->rect.right() - margin, y1));
- }
- painter->setPen(pen);
- }
- break;
-
- case PE_PanelTipLabel: {
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::ToolTipTheme,
- TTP_STANDARD, TTSS_NORMAL, option->rect);
- d->drawBackground(theme);
- break;
- }
-
- case PE_PanelItemViewItem:
- {
- const QStyleOptionViewItem *vopt;
- bool newStyle = true;
- QAbstractItemView::SelectionBehavior selectionBehavior = QAbstractItemView::SelectRows;
- QAbstractItemView::SelectionMode selectionMode = QAbstractItemView::NoSelection;
- if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget)) {
- newStyle = !qobject_cast<const QTableView*>(view);
- selectionBehavior = view->selectionBehavior();
- selectionMode = view->selectionMode();
-#ifndef QT_NO_ACCESSIBILITY
- } else if (!widget) {
- newStyle = !QStyleHelper::hasAncestor(option->styleObject, QAccessible::MenuItem) ;
-#endif
- }
-
- if (newStyle && (vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option))) {
- bool selected = vopt->state & QStyle::State_Selected;
- const bool hover = selectionMode != QAbstractItemView::NoSelection && (vopt->state & QStyle::State_MouseOver);
- bool active = vopt->state & QStyle::State_Active;
-
- if (vopt->features & QStyleOptionViewItem::Alternate)
- painter->fillRect(vopt->rect, vopt->palette.alternateBase());
-
- QPalette::ColorGroup cg = vopt->state & QStyle::State_Enabled
- ? QPalette::Normal : QPalette::Disabled;
- if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active))
- cg = QPalette::Inactive;
-
- QRect itemRect = subElementRect(QStyle::SE_ItemViewItemFocusRect, option, widget).adjusted(-1, 0, 1, 0);
- itemRect.setTop(vopt->rect.top());
- itemRect.setBottom(vopt->rect.bottom());
-
- QSize sectionSize = itemRect.size();
- if (vopt->showDecorationSelected)
- sectionSize = vopt->rect.size();
-
- if (selectionBehavior == QAbstractItemView::SelectRows)
- sectionSize.setWidth(vopt->rect.width());
- QPixmap pixmap;
-
- if (vopt->backgroundBrush.style() != Qt::NoBrush) {
- const QPointF oldBrushOrigin = painter->brushOrigin();
- painter->setBrushOrigin(vopt->rect.topLeft());
- painter->fillRect(vopt->rect, vopt->backgroundBrush);
- painter->setBrushOrigin(oldBrushOrigin);
- }
-
- if (hover || selected) {
- if (sectionSize.width() > 0 && sectionSize.height() > 0) {
- QString key = QString::fromLatin1("qvdelegate-%1-%2-%3-%4-%5").arg(sectionSize.width())
- .arg(sectionSize.height()).arg(selected).arg(active).arg(hover);
- if (!QPixmapCache::find(key, &pixmap)) {
- pixmap = QPixmap(sectionSize);
- pixmap.fill(Qt::transparent);
-
- int state;
- if (selected && hover)
- state = LISS_HOTSELECTED;
- else if (selected && !active)
- state = LISS_SELECTEDNOTFOCUS;
- else if (selected)
- state = LISS_SELECTED;
- else
- state = LISS_HOT;
-
- QPainter pixmapPainter(&pixmap);
- XPThemeData theme(widget, &pixmapPainter,
- QWindowsXPStylePrivate::VistaTreeViewTheme,
- LVP_LISTITEM, state, QRect(0, 0, sectionSize.width(), sectionSize.height()));
- if (theme.isValid()) {
- d->drawBackground(theme);
- } else {
- QWindowsXPStyle::drawPrimitive(PE_PanelItemViewItem, option, painter, widget);
- break;
- }
- QPixmapCache::insert(key, pixmap);
- }
- }
-
- if (vopt->showDecorationSelected) {
- const int frame = 2; //Assumes a 2 pixel pixmap border
- QRect srcRect = QRect(0, 0, sectionSize.width(), sectionSize.height());
- QRect pixmapRect = vopt->rect;
- bool reverse = vopt->direction == Qt::RightToLeft;
- bool leftSection = vopt->viewItemPosition == QStyleOptionViewItem::Beginning;
- bool rightSection = vopt->viewItemPosition == QStyleOptionViewItem::End;
- if (vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne
- || vopt->viewItemPosition == QStyleOptionViewItem::Invalid)
- painter->drawPixmap(pixmapRect.topLeft(), pixmap);
- else if (reverse ? rightSection : leftSection){
- painter->drawPixmap(QRect(pixmapRect.topLeft(),
- QSize(frame, pixmapRect.height())), pixmap,
- QRect(QPoint(0, 0), QSize(frame, pixmapRect.height())));
- painter->drawPixmap(pixmapRect.adjusted(frame, 0, 0, 0),
- pixmap, srcRect.adjusted(frame, 0, -frame, 0));
- } else if (reverse ? leftSection : rightSection) {
- painter->drawPixmap(QRect(pixmapRect.topRight() - QPoint(frame - 1, 0),
- QSize(frame, pixmapRect.height())), pixmap,
- QRect(QPoint(pixmapRect.width() - frame, 0),
- QSize(frame, pixmapRect.height())));
- painter->drawPixmap(pixmapRect.adjusted(0, 0, -frame, 0),
- pixmap, srcRect.adjusted(frame, 0, -frame, 0));
- } else if (vopt->viewItemPosition == QStyleOptionViewItem::Middle)
- painter->drawPixmap(pixmapRect, pixmap,
- srcRect.adjusted(frame, 0, -frame, 0));
- } else {
- if (vopt->text.isEmpty() && vopt->icon.isNull())
- break;
- painter->drawPixmap(itemRect.topLeft(), pixmap);
- }
- }
- } else {
- QWindowsXPStyle::drawPrimitive(element, option, painter, widget);
- }
- break;
- }
- case PE_Widget:
- {
-#if QT_CONFIG(dialogbuttonbox)
- const QDialogButtonBox *buttonBox = nullptr;
-
- if (qobject_cast<const QMessageBox *> (widget))
- buttonBox = widget->findChild<const QDialogButtonBox *>(QLatin1String("qt_msgbox_buttonbox"));
-#if QT_CONFIG(inputdialog)
- else if (qobject_cast<const QInputDialog *> (widget))
- buttonBox = widget->findChild<const QDialogButtonBox *>(QLatin1String("qt_inputdlg_buttonbox"));
-#endif // QT_CONFIG(inputdialog)
-
- if (buttonBox) {
- //draw white panel part
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::TaskDialogTheme,
- TDLG_PRIMARYPANEL, 0, option->rect);
- QRect toprect = option->rect;
- toprect.setBottom(buttonBox->geometry().top());
- theme.rect = toprect;
- d->drawBackground(theme);
-
- //draw bottom panel part
- QRect buttonRect = option->rect;
- buttonRect.setTop(buttonBox->geometry().top());
- theme.rect = buttonRect;
- theme.partId = TDLG_SECONDARYPANEL;
- d->drawBackground(theme);
- }
-#endif
- }
- break;
- default:
- QWindowsXPStyle::drawPrimitive(element, option, painter, widget);
- break;
- }
-}
-
-
-/*!
- \internal
-
- see drawPrimitive for comments on the animation support
- */
-void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
-{
- QWindowsVistaStylePrivate *d = const_cast<QWindowsVistaStylePrivate*>(d_func());
-
- if (!QWindowsVistaStylePrivate::useVista()) {
- QWindowsStyle::drawControl(element, option, painter, widget);
- return;
- }
-
- bool selected = option->state & State_Selected;
- bool pressed = option->state & State_Sunken;
- bool disabled = !(option->state & State_Enabled);
-
- int state = option->state;
- int themeNumber = -1;
-
- QRect rect(option->rect);
- State flags = option->state;
- int partId = 0;
- int stateId = 0;
-
- if (d->transitionsEnabled() && canAnimate(option))
- {
- if (element == CE_PushButtonBevel) {
- QRect oldRect;
- QRect newRect;
-
- QObject *styleObject = option->styleObject;
-
- int oldState = styleObject->property("_q_stylestate").toInt();
- oldRect = styleObject->property("_q_stylerect").toRect();
- newRect = option->rect;
- styleObject->setProperty("_q_stylestate", int(option->state));
- styleObject->setProperty("_q_stylerect", option->rect);
-
- bool wasDefault = false;
- bool isDefault = false;
- if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- wasDefault = styleObject->property("_q_isdefault").toBool();
- isDefault = button->features & QStyleOptionButton::DefaultButton;
- styleObject->setProperty("_q_isdefault", isDefault);
- }
-
- bool doTransition = ((state & State_Sunken) != (oldState & State_Sunken) ||
- (state & State_On) != (oldState & State_On) ||
- (state & State_MouseOver) != (oldState & State_MouseOver));
-
- if (oldRect != newRect || (wasDefault && !isDefault)) {
- doTransition = false;
- d->stopAnimation(styleObject);
- }
-
- if (doTransition) {
- styleObject->setProperty("_q_no_animation", true);
-
- QWindowsVistaTransition *t = new QWindowsVistaTransition(styleObject);
- QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject));
- QStyleOption *styleOption = clonedAnimationStyleOption(option);
- styleOption->state = QStyle::State(oldState);
-
- QImage startImage = createAnimationBuffer(option, widget);
- QPainter startPainter(&startImage);
-
- // Use current state of existing animation if already one is running
- if (!anim) {
- proxy()->drawControl(element, styleOption, &startPainter, widget);
- } else {
- anim->paint(&startPainter, styleOption);
- d->stopAnimation(styleObject);
- }
-
- t->setStartImage(startImage);
- QImage endImage = createAnimationBuffer(option, widget);
- QPainter endPainter(&endImage);
- styleOption->state = option->state;
- proxy()->drawControl(element, styleOption, &endPainter, widget);
- t->setEndImage(endImage);
-
-
- DWORD duration = 0;
- const HTHEME theme = OpenThemeData(nullptr, L"Button");
-
- int fromState = buttonStateId(oldState, BP_PUSHBUTTON);
- int toState = buttonStateId(option->state, BP_PUSHBUTTON);
- if (GetThemeTransitionDuration(theme, BP_PUSHBUTTON, fromState, toState, TMT_TRANSITIONDURATIONS, &duration) == S_OK)
- t->setDuration(int(duration));
- else
- t->setDuration(0);
- t->setStartTime(QTime::currentTime());
- styleObject->setProperty("_q_no_animation", false);
-
- deleteClonedAnimationStyleOption(styleOption);
- d->startAnimation(t);
- }
-
- QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject));
- if (anim) {
- anim->paint(painter, option);
- return;
- }
-
- }
- }
- switch (element) {
- case CE_PushButtonBevel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option))
- {
- themeNumber = QWindowsXPStylePrivate::ButtonTheme;
- partId = BP_PUSHBUTTON;
- if (btn->features & QStyleOptionButton::CommandLinkButton)
- partId = BP_COMMANDLINK;
- bool justFlat = (btn->features & QStyleOptionButton::Flat) && !(flags & (State_On|State_Sunken));
- if (!(flags & State_Enabled) && !(btn->features & QStyleOptionButton::Flat))
- stateId = PBS_DISABLED;
- else if (justFlat)
- ;
- else if (flags & (State_Sunken | State_On))
- stateId = PBS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = PBS_HOT;
- else if (btn->features & QStyleOptionButton::DefaultButton && (state & State_Active))
- stateId = PBS_DEFAULTED;
- else
- stateId = PBS_NORMAL;
-
- if (!justFlat) {
-
- if (d->transitionsEnabled() && (btn->features & QStyleOptionButton::DefaultButton) &&
- !(state & (State_Sunken | State_On)) && !(state & State_MouseOver) &&
- (state & State_Enabled) && (state & State_Active))
- {
- QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject(option)));
-
- if (!anim) {
- QImage startImage = createAnimationBuffer(option, widget);
- QImage alternateImage = createAnimationBuffer(option, widget);
-
- QWindowsVistaPulse *pulse = new QWindowsVistaPulse(styleObject(option));
-
- QPainter startPainter(&startImage);
- stateId = PBS_DEFAULTED;
- XPThemeData theme(widget, &startPainter, themeNumber, partId, stateId, rect);
- d->drawBackground(theme);
-
- QPainter alternatePainter(&alternateImage);
- theme.stateId = PBS_DEFAULTED_ANIMATING;
- theme.painter = &alternatePainter;
- d->drawBackground(theme);
- pulse->setStartImage(startImage);
- pulse->setEndImage(alternateImage);
- pulse->setStartTime(QTime::currentTime());
- pulse->setDuration(2000);
- d->startAnimation(pulse);
- anim = pulse;
- }
-
- if (anim)
- anim->paint(painter, option);
- else {
- XPThemeData theme(widget, painter, themeNumber, partId, stateId, rect);
- d->drawBackground(theme);
- }
- }
- else {
- XPThemeData theme(widget, painter, themeNumber, partId, stateId, rect);
- d->drawBackground(theme);
- }
- }
-
- if (btn->features & QStyleOptionButton::HasMenu) {
- int mbiw = 0, mbih = 0;
- XPThemeData theme(widget, nullptr, QWindowsXPStylePrivate::ToolBarTheme,
- TP_DROPDOWNBUTTON);
- if (theme.isValid()) {
- const QSizeF size = theme.size() * QStyleHelper::dpiScaled(1, option);
- if (!size.isEmpty()) {
- mbiw = qRound(size.width());
- mbih = qRound(size.height());
- }
- }
- QRect ir = subElementRect(SE_PushButtonContents, option, nullptr);
- QStyleOptionButton newBtn = *btn;
- newBtn.rect = QStyle::visualRect(option->direction, option->rect,
- QRect(ir.right() - mbiw - 2,
- option->rect.top() + (option->rect.height()/2) - (mbih/2),
- mbiw + 1, mbih + 1));
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget);
- }
- return;
- }
- break;
-
- case CE_ProgressBarContents:
- if (const QStyleOptionProgressBar *bar
- = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- bool isIndeterminate = (bar->minimum == 0 && bar->maximum == 0);
- const bool vertical = bar->orientation == Qt::Vertical;
- const bool inverted = bar->invertedAppearance;
-
- if (isIndeterminate || (bar->progress > 0 && (bar->progress < bar->maximum) && d->transitionsEnabled())) {
- if (!d->animation(styleObject(option)))
- d->startAnimation(new QProgressStyleAnimation(d->animationFps, styleObject(option)));
- } else {
- d->stopAnimation(styleObject(option));
- }
-
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::ProgressTheme,
- vertical ? PP_FILLVERT : PP_FILL);
- theme.rect = option->rect;
- bool reverse = (bar->direction == Qt::LeftToRight && inverted) || (bar->direction == Qt::RightToLeft && !inverted);
- QTime current = QTime::currentTime();
-
- if (isIndeterminate) {
- if (QProgressStyleAnimation *a = qobject_cast<QProgressStyleAnimation *>(d->animation(styleObject(option)))) {
- int glowSize = 120;
- int animationWidth = glowSize * 2 + (vertical ? theme.rect.height() : theme.rect.width());
- int animOffset = a->startTime().msecsTo(current) / 4;
- if (animOffset > animationWidth)
- a->setStartTime(QTime::currentTime());
- painter->save();
- painter->setClipRect(theme.rect);
- QRect animRect;
- QSize pixmapSize(14, 14);
- if (vertical) {
- animRect = QRect(theme.rect.left(),
- inverted ? rect.top() - glowSize + animOffset :
- rect.bottom() + glowSize - animOffset,
- rect.width(), glowSize);
- pixmapSize.setHeight(animRect.height());
- } else {
- animRect = QRect(rect.left() - glowSize + animOffset,
- rect.top(), glowSize, rect.height());
- animRect = QStyle::visualRect(reverse ? Qt::RightToLeft : Qt::LeftToRight,
- option->rect, animRect);
- pixmapSize.setWidth(animRect.width());
- }
- QString name = QString::fromLatin1("qiprogress-%1-%2").arg(pixmapSize.width()).arg(pixmapSize.height());
- QPixmap pixmap;
- if (!QPixmapCache::find(name, &pixmap)) {
- QImage image(pixmapSize, QImage::Format_ARGB32);
- image.fill(Qt::transparent);
- QPainter imagePainter(&image);
- theme.painter = &imagePainter;
- theme.partId = vertical ? PP_FILLVERT : PP_FILL;
- theme.rect = QRect(QPoint(0,0), animRect.size());
- QLinearGradient alphaGradient(0, 0, vertical ? 0 : image.width(),
- vertical ? image.height() : 0);
- alphaGradient.setColorAt(0, QColor(0, 0, 0, 0));
- alphaGradient.setColorAt(0.5, QColor(0, 0, 0, 220));
- alphaGradient.setColorAt(1, QColor(0, 0, 0, 0));
- imagePainter.fillRect(image.rect(), alphaGradient);
- imagePainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
- d->drawBackground(theme);
- imagePainter.end();
- pixmap = QPixmap::fromImage(image);
- QPixmapCache::insert(name, pixmap);
- }
- painter->drawPixmap(animRect, pixmap);
- painter->restore();
- }
- }
- else {
- qint64 progress = qMax<qint64>(bar->progress, bar->minimum); // workaround for bug in QProgressBar
-
- if (vertical) {
- int maxHeight = option->rect.height();
- int minHeight = 0;
- double vc6_workaround = ((progress - qint64(bar->minimum)) / qMax(double(1.0), double(qint64(bar->maximum) - qint64(bar->minimum))) * maxHeight);
- int height = isIndeterminate ? maxHeight: qMax(int(vc6_workaround), minHeight);
- theme.rect.setHeight(height);
- if (!inverted)
- theme.rect.moveTop(rect.height() - theme.rect.height());
- } else {
- int maxWidth = option->rect.width();
- int minWidth = 0;
- double vc6_workaround = ((progress - qint64(bar->minimum)) / qMax(double(1.0), double(qint64(bar->maximum) - qint64(bar->minimum))) * maxWidth);
- int width = isIndeterminate ? maxWidth : qMax(int(vc6_workaround), minWidth);
- theme.rect.setWidth(width);
- theme.rect = QStyle::visualRect(reverse ? Qt::RightToLeft : Qt::LeftToRight,
- option->rect, theme.rect);
- }
- d->drawBackground(theme);
-
- if (QProgressStyleAnimation *a = qobject_cast<QProgressStyleAnimation *>(d->animation(styleObject(option)))) {
- int glowSize = 140;
- int animationWidth = glowSize * 2 + (vertical ? theme.rect.height() : theme.rect.width());
- int animOffset = a->startTime().msecsTo(current) / 4;
- theme.partId = vertical ? PP_MOVEOVERLAYVERT : PP_MOVEOVERLAY;
- if (animOffset > animationWidth) {
- if (bar->progress < bar->maximum)
- a->setStartTime(QTime::currentTime());
- else
- d->stopAnimation(styleObject(option)); //we stop the glow motion only after it has
- //moved out of view
- }
- painter->save();
- painter->setClipRect(theme.rect);
- if (vertical) {
- theme.rect = QRect(theme.rect.left(),
- inverted ? rect.top() - glowSize + animOffset :
- rect.bottom() + glowSize - animOffset,
- rect.width(), glowSize);
- } else {
- theme.rect = QRect(rect.left() - glowSize + animOffset,rect.top(), glowSize, rect.height());
- theme.rect = QStyle::visualRect(reverse ? Qt::RightToLeft : Qt::LeftToRight, option->rect, theme.rect);
- }
- d->drawBackground(theme);
- painter->restore();
- }
- }
- }
- break;
-
- case CE_MenuBarItem:
- {
-
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option))
- {
- if (mbi->menuItemType == QStyleOptionMenuItem::DefaultItem)
- break;
-
- QPalette::ColorRole textRole = disabled ? QPalette::Text : QPalette::ButtonText;
- QPixmap pix = mbi->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option, widget), QIcon::Normal);
-
- int alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
- if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget))
- alignment |= Qt::TextHideMnemonic;
-
- if (widget && mbi->palette.color(QPalette::Window) != Qt::transparent) { // Not needed for QtQuick Controls
- //The rect adjustment is a workaround for the menu not really filling its background.
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_BARBACKGROUND, 0, option->rect.adjusted(-1, 0, 2, 1));
- d->drawBackground(theme);
- }
-
- int stateId = MBI_NORMAL;
- if (disabled)
- stateId = MBI_DISABLED;
- else if (pressed)
- stateId = MBI_PUSHED;
- else if (selected)
- stateId = MBI_HOT;
-
- XPThemeData theme2(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_BARITEM, stateId, option->rect);
- d->drawBackground(theme2);
-
- if (!pix.isNull())
- drawItemPixmap(painter, mbi->rect, alignment, pix);
- else
- drawItemText(painter, mbi->rect, alignment, mbi->palette, mbi->state & State_Enabled, mbi->text, textRole);
- }
- }
- break;
-#if QT_CONFIG(menu)
- case CE_MenuItem:
- if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- // windows always has a check column, regardless whether we have an icon or not
- const qreal factor = QWindowsXPStylePrivate::nativeMetricScaleFactor(widget);
- int checkcol = qRound(qreal(25) * factor);
- const int gutterWidth = qRound(qreal(3) * factor);
- {
- XPThemeData theme(widget, nullptr, QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPCHECKBACKGROUND, MBI_HOT);
- XPThemeData themeSize = theme;
- themeSize.partId = MENU_POPUPCHECK;
- themeSize.stateId = 0;
- const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- const QMarginsF margins = themeSize.margins() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- checkcol = qMax(menuitem->maxIconWidth, qRound(gutterWidth + size.width() + margins.left() + margins.right()));
- }
- QRect rect = option->rect;
-
- //draw vertical menu line
- if (option->direction == Qt::LeftToRight)
- checkcol += rect.x();
- QPoint p1 = QStyle::visualPos(option->direction, menuitem->rect, QPoint(checkcol, rect.top()));
- QPoint p2 = QStyle::visualPos(option->direction, menuitem->rect, QPoint(checkcol, rect.bottom()));
- QRect gutterRect(p1.x(), p1.y(), gutterWidth, p2.y() - p1.y() + 1);
- XPThemeData theme2(widget, painter, QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPGUTTER, stateId, gutterRect);
- d->drawBackground(theme2);
-
- int x, y, w, h;
- menuitem->rect.getRect(&x, &y, &w, &h);
- int tab = menuitem->tabWidth;
- bool dis = !(menuitem->state & State_Enabled);
- bool checked = menuitem->checkType != QStyleOptionMenuItem::NotCheckable
- ? menuitem->checked : false;
- bool act = menuitem->state & State_Selected;
-
- if (menuitem->menuItemType == QStyleOptionMenuItem::Separator) {
- int yoff = y-2 + h / 2;
- const int separatorSize = qRound(qreal(6) * QWindowsStylePrivate::nativeMetricScaleFactor(widget));
- QPoint p1 = QPoint(x + checkcol, yoff);
- QPoint p2 = QPoint(x + w + separatorSize, yoff);
- stateId = MBI_HOT;
- QRect subRect(p1.x() + (gutterWidth - menuitem->rect.x()), p1.y(),
- p2.x() - p1.x(), separatorSize);
- subRect = QStyle::visualRect(option->direction, option->rect, subRect );
- XPThemeData theme2(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPSEPARATOR, stateId, subRect);
- d->drawBackground(theme2);
- return;
- }
-
- QRect vCheckRect = visualRect(option->direction, menuitem->rect, QRect(menuitem->rect.x(),
- menuitem->rect.y(), checkcol - (gutterWidth + menuitem->rect.x()), menuitem->rect.height()));
-
- if (act) {
- stateId = dis ? MBI_DISABLED : MBI_HOT;
- XPThemeData theme2(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPITEM, stateId, option->rect);
- d->drawBackground(theme2);
- }
-
- if (checked) {
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPCHECKBACKGROUND,
- menuitem->icon.isNull() ? MBI_HOT : MBI_PUSHED, vCheckRect);
- XPThemeData themeSize = theme;
- themeSize.partId = MENU_POPUPCHECK;
- themeSize.stateId = 0;
- const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- const QMarginsF margins = themeSize.margins() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- QRect checkRect(0, 0, qRound(size.width() + margins.left() + margins.right()),
- qRound(size.height() + margins.bottom() + margins.top()));
- checkRect.moveCenter(vCheckRect.center());
- theme.rect = checkRect;
-
- d->drawBackground(theme);
-
- if (menuitem->icon.isNull()) {
- checkRect = QRect(QPoint(0, 0), size.toSize());
- checkRect.moveCenter(theme.rect.center());
- theme.rect = checkRect;
-
- theme.partId = MENU_POPUPCHECK;
- bool bullet = menuitem->checkType & QStyleOptionMenuItem::Exclusive;
- if (dis)
- theme.stateId = bullet ? MC_BULLETDISABLED: MC_CHECKMARKDISABLED;
- else
- theme.stateId = bullet ? MC_BULLETNORMAL: MC_CHECKMARKNORMAL;
- d->drawBackground(theme);
- }
- }
-
- if (!menuitem->icon.isNull()) {
- QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
- if (act && !dis)
- mode = QIcon::Active;
- QPixmap pixmap;
- if (checked)
- pixmap = menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option, widget), mode, QIcon::On);
- else
- pixmap = menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option, widget), mode);
- const int pixw = pixmap.width() / pixmap.devicePixelRatio();
- const int pixh = pixmap.height() / pixmap.devicePixelRatio();
- QRect pmr(0, 0, pixw, pixh);
- pmr.moveCenter(vCheckRect.center());
- painter->setPen(menuitem->palette.text().color());
- painter->drawPixmap(pmr.topLeft(), pixmap);
- }
-
- painter->setPen(menuitem->palette.buttonText().color());
-
- const QColor textColor = menuitem->palette.text().color();
- if (dis)
- painter->setPen(textColor);
-
- int xm = windowsItemFrame + checkcol + windowsItemHMargin + (gutterWidth - menuitem->rect.x()) - 1;
- int xpos = menuitem->rect.x() + xm;
- QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin);
- QRect vTextRect = visualRect(option->direction, menuitem->rect, textRect);
- QString s = menuitem->text;
- if (!s.isEmpty()) { // draw text
- painter->save();
- int t = s.indexOf(QLatin1Char('\t'));
- int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
- if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem, widget))
- text_flags |= Qt::TextHideMnemonic;
- text_flags |= Qt::AlignLeft;
- if (t >= 0) {
- QRect vShortcutRect = visualRect(option->direction, menuitem->rect,
- QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom())));
- painter->drawText(vShortcutRect, text_flags, s.mid(t + 1));
- s = s.left(t);
- }
- QFont font = menuitem->font;
- if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
- font.setBold(true);
- painter->setFont(font);
- painter->setPen(textColor);
- painter->drawText(vTextRect, text_flags, s.left(t));
- painter->restore();
- }
- if (menuitem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow
- int dim = (h - 2 * windowsItemFrame) / 2;
- PrimitiveElement arrow;
- arrow = (option->direction == Qt::RightToLeft) ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight;
- xpos = x + w - windowsArrowHMargin - windowsItemFrame - dim;
- QRect vSubMenuRect = visualRect(option->direction, menuitem->rect, QRect(xpos, y + h / 2 - dim / 2, dim, dim));
- QStyleOptionMenuItem newMI = *menuitem;
- newMI.rect = vSubMenuRect;
- newMI.state = dis ? State_None : State_Enabled;
- proxy()->drawPrimitive(arrow, &newMI, painter, widget);
- }
- }
- break;
-#endif // QT_CONFIG(menu)
- case CE_HeaderSection:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- partId = HP_HEADERITEM;
- if (flags & State_Sunken)
- stateId = HIS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = HIS_HOT;
- else
- stateId = HIS_NORMAL;
-
- if (header->sortIndicator != QStyleOptionHeader::None)
- stateId += 3;
-
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::HeaderTheme,
- partId, stateId, option->rect);
- d->drawBackground(theme);
- }
- break;
- case CE_MenuBarEmptyArea:
- {
- stateId = MBI_NORMAL;
- if (!(state & State_Enabled))
- stateId = MBI_DISABLED;
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_BARBACKGROUND, stateId, option->rect);
- d->drawBackground(theme);
- }
- break;
- case CE_ToolBar:
- if (const QStyleOptionToolBar *toolbar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) {
- QPalette pal = option->palette;
- pal.setColor(QPalette::Dark, option->palette.window().color().darker(130));
- QStyleOptionToolBar copyOpt = *toolbar;
- copyOpt.palette = pal;
- QWindowsStyle::drawControl(element, &copyOpt, painter, widget);
- }
- break;
-#if QT_CONFIG(dockwidget)
- case CE_DockWidgetTitle:
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) {
- const QDockWidget *dockWidget = qobject_cast<const QDockWidget *>(widget);
- QRect rect = option->rect;
- if (dockWidget && dockWidget->isFloating()) {
- QWindowsXPStyle::drawControl(element, option, painter, widget);
- break; //otherwise fall through
- }
-
- const bool verticalTitleBar = dwOpt->verticalTitleBar;
-
- if (verticalTitleBar) {
- rect = rect.transposed();
-
- painter->translate(rect.left() - 1, rect.top() + rect.width());
- painter->rotate(-90);
- painter->translate(-rect.left() + 1, -rect.top());
- }
-
- painter->setBrush(option->palette.window().color().darker(110));
- painter->setPen(option->palette.window().color().darker(130));
- painter->drawRect(rect.adjusted(0, 1, -1, -3));
-
- int buttonMargin = 4;
- int mw = proxy()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, dwOpt, widget);
- int fw = proxy()->pixelMetric(PM_DockWidgetFrameWidth, dwOpt, widget);
- const QDockWidget *dw = qobject_cast<const QDockWidget *>(widget);
- bool isFloating = dw && dw->isFloating();
-
- QRect r = option->rect.adjusted(0, 2, -1, -3);
- QRect titleRect = r;
-
- if (dwOpt->closable) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarCloseButton, dwOpt, widget).actualSize(QSize(10, 10));
- titleRect.adjust(0, 0, -sz.width() - mw - buttonMargin, 0);
- }
-
- if (dwOpt->floatable) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarMaxButton, dwOpt, widget).actualSize(QSize(10, 10));
- titleRect.adjust(0, 0, -sz.width() - mw - buttonMargin, 0);
- }
-
- if (isFloating) {
- titleRect.adjust(0, -fw, 0, 0);
- if (widget && widget->windowIcon().cacheKey() != QApplication::windowIcon().cacheKey())
- titleRect.adjust(titleRect.height() + mw, 0, 0, 0);
- } else {
- titleRect.adjust(mw, 0, 0, 0);
- if (!dwOpt->floatable && !dwOpt->closable)
- titleRect.adjust(0, 0, -mw, 0);
- }
- if (!verticalTitleBar)
- titleRect = visualRect(dwOpt->direction, r, titleRect);
-
- if (!dwOpt->title.isEmpty()) {
- QString titleText = painter->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight,
- verticalTitleBar ? titleRect.height() : titleRect.width());
- const int indent = 4;
- drawItemText(painter, rect.adjusted(indent + 1, 1, -indent - 1, -1),
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic,
- dwOpt->palette,
- dwOpt->state & State_Enabled, titleText,
- QPalette::WindowText);
- }
- }
- break;
-#endif // QT_CONFIG(dockwidget)
-#if QT_CONFIG(itemviews)
- case CE_ItemViewItem:
- {
- const QStyleOptionViewItem *vopt;
-
- const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget);
- bool newStyle = true;
-
- if (qobject_cast<const QTableView*>(widget))
- newStyle = false;
-
- if (newStyle && view && (vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option))) {
- /*
- // We cannot currently get the correct selection color for "explorer style" views
- COLORREF cref = 0;
- XPThemeData theme(d->treeViewHelper(), 0, QLatin1String("LISTVIEW"), 0, 0);
- unsigned int res = GetThemeColor(theme.handle(), LVP_LISTITEM, LISS_SELECTED, TMT_TEXTCOLOR, &cref);
- QColor textColor(GetRValue(cref), GetGValue(cref), GetBValue(cref));
- */
- QPalette palette = vopt->palette;
- palette.setColor(QPalette::All, QPalette::HighlightedText, palette.color(QPalette::Active, QPalette::Text));
- // Note that setting a saturated color here results in ugly XOR colors in the focus rect
- palette.setColor(QPalette::All, QPalette::Highlight, palette.base().color().darker(108));
- QStyleOptionViewItem adjustedOption = *vopt;
- adjustedOption.palette = palette;
- // We hide the focusrect in singleselection as it is not required
- if ((view->selectionMode() == QAbstractItemView::SingleSelection)
- && !(vopt->state & State_KeyboardFocusChange))
- adjustedOption.state &= ~State_HasFocus;
- QWindowsXPStyle::drawControl(element, &adjustedOption, painter, widget);
- } else {
- QWindowsXPStyle::drawControl(element, option, painter, widget);
- }
- break;
- }
-#endif // QT_CONFIG(itemviews)
-#if QT_CONFIG(combobox)
- case CE_ComboBoxLabel:
- QCommonStyle::drawControl(element, option, painter, widget);
- break;
-#endif // QT_CONFIG(combobox)
- default:
- QWindowsXPStyle::drawControl(element, option, painter, widget);
- break;
- }
-}
-
-/*!
- \internal
-
- see drawPrimitive for comments on the animation support
-
- */
-void QWindowsVistaStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- QPainter *painter, const QWidget *widget) const
-{
- QWindowsVistaStylePrivate *d = const_cast<QWindowsVistaStylePrivate*>(d_func());
- if (!QWindowsVistaStylePrivate::useVista()) {
- QWindowsStyle::drawComplexControl(control, option, painter, widget);
- return;
- }
-
- State state = option->state;
- SubControls sub = option->subControls;
- QRect r = option->rect;
-
- int partId = 0;
- int stateId = 0;
-
- State flags = option->state;
- if (widget && widget->testAttribute(Qt::WA_UnderMouse) && widget->isActiveWindow())
- flags |= State_MouseOver;
-
- if (d->transitionsEnabled() && canAnimate(option))
- {
-
- if (control == CC_ScrollBar || control == CC_SpinBox || control == CC_ComboBox) {
-
- QObject *styleObject = option->styleObject; // Can be widget or qquickitem
-
- int oldState = styleObject->property("_q_stylestate").toInt();
- int oldActiveControls = styleObject->property("_q_stylecontrols").toInt();
-
- QRect oldRect = styleObject->property("_q_stylerect").toRect();
- styleObject->setProperty("_q_stylestate", int(option->state));
- styleObject->setProperty("_q_stylecontrols", int(option->activeSubControls));
- styleObject->setProperty("_q_stylerect", option->rect);
-
- bool doTransition = ((state & State_Sunken) != (oldState & State_Sunken) ||
- (state & State_On) != (oldState & State_On) ||
- (state & State_MouseOver) != (oldState & State_MouseOver) ||
- oldActiveControls != int(option->activeSubControls));
-
- if (qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- QRect oldSliderPos = styleObject->property("_q_stylesliderpos").toRect();
- QRect currentPos = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget);
- styleObject->setProperty("_q_stylesliderpos", currentPos);
- if (oldSliderPos != currentPos) {
- doTransition = false;
- d->stopAnimation(styleObject);
- }
- } else if (control == CC_SpinBox) {
- //spinboxes have a transition when focus changes
- if (!doTransition)
- doTransition = (state & State_HasFocus) != (oldState & State_HasFocus);
- }
-
- if (oldRect != option->rect) {
- doTransition = false;
- d->stopAnimation(styleObject);
- }
-
- if (doTransition) {
- QImage startImage = createAnimationBuffer(option, widget);
- QPainter startPainter(&startImage);
-
- QImage endImage = createAnimationBuffer(option, widget);
- QPainter endPainter(&endImage);
-
- QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject));
- QWindowsVistaTransition *t = new QWindowsVistaTransition(styleObject);
-
- // Draw the image that ends the animation by using the current styleoption
- QStyleOptionComplex *styleOption = qstyleoption_cast<QStyleOptionComplex*>(clonedAnimationStyleOption(option));
-
- styleObject->setProperty("_q_no_animation", true);
-
- // Draw transition source
- if (!anim) {
- styleOption->state = QStyle::State(oldState);
- styleOption->activeSubControls = QStyle::SubControl(oldActiveControls);
- proxy()->drawComplexControl(control, styleOption, &startPainter, widget);
- } else {
- anim->paint(&startPainter, option);
- }
- t->setStartImage(startImage);
-
- // Draw transition target
- styleOption->state = option->state;
- styleOption->activeSubControls = option->activeSubControls;
- proxy()->drawComplexControl(control, styleOption, &endPainter, widget);
-
- styleObject->setProperty("_q_no_animation", false);
-
- t->setEndImage(endImage);
- t->setStartTime(QTime::currentTime());
-
- if (option->state & State_MouseOver || option->state & State_Sunken)
- t->setDuration(150);
- else
- t->setDuration(500);
-
- deleteClonedAnimationStyleOption(styleOption);
- d->startAnimation(t);
- }
- if (QWindowsVistaAnimation *anim = qobject_cast<QWindowsVistaAnimation *>(d->animation(styleObject))) {
- anim->paint(painter, option);
- return;
- }
- }
- }
-
- switch (control) {
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option))
- {
- if (cmb->editable) {
- if (sub & SC_ComboBoxEditField) {
- partId = EP_EDITBORDER_NOSCROLL;
- if (!(flags & State_Enabled))
- stateId = ETS_DISABLED;
- else if (flags & State_MouseOver)
- stateId = ETS_HOT;
- else if (flags & State_HasFocus)
- stateId = ETS_FOCUSED;
- else
- stateId = ETS_NORMAL;
-
- XPThemeData theme(widget, painter,
- QWindowsXPStylePrivate::EditTheme,
- partId, stateId, r);
-
- d->drawBackground(theme);
- }
- if (sub & SC_ComboBoxArrow) {
- QRect subRect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget);
- XPThemeData theme(widget, painter, QWindowsXPStylePrivate::ComboboxTheme);
- theme.rect = subRect;
- partId = option->direction == Qt::RightToLeft ? CP_DROPDOWNBUTTONLEFT : CP_DROPDOWNBUTTONRIGHT;
-
- if (!(cmb->state & State_Enabled))
- stateId = CBXS_DISABLED;
- else if (cmb->state & State_Sunken || cmb->state & State_On)
- stateId = CBXS_PRESSED;
- else if (cmb->state & State_MouseOver && option->activeSubControls & SC_ComboBoxArrow)
- stateId = CBXS_HOT;
- else
- stateId = CBXS_NORMAL;
-
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
-
- } else {
- if (sub & SC_ComboBoxFrame) {
- XPThemeData theme(widget, painter, QWindowsXPStylePrivate::ComboboxTheme);
- theme.rect = option->rect;
- theme.partId = CP_READONLY;
- if (!(cmb->state & State_Enabled))
- theme.stateId = CBXS_DISABLED;
- else if (cmb->state & State_Sunken || cmb->state & State_On)
- theme.stateId = CBXS_PRESSED;
- else if (cmb->state & State_MouseOver)
- theme.stateId = CBXS_HOT;
- else
- theme.stateId = CBXS_NORMAL;
- d->drawBackground(theme);
- }
- if (sub & SC_ComboBoxArrow) {
- XPThemeData theme(widget, painter, QWindowsXPStylePrivate::ComboboxTheme);
- theme.rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget);
- theme.partId = option->direction == Qt::RightToLeft ? CP_DROPDOWNBUTTONLEFT : CP_DROPDOWNBUTTONRIGHT;
- if (!(cmb->state & State_Enabled))
- theme.stateId = CBXS_DISABLED;
- else
- theme.stateId = CBXS_NORMAL;
- d->drawBackground(theme);
- }
- if ((sub & SC_ComboBoxEditField) && (flags & State_HasFocus)) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*cmb);
- fropt.rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxEditField, widget);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
- }
- }
- }
- break;
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(option))
- {
- XPThemeData theme(widget, painter, QWindowsXPStylePrivate::ScrollBarTheme);
- bool maxedOut = (scrollbar->maximum == scrollbar->minimum);
- if (maxedOut)
- flags &= ~State_Enabled;
-
- bool isHorz = flags & State_Horizontal;
- bool isRTL = option->direction == Qt::RightToLeft;
- if (sub & SC_ScrollBarAddLine) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddLine, widget);
- partId = SBP_ARROWBTN;
- if (!(flags & State_Enabled))
- stateId = (isHorz ? (isRTL ? ABS_LEFTDISABLED : ABS_RIGHTDISABLED) : ABS_DOWNDISABLED);
- else if (scrollbar->activeSubControls & SC_ScrollBarAddLine && (scrollbar->state & State_Sunken))
- stateId = (isHorz ? (isRTL ? ABS_LEFTPRESSED : ABS_RIGHTPRESSED) : ABS_DOWNPRESSED);
- else if (scrollbar->activeSubControls & SC_ScrollBarAddLine && (scrollbar->state & State_MouseOver))
- stateId = (isHorz ? (isRTL ? ABS_LEFTHOT : ABS_RIGHTHOT) : ABS_DOWNHOT);
- else if (scrollbar->state & State_MouseOver)
- stateId = (isHorz ? (isRTL ? ABS_LEFTHOVER : ABS_RIGHTHOVER) : ABS_DOWNHOVER);
- else
- stateId = (isHorz ? (isRTL ? ABS_LEFTNORMAL : ABS_RIGHTNORMAL) : ABS_DOWNNORMAL);
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_ScrollBarSubLine) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubLine, widget);
- partId = SBP_ARROWBTN;
- if (!(flags & State_Enabled))
- stateId = (isHorz ? (isRTL ? ABS_RIGHTDISABLED : ABS_LEFTDISABLED) : ABS_UPDISABLED);
- else if (scrollbar->activeSubControls & SC_ScrollBarSubLine && (scrollbar->state & State_Sunken))
- stateId = (isHorz ? (isRTL ? ABS_RIGHTPRESSED : ABS_LEFTPRESSED) : ABS_UPPRESSED);
- else if (scrollbar->activeSubControls & SC_ScrollBarSubLine && (scrollbar->state & State_MouseOver))
- stateId = (isHorz ? (isRTL ? ABS_RIGHTHOT : ABS_LEFTHOT) : ABS_UPHOT);
- else if (scrollbar->state & State_MouseOver)
- stateId = (isHorz ? (isRTL ? ABS_RIGHTHOVER : ABS_LEFTHOVER) : ABS_UPHOVER);
- else
- stateId = (isHorz ? (isRTL ? ABS_RIGHTNORMAL : ABS_LEFTNORMAL) : ABS_UPNORMAL);
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (maxedOut) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget);
- theme.rect = theme.rect.united(proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubPage, widget));
- theme.rect = theme.rect.united(proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddPage, widget));
- partId = flags & State_Horizontal ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT;
- stateId = SCRBS_DISABLED;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- } else {
- if (sub & SC_ScrollBarSubPage) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubPage, widget);
- partId = flags & State_Horizontal ? SBP_UPPERTRACKHORZ : SBP_UPPERTRACKVERT;
- if (!(flags & State_Enabled))
- stateId = SCRBS_DISABLED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSubPage && (scrollbar->state & State_Sunken))
- stateId = SCRBS_PRESSED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSubPage && (scrollbar->state & State_MouseOver))
- stateId = SCRBS_HOT;
- else
- stateId = SCRBS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_ScrollBarAddPage) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddPage, widget);
- partId = flags & State_Horizontal ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT;
- if (!(flags & State_Enabled))
- stateId = SCRBS_DISABLED;
- else if (scrollbar->activeSubControls & SC_ScrollBarAddPage && (scrollbar->state & State_Sunken))
- stateId = SCRBS_PRESSED;
- else if (scrollbar->activeSubControls & SC_ScrollBarAddPage && (scrollbar->state & State_MouseOver))
- stateId = SCRBS_HOT;
- else
- stateId = SCRBS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_ScrollBarSlider) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget);
- if (!(flags & State_Enabled))
- stateId = SCRBS_DISABLED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSlider && (scrollbar->state & State_Sunken))
- stateId = SCRBS_PRESSED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSlider && (scrollbar->state & State_MouseOver))
- stateId = SCRBS_HOT;
- else if (option->state & State_MouseOver)
- stateId = SCRBS_HOVER;
- else
- stateId = SCRBS_NORMAL;
-
- // Draw handle
- theme.partId = flags & State_Horizontal ? SBP_THUMBBTNHORZ : SBP_THUMBBTNVERT;
- theme.stateId = stateId;
- d->drawBackground(theme);
-
- if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8) {
- const QRect gripperBounds = QWindowsXPStylePrivate::scrollBarGripperBounds(flags, widget, &theme);
- // Draw gripper if there is enough space
- if (!gripperBounds.isEmpty() && flags & State_Enabled) {
- painter->save();
- XPThemeData grippBackground = theme;
- grippBackground.partId = flags & State_Horizontal ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT;
- theme.rect = gripperBounds;
- painter->setClipRegion(d->region(theme));// Only change inside the region of the gripper
- d->drawBackground(grippBackground);// The gutter is the grippers background
- d->drawBackground(theme); // Transparent gripper ontop of background
- painter->restore();
- }
- }
- }
- }
- }
- break;
-#if QT_CONFIG(spinbox)
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(option))
- {
- XPThemeData theme(widget, painter, QWindowsXPStylePrivate::SpinTheme);
- if (sb->frame && (sub & SC_SpinBoxFrame)) {
- partId = EP_EDITBORDER_NOSCROLL;
- if (!(flags & State_Enabled))
- stateId = ETS_DISABLED;
- else if (flags & State_MouseOver)
- stateId = ETS_HOT;
- else if (flags & State_HasFocus)
- stateId = ETS_SELECTED;
- else
- stateId = ETS_NORMAL;
-
- XPThemeData ftheme(widget, painter,
- QWindowsXPStylePrivate::EditTheme,
- partId, stateId, r);
- // The spinbox in Windows QStyle is drawn with frameless QLineEdit inside it
- // That however breaks with QtQuickControls where this results in transparent
- // spinbox background, so if there's no "widget" passed (QtQuickControls case),
- // let ftheme.noContent be false, which fixes the spinbox rendering in QQC
- ftheme.noContent = (widget != nullptr);
- d->drawBackground(ftheme);
- }
- if (sub & SC_SpinBoxUp) {
- theme.rect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxUp, widget).adjusted(0, 0, 0, 1);
- partId = SPNP_UP;
- if (!(sb->stepEnabled & QAbstractSpinBox::StepUpEnabled) || !(flags & State_Enabled))
- stateId = UPS_DISABLED;
- else if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_Sunken))
- stateId = UPS_PRESSED;
- else if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_MouseOver))
- stateId = UPS_HOT;
- else
- stateId = UPS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_SpinBoxDown) {
- theme.rect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxDown, widget);
- partId = SPNP_DOWN;
- if (!(sb->stepEnabled & QAbstractSpinBox::StepDownEnabled) || !(flags & State_Enabled))
- stateId = DNS_DISABLED;
- else if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_Sunken))
- stateId = DNS_PRESSED;
- else if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_MouseOver))
- stateId = DNS_HOT;
- else
- stateId = DNS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- }
- break;
-#endif // QT_CONFIG(spinbox)
- default:
- QWindowsXPStyle::drawComplexControl(control, option, painter, widget);
- break;
- }
-}
-
-/*!
- \internal
- */
-QSize QWindowsVistaStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &size, const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista())
- return QWindowsStyle::sizeFromContents(type, option, size, widget);
-
- QSize sz(size);
- switch (type) {
- case CT_MenuItem:
- sz = QWindowsXPStyle::sizeFromContents(type, option, size, widget);
- int minimumHeight;
- {
- XPThemeData theme(widget, nullptr,
- QWindowsXPStylePrivate::MenuTheme,
- MENU_POPUPCHECKBACKGROUND, MBI_HOT);
- XPThemeData themeSize = theme;
- themeSize.partId = MENU_POPUPCHECK;
- themeSize.stateId = 0;
- const QSizeF size = themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- const QMarginsF margins = themeSize.margins() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- minimumHeight = qMax(qRound(size.height() + margins.bottom() + margins.top()), sz.height());
- sz.rwidth() += qRound(size.width() + margins.left() + margins.right());
- }
-
- if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- if (menuitem->menuItemType != QStyleOptionMenuItem::Separator)
- sz.setHeight(minimumHeight);
- }
- return sz;
-#if QT_CONFIG(menubar)
- case CT_MenuBarItem:
- if (!sz.isEmpty())
- sz += QSize(windowsItemHMargin * 5 + 1, 5);
- return sz;
-#endif
- case CT_ItemViewItem:
- sz = QWindowsXPStyle::sizeFromContents(type, option, size, widget);
- sz.rheight() += 2;
- return sz;
- case CT_SpinBox:
- {
- //Spinbox adds frame twice
- sz = QWindowsStyle::sizeFromContents(type, option, size, widget);
- int border = proxy()->pixelMetric(PM_SpinBoxFrameWidth, option, widget);
- sz -= QSize(2*border, 2*border);
- }
- return sz;
- case CT_HeaderSection:
- {
- // When there is a sort indicator it adds to the width but it is shown
- // above the text natively and not on the side
- if (QStyleOptionHeader *hdr = qstyleoption_cast<QStyleOptionHeader *>(const_cast<QStyleOption *>(option))) {
- QStyleOptionHeader::SortIndicator sortInd = hdr->sortIndicator;
- hdr->sortIndicator = QStyleOptionHeader::None;
- sz = QWindowsXPStyle::sizeFromContents(type, hdr, size, widget);
- hdr->sortIndicator = sortInd;
- return sz;
- }
- break;
- }
- default:
- break;
- }
- return QWindowsXPStyle::sizeFromContents(type, option, size, widget);
-}
-
-/*!
- \internal
- */
-QRect QWindowsVistaStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista())
- return QWindowsStyle::subElementRect(element, option, widget);
-
- QRect rect = QWindowsXPStyle::subElementRect(element, option, widget);
- switch (element) {
-
- case SE_PushButtonContents:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- MARGINS borderSize;
- const HTHEME theme = OpenThemeData(widget ? QWindowsVistaStylePrivate::winId(widget) : nullptr, L"Button");
- if (theme) {
- int stateId = PBS_NORMAL;
- if (!(option->state & State_Enabled))
- stateId = PBS_DISABLED;
- else if (option->state & State_Sunken)
- stateId = PBS_PRESSED;
- else if (option->state & State_MouseOver)
- stateId = PBS_HOT;
- else if (btn->features & QStyleOptionButton::DefaultButton)
- stateId = PBS_DEFAULTED;
-
- int border = proxy()->pixelMetric(PM_DefaultFrameWidth, btn, widget);
- rect = option->rect.adjusted(border, border, -border, -border);
-
- if (SUCCEEDED(GetThemeMargins(theme, nullptr, BP_PUSHBUTTON, stateId, TMT_CONTENTMARGINS, nullptr, &borderSize))) {
- rect.adjust(borderSize.cxLeftWidth, borderSize.cyTopHeight,
- -borderSize.cxRightWidth, -borderSize.cyBottomHeight);
- rect = visualRect(option->direction, option->rect, rect);
- }
- }
- }
- break;
-
- case SE_HeaderArrow:
- {
- QRect r = rect;
- int h = option->rect.height();
- int w = option->rect.width();
- int x = option->rect.x();
- int y = option->rect.y();
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, option, widget);
-
- XPThemeData theme(widget, nullptr,
- QWindowsXPStylePrivate::HeaderTheme,
- HP_HEADERSORTARROW, HSAS_SORTEDDOWN, option->rect);
-
- int arrowWidth = 13;
- int arrowHeight = 5;
- if (theme.isValid()) {
- const QSizeF size = theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- if (!size.isEmpty()) {
- arrowWidth = qRound(size.width());
- arrowHeight = qRound(size.height());
- }
- }
- if (option->state & State_Horizontal) {
- r.setRect(x + w/2 - arrowWidth/2, y , arrowWidth, arrowHeight);
- } else {
- int vert_size = w / 2;
- r.setRect(x + 5, y + h - margin * 2 - vert_size,
- w - margin * 2 - 5, vert_size);
- }
- rect = visualRect(option->direction, option->rect, r);
- }
- break;
-
- case SE_HeaderLabel:
- {
- int margin = proxy()->pixelMetric(QStyle::PM_HeaderMargin, option, widget);
- QRect r = option->rect;
- r.setRect(option->rect.x() + margin, option->rect.y() + margin,
- option->rect.width() - margin * 2, option->rect.height() - margin * 2);
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- // Subtract width needed for arrow, if there is one
- if (header->sortIndicator != QStyleOptionHeader::None) {
- if (!(option->state & State_Horizontal)) //horizontal arrows are positioned on top
- r.setHeight(r.height() - (option->rect.width() / 2) - (margin * 2));
- }
- }
- rect = visualRect(option->direction, option->rect, r);
- }
- break;
- case SE_ProgressBarContents:
- rect = QCommonStyle::subElementRect(SE_ProgressBarGroove, option, widget);
- break;
- case SE_ItemViewItemDecoration:
- if (qstyleoption_cast<const QStyleOptionViewItem *>(option))
- rect.adjust(-2, 0, 2, 0);
- break;
- case SE_ItemViewItemFocusRect:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
- QRect textRect = subElementRect(QStyle::SE_ItemViewItemText, option, widget);
- QRect displayRect = subElementRect(QStyle::SE_ItemViewItemDecoration, option, widget);
- if (!vopt->icon.isNull())
- rect = textRect.united(displayRect);
- else
- rect = textRect;
- rect = rect.adjusted(1, 0, -1, 0);
- }
- break;
- default:
- break;
- }
- return rect;
-}
-
-
-/*
- This function is used by subControlRect to check if a button
- should be drawn for the given subControl given a set of window flags.
-*/
-static bool buttonVisible(const QStyle::SubControl sc, const QStyleOptionTitleBar *tb){
-
- bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
- bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
- const auto flags = tb->titleBarFlags;
- bool retVal = false;
- switch (sc) {
- case QStyle::SC_TitleBarContextHelpButton:
- if (flags & Qt::WindowContextHelpButtonHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarMinButton:
- if (!isMinimized && (flags & Qt::WindowMinimizeButtonHint))
- retVal = true;
- break;
- case QStyle::SC_TitleBarNormalButton:
- if (isMinimized && (flags & Qt::WindowMinimizeButtonHint))
- retVal = true;
- else if (isMaximized && (flags & Qt::WindowMaximizeButtonHint))
- retVal = true;
- break;
- case QStyle::SC_TitleBarMaxButton:
- if (!isMaximized && (flags & Qt::WindowMaximizeButtonHint))
- retVal = true;
- break;
- case QStyle::SC_TitleBarShadeButton:
- if (!isMinimized && flags & Qt::WindowShadeButtonHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarUnshadeButton:
- if (isMinimized && flags & Qt::WindowShadeButtonHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarCloseButton:
- if (flags & Qt::WindowSystemMenuHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarSysMenu:
- if (flags & Qt::WindowSystemMenuHint)
- retVal = true;
- break;
- default :
- retVal = true;
- }
- return retVal;
-}
-
-
-/*! \internal */
-int QWindowsVistaStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
- QStyleHintReturn *returnData) const
-{
- QWindowsVistaStylePrivate *d = const_cast<QWindowsVistaStylePrivate*>(d_func());
- int ret = 0;
- switch (hint) {
- case SH_MessageBox_CenterButtons:
- ret = false;
- break;
- case SH_ToolTip_Mask:
- if (option) {
- if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(returnData)) {
- ret = true;
- XPThemeData themeData(widget, nullptr,
- QWindowsXPStylePrivate::ToolTipTheme,
- TTP_STANDARD, TTSS_NORMAL, option->rect);
- mask->region = d->region(themeData);
- }
- }
- break;
- case SH_Table_GridLineColor:
- if (option)
- ret = int(option->palette.color(QPalette::Base).darker(118).rgba());
- else
- ret = -1;
- break;
- case SH_Header_ArrowAlignment:
- ret = Qt::AlignTop | Qt::AlignHCenter;
- break;
- default:
- ret = QWindowsXPStyle::styleHint(hint, option, widget, returnData);
- break;
- }
- return ret;
-}
-
-
-/*!
- \internal
- */
-QRect QWindowsVistaStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
- SubControl subControl, const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista())
- return QWindowsStyle::subControlRect(control, option, subControl, widget);
-
- QRect rect = QWindowsXPStyle::subControlRect(control, option, subControl, widget);
- switch (control) {
-#if QT_CONFIG(combobox)
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- const int x = cb->rect.x(), y = cb->rect.y(), wi = cb->rect.width(), he = cb->rect.height();
- const int margin = cb->frame ? 3 : 0;
- const int bmarg = cb->frame ? 2 : 0;
- const int arrowWidth = qRound(QStyleHelper::dpiScaled(16, option));
- const int arrowButtonWidth = bmarg + arrowWidth;
- const int xpos = x + wi - arrowButtonWidth;
-
- switch (subControl) {
- case SC_ComboBoxFrame:
- rect = cb->rect;
- break;
- case SC_ComboBoxArrow:
- rect.setRect(xpos, y , arrowButtonWidth, he);
- break;
- case SC_ComboBoxEditField:
- rect.setRect(x + margin, y + margin, wi - 2 * margin - arrowWidth, he - 2 * margin);
- break;
- case SC_ComboBoxListBoxPopup:
- rect = cb->rect;
- break;
- default:
- break;
- }
- rect = visualRect(cb->direction, cb->rect, rect);
- return rect;
- }
- break;
-#endif // QT_CONFIG(combobox)
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
- if (!buttonVisible(subControl, tb))
- return rect;
- const qreal factor = QWindowsStylePrivate::nativeMetricScaleFactor(widget);
- const bool isToolTitle = false;
- const int height = tb->rect.height();
- const int width = tb->rect.width();
- const int buttonWidth =
- qRound(qreal(GetSystemMetrics(SM_CXSIZE)) * factor - QStyleHelper::dpiScaled(4, option));
-
- const int frameWidth = proxy()->pixelMetric(PM_MdiSubWindowFrameWidth, option, widget);
- const bool sysmenuHint = (tb->titleBarFlags & Qt::WindowSystemMenuHint) != 0;
- const bool minimizeHint = (tb->titleBarFlags & Qt::WindowMinimizeButtonHint) != 0;
- const bool maximizeHint = (tb->titleBarFlags & Qt::WindowMaximizeButtonHint) != 0;
- const bool contextHint = (tb->titleBarFlags & Qt::WindowContextHelpButtonHint) != 0;
- const bool shadeHint = (tb->titleBarFlags & Qt::WindowShadeButtonHint) != 0;
-
- switch (subControl) {
- case SC_TitleBarLabel:
- rect = QRect(frameWidth, 0, width - (buttonWidth + frameWidth + 10), height);
- if (isToolTitle) {
- if (sysmenuHint) {
- rect.adjust(0, 0, int(-buttonWidth - 3 * factor), 0);
- }
- if (minimizeHint || maximizeHint)
- rect.adjust(0, 0, int(-buttonWidth - 2 * factor), 0);
- } else {
- if (sysmenuHint) {
- const int leftOffset = int(height - 8 * factor);
- rect.adjust(leftOffset, 0, 0, int(4 * factor));
- }
- if (minimizeHint)
- rect.adjust(0, 0, int(-buttonWidth - 2 * factor), 0);
- if (maximizeHint)
- rect.adjust(0, 0, int(-buttonWidth - 2 * factor), 0);
- if (contextHint)
- rect.adjust(0, 0, int(-buttonWidth - 2 * factor), 0);
- if (shadeHint)
- rect.adjust(0, 0, int(-buttonWidth - 2 * factor), 0);
- }
- rect.translate(0, int(2 * factor));
- rect = visualRect(option->direction, option->rect, rect);
- break;
- case SC_TitleBarSysMenu:
- {
- const int controlTop = int(6 * factor);
- const int controlHeight = int(height - controlTop - 3 * factor);
- int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, option);
- QSize iconSize = tb->icon.actualSize(QSize(iconExtent, iconExtent));
- if (tb->icon.isNull())
- iconSize = QSize(controlHeight, controlHeight);
- int hPad = (controlHeight - iconSize.height())/2;
- int vPad = (controlHeight - iconSize.width())/2;
- rect = QRect(frameWidth + hPad, controlTop + vPad, iconSize.width(), iconSize.height());
- rect.translate(0, int(3 * factor));
- rect = visualRect(option->direction, option->rect, rect);
- }
- break;
- default:
- break;
- }
- }
- break;
- default:
- break;
- }
- return rect;
-}
-
-/*!
- \internal
- */
-QStyle::SubControl QWindowsVistaStyle::hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- const QPoint &pos, const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista()) {
- return QWindowsStyle::hitTestComplexControl(control, option, pos, widget);
- }
- return QWindowsXPStyle::hitTestComplexControl(control, option, pos, widget);
-}
-
-int QWindowsVistaStylePrivate::fixedPixelMetric(QStyle::PixelMetric pm)
-{
- switch (pm) {
- case QStyle::PM_DockWidgetTitleBarButtonMargin:
- return 5;
- case QStyle::PM_ScrollBarSliderMin:
- return 18;
- case QStyle::PM_MenuHMargin:
- case QStyle::PM_MenuVMargin:
- return 0;
- case QStyle::PM_MenuPanelWidth:
- return 3;
- default:
- break;
- }
- return QWindowsVistaStylePrivate::InvalidMetric;
-}
-
-/*!
- \internal
- */
-int QWindowsVistaStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista())
- return QWindowsStyle::pixelMetric(metric, option, widget);
-
- int ret = QWindowsVistaStylePrivate::fixedPixelMetric(metric);
- if (ret != QWindowsStylePrivate::InvalidMetric)
- return int(QStyleHelper::dpiScaled(ret, option));
-
- return QWindowsXPStyle::pixelMetric(metric, option, widget);
-}
-
-/*!
- \internal
- */
-QPalette QWindowsVistaStyle::standardPalette() const
-{
- return QWindowsXPStyle::standardPalette();
-}
-
-/*!
- \internal
- */
-void QWindowsVistaStyle::polish(QApplication *app)
-{
- QWindowsXPStyle::polish(app);
-}
-
-/*!
- \internal
- */
-void QWindowsVistaStyle::polish(QWidget *widget)
-{
- QWindowsXPStyle::polish(widget);
-#if QT_CONFIG(lineedit)
- if (qobject_cast<QLineEdit*>(widget))
- widget->setAttribute(Qt::WA_Hover);
- else
-#endif // QT_CONFIG(lineedit)
- if (qobject_cast<QGroupBox*>(widget))
- widget->setAttribute(Qt::WA_Hover);
-#if QT_CONFIG(commandlinkbutton)
- else if (qobject_cast<QCommandLinkButton*>(widget)) {
- QFont buttonFont = widget->font();
- buttonFont.setFamilies(QStringList{QLatin1String("Segoe UI")});
- widget->setFont(buttonFont);
- }
-#endif // QT_CONFIG(commandlinkbutton)
- else if (widget->inherits("QTipLabel")){
- //note that since tooltips are not reused
- //we do not have to care about unpolishing
- widget->setContentsMargins(3, 0, 4, 0);
- COLORREF bgRef;
- HTHEME theme = OpenThemeData(widget ? QWindowsVistaStylePrivate::winId(widget) : nullptr, L"TOOLTIP");
- if (theme && SUCCEEDED(GetThemeColor(theme, TTP_STANDARD, TTSS_NORMAL, TMT_TEXTCOLOR, &bgRef))) {
- QColor textColor = QColor::fromRgb(bgRef);
- QPalette pal;
- pal.setColor(QPalette::All, QPalette::ToolTipText, textColor);
- widget->setPalette(pal);
- }
- } else if (qobject_cast<QMessageBox *> (widget)) {
- widget->setAttribute(Qt::WA_StyledBackground);
-#if QT_CONFIG(dialogbuttonbox)
- QDialogButtonBox *buttonBox = widget->findChild<QDialogButtonBox *>(QLatin1String("qt_msgbox_buttonbox"));
- if (buttonBox)
- buttonBox->setContentsMargins(0, 9, 0, 0);
-#endif
- }
-#if QT_CONFIG(inputdialog)
- else if (qobject_cast<QInputDialog *> (widget)) {
- widget->setAttribute(Qt::WA_StyledBackground);
-#if QT_CONFIG(dialogbuttonbox)
- QDialogButtonBox *buttonBox = widget->findChild<QDialogButtonBox *>(QLatin1String("qt_inputdlg_buttonbox"));
- if (buttonBox)
- buttonBox->setContentsMargins(0, 9, 0, 0);
-#endif
- }
-#endif // QT_CONFIG(inputdialog)
- else if (QTreeView *tree = qobject_cast<QTreeView *> (widget)) {
- tree->viewport()->setAttribute(Qt::WA_Hover);
- }
- else if (QListView *list = qobject_cast<QListView *> (widget)) {
- list->viewport()->setAttribute(Qt::WA_Hover);
- }
-}
-
-/*!
- \internal
- */
-void QWindowsVistaStyle::unpolish(QWidget *widget)
-{
- QWindowsXPStyle::unpolish(widget);
-
- QWindowsVistaStylePrivate *d = d_func();
-
- d->stopAnimation(widget);
-
-#if QT_CONFIG(lineedit)
- if (qobject_cast<QLineEdit*>(widget))
- widget->setAttribute(Qt::WA_Hover, false);
- else
-#endif // QT_CONFIG(lineedit)
- if (qobject_cast<QGroupBox*>(widget))
- widget->setAttribute(Qt::WA_Hover, false);
- else if (qobject_cast<QMessageBox *> (widget)) {
- widget->setAttribute(Qt::WA_StyledBackground, false);
-#if QT_CONFIG(dialogbuttonbox)
- QDialogButtonBox *buttonBox = widget->findChild<QDialogButtonBox *>(QLatin1String("qt_msgbox_buttonbox"));
- if (buttonBox)
- buttonBox->setContentsMargins(0, 0, 0, 0);
-#endif
- }
-#if QT_CONFIG(inputdialog)
- else if (qobject_cast<QInputDialog *> (widget)) {
- widget->setAttribute(Qt::WA_StyledBackground, false);
-#if QT_CONFIG(dialogbuttonbox)
- QDialogButtonBox *buttonBox = widget->findChild<QDialogButtonBox *>(QLatin1String("qt_inputdlg_buttonbox"));
- if (buttonBox)
- buttonBox->setContentsMargins(0, 0, 0, 0);
-#endif
- }
-#endif // QT_CONFIG(inputdialog)
- else if (QTreeView *tree = qobject_cast<QTreeView *> (widget)) {
- tree->viewport()->setAttribute(Qt::WA_Hover, false);
- }
-#if QT_CONFIG(commandlinkbutton)
- else if (qobject_cast<QCommandLinkButton*>(widget)) {
- QFont font = QApplication::font("QCommandLinkButton");
- QFont widgetFont = widget->font();
- widgetFont.setFamilies(font.families()); //Only family set by polish
- widget->setFont(widgetFont);
- }
-#endif // QT_CONFIG(commandlinkbutton)
-}
-
-
-/*!
- \internal
- */
-void QWindowsVistaStyle::unpolish(QApplication *app)
-{
- QWindowsXPStyle::unpolish(app);
-}
-
-/*!
- \internal
- */
-void QWindowsVistaStyle::polish(QPalette &pal)
-{
- QWindowsStyle::polish(pal);
- pal.setBrush(QPalette::AlternateBase, pal.base().color().darker(104));
-}
-
-/*!
- \internal
- */
-QPixmap QWindowsVistaStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *option,
- const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista()) {
- return QWindowsStyle::standardPixmap(standardPixmap, option, widget);
- }
- return QWindowsXPStyle::standardPixmap(standardPixmap, option, widget);
-}
-
-QWindowsVistaStylePrivate::QWindowsVistaStylePrivate() :
- QWindowsXPStylePrivate()
-{
-}
-
-bool QWindowsVistaStylePrivate::transitionsEnabled() const
-{
- BOOL animEnabled = false;
- if (SystemParametersInfo(SPI_GETCLIENTAREAANIMATION, 0, &animEnabled, 0))
- {
- if (animEnabled)
- return true;
- }
- return false;
-}
-
-/*!
-\reimp
-*/
-QIcon QWindowsVistaStyle::standardIcon(StandardPixmap standardIcon,
- const QStyleOption *option,
- const QWidget *widget) const
-{
- if (!QWindowsVistaStylePrivate::useVista()) {
- return QWindowsStyle::standardIcon(standardIcon, option, widget);
- }
-
- QWindowsVistaStylePrivate *d = const_cast<QWindowsVistaStylePrivate *>(d_func());
- switch (standardIcon) {
- case SP_CommandLink:
- {
- XPThemeData theme(nullptr, nullptr,
- QWindowsXPStylePrivate::ButtonTheme,
- BP_COMMANDLINKGLYPH, CMDLGS_NORMAL);
- if (theme.isValid()) {
- const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(widget)).toSize();
- QIcon linkGlyph;
- QPixmap pm(size);
- pm.fill(Qt::transparent);
- QPainter p(&pm);
- theme.painter = &p;
- theme.rect = QRect(QPoint(0, 0), size);
- d->drawBackground(theme);
- linkGlyph.addPixmap(pm, QIcon::Normal, QIcon::Off); // Normal
- pm.fill(Qt::transparent);
-
- theme.stateId = CMDLGS_PRESSED;
- d->drawBackground(theme);
- linkGlyph.addPixmap(pm, QIcon::Normal, QIcon::On); // Pressed
- pm.fill(Qt::transparent);
-
- theme.stateId = CMDLGS_HOT;
- d->drawBackground(theme);
- linkGlyph.addPixmap(pm, QIcon::Active, QIcon::Off); // Hover
- pm.fill(Qt::transparent);
-
- theme.stateId = CMDLGS_DISABLED;
- d->drawBackground(theme);
- linkGlyph.addPixmap(pm, QIcon::Disabled, QIcon::Off); // Disabled
- return linkGlyph;
- }
- }
- break;
- default:
- break;
- }
- return QWindowsXPStyle::standardIcon(standardIcon, option, widget);
-}
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p.h b/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p.h
deleted file mode 100644
index 07cd2b8a..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWINDOWSVISTASTYLE_P_H
-#define QWINDOWSVISTASTYLE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include "qquickwindowsxpstyle_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QWindowsVistaStylePrivate;
-class QWindowsVistaStyle : public QWindowsXPStyle
-{
- Q_OBJECT
-public:
- QWindowsVistaStyle();
- ~QWindowsVistaStyle() override;
-
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter,
- const QWidget *widget = nullptr) const override;
- void drawControl(ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const override;
- void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- QPainter *painter, const QWidget *widget) const override;
- QSize sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &size, const QWidget *widget) const override;
-
- QRect subElementRect(SubElement element, const QStyleOption *option,
- const QWidget *widget) const override;
- QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt,
- SubControl sc, const QWidget *widget) const override;
-
- SubControl hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- const QPoint &pos, const QWidget *widget = nullptr) const override;
-
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr,
- const QWidget *widget = nullptr) const override;
- QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
- const QWidget *widget = nullptr) const override;
- int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr,
- const QWidget *widget = nullptr) const override;
- int styleHint(StyleHint hint, const QStyleOption *opt = nullptr,
- const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override;
-
- void polish(QWidget *widget) override;
- void unpolish(QWidget *widget) override;
- void polish(QPalette &pal) override;
- void polish(QApplication *app) override;
- void unpolish(QApplication *app) override;
- QPalette standardPalette() const override;
-
-private:
- Q_DISABLE_COPY_MOVE(QWindowsVistaStyle)
- Q_DECLARE_PRIVATE(QWindowsVistaStyle)
- friend class QStyleFactory;
-};
-
-QT_END_NAMESPACE
-
-#endif // QWINDOWSVISTASTYLE_P_H
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p_p.h b/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p_p.h
deleted file mode 100644
index a5383175..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsvistastyle_p_p.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QWINDOWSVISTASTYLE_P_P_H
-#define QWINDOWSVISTASTYLE_P_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
-// file may change from version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include "qquickwindowsvistastyle_p.h"
-#include "qquickwindowsxpstyle_p_p.h"
-#include <private/qstyleanimation_p.h>
-#include <private/qpaintengine_raster_p.h>
-#include <qpaintengine.h>
-#include <qwidget.h>
-#include <qapplication.h>
-#include <qpixmapcache.h>
-#include <qstyleoption.h>
-#if QT_CONFIG(pushbutton)
-#include <qpushbutton.h>
-#endif
-#include <qradiobutton.h>
-#if QT_CONFIG(lineedit)
-#include <qlineedit.h>
-#endif
-#include <qgroupbox.h>
-#if QT_CONFIG(toolbutton)
-#include <qtoolbutton.h>
-#endif
-#if QT_CONFIG(spinbox)
-#include <qspinbox.h>
-#endif
-#if QT_CONFIG(toolbar)
-#include <qtoolbar.h>
-#endif
-#if QT_CONFIG(combobox)
-#include <qcombobox.h>
-#endif
-#if QT_CONFIG(scrollbar)
-#include <qscrollbar.h>
-#endif
-#if QT_CONFIG(progressbar)
-#include <qprogressbar.h>
-#endif
-#if QT_CONFIG(dockwidget)
-#include <qdockwidget.h>
-#endif
-#if QT_CONFIG(listview)
-#include <qlistview.h>
-#endif
-#if QT_CONFIG(treeview)
-#include <qtreeview.h>
-#endif
-#include <qtextedit.h>
-#include <qmessagebox.h>
-#if QT_CONFIG(dialogbuttonbox)
-#include <qdialogbuttonbox.h>
-#endif
-#include <qinputdialog.h>
-#if QT_CONFIG(tableview)
-#include <qtableview.h>
-#endif
-#include <qdatetime.h>
-#if QT_CONFIG(commandlinkbutton)
-#include <qcommandlinkbutton.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#if !defined(SCHEMA_VERIFY_VSSYM32)
-#define TMT_ANIMATIONDURATION 5006
-#define TMT_TRANSITIONDURATIONS 6000
-#define EP_EDITBORDER_NOSCROLL 6
-#define EP_EDITBORDER_HVSCROLL 9
-#define EP_BACKGROUND 3
-#define EBS_NORMAL 1
-#define EBS_HOT 2
-#define EBS_DISABLED 3
-#define EBS_READONLY 5
-#define PBS_DEFAULTED_ANIMATING 6
-#define MBI_NORMAL 1
-#define MBI_HOT 2
-#define MBI_PUSHED 3
-#define MBI_DISABLED 4
-#define MB_ACTIVE 1
-#define MB_INACTIVE 2
-#define PP_FILL 5
-#define PP_FILLVERT 6
-#define PP_MOVEOVERLAY 8
-#define PP_MOVEOVERLAYVERT 10
-#define MENU_BARBACKGROUND 7
-#define MENU_BARITEM 8
-#define MENU_POPUPCHECK 11
-#define MENU_POPUPCHECKBACKGROUND 12
-#define MENU_POPUPGUTTER 13
-#define MENU_POPUPITEM 14
-#define MENU_POPUPBORDERS 10
-#define MENU_POPUPSEPARATOR 15
-#define MC_CHECKMARKNORMAL 1
-#define MC_CHECKMARKDISABLED 2
-#define MC_BULLETNORMAL 3
-#define MC_BULLETDISABLED 4
-#define ABS_UPHOVER 17
-#define ABS_DOWNHOVER 18
-#define ABS_LEFTHOVER 19
-#define ABS_RIGHTHOVER 20
-#define CP_DROPDOWNBUTTONRIGHT 6
-#define CP_DROPDOWNBUTTONLEFT 7
-#define SCRBS_HOVER 5
-#define TVP_HOTGLYPH 4
-#define SPI_GETCLIENTAREAANIMATION 0x1042
-#define TDLG_PRIMARYPANEL 1
-#define TDLG_SECONDARYPANEL 8
-#endif
-
-class QWindowsVistaAnimation : public QBlendStyleAnimation
-{
- Q_OBJECT
-public:
- QWindowsVistaAnimation(Type type, QObject *target) : QBlendStyleAnimation(type, target) { }
-
- bool isUpdateNeeded() const override;
- void paint(QPainter *painter, const QStyleOption *option);
-};
-
-
-// Handles state transition animations
-class QWindowsVistaTransition : public QWindowsVistaAnimation
-{
- Q_OBJECT
-public:
- QWindowsVistaTransition(QObject *target) : QWindowsVistaAnimation(Transition, target) {}
-};
-
-
-// Handles pulse animations (default buttons)
-class QWindowsVistaPulse: public QWindowsVistaAnimation
-{
- Q_OBJECT
-public:
- QWindowsVistaPulse(QObject *target) : QWindowsVistaAnimation(Pulse, target) {}
-};
-
-
-class QWindowsVistaStylePrivate : public QWindowsXPStylePrivate
-{
- Q_DECLARE_PUBLIC(QWindowsVistaStyle)
-
-public:
- QWindowsVistaStylePrivate();
-
- static int fixedPixelMetric(QStyle::PixelMetric pm);
- static inline bool useVista();
- bool transitionsEnabled() const;
-};
-
-QT_END_NAMESPACE
-
-#endif // QWINDOWSVISTASTYLE_P_P_H
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle.cpp b/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle.cpp
deleted file mode 100644
index a3e8ef20..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle.cpp
+++ /dev/null
@@ -1,4149 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include "qquickstylehelper_p.h"
-#include "qquickwindowsxpstyle_p.h"
-#include "qquickwindowsxpstyle_p_p.h"
-
-#include <private/qobject_p.h>
-#include <private/qpaintengine_raster_p.h>
-#include <qpa/qplatformnativeinterface.h>
-#include <qpainter.h>
-#include <qpaintengine.h>
-#include <qbackingstore.h>
-#include <qpixmapcache.h>
-#include <qpa/qplatformnativeinterface.h>
-#include <qvarlengtharray.h>
-#include <qdebug.h>
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-// General const values
-static const int windowsItemFrame = 2; // menu item frame width
-static const int windowsItemHMargin = 3; // menu item hor text margin
-static const int windowsItemVMargin = 0; // menu item ver text margin
-static const int windowsArrowHMargin = 6; // arrow horizontal margin
-static const int windowsRightBorder = 12; // right border on windows
-
-// Theme names matching the QWindowsXPStylePrivate::Theme enumeration.
-static const wchar_t *themeNames[QWindowsXPStylePrivate::NThemes] =
-{
- L"BUTTON", L"COMBOBOX", L"EDIT", L"HEADER", L"LISTVIEW",
- L"MENU", L"PROGRESS", L"REBAR", L"SCROLLBAR", L"SPIN",
- L"TAB", L"TASKDIALOG", L"TOOLBAR", L"TOOLTIP", L"TRACKBAR",
- L"TREEVIEW", L"WINDOW", L"STATUS", L"TREEVIEW"
-};
-
-// Theme data helper ------------------------------------------------------------------------------
-/* \internal
- Returns \c true if the themedata is valid for use.
-*/
-bool XPThemeData::isValid()
-{
- return QWindowsXPStylePrivate::useXP() && theme >= 0 && handle();
-}
-
-
-/* \internal
- Returns the theme engine handle to the specific class.
- If the handle hasn't been opened before, it opens the data, and
- adds it to a static map, for caching.
-*/
-HTHEME XPThemeData::handle()
-{
- if (!QWindowsXPStylePrivate::useXP())
- return nullptr;
-
- if (!htheme)
- htheme = QWindowsXPStylePrivate::createTheme(theme, QWindowsXPStylePrivate::winId(window));
- return htheme;
-}
-
-/* \internal
- Converts a QRect to the native RECT structure.
-*/
-RECT XPThemeData::toRECT(const QRect &qr)
-{
- RECT r;
- r.left = qr.x();
- r.right = qr.x() + qr.width();
- r.top = qr.y();
- r.bottom = qr.y() + qr.height();
- return r;
-}
-
-/* \internal
- Returns the native region of a part, if the part is considered
- transparent. The region is scaled to the parts size (rect).
-*/
-
-// QWindowsXPStylePrivate -------------------------------------------------------------------------
-// Static initializations
-HWND QWindowsXPStylePrivate::m_vistaTreeViewHelper = nullptr;
-HTHEME QWindowsXPStylePrivate::m_themes[NThemes];
-bool QWindowsXPStylePrivate::use_xp = false;
-QBasicAtomicInt QWindowsXPStylePrivate::ref = Q_BASIC_ATOMIC_INITIALIZER(-1); // -1 based refcounting
-
-static void qt_add_rect(HRGN &winRegion, QRect r)
-{
- HRGN rgn = CreateRectRgn(r.left(), r.top(), r.x() + r.width(), r.y() + r.height());
- if (rgn) {
- HRGN dest = CreateRectRgn(0,0,0,0);
- int result = CombineRgn(dest, winRegion, rgn, RGN_OR);
- if (result) {
- DeleteObject(winRegion);
- winRegion = dest;
- }
- DeleteObject(rgn);
- }
-}
-
-static HRGN qt_hrgn_from_qregion(const QRegion &region)
-{
- HRGN hRegion = CreateRectRgn(0,0,0,0);
- if (region.rectCount() == 1) {
- qt_add_rect(hRegion, region.boundingRect());
- return hRegion;
- }
- for (const QRect &rect : region)
- qt_add_rect(hRegion, rect);
- return hRegion;
-}
-
-/* \internal
- Checks if the theme engine can/should be used, or if we should
- fall back to Windows style.
-*/
-bool QWindowsXPStylePrivate::useXP(bool update)
-{
- if (update) {
- use_xp = IsThemeActive() && (IsAppThemed() || !QCoreApplication::instance())
- && !QWindowsStylePrivate::isDarkMode();
- }
- return use_xp;
-}
-
-/* \internal
- Handles refcounting, and queries the theme engine for usage.
-*/
-void QWindowsXPStylePrivate::init(bool force)
-{
- if (ref.ref() && !force)
- return;
- if (!force) // -1 based atomic refcounting
- ref.ref();
-
- useXP(true);
- std::fill(m_themes, m_themes + NThemes, nullptr);
-}
-
-/* \internal
- Cleans up all static data.
-*/
-void QWindowsXPStylePrivate::cleanup(bool force)
-{
- if (bufferBitmap) {
- if (bufferDC && nullBitmap)
- SelectObject(bufferDC, nullBitmap);
- DeleteObject(bufferBitmap);
- bufferBitmap = nullptr;
- }
-
- if (bufferDC)
- DeleteDC(bufferDC);
- bufferDC = nullptr;
-
- if (ref.deref() && !force)
- return;
- if (!force) // -1 based atomic refcounting
- ref.deref();
-
- use_xp = false;
- cleanupHandleMap();
-}
-
-/* In order to obtain the correct VistaTreeViewTheme (arrows for PE_IndicatorBranch),
- * we need to set the windows "explorer" theme explicitly on a native
- * window and open the "TREEVIEW" theme handle passing its window handle
- * in order to get Vista-style item view themes (particulary drawBackground()
- * for selected items needs this).
- * We invoke a service of the native Windows interface to create
- * a non-visible window handle, open the theme on it and insert it into
- * the cache so that it is found by XPThemeData::handle() first.
- */
-
-static inline HWND createTreeViewHelperWindow()
-{
- if (QPlatformNativeInterface *ni = QGuiApplication::platformNativeInterface()) {
- void *hwnd = nullptr;
- void *wndProc = reinterpret_cast<void *>(DefWindowProc);
- if (QMetaObject::invokeMethod(ni, "createMessageWindow", Qt::DirectConnection,
- Q_RETURN_ARG(void*, hwnd),
- Q_ARG(QString, QStringLiteral("QTreeViewThemeHelperWindowClass")),
- Q_ARG(QString, QStringLiteral("QTreeViewThemeHelperWindow")),
- Q_ARG(void*, wndProc)) && hwnd) {
- return reinterpret_cast<HWND>(hwnd);
- }
- }
- return nullptr;
-}
-
-bool QWindowsXPStylePrivate::initVistaTreeViewTheming()
-{
- if (m_vistaTreeViewHelper)
- return true;
-
- m_vistaTreeViewHelper = createTreeViewHelperWindow();
- if (!m_vistaTreeViewHelper) {
- qWarning("Unable to create the treeview helper window.");
- return false;
- }
- if (FAILED(SetWindowTheme(m_vistaTreeViewHelper, L"explorer", nullptr))) {
- qErrnoWarning("SetWindowTheme() failed.");
- cleanupVistaTreeViewTheming();
- return false;
- }
- return true;
-}
-
-void QWindowsXPStylePrivate::cleanupVistaTreeViewTheming()
-{
- if (m_vistaTreeViewHelper) {
- DestroyWindow(m_vistaTreeViewHelper);
- m_vistaTreeViewHelper = nullptr;
- }
-}
-
-/* \internal
- Closes all open theme data handles to ensure that we don't leak
- resources, and that we don't refere to old handles when for
- example the user changes the theme style.
-*/
-void QWindowsXPStylePrivate::cleanupHandleMap()
-{
- for (auto &theme : m_themes) {
- if (theme) {
- CloseThemeData(theme);
- theme = nullptr;
- }
- }
- QWindowsXPStylePrivate::cleanupVistaTreeViewTheming();
-}
-
-HTHEME QWindowsXPStylePrivate::createTheme(int theme, HWND hwnd)
-{
- if (Q_UNLIKELY(theme < 0 || theme >= NThemes || !hwnd)) {
- qWarning("Invalid parameters #%d, %p", theme, hwnd);
- return nullptr;
- }
- if (!m_themes[theme]) {
- const wchar_t *name = themeNames[theme];
- if (theme == VistaTreeViewTheme && QWindowsXPStylePrivate::initVistaTreeViewTheming())
- hwnd = QWindowsXPStylePrivate::m_vistaTreeViewHelper;
- m_themes[theme] = OpenThemeData(hwnd, name);
- if (Q_UNLIKELY(!m_themes[theme]))
- qErrnoWarning("OpenThemeData() failed for theme %d (%s).",
- theme, qPrintable(themeName(theme)));
- }
- return m_themes[theme];
-}
-
-QString QWindowsXPStylePrivate::themeName(int theme)
-{
- return theme >= 0 && theme < NThemes ?
- QString::fromWCharArray(themeNames[theme]) :
- QString();
-}
-
-/*
-bool QWindowsXPStylePrivate::isItemViewDelegateLineEdit(const QWidget *widget)
-{
- if (!widget)
- return false;
- const QWidget *parent1 = widget->parentWidget();
- // Exlude dialogs or other toplevels parented on item views.
- if (!parent1 || parent1->isWindow())
- return false;
- const QWidget *parent2 = parent1->parentWidget();
- return parent2 && widget->inherits("QLineEdit")
- && parent2->inherits("QAbstractItemView");
-}
-*/
-
-/*
-// Returns whether base color is set for this widget
-bool QWindowsXPStylePrivate::isLineEditBaseColorSet(const QStyleOption *option, const QWidget *widget)
-{
- uint resolveMask = option->palette.resolve();
- if (widget) {
- // Since spin box includes a line edit we need to resolve the palette mask also from
- // the parent, as while the color is always correct on the palette supplied by panel,
- // the mask can still be empty. If either mask specifies custom base color, use that.
-#if QT_CONFIG(spinbox)
- if (const QAbstractSpinBox *spinbox = qobject_cast<QAbstractSpinBox*>(widget->parentWidget()))
- resolveMask |= spinbox->palette().resolve();
-#endif // QT_CONFIG(spinbox)
- }
- return (resolveMask & (1 << QPalette::Base)) != 0;
-}
-*/
-
-/*! \internal
- This function will always return a valid window handle, and might
- create a limbo widget to do so.
- We often need a window handle to for example open theme data, so
- this function ensures that we get one.
-*/
-HWND QWindowsXPStylePrivate::winId(const QWindow *window)
-{
- if (window)
- if (const HWND hwnd = reinterpret_cast<HWND>(window->winId()))
- return hwnd;
-
- // Find top level with native window (there might be dialogs that do not have one).
- const auto allWindows = QGuiApplication::allWindows();
- for (const QWindow *window : allWindows) {
- if (window->isTopLevel() && window->type() != Qt::Desktop && window->handle() != nullptr)
- return reinterpret_cast<HWND>(window->winId());
- }
-
- return GetDesktopWindow();
-}
-
-/*! \internal
- Returns a native buffer (DIB section) of at least the size of
- ( \a x , \a y ). The buffer has a 32 bit depth, to not lose
- the alpha values on proper alpha-pixmaps.
-*/
-HBITMAP QWindowsXPStylePrivate::buffer(int w, int h)
-{
- // If we already have a HBITMAP which is of adequate size, just return that
- if (bufferBitmap) {
- if (bufferW >= w && bufferH >= h)
- return bufferBitmap;
- // Not big enough, discard the old one
- if (bufferDC && nullBitmap)
- SelectObject(bufferDC, nullBitmap);
- DeleteObject(bufferBitmap);
- bufferBitmap = nullptr;
- }
-
- w = qMax(bufferW, w);
- h = qMax(bufferH, h);
-
- if (!bufferDC) {
- HDC displayDC = GetDC(nullptr);
- bufferDC = CreateCompatibleDC(displayDC);
- ReleaseDC(nullptr, displayDC);
- }
-
- // Define the header
- BITMAPINFO bmi;
- memset(&bmi, 0, sizeof(bmi));
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = w;
- bmi.bmiHeader.biHeight = -h;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB;
-
- // Create the pixmap
- bufferPixels = nullptr;
- bufferBitmap = CreateDIBSection(bufferDC, &bmi, DIB_RGB_COLORS, reinterpret_cast<void **>(&bufferPixels), nullptr, 0);
- GdiFlush();
- nullBitmap = static_cast<HBITMAP>(SelectObject(bufferDC, bufferBitmap));
-
- if (Q_UNLIKELY(!bufferBitmap)) {
- qErrnoWarning("QWindowsXPStylePrivate::buffer(%dx%d), CreateDIBSection() failed.", w, h);
- bufferW = 0;
- bufferH = 0;
- return nullptr;
- }
- if (Q_UNLIKELY(!bufferPixels)) {
- qErrnoWarning("QWindowsXPStylePrivate::buffer(%dx%d), CreateDIBSection() did not allocate pixel data.", w, h);
- bufferW = 0;
- bufferH = 0;
- return nullptr;
- }
- bufferW = w;
- bufferH = h;
-#ifdef DEBUG_XP_STYLE
- qDebug("Creating new dib section (%d, %d)", w, h);
-#endif
- return bufferBitmap;
-}
-
-/*! \internal
- Returns \c true if the part contains any transparency at all. This does
- not indicate what kind of transparency we're dealing with. It can be
- - Alpha transparency
- - Masked transparency
-*/
-bool QWindowsXPStylePrivate::isTransparent(XPThemeData &themeData)
-{
- return IsThemeBackgroundPartiallyTransparent(themeData.handle(), themeData.partId,
- themeData.stateId);
-}
-
-
-/*! \internal
- Returns a QRegion of the region of the part
-*/
-QRegion QWindowsXPStylePrivate::region(XPThemeData &themeData)
-{
- HRGN hRgn = nullptr;
- const qreal factor = QWindowsStylePrivate::nativeMetricScaleFactor(themeData.window);
- RECT rect = themeData.toRECT(QRect(themeData.rect.topLeft() / factor, themeData.rect.size() / factor));
- if (!SUCCEEDED(GetThemeBackgroundRegion(themeData.handle(), bufferHDC(), themeData.partId,
- themeData.stateId, &rect, &hRgn))) {
- return QRegion();
- }
-
- HRGN dest = CreateRectRgn(0, 0, 0, 0);
- const bool success = CombineRgn(dest, hRgn, nullptr, RGN_COPY) != ERROR;
-
- QRegion region;
-
- if (success) {
- const auto numBytes = GetRegionData(dest, 0, nullptr);
- if (numBytes == 0)
- return QRegion();
-
- char *buf = new (std::nothrow) char[numBytes];
- if (!buf)
- return QRegion();
-
- RGNDATA *rd = reinterpret_cast<RGNDATA*>(buf);
- if (GetRegionData(dest, numBytes, rd) == 0) {
- delete [] buf;
- return QRegion();
- }
-
- RECT *r = reinterpret_cast<RECT*>(rd->Buffer);
- for (uint i = 0; i < rd->rdh.nCount; ++i) {
- QRect rect;
- rect.setCoords(int(r->left * factor), int(r->top * factor), int((r->right - 1) * factor), int((r->bottom - 1) * factor));
- ++r;
- region |= rect;
- }
-
- delete [] buf;
- }
-
- DeleteObject(hRgn);
- DeleteObject(dest);
-
- return region;
-}
-
-/*! \internal
- Returns \c true if the native doublebuffer contains pixels with
- varying alpha value.
-*/
-bool QWindowsXPStylePrivate::hasAlphaChannel(const QRect &rect)
-{
- const int startX = rect.left();
- const int startY = rect.top();
- const int w = rect.width();
- const int h = rect.height();
-
- int firstAlpha = -1;
- for (int y = startY; y < h/2; ++y) {
- auto buffer = reinterpret_cast<const DWORD *>(bufferPixels) + (y * bufferW);
- for (int x = startX; x < w; ++x, ++buffer) {
- int alpha = (*buffer) >> 24;
- if (firstAlpha == -1)
- firstAlpha = alpha;
- else if (alpha != firstAlpha)
- return true;
- }
- }
- return false;
-}
-
-/*! \internal
- When the theme engine paints both a true alpha pixmap and a glyph
- into our buffer, the glyph might not contain a proper alpha value.
- The rule of thumb for premultiplied pixmaps is that the color
- values of a pixel can never be higher than the alpha values, so
- we use this to our advantage here, and fix all instances where
- this occures.
-*/
-bool QWindowsXPStylePrivate::fixAlphaChannel(const QRect &rect)
-{
- const int startX = rect.left();
- const int startY = rect.top();
- const int w = rect.width();
- const int h = rect.height();
- bool hasFixedAlphaValue = false;
-
- for (int y = startY; y < h; ++y) {
- auto buffer = reinterpret_cast<DWORD *>(bufferPixels) + (y * bufferW);
- for (int x = startX; x < w; ++x, ++buffer) {
- uint pixel = *buffer;
- int alpha = qAlpha(pixel);
- if (qRed(pixel) > alpha || qGreen(pixel) > alpha || qBlue(pixel) > alpha) {
- *buffer |= 0xff000000;
- hasFixedAlphaValue = true;
- }
- }
- }
- return hasFixedAlphaValue;
-}
-
-/*! \internal
- Swaps the alpha values on certain pixels:
- 0xFF?????? -> 0x00??????
- 0x00?????? -> 0xFF??????
- Used to determin the mask of a non-alpha transparent pixmap in
- the native doublebuffer, and swap the alphas so we may paint
- the image as a Premultiplied QImage with drawImage(), and obtain
- the mask transparency.
-*/
-bool QWindowsXPStylePrivate::swapAlphaChannel(const QRect &rect, bool allPixels)
-{
- const int startX = rect.left();
- const int startY = rect.top();
- const int w = rect.width();
- const int h = rect.height();
- bool valueChange = false;
-
- // Flip the alphas, so that 255-alpha pixels are 0, and 0-alpha are 255.
- for (int y = startY; y < h; ++y) {
- auto buffer = reinterpret_cast<DWORD *>(bufferPixels) + (y * bufferW);
- for (int x = startX; x < w; ++x, ++buffer) {
- if (allPixels) {
- *buffer |= 0xFF000000;
- continue;
- }
- unsigned int alphaValue = (*buffer) & 0xFF000000;
- if (alphaValue == 0xFF000000) {
- *buffer = 0;
- valueChange = true;
- } else if (alphaValue == 0) {
- *buffer |= 0xFF000000;
- valueChange = true;
- }
- }
- }
- return valueChange;
-}
-
-enum TransformType { SimpleTransform, HighDpiScalingTransform, ComplexTransform };
-
-static inline TransformType transformType(const QTransform &transform, qreal devicePixelRatio)
-{
- if (transform.type() <= QTransform::TxTranslate)
- return SimpleTransform;
- if (transform.type() > QTransform::TxScale)
- return ComplexTransform;
- return qFuzzyCompare(transform.m11(), devicePixelRatio)
- && qFuzzyCompare(transform.m22(), devicePixelRatio)
- ? HighDpiScalingTransform : ComplexTransform;
-}
-
-// QTBUG-60571: Exclude known fully opaque theme parts which produce values
-// invalid in ARGB32_Premultiplied (for example, 0x00ffffff).
-static inline bool isFullyOpaque(const XPThemeData &themeData)
-{
- return themeData.theme == QWindowsXPStylePrivate::TaskDialogTheme && themeData.partId == TDLG_PRIMARYPANEL;
-}
-
-/*! \internal
- Main theme drawing function.
- Determines the correct lowlevel drawing method depending on several
- factors.
- Use drawBackgroundThruNativeBuffer() if:
- - Painter does not have an HDC
- - Theme part is flipped (mirrored horizontally)
- else use drawBackgroundDirectly().
- \note drawBackgroundThruNativeBuffer() can return false for large
- sizes due to buffer()/CreateDIBSection() failing.
-*/
-bool QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData, qreal correctionFactor)
-{
- if (themeData.rect.isEmpty())
- return true;
-
- QPainter *painter = themeData.painter;
- Q_ASSERT_X(painter != nullptr, "QWindowsXPStylePrivate::drawBackground()", "Trying to draw a theme part without a painter");
- if (!painter || !painter->isActive())
- return false;
-
- painter->save();
-
- // Access paintDevice via engine since the painter may
- // return the clip device which can still be a widget device in case of grabWidget().
-
- //bool translucentToplevel = false;
- //const QPaintDevice *paintDevice = painter->device();
- const qreal additionalDevicePixelRatio = themeData.window ? themeData.window->devicePixelRatio() : qreal(1);
- Q_ASSERT(painter->device()->devType() != QInternal::Widget);
-/*
- if (paintDevice->devType() == QInternal::Widget) {
- const QWidget *window = static_cast<const QWidget *>(paintDevice)->window();
- translucentToplevel = window->testAttribute(Qt::WA_TranslucentBackground);
- }
-
- const TransformType tt = transformType(painter->deviceTransform(), aditionalDevicePixelRatio);
-
- bool canDrawDirectly = false;
- if (themeData.widget && painter->opacity() == 1.0 && !themeData.rotate
- && !isFullyOpaque(themeData)
- && tt != ComplexTransform && !themeData.mirrorVertically
- && !translucentToplevel) {
- // Draw on backing store DC only for real widgets or backing store images.
- const QPaintDevice *enginePaintDevice = painter->paintEngine()->paintDevice();
- switch (enginePaintDevice->devType()) {
- case QInternal::Widget:
- canDrawDirectly = true;
- break;
- case QInternal::Image:
- // Ensure the backing store has received as resize and is initialized.
- if (QBackingStore *bs = backingStoreForWidget(themeData.widget))
- if (bs->size().isValid() && bs->paintDevice() == enginePaintDevice)
- canDrawDirectly = true;
- }
- }
-
- const HDC dc = canDrawDirectly ? hdcForWidgetBackingStore(themeData.widget) : nullptr;
- const bool result = dc && qFuzzyCompare(correctionFactor, qreal(1))
- ? drawBackgroundDirectly(dc, themeData, aditionalDevicePixelRatio)
- : drawBackgroundThruNativeBuffer(themeData, aditionalDevicePixelRatio, correctionFactor);
- */
- const bool result = drawBackgroundThruNativeBuffer(themeData, additionalDevicePixelRatio, correctionFactor);
- painter->restore();
- return result;
-}
-
-static inline QRectF scaleRect(const QRectF &r, qreal factor)
-{
- return r.isValid() && factor > 1
- ? QRectF(r.topLeft() * factor, r.size() * factor)
- : r;
-}
-
-static QRegion scaleRegion(const QRegion &region, qreal factor)
-{
- if (region.isEmpty() || qFuzzyCompare(factor, qreal(1)))
- return region;
- QRegion result;
- for (const QRect &rect : region)
- result += QRectF(QPointF(rect.topLeft()) * factor, QSizeF(rect.size() * factor)).toRect();
- return result;
-}
-
-/*! \internal
- This function draws the theme parts directly to the paintengines HDC.
- Do not use this if you need to perform other transformations on the
- resulting data.
-*/
-bool QWindowsXPStylePrivate::drawBackgroundDirectly(HDC dc, XPThemeData &themeData, qreal additionalDevicePixelRatio)
-{
- QPainter *painter = themeData.painter;
-
- const auto &deviceTransform = painter->deviceTransform();
- const QPointF redirectionDelta(deviceTransform.dx(), deviceTransform.dy());
- const QRect area = scaleRect(QRectF(themeData.rect), additionalDevicePixelRatio).translated(redirectionDelta).toRect();
-
- QRegion sysRgn = painter->paintEngine()->systemClip();
- if (sysRgn.isEmpty())
- sysRgn = area;
- else
- sysRgn &= area;
- if (painter->hasClipping())
- sysRgn &= scaleRegion(painter->clipRegion(), additionalDevicePixelRatio).translated(redirectionDelta.toPoint());
- HRGN hrgn = qt_hrgn_from_qregion(sysRgn);
- SelectClipRgn(dc, hrgn);
-
-#ifdef DEBUG_XP_STYLE
- printf("---[ DIRECT PAINTING ]------------------> Name(%-10s) Part(%d) State(%d)\n",
- qPrintable(themeData.name), themeData.partId, themeData.stateId);
- showProperties(themeData);
-#endif
-
- RECT drawRECT = themeData.toRECT(area);
- DTBGOPTS drawOptions;
- memset(&drawOptions, 0, sizeof(drawOptions));
- drawOptions.dwSize = sizeof(drawOptions);
- drawOptions.rcClip = themeData.toRECT(sysRgn.boundingRect());
- drawOptions.dwFlags = DTBG_CLIPRECT
- | (themeData.noBorder ? DTBG_OMITBORDER : 0)
- | (themeData.noContent ? DTBG_OMITCONTENT : 0)
- | (themeData.mirrorHorizontally ? DTBG_MIRRORDC : 0);
-
- const HRESULT result = DrawThemeBackgroundEx(themeData.handle(), dc, themeData.partId, themeData.stateId, &(drawRECT), &drawOptions);
- SelectClipRgn(dc, nullptr);
- DeleteObject(hrgn);
- return SUCCEEDED(result);
-}
-
-/*! \internal
- This function uses a secondary Native doublebuffer for painting parts.
- It should only be used when the painteengine doesn't provide a proper
- HDC for direct painting (e.g. when doing a grabWidget(), painting to
- other pixmaps etc), or when special transformations are needed (e.g.
- flips (horizonal mirroring only, vertical are handled by the theme
- engine).
-
- \a correctionFactor is an additional factor used to scale up controls
- that are too small on High DPI screens, as has been observed for
- WP_MDICLOSEBUTTON, WP_MDIRESTOREBUTTON, WP_MDIMINBUTTON (QTBUG-75927).
-*/
-bool QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeData,
- qreal additionalDevicePixelRatio,
- qreal correctionFactor)
-{
- QPainter *painter = themeData.painter;
- QRectF rectF = scaleRect(QRectF(themeData.rect), additionalDevicePixelRatio);
-
- if ((themeData.rotate + 90) % 180 == 0) { // Catch 90,270,etc.. degree flips.
- rectF = QRectF(0, 0, rectF.height(), rectF.width());
- }
- rectF.moveTo(0, 0);
-
- const bool hasCorrectionFactor = !qFuzzyCompare(correctionFactor, qreal(1));
- QRect rect = rectF.toRect();
- QRect drawRect = hasCorrectionFactor
- ? QRectF(rectF.topLeft() / correctionFactor, rectF.size() / correctionFactor).toRect() : rect;
- int partId = themeData.partId;
- int stateId = themeData.stateId;
- int w = rect.width();
- int h = rect.height();
-
- // Values initialized later, either from cached values, or from function calls
- AlphaChannelType alphaType = UnknownAlpha;
- bool stateHasData = true; // We assume so;
- bool hasAlpha = false;
- bool partIsTransparent;
- bool potentialInvalidAlpha;
-
- QString pixmapCacheKey = QStringLiteral("$qt_xp_");
- pixmapCacheKey.append(themeName(themeData.theme));
- pixmapCacheKey.append(QLatin1Char('p'));
- pixmapCacheKey.append(QString::number(partId));
- pixmapCacheKey.append(QLatin1Char('s'));
- pixmapCacheKey.append(QString::number(stateId));
- pixmapCacheKey.append(QLatin1Char('s'));
- pixmapCacheKey.append(themeData.noBorder ? QLatin1Char('0') : QLatin1Char('1'));
- pixmapCacheKey.append(QLatin1Char('b'));
- pixmapCacheKey.append(themeData.noContent ? QLatin1Char('0') : QLatin1Char('1'));
- pixmapCacheKey.append(QString::number(w));
- pixmapCacheKey.append(QLatin1Char('w'));
- pixmapCacheKey.append(QString::number(h));
- pixmapCacheKey.append(QLatin1Char('h'));
- pixmapCacheKey.append(QString::number(additionalDevicePixelRatio));
- pixmapCacheKey.append(QLatin1Char('d'));
- if (hasCorrectionFactor) {
- pixmapCacheKey.append(QLatin1Char('c'));
- pixmapCacheKey.append(QString::number(correctionFactor));
- }
-
- QPixmap cachedPixmap;
- ThemeMapKey key(themeData);
- ThemeMapData data = alphaCache.value(key);
-
- bool haveCachedPixmap = false;
- bool isCached = data.dataValid;
- if (isCached) {
- partIsTransparent = data.partIsTransparent;
- hasAlpha = data.hasAlphaChannel;
- alphaType = data.alphaType;
- potentialInvalidAlpha = data.hadInvalidAlpha;
-
- haveCachedPixmap = QPixmapCache::find(pixmapCacheKey, &cachedPixmap);
-
-#ifdef DEBUG_XP_STYLE
- char buf[25];
- ::sprintf(buf, "+ Pixmap(%3d, %3d) ]", w, h);
- printf("---[ CACHED %s--------> Name(%-10s) Part(%d) State(%d)\n",
- haveCachedPixmap ? buf : "]-------------------",
- qPrintable(themeData.name), themeData.partId, themeData.stateId);
-#endif
- } else {
- // Not cached, so get values from Theme Engine
- BOOL tmt_borderonly = false;
- COLORREF tmt_transparentcolor = 0x0;
- PROPERTYORIGIN proporigin = PO_NOTFOUND;
- GetThemeBool(themeData.handle(), themeData.partId, themeData.stateId, TMT_BORDERONLY, &tmt_borderonly);
- GetThemeColor(themeData.handle(), themeData.partId, themeData.stateId, TMT_TRANSPARENTCOLOR, &tmt_transparentcolor);
- GetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, TMT_CAPTIONMARGINS, &proporigin);
-
- partIsTransparent = isTransparent(themeData);
-
- potentialInvalidAlpha = false;
- GetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, TMT_GLYPHTYPE, &proporigin);
- if (proporigin == PO_PART || proporigin == PO_STATE) {
- int tmt_glyphtype = GT_NONE;
- GetThemeEnumValue(themeData.handle(), themeData.partId, themeData.stateId, TMT_GLYPHTYPE, &tmt_glyphtype);
- potentialInvalidAlpha = partIsTransparent && tmt_glyphtype == GT_IMAGEGLYPH;
- }
-
-#ifdef DEBUG_XP_STYLE
- printf("---[ NOT CACHED ]-----------------------> Name(%-10s) Part(%d) State(%d)\n",
- qPrintable(themeData.name), themeData.partId, themeData.stateId);
- printf("-->partIsTransparen = %d\n", partIsTransparent);
- printf("-->potentialInvalidAlpha = %d\n", potentialInvalidAlpha);
- showProperties(themeData);
-#endif
- }
- bool wasAlphaSwapped = false;
- bool wasAlphaFixed = false;
-
- // OLD PSDK Workaround ------------------------------------------------------------------------
- // See if we need extra clipping for the older PSDK, which does
- // not have a DrawThemeBackgroundEx function for DTGB_OMITBORDER
- // and DTGB_OMITCONTENT
- bool addBorderContentClipping = false;
- QRegion extraClip;
- QRect area = drawRect;
- if (themeData.noBorder || themeData.noContent) {
- extraClip = area;
- // We are running on a system where the uxtheme.dll does not have
- // the DrawThemeBackgroundEx function, so we need to clip away
- // borders or contents manually.
-
- int borderSize = 0;
- PROPERTYORIGIN origin = PO_NOTFOUND;
- GetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, TMT_BORDERSIZE, &origin);
- GetThemeInt(themeData.handle(), themeData.partId, themeData.stateId, TMT_BORDERSIZE, &borderSize);
- borderSize *= additionalDevicePixelRatio;
-
- // Clip away border region
- if ((origin == PO_CLASS || origin == PO_PART || origin == PO_STATE) && borderSize > 0) {
- if (themeData.noBorder) {
- extraClip &= area;
- area = area.adjusted(-borderSize, -borderSize, borderSize, borderSize);
- }
-
- // Clip away content region
- if (themeData.noContent) {
- QRegion content = area.adjusted(borderSize, borderSize, -borderSize, -borderSize);
- extraClip ^= content;
- }
- }
- addBorderContentClipping = (themeData.noBorder | themeData.noContent);
- }
-
- QImage img;
- if (!haveCachedPixmap) { // If the pixmap is not cached, generate it! -------------------------
- if (!buffer(drawRect.width(), drawRect.height())) // Ensure a buffer of at least (w, h) in size
- return false;
- HDC dc = bufferHDC();
-
- // Clear the buffer
- if (alphaType != NoAlpha) {
- // Consider have separate "memset" function for small chunks for more speedup
- memset(bufferPixels, 0x00, bufferW * drawRect.height() * 4);
- }
-
- // Difference between area and rect
- int dx = area.x() - drawRect.x();
- int dy = area.y() - drawRect.y();
-
- // Adjust so painting rect starts from Origo
- rect.moveTo(0,0);
- area.moveTo(dx,dy);
- DTBGOPTS drawOptions;
- drawOptions.dwSize = sizeof(drawOptions);
- drawOptions.rcClip = themeData.toRECT(rect);
- drawOptions.dwFlags = DTBG_CLIPRECT
- | (themeData.noBorder ? DTBG_OMITBORDER : 0)
- | (themeData.noContent ? DTBG_OMITCONTENT : 0);
-
- // Drawing the part into the backing store
- RECT wRect(themeData.toRECT(area));
- DrawThemeBackgroundEx(themeData.handle(), dc, themeData.partId, themeData.stateId, &wRect, &drawOptions);
-
- // If not cached, analyze the buffer data to figure
- // out alpha type, and if it contains data
- if (!isCached) {
- // SHORTCUT: If the part's state has no data, cache it for NOOP later
- if (!stateHasData) {
- memset(static_cast<void *>(&data), 0, sizeof(data));
- data.dataValid = true;
- alphaCache.insert(key, data);
- return true;
- }
- hasAlpha = hasAlphaChannel(rect);
- if (!hasAlpha && partIsTransparent)
- potentialInvalidAlpha = true;
-#if defined(DEBUG_XP_STYLE) && 1
- dumpNativeDIB(drawRect.width(), drawRect.height());
-#endif
- }
-
- // Fix alpha values, if needed
- if (potentialInvalidAlpha)
- wasAlphaFixed = fixAlphaChannel(drawRect);
-
- QImage::Format format;
- if ((partIsTransparent && !wasAlphaSwapped) || (!partIsTransparent && hasAlpha)) {
- format = QImage::Format_ARGB32_Premultiplied;
- alphaType = RealAlpha;
- } else if (wasAlphaSwapped) {
- format = QImage::Format_ARGB32_Premultiplied;
- alphaType = MaskAlpha;
- } else {
- format = QImage::Format_RGB32;
- // The image data we got from the theme engine does not have any transparency,
- // thus the alpha channel is set to 0.
- // However, Format_RGB32 requires the alpha part to be set to 0xff, thus
- // we must flip it from 0x00 to 0xff
- swapAlphaChannel(rect, true);
- alphaType = NoAlpha;
- }
-#if defined(DEBUG_XP_STYLE) && 1
- printf("Image format is: %s\n", alphaType == RealAlpha ? "Real Alpha" : alphaType == MaskAlpha ? "Masked Alpha" : "No Alpha");
-#endif
- img = QImage(bufferPixels, bufferW, bufferH, format);
- if (hasCorrectionFactor)
- img = img.scaled(w, h, Qt::KeepAspectRatio, Qt::SmoothTransformation);
- img.setDevicePixelRatio(additionalDevicePixelRatio);
- }
-
- // Blitting backing store
- bool useRegion = partIsTransparent && !hasAlpha && !wasAlphaSwapped;
-
- QRegion newRegion;
- QRegion oldRegion;
- if (useRegion) {
- newRegion = region(themeData);
- oldRegion = painter->clipRegion();
- painter->setClipRegion(newRegion);
-#if defined(DEBUG_XP_STYLE) && 0
- printf("Using region:\n");
- for (const QRect &r : newRegion)
- printf(" (%d, %d, %d, %d)\n", r.x(), r.y(), r.right(), r.bottom());
-#endif
- }
-
- if (addBorderContentClipping)
- painter->setClipRegion(scaleRegion(extraClip, 1.0 / additionalDevicePixelRatio), Qt::IntersectClip);
-
- if (!themeData.mirrorHorizontally && !themeData.mirrorVertically && !themeData.rotate) {
- if (!haveCachedPixmap)
- painter->drawImage(themeData.rect, img, rect);
- else
- painter->drawPixmap(themeData.rect, cachedPixmap);
- } else {
- // This is _slow_!
- // Make a copy containing only the necessary data, and mirror
- // on all wanted axes. Then draw the copy.
- // If cached, the normal pixmap is cached, instead of caching
- // all possible orientations for each part and state.
- QImage imgCopy;
- if (!haveCachedPixmap)
- imgCopy = img.copy(rect);
- else
- imgCopy = cachedPixmap.toImage();
-
- if (themeData.rotate) {
- QTransform rotMatrix;
- rotMatrix.rotate(themeData.rotate);
- imgCopy = imgCopy.transformed(rotMatrix);
- }
- if (themeData.mirrorHorizontally || themeData.mirrorVertically) {
- imgCopy = imgCopy.mirrored(themeData.mirrorHorizontally, themeData.mirrorVertically);
- }
- painter->drawImage(themeData.rect,
- imgCopy);
- }
-
- if (useRegion || addBorderContentClipping) {
- if (oldRegion.isEmpty())
- painter->setClipping(false);
- else
- painter->setClipRegion(oldRegion);
- }
-
- // Cache the pixmap to avoid expensive swapAlphaChannel() calls
- if (!haveCachedPixmap && w && h) {
- QPixmap pix = QPixmap::fromImage(img).copy(rect);
- QPixmapCache::insert(pixmapCacheKey, pix);
-#ifdef DEBUG_XP_STYLE
- printf("+++Adding pixmap to cache, size(%d, %d), wasAlphaSwapped(%d), wasAlphaFixed(%d), name(%s)\n",
- w, h, wasAlphaSwapped, wasAlphaFixed, qPrintable(pixmapCacheKey));
-#endif
- }
-
- // Add to theme part cache
- if (!isCached) {
- memset(static_cast<void *>(&data), 0, sizeof(data));
- data.dataValid = true;
- data.partIsTransparent = partIsTransparent;
- data.alphaType = alphaType;
- data.hasAlphaChannel = hasAlpha;
- data.wasAlphaSwapped = wasAlphaSwapped;
- data.hadInvalidAlpha = wasAlphaFixed;
- alphaCache.insert(key, data);
- }
- return true;
-}
-
-
-// ------------------------------------------------------------------------------------------------
-
-/*!
- \class QWindowsXPStyle
- \brief The QWindowsXPStyle class provides a Microsoft Windows XP-like look and feel.
-
- \ingroup appearance
- \inmodule QtWidgets
- \internal
-
- \warning This style is only available on the Windows XP platform
- because it makes use of Windows XP's style engine.
-
- Most of the functions are documented in the base classes
- QWindowsStyle, QCommonStyle, and QStyle, but the
- QWindowsXPStyle overloads of drawComplexControl(), drawControl(),
- drawControlMask(), drawPrimitive(), proxy()->subControlRect(), and
- sizeFromContents(), are documented here.
-
- \image qwindowsxpstyle.png
- \sa QMacStyle, QWindowsStyle, QFusionStyle
-*/
-
-/*!
- Constructs a QWindowsStyle
-*/
-QWindowsXPStyle::QWindowsXPStyle()
- : QWindowsStyle(*new QWindowsXPStylePrivate)
-{
-}
-
-/*!
- Destroys the style.
-*/
-QWindowsXPStyle::~QWindowsXPStyle() = default;
-
-/*! \reimp */
-QRect QWindowsXPStyle::subElementRect(SubElement sr, const QStyleOption *option) const
-{
- if (!QWindowsXPStylePrivate::useXP()) {
- return QWindowsStyle::subElementRect(sr, option);
- }
-
- QRect rect(option->rect);
- switch (sr) {
- case SE_DockWidgetCloseButton:
- case SE_DockWidgetFloatButton:
- rect = QWindowsStyle::subElementRect(sr, option);
- return rect.translated(0, 1);
- break;
-#if 0
- case SE_TabWidgetTabContents:
- if (qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option))
- {
- rect = QWindowsStyle::subElementRect(sr, option);
- if (sr == SE_TabWidgetTabContents) {
- if (const QTabWidget *tabWidget = qobject_cast<const QTabWidget *>(widget)) {
- if (tabWidget->documentMode())
- break;
- }
-
- rect.adjust(0, 0, -2, -2);
- }
- }
- break;
- case SE_TabWidgetTabBar: {
- rect = QWindowsStyle::subElementRect(sr, option);
- const QStyleOptionTabWidgetFrame *twfOption =
- qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option);
- if (twfOption && twfOption->direction == Qt::RightToLeft
- && (twfOption->shape == QTabBar::RoundedNorth
- || twfOption->shape == QTabBar::RoundedSouth))
- {
- QStyleOptionTab otherOption;
- otherOption.shape = (twfOption->shape == QTabBar::RoundedNorth
- ? QTabBar::RoundedEast : QTabBar::RoundedSouth);
- int overlap = proxy()->pixelMetric(PM_TabBarBaseOverlap, &otherOption);
- int borderThickness = proxy()->pixelMetric(PM_DefaultFrameWidth, option);
- rect.adjust(-overlap + borderThickness, 0, -overlap + borderThickness, 0);
- }
- break;}
-#endif
- case SE_PushButtonContents:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- MARGINS borderSize;
- if (option->window) {
- XPThemeData buttontheme(option->window, nullptr, QWindowsXPStylePrivate::ButtonTheme);
- HTHEME theme = buttontheme.handle();
- if (theme) {
- int stateId;
- if (!(option->state & State_Enabled))
- stateId = PBS_DISABLED;
- else if (option->state & State_Sunken)
- stateId = PBS_PRESSED;
- else if (option->state & State_MouseOver)
- stateId = PBS_HOT;
- else if (btn->features & QStyleOptionButton::DefaultButton)
- stateId = PBS_DEFAULTED;
- else
- stateId = PBS_NORMAL;
-
- int border = proxy()->pixelMetric(PM_DefaultFrameWidth, btn);
- rect = option->rect.adjusted(border, border, -border, -border);
-
- if (SUCCEEDED(GetThemeMargins(theme, nullptr, BP_PUSHBUTTON, stateId, TMT_CONTENTMARGINS, nullptr, &borderSize))) {
- rect.adjust(borderSize.cxLeftWidth, borderSize.cyTopHeight,
- -borderSize.cxRightWidth, -borderSize.cyBottomHeight);
- rect = visualRect(option->direction, option->rect, rect);
- }
- }
- }
- }
- break;
- case SE_ProgressBarContents:
- rect = QCommonStyle::subElementRect(SE_ProgressBarGroove, option);
- if (option->state & QStyle::State_Horizontal)
- rect.adjust(4, 3, -4, -3);
- else
- rect.adjust(3, 2, -3, -2);
- break;
- default:
- rect = QWindowsStyle::subElementRect(sr, option);
- }
- return rect;
-}
-
-/*!
- \reimp
-*/
-void QWindowsXPStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *option, QPainter *p) const
-{
- QWindowsXPStylePrivate *d = const_cast<QWindowsXPStylePrivate*>(d_func());
-
- if (!QWindowsXPStylePrivate::useXP()) {
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
-
- int themeNumber = -1;
- int partId = 0;
- int stateId = 0;
- QRect rect = option->rect;
- State flags = option->state;
- bool hMirrored = false;
- bool vMirrored = false;
- bool noBorder = false;
- bool noContent = false;
- int rotate = 0;
-
- switch (pe) {
-#if 0
- case PE_FrameTabBarBase:
- if (const QStyleOptionTabBarBase *tbb
- = qstyleoption_cast<const QStyleOptionTabBarBase *>(option)) {
- p->save();
- switch (tbb->shape) {
- case QTabBar::RoundedNorth:
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.topLeft(), tbb->rect.topRight());
- break;
- case QTabBar::RoundedWest:
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.left(), tbb->rect.top(), tbb->rect.left(), tbb->rect.bottom());
- break;
- case QTabBar::RoundedSouth:
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.left(), tbb->rect.top(),
- tbb->rect.right(), tbb->rect.top());
- break;
- case QTabBar::RoundedEast:
- p->setPen(QPen(tbb->palette.dark(), 0));
- p->drawLine(tbb->rect.topLeft(), tbb->rect.bottomLeft());
- break;
- case QTabBar::TriangularNorth:
- case QTabBar::TriangularEast:
- case QTabBar::TriangularWest:
- case QTabBar::TriangularSouth:
- p->restore();
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- p->restore();
- }
- return;
-#endif
- case PE_PanelButtonBevel:
- themeNumber = QWindowsXPStylePrivate::ButtonTheme;
- partId = BP_PUSHBUTTON;
- if (!(flags & State_Enabled))
- stateId = PBS_DISABLED;
- else if ((flags & State_Sunken) || (flags & State_On))
- stateId = PBS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = PBS_HOT;
- //else if (flags & State_ButtonDefault)
- // stateId = PBS_DEFAULTED;
- else
- stateId = PBS_NORMAL;
- break;
-
- case PE_PanelButtonTool:
-// if (widget && widget->inherits("QDockWidgetTitleButton")) {
-// if (const QWidget *dw = widget->parentWidget())
-// if (dw->isWindow())
-// return;
-// }
- themeNumber = QWindowsXPStylePrivate::ToolBarTheme;
- partId = TP_BUTTON;
- if (!(flags & State_Enabled))
- stateId = TS_DISABLED;
- else if (flags & State_Sunken)
- stateId = TS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = flags & State_On ? TS_HOTCHECKED : TS_HOT;
- else if (flags & State_On)
- stateId = TS_CHECKED;
- else if (!(flags & State_AutoRaise))
- stateId = TS_HOT;
- else
- stateId = TS_NORMAL;
- break;
-
- case PE_IndicatorButtonDropDown:
- themeNumber = QWindowsXPStylePrivate::ToolBarTheme;
- partId = TP_SPLITBUTTONDROPDOWN;
- if (!(flags & State_Enabled))
- stateId = TS_DISABLED;
- else if (flags & State_Sunken)
- stateId = TS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = flags & State_On ? TS_HOTCHECKED : TS_HOT;
- else if (flags & State_On)
- stateId = TS_CHECKED;
- else if (!(flags & State_AutoRaise))
- stateId = TS_HOT;
- else
- stateId = TS_NORMAL;
- if (option->direction == Qt::RightToLeft)
- hMirrored = true;
- break;
-
- case PE_IndicatorCheckBox:
- themeNumber = QWindowsXPStylePrivate::ButtonTheme;
- partId = BP_CHECKBOX;
- if (!(flags & State_Enabled))
- stateId = CBS_UNCHECKEDDISABLED;
- else if (flags & State_Sunken)
- stateId = CBS_UNCHECKEDPRESSED;
- else if (flags & State_MouseOver)
- stateId = CBS_UNCHECKEDHOT;
- else
- stateId = CBS_UNCHECKEDNORMAL;
-
- if (flags & State_On)
- stateId += CBS_CHECKEDNORMAL-1;
- else if (flags & State_NoChange)
- stateId += CBS_MIXEDNORMAL-1;
-
- break;
-
- case PE_IndicatorRadioButton:
- themeNumber = QWindowsXPStylePrivate::ButtonTheme;
- partId = BP_RADIOBUTTON;
- if (!(flags & State_Enabled))
- stateId = RBS_UNCHECKEDDISABLED;
- else if (flags & State_Sunken)
- stateId = RBS_UNCHECKEDPRESSED;
- else if (flags & State_MouseOver)
- stateId = RBS_UNCHECKEDHOT;
- else
- stateId = RBS_UNCHECKEDNORMAL;
-
- if (flags & State_On)
- stateId += RBS_CHECKEDNORMAL-1;
- break;
-
- case PE_IndicatorDockWidgetResizeHandle:
- return;
-
-case PE_Frame:
- {
- if (flags & State_Raised)
- return;
- themeNumber = QWindowsXPStylePrivate::ListViewTheme;
- partId = LVP_LISTGROUP;
- XPThemeData theme(option->window, nullptr, themeNumber, partId);
-
- if (!(flags & State_Enabled))
- stateId = ETS_DISABLED;
- else
- stateId = ETS_NORMAL;
- int fillType;
- if (GetThemeEnumValue(theme.handle(), partId, stateId, TMT_BGTYPE, &fillType) == S_OK) {
- if (fillType == BT_BORDERFILL) {
- COLORREF bcRef;
- GetThemeColor(theme.handle(), partId, stateId, TMT_BORDERCOLOR, &bcRef);
- QColor bordercolor(qRgb(GetRValue(bcRef), GetGValue(bcRef), GetBValue(bcRef)));
- QPen oldPen = p->pen();
- // int borderSize = 1;
- // GetThemeInt(theme.handle(), partId, stateId, TMT_BORDERCOLOR, &borderSize);
-
- // Inner white border
- p->setPen(QPen(option->palette.base().color(), 0));
- const qreal dpi = QStyleHelper::dpi(option);
- const auto topLevelAdjustment = QStyleHelper::dpiScaled(0.5, dpi);
- const auto bottomRightAdjustment = QStyleHelper::dpiScaled(-1, dpi);
- p->drawRect(QRectF(option->rect).adjusted(topLevelAdjustment, topLevelAdjustment,
- bottomRightAdjustment, bottomRightAdjustment));
- // Outer dark border
- p->setPen(QPen(bordercolor, 0));
- p->drawRect(QRectF(option->rect).adjusted(0, 0, -topLevelAdjustment, -topLevelAdjustment));
- p->setPen(oldPen);
- return;
- }
- if (fillType == BT_NONE)
- return;
- }
- break;
- }
- case PE_FrameLineEdit: {
- // we try to check if this lineedit is a delegate on a QAbstractItemView-derived class.
- /*
- if (QWindowsXPStylePrivate::isItemViewDelegateLineEdit(widget)) {
- QPen oldPen = p->pen();
- // Inner white border
- p->setPen(QPen(option->palette.base().color(), 1));
- p->drawRect(option->rect.adjusted(1, 1, -2, -2));
- // Outer dark border
- p->setPen(QPen(option->palette.shadow().color(), 1));
- p->drawRect(option->rect.adjusted(0, 0, -1, -1));
- p->setPen(oldPen);
- return;
- }
- */
- if (qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- themeNumber = QWindowsXPStylePrivate::EditTheme;
- partId = EP_EDITTEXT;
- noContent = true;
- if (!(flags & State_Enabled))
- stateId = ETS_DISABLED;
- else
- stateId = ETS_NORMAL;
- }
- break;
- }
-
- case PE_PanelLineEdit:
- if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- themeNumber = QWindowsXPStylePrivate::EditTheme;
- partId = EP_EDITTEXT;
- noBorder = true;
- bool isEnabled = flags & State_Enabled;
-
- stateId = isEnabled ? ETS_NORMAL : ETS_DISABLED;
-
- /*if (QWindowsXPStylePrivate::isLineEditBaseColorSet(option, widget)) {
- p->fillRect(panel->rect, panel->palette.brush(QPalette::Base));
- } else*/ {
- XPThemeData theme(nullptr, p, themeNumber, partId, stateId, rect);
- if (!theme.isValid()) {
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- int bgType;
- GetThemeEnumValue(theme.handle(), partId, stateId, TMT_BGTYPE, &bgType);
- if ( bgType == BT_IMAGEFILE ) {
- theme.mirrorHorizontally = hMirrored;
- theme.mirrorVertically = vMirrored;
- theme.noBorder = noBorder;
- theme.noContent = noContent;
- theme.rotate = rotate;
- d->drawBackground(theme);
- } else {
- QBrush fillColor = option->palette.brush(QPalette::Base);
-
- if (!isEnabled) {
- PROPERTYORIGIN origin = PO_NOTFOUND;
- GetThemePropertyOrigin(theme.handle(), theme.partId, theme.stateId, TMT_FILLCOLOR, &origin);
- // Use only if the fill property comes from our part
- if ((origin == PO_PART || origin == PO_STATE)) {
- COLORREF bgRef;
- GetThemeColor(theme.handle(), partId, stateId, TMT_FILLCOLOR, &bgRef);
- fillColor = QBrush(qRgb(GetRValue(bgRef), GetGValue(bgRef), GetBValue(bgRef)));
- }
- }
- p->fillRect(option->rect, fillColor);
- }
- }
-
- if (panel->lineWidth > 0)
- proxy()->drawPrimitive(PE_FrameLineEdit, panel, p);
- return;
- }
- break;
-#if 0
- case PE_FrameTabWidget:
- if (const QStyleOptionTabWidgetFrame *tab = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option))
- {
- themeNumber = QWindowsXPStylePrivate::TabTheme;
- partId = TABP_PANE;
-
- if (option->window) {
- bool useGradient = true;
- const int maxlength = 256;
- wchar_t themeFileName[maxlength];
- wchar_t themeColor[maxlength];
- // Due to a a scaling issue with the XP Silver theme, tab gradients are not used with it
- if (GetCurrentThemeName(themeFileName, maxlength, themeColor, maxlength, nullptr, 0) == S_OK) {
- wchar_t *offset = nullptr;
- if ((offset = wcsrchr(themeFileName, QChar(QLatin1Char('\\')).unicode())) != nullptr) {
- offset++;
- if (!lstrcmp(offset, L"Luna.msstyles") && !lstrcmp(offset, L"Metallic")) {
- useGradient = false;
- }
- }
- }
- // This should work, but currently there's an error in the ::drawBackgroundDirectly()
- // code, when using the HDC directly..
- if (useGradient) {
- QStyleOptionTabWidgetFrame frameOpt = *tab;
- //frameOpt.rect = widget->rect();
-
- QRect contentsRect = subElementRect(SE_TabWidgetTabContents, &frameOpt);
- QRegion reg = option->rect;
- reg -= contentsRect;
- p->setClipRegion(reg);
- XPThemeData theme(option->window, p, themeNumber, partId, stateId, rect);
- theme.mirrorHorizontally = hMirrored;
- theme.mirrorVertically = vMirrored;
- d->drawBackground(theme);
- p->setClipRect(contentsRect);
- partId = TABP_BODY;
- }
- }
- switch (tab->shape) {
- case QTabBar::RoundedNorth:
- case QTabBar::TriangularNorth:
- break;
- case QTabBar::RoundedSouth:
- case QTabBar::TriangularSouth:
- vMirrored = true;
- break;
- case QTabBar::RoundedEast:
- case QTabBar::TriangularEast:
- rotate = 90;
- break;
- case QTabBar::RoundedWest:
- case QTabBar::TriangularWest:
- rotate = 90;
- hMirrored = true;
- break;
- default:
- break;
- }
- }
- break;
-#endif
- case PE_FrameMenu:
- p->save();
- p->setPen(option->palette.dark().color());
- p->drawRect(rect.adjusted(0, 0, -1, -1));
- p->restore();
- return;
-
- case PE_PanelMenuBar:
- break;
-
- case PE_FrameDockWidget:
- if (const QStyleOptionFrame *frm = qstyleoption_cast<const QStyleOptionFrame *>(option))
- {
- themeNumber = QWindowsXPStylePrivate::WindowTheme;
- if (flags & State_Active)
- stateId = FS_ACTIVE;
- else
- stateId = FS_INACTIVE;
-
- int fwidth = proxy()->pixelMetric(PM_DockWidgetFrameWidth, frm);
-
- XPThemeData theme(option->window, p, themeNumber, 0, stateId);
- if (!theme.isValid())
- break;
- theme.rect = QRect(frm->rect.x(), frm->rect.y(), frm->rect.x()+fwidth, frm->rect.height()-fwidth); theme.partId = WP_SMALLFRAMELEFT;
- d->drawBackground(theme);
- theme.rect = QRect(frm->rect.width()-fwidth, frm->rect.y(), fwidth, frm->rect.height()-fwidth);
- theme.partId = WP_SMALLFRAMERIGHT;
- d->drawBackground(theme);
- theme.rect = QRect(frm->rect.x(), frm->rect.bottom()-fwidth+1, frm->rect.width(), fwidth);
- theme.partId = WP_SMALLFRAMEBOTTOM;
- d->drawBackground(theme);
- return;
- }
- break;
-
- case PE_IndicatorHeaderArrow:
- {
-#if 0 // XP theme engine doesn't know about this :(
- name = QWindowsXPStylePrivate::HeaderTheme;
- partId = HP_HEADERSORTARROW;
- if (flags & State_Down)
- stateId = HSAS_SORTEDDOWN;
- else
- stateId = HSAS_SORTEDUP;
-#else
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- p->save();
- p->setPen(option->palette.dark().color());
- p->translate(0, option->rect.height()/2 - 4);
- if (header->sortIndicator & QStyleOptionHeader::SortUp) { // invert logic to follow Windows style guide
- p->drawLine(option->rect.x(), option->rect.y(), option->rect.x()+8, option->rect.y());
- p->drawLine(option->rect.x()+1, option->rect.y()+1, option->rect.x()+7, option->rect.y()+1);
- p->drawLine(option->rect.x()+2, option->rect.y()+2, option->rect.x()+6, option->rect.y()+2);
- p->drawLine(option->rect.x()+3, option->rect.y()+3, option->rect.x()+5, option->rect.y()+3);
- p->drawPoint(option->rect.x()+4, option->rect.y()+4);
- } else if (header->sortIndicator & QStyleOptionHeader::SortDown) {
- p->drawLine(option->rect.x(), option->rect.y()+4, option->rect.x()+8, option->rect.y()+4);
- p->drawLine(option->rect.x()+1, option->rect.y()+3, option->rect.x()+7, option->rect.y()+3);
- p->drawLine(option->rect.x()+2, option->rect.y()+2, option->rect.x()+6, option->rect.y()+2);
- p->drawLine(option->rect.x()+3, option->rect.y()+1, option->rect.x()+5, option->rect.y()+1);
- p->drawPoint(option->rect.x()+4, option->rect.y());
- }
- p->restore();
- return;
- }
-#endif
- }
- break;
-
- case PE_FrameStatusBarItem:
- themeNumber = QWindowsXPStylePrivate::StatusTheme;
- partId = SP_PANE;
- break;
-
- case PE_FrameGroupBox:
- themeNumber = QWindowsXPStylePrivate::ButtonTheme;
- partId = BP_GROUPBOX;
- if (!(flags & State_Enabled))
- stateId = GBS_DISABLED;
- else
- stateId = GBS_NORMAL;
- if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- if (frame->features & QStyleOptionFrame::Flat) {
- // Windows XP does not have a theme part for a flat GroupBox, paint it with the windows style
- QRect fr = frame->rect;
- QPoint p1(fr.x(), fr.y() + 1);
- QPoint p2(fr.x() + fr.width(), p1.y() + 1);
- rect = QRect(p1, p2);
- themeNumber = -1;
- }
- }
- break;
-
- case PE_IndicatorProgressChunk:
- {
- Qt::Orientation orient = Qt::Horizontal;
- bool inverted = false;
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- orient = pb->state & QStyle::State_Horizontal ? Qt::Horizontal : Qt::Vertical;
- inverted = pb->invertedAppearance;
- }
- if (orient == Qt::Horizontal) {
- partId = PP_CHUNK;
- rect = QRect(option->rect.x(), option->rect.y(), option->rect.width(), option->rect.height() );
- if (inverted && option->direction == Qt::LeftToRight)
- hMirrored = true;
- } else {
- partId = PP_CHUNKVERT;
- rect = QRect(option->rect.x(), option->rect.y(), option->rect.width(), option->rect.height());
- }
- themeNumber = QWindowsXPStylePrivate::ProgressTheme;
- stateId = 1;
- }
- break;
-
- case PE_FrameWindow:
- if (const QStyleOptionFrame *frm = qstyleoption_cast<const QStyleOptionFrame *>(option))
- {
- themeNumber = QWindowsXPStylePrivate::WindowTheme;
- if (flags & State_Active)
- stateId = FS_ACTIVE;
- else
- stateId = FS_INACTIVE;
-
- int fwidth = int((frm->lineWidth + frm->midLineWidth) / QWindowsStylePrivate::nativeMetricScaleFactor(option));
-
- XPThemeData theme(option->window, p, themeNumber, 0, stateId);
- if (!theme.isValid())
- break;
-
- // May fail due to too-large buffers for large widgets, fall back to Windows style.
- theme.rect = QRect(option->rect.x(), option->rect.y()+fwidth, option->rect.x()+fwidth, option->rect.height()-fwidth);
- theme.partId = WP_FRAMELEFT;
- if (!d->drawBackground(theme)) {
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- theme.rect = QRect(option->rect.width()-fwidth, option->rect.y()+fwidth, fwidth, option->rect.height()-fwidth);
- theme.partId = WP_FRAMERIGHT;
- if (!d->drawBackground(theme)) {
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- theme.rect = QRect(option->rect.x(), option->rect.height()-fwidth, option->rect.width(), fwidth);
- theme.partId = WP_FRAMEBOTTOM;
- if (!d->drawBackground(theme)) {
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- theme.rect = QRect(option->rect.x(), option->rect.y(), option->rect.width(), option->rect.y()+fwidth);
- theme.partId = WP_CAPTION;
- if (!d->drawBackground(theme))
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- break;
-
- case PE_IndicatorBranch:
- {
- static const int decoration_size = 9;
- int mid_h = option->rect.x() + option->rect.width() / 2;
- int mid_v = option->rect.y() + option->rect.height() / 2;
- int bef_h = mid_h;
- int bef_v = mid_v;
- int aft_h = mid_h;
- int aft_v = mid_v;
- QBrush brush(option->palette.dark().color(), Qt::Dense4Pattern);
- if (option->state & State_Item) {
- if (option->direction == Qt::RightToLeft)
- p->fillRect(option->rect.left(), mid_v, bef_h - option->rect.left(), 1, brush);
- else
- p->fillRect(aft_h, mid_v, option->rect.right() - aft_h + 1, 1, brush);
- }
- if (option->state & State_Sibling)
- p->fillRect(mid_h, aft_v, 1, option->rect.bottom() - aft_v + 1, brush);
- if (option->state & (State_Open | State_Children | State_Item | State_Sibling))
- p->fillRect(mid_h, option->rect.y(), 1, bef_v - option->rect.y(), brush);
- if (option->state & State_Children) {
- int delta = decoration_size / 2;
- bef_h -= delta;
- bef_v -= delta;
- aft_h += delta;
- aft_v += delta;
- XPThemeData theme(nullptr, p, QWindowsXPStylePrivate::XpTreeViewTheme);
- theme.rect = QRect(bef_h, bef_v, decoration_size, decoration_size);
- theme.partId = TVP_GLYPH;
- theme.stateId = flags & QStyle::State_Open ? GLPS_OPENED : GLPS_CLOSED;
- d->drawBackground(theme);
- }
- }
- return;
-
- case PE_IndicatorToolBarSeparator:
- if (option->rect.height() < 3) {
- // XP style requires a few pixels for the separator
- // to be visible.
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- themeNumber = QWindowsXPStylePrivate::ToolBarTheme;
- partId = TP_SEPARATOR;
-
- if (option->state & State_Horizontal)
- partId = TP_SEPARATOR;
- else
- partId = TP_SEPARATORVERT;
-
- break;
-
- case PE_IndicatorToolBarHandle:
-
- themeNumber = QWindowsXPStylePrivate::RebarTheme;
- partId = RP_GRIPPER;
- if (option->state & State_Horizontal) {
- partId = RP_GRIPPER;
- rect.adjust(0, 0, -2, 0);
- }
- else {
- partId = RP_GRIPPERVERT;
- rect.adjust(0, 0, 0, -2);
- }
- break;
-
- case PE_IndicatorItemViewItemCheck: {
- QStyleOptionButton button;
- button.QStyleOption::operator=(*option);
- button.state &= ~State_MouseOver;
- proxy()->drawPrimitive(PE_IndicatorCheckBox, &button, p);
- return;
- }
-
- default:
- break;
- }
-
- XPThemeData theme(option->window, p, themeNumber, partId, stateId, rect);
- if (!theme.isValid()) {
- QWindowsStyle::drawPrimitive(pe, option, p);
- return;
- }
- theme.mirrorHorizontally = hMirrored;
- theme.mirrorVertically = vMirrored;
- theme.noBorder = noBorder;
- theme.noContent = noContent;
- theme.rotate = rotate;
- d->drawBackground(theme);
-}
-
-/*!
- \reimp
-*/
-void QWindowsXPStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *p) const
-{
- QWindowsXPStylePrivate *d = const_cast<QWindowsXPStylePrivate*>(d_func());
- if (!QWindowsXPStylePrivate::useXP()) {
- QWindowsStyle::drawControl(element, option, p);
- return;
- }
-
- QRect rect(option->rect);
- State flags = option->state;
-
- int rotate = 0;
- bool hMirrored = false;
- bool vMirrored = false;
-
- int themeNumber = -1;
- int partId = 0;
- int stateId = 0;
- switch (element) {
- case CE_SizeGrip:
- {
- themeNumber = QWindowsXPStylePrivate::StatusTheme;
- partId = SP_GRIPPER;
- XPThemeData theme(nullptr, p, themeNumber, partId);
- QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(option)).toSize();
- size.rheight()--;
- if (const QStyleOptionSizeGrip *sg = qstyleoption_cast<const QStyleOptionSizeGrip *>(option)) {
- switch (sg->corner) {
- case Qt::BottomRightCorner:
- rect = QRect(QPoint(rect.right() - size.width(), rect.bottom() - size.height()), size);
- break;
- case Qt::BottomLeftCorner:
- rect = QRect(QPoint(rect.left() + 1, rect.bottom() - size.height()), size);
- hMirrored = true;
- break;
- case Qt::TopRightCorner:
- rect = QRect(QPoint(rect.right() - size.width(), rect.top() + 1), size);
- vMirrored = true;
- break;
- case Qt::TopLeftCorner:
- rect = QRect(rect.topLeft() + QPoint(1, 1), size);
- hMirrored = vMirrored = true;
- }
- }
- }
- break;
-
- case CE_HeaderSection:
- themeNumber = QWindowsXPStylePrivate::HeaderTheme;
- partId = HP_HEADERITEM;
- if (flags & State_Sunken)
- stateId = HIS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = HIS_HOT;
- else
- stateId = HIS_NORMAL;
- break;
-
- case CE_Splitter:
- p->eraseRect(option->rect);
- return;
-
- case CE_PushButtonBevel:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option))
- {
- themeNumber = QWindowsXPStylePrivate::ButtonTheme;
- partId = BP_PUSHBUTTON;
- bool justFlat = ((btn->features & QStyleOptionButton::Flat) && !(flags & (State_On|State_Sunken)))
- || ((btn->features & QStyleOptionButton::CommandLinkButton)
- && !(flags & State_MouseOver)
- && !(btn->features & QStyleOptionButton::DefaultButton));
- if (!(flags & State_Enabled) && !(btn->features & QStyleOptionButton::Flat))
- stateId = PBS_DISABLED;
- else if (justFlat)
- ;
- else if (flags & (State_Sunken | State_On))
- stateId = PBS_PRESSED;
- else if (flags & State_MouseOver)
- stateId = PBS_HOT;
- else if (btn->features & QStyleOptionButton::DefaultButton)
- stateId = PBS_DEFAULTED;
- else
- stateId = PBS_NORMAL;
-
- if (!justFlat) {
- XPThemeData theme(option->window, p, themeNumber, partId, stateId, rect);
- d->drawBackground(theme);
- }
-
- if (btn->features & QStyleOptionButton::HasMenu) {
- int mbiw = 0, mbih = 0;
- XPThemeData theme(option->window, nullptr,
- QWindowsXPStylePrivate::ToolBarTheme,
- TP_SPLITBUTTONDROPDOWN);
- if (theme.isValid()) {
- const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(option)).toSize();
- mbiw = size.width();
- mbih = size.height();
- }
-
- QRect ir = btn->rect;
- QStyleOptionButton newBtn = *btn;
- newBtn.rect = QRect(ir.right() - mbiw - 1, 1 + (ir.height()/2) - (mbih/2), mbiw, mbih);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, p);
- }
- return;
- }
- break;
- case CE_TabBarTab:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option))
- {
- stateId = tab->state & State_Enabled ? TIS_NORMAL : TIS_DISABLED;
- }
- break;
-#if 0
- case CE_TabBarTabShape:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option))
- {
- themeNumber = QWindowsXPStylePrivate::TabTheme;
- bool isDisabled = !(tab->state & State_Enabled);
- bool hasFocus = tab->state & State_HasFocus;
- bool isHot = tab->state & State_MouseOver;
- bool selected = tab->state & State_Selected;
- bool lastTab = tab->position == QStyleOptionTab::End;
- bool firstTab = tab->position == QStyleOptionTab::Beginning;
- bool onlyOne = tab->position == QStyleOptionTab::OnlyOneTab;
- bool leftAligned = proxy()->styleHint(SH_TabBar_Alignment, tab) == Qt::AlignLeft;
- bool centerAligned = proxy()->styleHint(SH_TabBar_Alignment, tab) == Qt::AlignCenter;
- int borderThickness = proxy()->pixelMetric(PM_DefaultFrameWidth, option);
- int tabOverlap = proxy()->pixelMetric(PM_TabBarTabOverlap, option);
-
- if (isDisabled)
- stateId = TIS_DISABLED;
- else if (selected)
- stateId = TIS_SELECTED;
- else if (hasFocus)
- stateId = TIS_FOCUSED;
- else if (isHot)
- stateId = TIS_HOT;
- else
- stateId = TIS_NORMAL;
-
- // Selecting proper part depending on position
- if (firstTab || onlyOne) {
- if (leftAligned) {
- partId = TABP_TABITEMLEFTEDGE;
- } else if (centerAligned) {
- partId = TABP_TABITEM;
- } else { // rightAligned
- partId = TABP_TABITEMRIGHTEDGE;
- }
- } else {
- partId = TABP_TABITEM;
- }
-
- if (tab->direction == Qt::RightToLeft
- && (tab->shape == QTabBar::RoundedNorth
- || tab->shape == QTabBar::RoundedSouth)) {
- bool temp = firstTab;
- firstTab = lastTab;
- lastTab = temp;
- }
- bool begin = firstTab || onlyOne;
- bool end = lastTab || onlyOne;
- switch (tab->shape) {
- case QTabBar::RoundedNorth:
- if (selected)
- rect.adjust(begin ? 0 : -tabOverlap, 0, end ? 0 : tabOverlap, borderThickness);
- else
- rect.adjust(begin? tabOverlap : 0, tabOverlap, end ? -tabOverlap : 0, 0);
- break;
- case QTabBar::RoundedSouth:
- //vMirrored = true;
- rotate = 180; // Not 100% correct, but works
- if (selected)
- rect.adjust(begin ? 0 : -tabOverlap , -borderThickness, end ? 0 : tabOverlap, 0);
- else
- rect.adjust(begin ? tabOverlap : 0, 0, end ? -tabOverlap : 0 , -tabOverlap);
- break;
- case QTabBar::RoundedEast:
- rotate = 90;
- if (selected) {
- rect.adjust(-borderThickness, begin ? 0 : -tabOverlap, 0, end ? 0 : tabOverlap);
- }else{
- rect.adjust(0, begin ? tabOverlap : 0, -tabOverlap, end ? -tabOverlap : 0);
- }
- break;
- case QTabBar::RoundedWest:
- hMirrored = true;
- rotate = 90;
- if (selected) {
- rect.adjust(0, begin ? 0 : -tabOverlap, borderThickness, end ? 0 : tabOverlap);
- }else{
- rect.adjust(tabOverlap, begin ? tabOverlap : 0, 0, end ? -tabOverlap : 0);
- }
- break;
- default:
- themeNumber = -1; // Do our own painting for triangular
- break;
- }
-
- if (!selected) {
- switch (tab->shape) {
- case QTabBar::RoundedNorth:
- rect.adjust(0,0, 0,-1);
- break;
- case QTabBar::RoundedSouth:
- rect.adjust(0,1, 0,0);
- break;
- case QTabBar::RoundedEast:
- rect.adjust( 1,0, 0,0);
- break;
- case QTabBar::RoundedWest:
- rect.adjust(0,0, -1,0);
- break;
- default:
- break;
- }
- }
- }
- break;
-#endif
- case CE_ProgressBarGroove:
- {
- Qt::Orientation orient = Qt::Horizontal;
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(option))
- orient = pb->state & QStyle::State_Horizontal ? Qt::Horizontal : Qt::Vertical;
- partId = (orient == Qt::Horizontal) ? PP_BAR : PP_BARVERT;
- themeNumber = QWindowsXPStylePrivate::ProgressTheme;
- stateId = 1;
- }
- break;
-
- case CE_MenuEmptyArea:
- case CE_MenuItem:
- if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(option))
- {
- int tab = menuitem->tabWidth;
- bool dis = !(menuitem->state & State_Enabled);
- bool act = menuitem->state & State_Selected;
- bool checkable = menuitem->menuHasCheckableItems;
- bool checked = checkable ? menuitem->checked : false;
-
- // windows always has a check column, regardless whether we have an icon or not
- int checkcol = qMax(menuitem->maxIconWidth, 12);
-
- int x, y, w, h;
- rect.getRect(&x, &y, &w, &h);
-
- QBrush fill = menuitem->palette.brush(act ? QPalette::Highlight : QPalette::Button);
- p->fillRect(rect, fill);
-
- if (element == CE_MenuEmptyArea)
- break;
-
- // draw separator -------------------------------------------------
- if (menuitem->menuItemType == QStyleOptionMenuItem::Separator) {
- int yoff = y-1 + h / 2;
- p->setPen(menuitem->palette.dark().color());
- p->drawLine(x, yoff, x+w, yoff);
- ++yoff;
- p->setPen(menuitem->palette.light().color());
- p->drawLine(x, yoff, x+w, yoff);
- return;
- }
-
- int xpos = x;
-
- // draw icon ------------------------------------------------------
- if (!menuitem->icon.isNull()) {
- QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
- if (act && !dis)
- mode = QIcon::Active;
- QPixmap pixmap = checked ?
- menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option), mode, QIcon::On) :
- menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option), mode);
- const int pixw = pixmap.width() / pixmap.devicePixelRatio();
- const int pixh = pixmap.height() / pixmap.devicePixelRatio();
- QRect iconRect(0, 0, pixw, pixh);
- iconRect.moveCenter(QRect(xpos, y, checkcol, h).center());
- QRect vIconRect = visualRect(option->direction, option->rect, iconRect);
- p->setPen(menuitem->palette.text().color());
- p->setBrush(Qt::NoBrush);
- if (checked)
- p->drawRect(vIconRect.adjusted(-1, -1, 0, 0));
- p->drawPixmap(vIconRect.topLeft(), pixmap);
-
- // draw checkmark -------------------------------------------------
- } else if (checked) {
- QStyleOptionMenuItem newMi = *menuitem;
- newMi.state = State_None;
- if (!dis)
- newMi.state |= State_Enabled;
- if (act)
- newMi.state |= State_On;
-
- QRect checkMarkRect = QRect(menuitem->rect.x() + windowsItemFrame,
- menuitem->rect.y() + windowsItemFrame,
- checkcol - 2 * windowsItemFrame,
- menuitem->rect.height() - 2*windowsItemFrame);
- newMi.rect = visualRect(option->direction, option->rect, checkMarkRect);
- proxy()->drawPrimitive(PE_IndicatorMenuCheckMark, &newMi, p);
- }
-
- QColor textColor = dis ? menuitem->palette.text().color() :
- act ? menuitem->palette.highlightedText().color() : menuitem->palette.buttonText().color();
- p->setPen(textColor);
-
- // draw text ------------------------------------------------------
- int xm = windowsItemFrame + checkcol + windowsItemHMargin;
- xpos = menuitem->rect.x() + xm;
- QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin);
- QRect vTextRect = visualRect(option->direction, option->rect, textRect);
- QString s = menuitem->text;
- if (!s.isEmpty()) {
- p->save();
- int t = s.indexOf(QLatin1Char('\t'));
- int text_flags = Qt::AlignVCenter|Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine | Qt::AlignLeft;
- if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem))
- text_flags |= Qt::TextHideMnemonic;
- // draw tab text ----------------
- if (t >= 0) {
- QRect vShortcutRect = visualRect(option->direction, option->rect, QRect(textRect.topRight(), menuitem->rect.bottomRight()));
- if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, option)) {
- p->setPen(menuitem->palette.light().color());
- p->drawText(vShortcutRect.adjusted(1,1,1,1), text_flags, s.mid(t + 1));
- p->setPen(textColor);
- }
- p->drawText(vShortcutRect, text_flags, s.mid(t + 1));
- s = s.left(t);
- }
- QFont font = menuitem->font;
- if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
- font.setBold(true);
- p->setFont(font);
- if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, option)) {
- p->setPen(menuitem->palette.light().color());
- p->drawText(vTextRect.adjusted(1,1,1,1), text_flags, s.left(t));
- p->setPen(textColor);
- }
- p->drawText(vTextRect, text_flags, s);
- p->restore();
- }
-
- // draw sub menu arrow --------------------------------------------
- if (menuitem->menuItemType == QStyleOptionMenuItem::SubMenu) {
- int dim = (h - 2) / 2;
- PrimitiveElement arrow;
- arrow = (option->direction == Qt::RightToLeft) ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight;
- xpos = x + w - windowsArrowHMargin - windowsItemFrame - dim;
- QRect vSubMenuRect = visualRect(option->direction, option->rect, QRect(xpos, y + h / 2 - dim / 2, dim, dim));
- QStyleOptionMenuItem newMI = *menuitem;
- newMI.rect = vSubMenuRect;
- newMI.state = dis ? State_None : State_Enabled;
- if (act)
- newMI.palette.setColor(QPalette::ButtonText, newMI.palette.highlightedText().color());
- proxy()->drawPrimitive(arrow, &newMI, p);
- }
- }
- return;
-
- case CE_MenuBarItem:
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option))
- {
- if (mbi->menuItemType == QStyleOptionMenuItem::DefaultItem)
- break;
-
- bool act = mbi->state & State_Selected;
- bool dis = !(mbi->state & State_Enabled);
-
- QBrush fill = mbi->palette.brush(act ? QPalette::Highlight : QPalette::Button);
- QPalette::ColorRole textRole = dis ? QPalette::Text:
- act ? QPalette::HighlightedText : QPalette::ButtonText;
- QPixmap pix = mbi->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option), QIcon::Normal);
-
- uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
- if (!proxy()->styleHint(SH_UnderlineShortcut, mbi))
- alignment |= Qt::TextHideMnemonic;
-
- p->fillRect(rect, fill);
- if (!pix.isNull())
- drawItemPixmap(p, mbi->rect, alignment, pix);
- else
- drawItemText(p, mbi->rect, alignment, mbi->palette, mbi->state & State_Enabled, mbi->text, textRole);
- }
- return;
-#if 0 && QT_CONFIG(dockwidget)
- case CE_DockWidgetTitle:
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option))
- {
- int buttonMargin = 4;
- int mw = proxy()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, dwOpt);
- int fw = proxy()->pixelMetric(PM_DockWidgetFrameWidth, dwOpt);
- bool isFloating = false; // widget && widget->isWindow();
- bool isActive = dwOpt->state & State_Active;
-
- const bool verticalTitleBar = dwOpt->verticalTitleBar;
-
- if (verticalTitleBar) {
- rect = rect.transposed();
-
- p->translate(rect.left() - 1, rect.top() + rect.width());
- p->rotate(-90);
- p->translate(-rect.left() + 1, -rect.top());
- }
- QRect r = rect.adjusted(0, 2, -1, -3);
- QRect titleRect = r;
-
- if (dwOpt->closable) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarCloseButton, dwOpt).actualSize(QSize(10, 10));
- titleRect.adjust(0, 0, -sz.width() - mw - buttonMargin, 0);
- }
-
- if (dwOpt->floatable) {
- QSize sz = proxy()->standardIcon(QStyle::SP_TitleBarMaxButton, dwOpt).actualSize(QSize(10, 10));
- titleRect.adjust(0, 0, -sz.width() - mw - buttonMargin, 0);
- }
-
- if (isFloating) {
- titleRect.adjust(0, -fw, 0, 0);
- if (option->window && option->window->icon().cacheKey() != QApplication::windowIcon().cacheKey())
- titleRect.adjust(titleRect.height() + mw, 0, 0, 0);
- } else {
- titleRect.adjust(mw, 0, 0, 0);
- if (!dwOpt->floatable && !dwOpt->closable)
- titleRect.adjust(0, 0, -mw, 0);
- }
-
- if (!verticalTitleBar)
- titleRect = visualRect(dwOpt->direction, r, titleRect);
-
- if (!isFloating) {
- QPen oldPen = p->pen();
- QString titleText = p->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight, titleRect.width());
- p->setPen(dwOpt->palette.color(QPalette::Dark));
- p->drawRect(r);
-
- if (!titleText.isEmpty()) {
- drawItemText(p, titleRect,
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, dwOpt->palette,
- dwOpt->state & State_Enabled, titleText,
- QPalette::WindowText);
- }
-
- p->setPen(oldPen);
- } else {
- themeNumber = QWindowsXPStylePrivate::WindowTheme;
- if (isActive)
- stateId = CS_ACTIVE;
- else
- stateId = CS_INACTIVE;
-
- int titleHeight = rect.height() - 2;
- rect = rect.adjusted(-fw, -fw, fw, 0);
-
- XPThemeData theme(option->window, p, themeNumber, 0, stateId);
- if (!theme.isValid())
- break;
-
- // Draw small type title bar
- theme.rect = rect;
- theme.partId = WP_SMALLCAPTION;
- d->drawBackground(theme);
-
- // Figure out maximal button space on title bar
-
- QIcon ico = option->window->icon();
- bool hasIcon = (ico.cacheKey() != QApplication::windowIcon().cacheKey());
- if (hasIcon) {
- QPixmap pxIco = ico.pixmap(titleHeight);
- if (!verticalTitleBar && dwOpt->direction == Qt::RightToLeft)
- p->drawPixmap(rect.width() - titleHeight - pxIco.width(), rect.bottom() - titleHeight - 2, pxIco);
- else
- p->drawPixmap(fw, rect.bottom() - titleHeight - 2, pxIco);
- }
- if (!dwOpt->title.isEmpty()) {
- QPen oldPen = p->pen();
- QFont oldFont = p->font();
- QFont titleFont = oldFont;
- titleFont.setBold(true);
- p->setFont(titleFont);
- QString titleText
- = p->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight, titleRect.width());
-
- int result = TST_NONE;
- GetThemeEnumValue(theme.handle(), WP_SMALLCAPTION, isActive ? CS_ACTIVE : CS_INACTIVE, TMT_TEXTSHADOWTYPE, &result);
- if (result != TST_NONE) {
- COLORREF textShadowRef;
- GetThemeColor(theme.handle(), WP_SMALLCAPTION, isActive ? CS_ACTIVE : CS_INACTIVE, TMT_TEXTSHADOWCOLOR, &textShadowRef);
- QColor textShadow = qRgb(GetRValue(textShadowRef), GetGValue(textShadowRef), GetBValue(textShadowRef));
- p->setPen(textShadow);
- drawItemText(p, titleRect.adjusted(1, 1, 1, 1),
- Qt::AlignLeft | Qt::AlignBottom, dwOpt->palette,
- dwOpt->state & State_Enabled, titleText);
- }
-
- COLORREF captionText = GetSysColor(isActive ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT);
- QColor textColor = qRgb(GetRValue(captionText), GetGValue(captionText), GetBValue(captionText));
- p->setPen(textColor);
- drawItemText(p, titleRect,
- Qt::AlignLeft | Qt::AlignBottom, dwOpt->palette,
- dwOpt->state & State_Enabled, titleText);
- p->setFont(oldFont);
- p->setPen(oldPen);
- }
-
- }
-
- return;
- }
- break;
-#endif // QT_CONFIG(dockwidget)
-#if 0 && QT_CONFIG(rubberband)
- case CE_RubberBand:
- if (qstyleoption_cast<const QStyleOptionRubberBand *>(option)) {
- QColor highlight = option->palette.color(QPalette::Active, QPalette::Highlight);
- p->save();
- p->setPen(highlight.darker(120));
- QColor dimHighlight(qMin(highlight.red()/2 + 110, 255),
- qMin(highlight.green()/2 + 110, 255),
- qMin(highlight.blue()/2 + 110, 255),
- 127);
- //(widget && widget->isTopLevel())? 255 : 127);
- p->setBrush(dimHighlight);
- p->drawRect(option->rect.adjusted(0, 0, -1, -1));
- p->restore();
- return;
- }
- break;
-#endif // QT_CONFIG(rubberband)
- case CE_HeaderEmptyArea:
- if (option->state & State_Horizontal)
- {
- themeNumber = QWindowsXPStylePrivate::HeaderTheme;
- stateId = HIS_NORMAL;
- }
- else {
- QWindowsStyle::drawControl(CE_HeaderEmptyArea, option, p);
- return;
- }
- break;
- default:
- break;
- }
-
- XPThemeData theme(option->window, p, themeNumber, partId, stateId, rect);
- if (!theme.isValid()) {
- QWindowsStyle::drawControl(element, option, p);
- return;
- }
-
- theme.rotate = rotate;
- theme.mirrorHorizontally = hMirrored;
- theme.mirrorVertically = vMirrored;
- d->drawBackground(theme);
-}
-
-QRect QWindowsXPStylePrivate::scrollBarGripperBounds(QStyle::State flags, XPThemeData *theme)
-{
- const bool horizontal = flags & QStyle::State_Horizontal;
- const qreal factor = QWindowsStylePrivate::nativeMetricScaleFactor(theme->window);
- const QMargins contentsMargin =
- (theme->margins(theme->rect, TMT_SIZINGMARGINS) * factor).toMargins();
- theme->partId = horizontal ? SBP_GRIPPERHORZ : SBP_GRIPPERVERT;
- const QSize size = (theme->size() * factor).toSize();
-
- const int hSpace = theme->rect.width() - size.width();
- const int vSpace = theme->rect.height() - size.height();
- const bool sufficientSpace = (horizontal && hSpace > (contentsMargin.left() + contentsMargin.right()))
- || vSpace > contentsMargin.top() + contentsMargin.bottom();
- return sufficientSpace ? QRect(theme->rect.topLeft() + QPoint(hSpace, vSpace) / 2, size) : QRect();
-}
-
-#if 0 && QT_CONFIG(mdiarea)
-// Helper for drawing MDI buttons into the corner widget of QMenuBar in case a
-// QMdiSubWindow is maximized.
-static void populateMdiButtonTheme(const QStyle *proxy,
- const QStyleOptionComplex *option,
- QStyle::SubControl subControl, int part,
- XPThemeData *theme)
-{
- theme->partId = part;
- theme->rect = proxy->subControlRect(QStyle::CC_MdiControls, option, subControl);
- if (!option->state.testFlag(QStyle::State_Enabled))
- theme->stateId = CBS_INACTIVE;
- else if (option->state.testFlag(QStyle::State_Sunken) && option->activeSubControls.testFlag(subControl))
- theme->stateId = CBS_PUSHED;
- else if (option->state.testFlag(QStyle::State_MouseOver) && option->activeSubControls.testFlag(subControl))
- theme->stateId = CBS_HOT;
- else
- theme->stateId = CBS_NORMAL;
-}
-
-// Calculate an small (max 2), empirical correction factor for scaling up
-// WP_MDICLOSEBUTTON, WP_MDIRESTOREBUTTON, WP_MDIMINBUTTON, which are too
-// small on High DPI screens (QTBUG-75927).
-qreal mdiButtonCorrectionFactor(XPThemeData &theme, const QPaintDevice *pd = nullptr)
-{
- const auto dpr = pd ? pd->devicePixelRatioF() : qApp->devicePixelRatio();
- const QSizeF nativeSize = QSizeF(theme.size()) / dpr;
- const QSizeF requestedSize(theme.rect.size());
- const auto rawFactor = qMin(requestedSize.width() / nativeSize.width(),
- requestedSize.height() / nativeSize.height());
- const auto factor = rawFactor >= qreal(2) ? qreal(2) : qreal(1);
- return factor;
-}
-#endif // QT_CONFIG(mdiarea)
-
-static void populateTitleBarButtonTheme(const QStyle *proxy,
- const QStyleOptionComplex *option,
- QStyle::SubControl subControl,
- bool isTitleBarActive, int part,
- XPThemeData *theme)
-{
- theme->rect = proxy->subControlRect(QStyle::CC_TitleBar, option, subControl);
- theme->partId = part;
- if (!(option->state & QStyle::State_Enabled))
- theme->stateId = RBS_DISABLED;
- else if (option->activeSubControls == subControl && option->state.testFlag(QStyle::State_Sunken))
- theme->stateId = RBS_PUSHED;
- else if (option->activeSubControls == subControl && option->state.testFlag(QStyle::State_MouseOver))
- theme->stateId = RBS_HOT;
- else if (!isTitleBarActive)
- theme->stateId = RBS_INACTIVE;
- else
- theme->stateId = RBS_NORMAL;
-}
-
-/*!
- \reimp
-*/
-void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *option,
- QPainter *p) const
-{
- QWindowsXPStylePrivate *d = const_cast<QWindowsXPStylePrivate*>(d_func());
-
- if (!QWindowsXPStylePrivate::useXP()) {
- QWindowsStyle::drawComplexControl(cc, option, p);
- return;
- }
-
- State flags = option->state;
- SubControls sub = option->subControls;
- QRect r = option->rect;
-
- int partId = 0;
- int stateId = 0;
- if (option->window && option->window->isActive())
- flags |= State_MouseOver;
-
- switch (cc) {
-//#if QT_CONFIG(spinbox)
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(option))
- {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::SpinTheme);
-
- if (sb->frame && (sub & SC_SpinBoxFrame)) {
- partId = EP_EDITTEXT;
- if (!(flags & State_Enabled))
- stateId = ETS_DISABLED;
- else if (flags & State_HasFocus)
- stateId = ETS_FOCUSED;
- else
- stateId = ETS_NORMAL;
-
- XPThemeData ftheme(option->window, p, QWindowsXPStylePrivate::EditTheme,
- partId, stateId, r);
- ftheme.noContent = true;
- d->drawBackground(ftheme);
- }
- if (sub & SC_SpinBoxUp) {
- theme.rect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxUp);
- partId = SPNP_UP;
- if (!(sb->stepEnabled & QStyleOptionSpinBox::StepUpEnabled) || !(flags & State_Enabled))
- stateId = UPS_DISABLED;
- else if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_Sunken))
- stateId = UPS_PRESSED;
- else if (sb->activeSubControls == SC_SpinBoxUp && (sb->state & State_MouseOver))
- stateId = UPS_HOT;
- else
- stateId = UPS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_SpinBoxDown) {
- theme.rect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxDown);
- partId = SPNP_DOWN;
- if (!(sb->stepEnabled & QStyleOptionSpinBox::StepDownEnabled) || !(flags & State_Enabled))
- stateId = DNS_DISABLED;
- else if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_Sunken))
- stateId = DNS_PRESSED;
- else if (sb->activeSubControls == SC_SpinBoxDown && (sb->state & State_MouseOver))
- stateId = DNS_HOT;
- else
- stateId = DNS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- }
- break;
-//#endif // QT_CONFIG(spinbox)
-//#if QT_CONFIG(combobox)
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option))
- {
- if (cmb->editable) {
- if (sub & SC_ComboBoxEditField) {
- partId = EP_EDITBORDER_NOSCROLL;
- if (!(flags & State_Enabled))
- stateId = ETS_DISABLED;
- else if (flags & State_MouseOver)
- stateId = ETS_HOT;
- else if (flags & State_HasFocus)
- stateId = ETS_FOCUSED;
- else
- stateId = ETS_NORMAL;
-
- XPThemeData theme(option->window, p,
- QWindowsXPStylePrivate::EditTheme,
- partId, stateId, r);
-
- d->drawBackground(theme);
- }
- if (sub & SC_ComboBoxArrow) {
- QRect subRect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow);
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::ComboboxTheme);
- theme.rect = subRect;
- partId = option->direction == Qt::RightToLeft ? CP_DROPDOWNBUTTONLEFT : CP_DROPDOWNBUTTONRIGHT;
-
- if (!(cmb->state & State_Enabled))
- stateId = CBXS_DISABLED;
- else if (cmb->state & State_Sunken || cmb->state & State_On)
- stateId = CBXS_PRESSED;
- else if (cmb->state & State_MouseOver && option->activeSubControls & SC_ComboBoxArrow)
- stateId = CBXS_HOT;
- else
- stateId = CBXS_NORMAL;
-
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
-
- } else {
- if (sub & SC_ComboBoxFrame) {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::ComboboxTheme);
- theme.rect = option->rect;
- theme.partId = CP_READONLY;
- if (!(cmb->state & State_Enabled))
- theme.stateId = CBXS_DISABLED;
- else if (cmb->state & State_Sunken || cmb->state & State_On)
- theme.stateId = CBXS_PRESSED;
- else if (cmb->state & State_MouseOver)
- theme.stateId = CBXS_HOT;
- else
- theme.stateId = CBXS_NORMAL;
- d->drawBackground(theme);
- }
- if (sub & SC_ComboBoxArrow) {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::ComboboxTheme);
- theme.rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow);
- theme.partId = option->direction == Qt::RightToLeft ? CP_DROPDOWNBUTTONLEFT : CP_DROPDOWNBUTTONRIGHT;
- if (!(cmb->state & State_Enabled))
- theme.stateId = CBXS_DISABLED;
- else
- theme.stateId = CBXS_NORMAL;
- d->drawBackground(theme);
- }
- if ((sub & SC_ComboBoxEditField) && (flags & State_HasFocus)) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*cmb);
- fropt.rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxEditField);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- }
- break;
-//#endif // QT_CONFIG(combobox)
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(option))
- {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::ScrollBarTheme);
- bool maxedOut = (scrollbar->maximum == scrollbar->minimum);
- if (maxedOut)
- flags &= ~State_Enabled;
-
- bool isHorz = flags & State_Horizontal;
- bool isRTL = option->direction == Qt::RightToLeft;
- if (sub & SC_ScrollBarAddLine) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddLine);
- partId = SBP_ARROWBTN;
- if (!(flags & State_Enabled))
- stateId = (isHorz ? (isRTL ? ABS_LEFTDISABLED : ABS_RIGHTDISABLED) : ABS_DOWNDISABLED);
- else if (scrollbar->activeSubControls & SC_ScrollBarAddLine && (scrollbar->state & State_Sunken))
- stateId = (isHorz ? (isRTL ? ABS_LEFTPRESSED : ABS_RIGHTPRESSED) : ABS_DOWNPRESSED);
- else if (scrollbar->activeSubControls & SC_ScrollBarAddLine && (scrollbar->state & State_MouseOver))
- stateId = (isHorz ? (isRTL ? ABS_LEFTHOT : ABS_RIGHTHOT) : ABS_DOWNHOT);
- else
- stateId = (isHorz ? (isRTL ? ABS_LEFTNORMAL : ABS_RIGHTNORMAL) : ABS_DOWNNORMAL);
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_ScrollBarSubLine) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubLine);
- partId = SBP_ARROWBTN;
- if (!(flags & State_Enabled))
- stateId = (isHorz ? (isRTL ? ABS_RIGHTDISABLED : ABS_LEFTDISABLED) : ABS_UPDISABLED);
- else if (scrollbar->activeSubControls & SC_ScrollBarSubLine && (scrollbar->state & State_Sunken))
- stateId = (isHorz ? (isRTL ? ABS_RIGHTPRESSED : ABS_LEFTPRESSED) : ABS_UPPRESSED);
- else if (scrollbar->activeSubControls & SC_ScrollBarSubLine && (scrollbar->state & State_MouseOver))
- stateId = (isHorz ? (isRTL ? ABS_RIGHTHOT : ABS_LEFTHOT) : ABS_UPHOT);
- else
- stateId = (isHorz ? (isRTL ? ABS_RIGHTNORMAL : ABS_LEFTNORMAL) : ABS_UPNORMAL);
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (maxedOut) {
- if (sub & SC_ScrollBarSlider) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider);
- theme.rect = theme.rect.united(proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubPage));
- theme.rect = theme.rect.united(proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddPage));
- partId = scrollbar->orientation == Qt::Horizontal ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT;
- stateId = SCRBS_DISABLED;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- } else {
- if (sub & SC_ScrollBarSubPage) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubPage);
- partId = flags & State_Horizontal ? SBP_UPPERTRACKHORZ : SBP_UPPERTRACKVERT;
- if (!(flags & State_Enabled))
- stateId = SCRBS_DISABLED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSubPage && (scrollbar->state & State_Sunken))
- stateId = SCRBS_PRESSED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSubPage && (scrollbar->state & State_MouseOver))
- stateId = SCRBS_HOT;
- else
- stateId = SCRBS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_ScrollBarAddPage) {
- theme.rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddPage);
- partId = flags & State_Horizontal ? SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT;
- if (!(flags & State_Enabled))
- stateId = SCRBS_DISABLED;
- else if (scrollbar->activeSubControls & SC_ScrollBarAddPage && (scrollbar->state & State_Sunken))
- stateId = SCRBS_PRESSED;
- else if (scrollbar->activeSubControls & SC_ScrollBarAddPage && (scrollbar->state & State_MouseOver))
- stateId = SCRBS_HOT;
- else
- stateId = SCRBS_NORMAL;
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_ScrollBarSlider) {
- QRect rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider);
- // The style paint the slider handle so that it is surrounded by transparent areas
- // on each side. These areas have the same size as the Left/Right (or Top/Left) buttons.
- // This is probaly done in order for the handle to travel all along the geometry
- // of the slider, while the handle still not occluding the buttons.
- // We do not want those transparent areas, so we clip them off here.
- const QSize handleSize = proxy()->subControlRect(QStyle::CC_ScrollBar, scrollbar, QStyle::SC_ScrollBarAddLine).size();
-
- if (scrollbar->orientation == Qt::Vertical) {
- const int handleHeight = handleSize.height();
- rect.setBottom(rect.bottom() + 2 * handleHeight);
- p->setClipRect(r.adjusted(0, 0, 0, handleHeight));
- p->translate(0, -handleHeight);
- } else {
- const int handleWidth = handleSize.width();
- rect.setRight(rect.right() + 2 * handleWidth);
- p->setClipRect(r.adjusted(0, 0, handleWidth, 0));
- p->translate(-handleWidth, 0);
- }
-
- theme.rect = rect;
- if (!(flags & State_Enabled))
- stateId = SCRBS_DISABLED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSlider && (scrollbar->state & State_Sunken))
- stateId = SCRBS_PRESSED;
- else if (scrollbar->activeSubControls & SC_ScrollBarSlider && (scrollbar->state & State_MouseOver))
- stateId = SCRBS_HOT;
- else
- stateId = SCRBS_NORMAL;
-
- // Draw handle
- theme.partId = flags & State_Horizontal ? SBP_THUMBBTNHORZ : SBP_THUMBBTNVERT;
- theme.stateId = stateId;
- d->drawBackground(theme);
-
- const QRect gripperBounds = QWindowsXPStylePrivate::scrollBarGripperBounds(flags, &theme);
- // Draw gripper if there is enough space
- if (!gripperBounds.isEmpty()) {
- p->save();
- theme.rect = gripperBounds;
- p->setClipRegion(d->region(theme));// Only change inside the region of the gripper
- d->drawBackground(theme); // Transparent gripper ontop of background
- p->restore();
- }
- }
- }
- }
- break;
-
-//#if QT_CONFIG(slider)
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option))
- {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::TrackBarTheme);
- QRect slrect = slider->rect;
- QRegion tickreg = slrect;
- if (sub & SC_SliderGroove) {
- theme.rect = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove);
- if (slider->orientation == Qt::Horizontal) {
- partId = TKP_TRACK;
- stateId = TRS_NORMAL;
- theme.rect = QRect(slrect.left(), theme.rect.center().y() - 2, slrect.width(), 4);
- } else {
- partId = TKP_TRACKVERT;
- stateId = TRVS_NORMAL;
- theme.rect = QRect(theme.rect.center().x() - 2, slrect.top(), 4, slrect.height());
- }
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- tickreg -= theme.rect;
- }
- if (sub & SC_SliderTickmarks) {
- int tickOffset = proxy()->pixelMetric(PM_SliderTickmarkOffset, slider);
- int ticks = slider->tickPosition;
- int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider);
- int len = proxy()->pixelMetric(PM_SliderLength, slider);
- int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider);
- int interval = slider->tickInterval;
- if (interval <= 0) {
- interval = slider->singleStep;
- if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval,
- available)
- - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- 0, available) < 3)
- interval = slider->pageStep;
- }
- if (!interval)
- interval = 1;
- int fudge = len / 2;
- int pos;
- int bothOffset = (ticks & QStyleOptionSlider::TicksAbove && ticks & QStyleOptionSlider::TicksBelow) ? 1 : 0;
- p->setPen(d->sliderTickColor);
- QVarLengthArray<QLine, 32> lines;
- int v = slider->minimum;
- while (v <= slider->maximum + 1) {
- if (v == slider->maximum + 1 && interval == 1)
- break;
- const int v_ = qMin(v, slider->maximum);
- int tickLength = (v_ == slider->minimum || v_ >= slider->maximum) ? 4 : 3;
- pos = QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- v_, available) + fudge;
- if (slider->orientation == Qt::Horizontal) {
- if (ticks & QStyleOptionSlider::TicksAbove)
- lines.append(QLine(pos, tickOffset - 1 - bothOffset,
- pos, tickOffset - 1 - bothOffset - tickLength));
-
- if (ticks & QStyleOptionSlider::TicksBelow)
- lines.append(QLine(pos, tickOffset + thickness + bothOffset,
- pos, tickOffset + thickness + bothOffset + tickLength));
- } else {
- if (ticks & QStyleOptionSlider::TicksAbove)
- lines.append(QLine(tickOffset - 1 - bothOffset, pos,
- tickOffset - 1 - bothOffset - tickLength, pos));
-
- if (ticks & QStyleOptionSlider::TicksBelow)
- lines.append(QLine(tickOffset + thickness + bothOffset, pos,
- tickOffset + thickness + bothOffset + tickLength, pos));
- }
- // in the case where maximum is max int
- int nextInterval = v + interval;
- if (nextInterval < v)
- break;
- v = nextInterval;
- }
- if (!lines.isEmpty()) {
- p->save();
- p->translate(slrect.topLeft());
- p->drawLines(lines.constData(), lines.size());
- p->restore();
- }
- }
- if (sub & SC_SliderHandle) {
- theme.rect = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle);
- if (slider->orientation == Qt::Horizontal) {
- if (slider->tickPosition == QStyleOptionSlider::TicksAbove)
- partId = TKP_THUMBTOP;
- else if (slider->tickPosition == QStyleOptionSlider::TicksBelow)
- partId = TKP_THUMBBOTTOM;
- else
- partId = TKP_THUMB;
-
- if (!(slider->state & State_Enabled))
- stateId = TUS_DISABLED;
- else if (slider->activeSubControls & SC_SliderHandle && (slider->state & State_Sunken))
- stateId = TUS_PRESSED;
- else if (slider->activeSubControls & SC_SliderHandle && (slider->state & State_MouseOver))
- stateId = TUS_HOT;
- else if (flags & State_HasFocus)
- stateId = TUS_FOCUSED;
- else
- stateId = TUS_NORMAL;
- } else {
- if (slider->tickPosition == QStyleOptionSlider::TicksLeft)
- partId = TKP_THUMBLEFT;
- else if (slider->tickPosition == QStyleOptionSlider::TicksRight)
- partId = TKP_THUMBRIGHT;
- else
- partId = TKP_THUMBVERT;
-
- if (!(slider->state & State_Enabled))
- stateId = TUVS_DISABLED;
- else if (slider->activeSubControls & SC_SliderHandle && (slider->state & State_Sunken))
- stateId = TUVS_PRESSED;
- else if (slider->activeSubControls & SC_SliderHandle && (slider->state & State_MouseOver))
- stateId = TUVS_HOT;
- else if (flags & State_HasFocus)
- stateId = TUVS_FOCUSED;
- else
- stateId = TUVS_NORMAL;
- }
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
- }
- if (sub & SC_SliderGroove && slider->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*slider);
- fropt.rect = subElementRect(SE_SliderFocusRect, slider);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p);
- }
- }
- break;
-//#endif
-#if 0 && QT_CONFIG(toolbutton)
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
- QRect button, menuarea;
- button = proxy()->subControlRect(cc, toolbutton, SC_ToolButton);
- menuarea = proxy()->subControlRect(cc, toolbutton, SC_ToolButtonMenu);
-
- State bflags = toolbutton->state & ~State_Sunken;
- State mflags = bflags;
- bool autoRaise = flags & State_AutoRaise;
- if (autoRaise) {
- if (!(bflags & State_MouseOver) || !(bflags & State_Enabled)) {
- bflags &= ~State_Raised;
- }
- }
-
- if (toolbutton->state & State_Sunken) {
- if (toolbutton->activeSubControls & SC_ToolButton) {
- bflags |= State_Sunken;
- mflags |= State_MouseOver | State_Sunken;
- } else if (toolbutton->activeSubControls & SC_ToolButtonMenu) {
- mflags |= State_Sunken;
- bflags |= State_MouseOver;
- }
- }
-
- QStyleOption tool = *toolbutton;
- if (toolbutton->subControls & SC_ToolButton) {
- if (flags & (State_Sunken | State_On | State_Raised) || !autoRaise) {
- if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup && autoRaise) {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::ToolBarTheme);
- theme.partId = TP_SPLITBUTTON;
- theme.rect = button;
- if (!(bflags & State_Enabled))
- stateId = TS_DISABLED;
- else if (bflags & State_Sunken)
- stateId = TS_PRESSED;
- else if (bflags & State_MouseOver || !(flags & State_AutoRaise))
- stateId = flags & State_On ? TS_HOTCHECKED : TS_HOT;
- else if (bflags & State_On)
- stateId = TS_CHECKED;
- else
- stateId = TS_NORMAL;
- if (option->direction == Qt::RightToLeft)
- theme.mirrorHorizontally = true;
- theme.stateId = stateId;
- d->drawBackground(theme);
- } else {
- tool.rect = option->rect;
- tool.state = bflags;
- if (autoRaise) // for tool bars
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p);
- else
- proxy()->drawPrimitive(PE_PanelButtonBevel, &tool, p);
- }
- }
- }
-
- if (toolbutton->state & State_HasFocus) {
- QStyleOptionFocusRect fr;
- fr.QStyleOption::operator=(*toolbutton);
- fr.rect.adjust(3, 3, -3, -3);
- if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup)
- fr.rect.adjust(0, 0, -proxy()->pixelMetric(QStyle::PM_MenuButtonIndicator,
- toolbutton), 0);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fr, p);
- }
- QStyleOptionToolButton label = *toolbutton;
- label.state = bflags;
- int fw = 2;
- if (!autoRaise)
- label.state &= ~State_Sunken;
- label.rect = button.adjusted(fw, fw, -fw, -fw);
- proxy()->drawControl(CE_ToolButtonLabel, &label, p);
-
- if (toolbutton->subControls & SC_ToolButtonMenu) {
- tool.rect = menuarea;
- tool.state = mflags;
- if (autoRaise) {
- proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, p);
- } else {
- tool.state = mflags;
- menuarea.adjust(-2, 0, 0, 0);
- // Draw menu button
- if ((bflags & State_Sunken) != (mflags & State_Sunken)){
- p->save();
- p->setClipRect(menuarea);
- tool.rect = option->rect;
- proxy()->drawPrimitive(PE_PanelButtonBevel, &tool, p);
- p->restore();
- }
- // Draw arrow
- p->save();
- p->setPen(option->palette.dark().color());
- p->drawLine(menuarea.left(), menuarea.top() + 3,
- menuarea.left(), menuarea.bottom() - 3);
- p->setPen(option->palette.light().color());
- p->drawLine(menuarea.left() - 1, menuarea.top() + 3,
- menuarea.left() - 1, menuarea.bottom() - 3);
-
- tool.rect = menuarea.adjusted(2, 3, -2, -1);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, p);
- p->restore();
- }
- } else if (toolbutton->features & QStyleOptionToolButton::HasMenu) {
- int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, toolbutton);
- QRect ir = toolbutton->rect;
- QStyleOptionToolButton newBtn = *toolbutton;
- newBtn.rect = QRect(ir.right() + 4 - mbi, ir.height() - mbi + 4, mbi - 5, mbi - 5);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, p);
- }
- }
- break;
-#endif // QT_CONFIG(toolbutton)
-
- case CC_TitleBar:
- {
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option))
- {
- const qreal factor = QWindowsStylePrivate::nativeMetricScaleFactor(option);
- bool isActive = tb->titleBarState & QStyle::State_Active;
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::WindowTheme);
- if (sub & SC_TitleBarLabel) {
-
- partId = (tb->titleBarState & Qt::WindowMinimized) ? WP_MINCAPTION : WP_CAPTION;
- theme.rect = option->rect;
- if (!(option->state & QStyle::State_Enabled))
- stateId = CS_DISABLED;
- else if (isActive)
- stateId = CS_ACTIVE;
- else
- stateId = CS_INACTIVE;
-
- theme.partId = partId;
- theme.stateId = stateId;
- d->drawBackground(theme);
-
- QRect ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarLabel);
-
- int result = TST_NONE;
- GetThemeEnumValue(theme.handle(), WP_CAPTION, isActive ? CS_ACTIVE : CS_INACTIVE, TMT_TEXTSHADOWTYPE, &result);
- if (result != TST_NONE) {
- COLORREF textShadowRef;
- GetThemeColor(theme.handle(), WP_CAPTION, isActive ? CS_ACTIVE : CS_INACTIVE, TMT_TEXTSHADOWCOLOR, &textShadowRef);
- QColor textShadow = qRgb(GetRValue(textShadowRef), GetGValue(textShadowRef), GetBValue(textShadowRef));
- p->setPen(textShadow);
- p->drawText(int(ir.x() + 3 * factor), int(ir.y() + 2 * factor),
- int(ir.width() - 1 * factor), ir.height(),
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, tb->text);
- }
- COLORREF captionText = GetSysColor(isActive ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT);
- QColor textColor = qRgb(GetRValue(captionText), GetGValue(captionText), GetBValue(captionText));
- p->setPen(textColor);
- p->drawText(int(ir.x() + 2 * factor), int(ir.y() + 1 * factor),
- int(ir.width() - 2 * factor), ir.height(),
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, tb->text);
- }
- if (sub & SC_TitleBarSysMenu && tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- theme.rect = proxy()->subControlRect(CC_TitleBar, option, SC_TitleBarSysMenu);
- partId = WP_SYSBUTTON;
- if (!(option->state & QStyle::State_Enabled) || !isActive)
- stateId = SBS_DISABLED;
- else if (option->activeSubControls == SC_TitleBarSysMenu && (option->state & State_Sunken))
- stateId = SBS_PUSHED;
- else if (option->activeSubControls == SC_TitleBarSysMenu && (option->state & State_MouseOver))
- stateId = SBS_HOT;
- else
- stateId = SBS_NORMAL;
- if (!tb->icon.isNull()) {
- tb->icon.paint(p, theme.rect);
- } else {
- theme.partId = partId;
- theme.stateId = stateId;
- if (theme.size().isEmpty()) {
- int iconSize = proxy()->pixelMetric(PM_SmallIconSize, tb);
- QPixmap pm = proxy()->standardIcon(SP_TitleBarMenuButton, tb).pixmap(iconSize, iconSize);
- p->save();
- drawItemPixmap(p, theme.rect, Qt::AlignCenter, pm);
- p->restore();
- } else {
- d->drawBackground(theme);
- }
- }
- }
-
- if (sub & SC_TitleBarMinButton && tb->titleBarFlags & Qt::WindowMinimizeButtonHint
- && !(tb->titleBarState & Qt::WindowMinimized)) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarMinButton, isActive, WP_MINBUTTON, &theme);
- d->drawBackground(theme);
- }
- if (sub & SC_TitleBarMaxButton && tb->titleBarFlags & Qt::WindowMaximizeButtonHint
- && !(tb->titleBarState & Qt::WindowMaximized)) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarMaxButton, isActive, WP_MAXBUTTON, &theme);
- d->drawBackground(theme);
- }
- if (sub & SC_TitleBarContextHelpButton
- && tb->titleBarFlags & Qt::WindowContextHelpButtonHint) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarContextHelpButton, isActive, WP_HELPBUTTON, &theme);
- d->drawBackground(theme);
- }
- bool drawNormalButton = (sub & SC_TitleBarNormalButton)
- && (((tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
- && (tb->titleBarState & Qt::WindowMinimized))
- || ((tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
- && (tb->titleBarState & Qt::WindowMaximized)));
- if (drawNormalButton) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarNormalButton, isActive, WP_RESTOREBUTTON, &theme);
- d->drawBackground(theme);
- }
- if (sub & SC_TitleBarShadeButton && tb->titleBarFlags & Qt::WindowShadeButtonHint
- && !(tb->titleBarState & Qt::WindowMinimized)) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarShadeButton, isActive, WP_MINBUTTON, &theme);
- d->drawBackground(theme);
- }
- if (sub & SC_TitleBarUnshadeButton && tb->titleBarFlags & Qt::WindowShadeButtonHint
- && tb->titleBarState & Qt::WindowMinimized) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarUnshadeButton, isActive, WP_RESTOREBUTTON, &theme);
- d->drawBackground(theme);
- }
- if (sub & SC_TitleBarCloseButton && tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- populateTitleBarButtonTheme(proxy(), option, SC_TitleBarCloseButton, isActive, WP_CLOSEBUTTON, &theme);
- d->drawBackground(theme);
- }
- }
- }
- break;
-
-#if 0 && QT_CONFIG(mdiarea)
- case CC_MdiControls:
- {
- XPThemeData theme(option->window, p, QWindowsXPStylePrivate::WindowTheme, WP_MDICLOSEBUTTON, CBS_NORMAL);
- if (Q_UNLIKELY(!theme.isValid()))
- return;
-
- if (option->subControls.testFlag(SC_MdiCloseButton)) {
- populateMdiButtonTheme(proxy(), option, SC_MdiCloseButton, WP_MDICLOSEBUTTON, &theme);
- d->drawBackground(theme, mdiButtonCorrectionFactor(theme));
- }
- if (option->subControls.testFlag(SC_MdiNormalButton)) {
- populateMdiButtonTheme(proxy(), option, SC_MdiNormalButton, WP_MDIRESTOREBUTTON, &theme);
- d->drawBackground(theme, mdiButtonCorrectionFactor(theme));
- }
- if (option->subControls.testFlag(QStyle::SC_MdiMinButton)) {
- populateMdiButtonTheme(proxy(), option, SC_MdiMinButton, WP_MDIMINBUTTON, &theme);
- d->drawBackground(theme, mdiButtonCorrectionFactor(theme));
- }
- }
- break;
-#endif // QT_CONFIG(mdiarea)
-#if 0 && QT_CONFIG(dial)
- case CC_Dial:
- if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option))
- QStyleHelper::drawDial(dial, p);
- break;
-#endif // QT_CONFIG(dial)
- default:
- QWindowsStyle::drawComplexControl(cc, option, p);
- break;
- }
-}
-
-static inline Qt::Orientation progressBarOrientation(const QStyleOption *option = nullptr)
-{
- if (const QStyleOptionProgressBar *pb = qstyleoption_cast<const QStyleOptionProgressBar *>(option))
- return pb->state & QStyle::State_Horizontal ? Qt::Horizontal : Qt::Vertical;
- return Qt::Horizontal;
-}
-
-int QWindowsXPStylePrivate::pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *option)
-{
- switch (pm) {
- case QStyle::PM_IndicatorWidth:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::ButtonTheme, BP_CHECKBOX, CBS_UNCHECKEDNORMAL).width();
- case QStyle::PM_IndicatorHeight:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::ButtonTheme, BP_CHECKBOX, CBS_UNCHECKEDNORMAL).height();
- case QStyle::PM_ExclusiveIndicatorWidth:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::ButtonTheme, BP_RADIOBUTTON, RBS_UNCHECKEDNORMAL).width();
- case QStyle::PM_ExclusiveIndicatorHeight:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::ButtonTheme, BP_RADIOBUTTON, RBS_UNCHECKEDNORMAL).height();
- case QStyle::PM_ProgressBarChunkWidth:
- return progressBarOrientation(option) == Qt::Horizontal
- ? XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::ProgressTheme, PP_CHUNK).width()
- : XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::ProgressTheme, PP_CHUNKVERT).height();
- case QStyle::PM_SliderThickness:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::TrackBarTheme, TKP_THUMB).height();
- case QStyle::PM_TitleBarHeight:
- return option->window && (option->window->type() == Qt::Tool)
- ? GetSystemMetrics(SM_CYSMCAPTION) + GetSystemMetrics(SM_CXSIZEFRAME)
- : GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CXSIZEFRAME);
- case QStyle::PM_MdiSubWindowFrameWidth:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::WindowTheme, WP_FRAMELEFT, FS_ACTIVE).width();
- case QStyle::PM_DockWidgetFrameWidth:
- return XPThemeData::themeSize(option->window, nullptr, QWindowsXPStylePrivate::WindowTheme, WP_SMALLFRAMERIGHT, FS_ACTIVE).width();
- default:
- break;
- }
- return QWindowsXPStylePrivate::InvalidMetric;
-}
-
-/*! \reimp */
-int QWindowsXPStyle::pixelMetric(PixelMetric pm, const QStyleOption *option) const
-{
- if (!QWindowsXPStylePrivate::useXP())
- return QWindowsStyle::pixelMetric(pm, option);
-
- int res = QWindowsXPStylePrivate::pixelMetricFromSystemDp(pm, option);
- if (res != QWindowsStylePrivate::InvalidMetric)
- return qRound(qreal(res) * QWindowsStylePrivate::nativeMetricScaleFactor(option));
-
- res = 0;
- switch (pm) {
- case PM_MenuBarPanelWidth:
- case PM_ButtonDefaultIndicator:
- res = 0;
- break;
-
- case PM_DefaultFrameWidth:
- res = 1;
- //res = qobject_cast<const QListView*>(widget) ? 2 : 1;
- break;
- case PM_MenuPanelWidth:
- case PM_SpinBoxFrameWidth:
- res = 1;
- break;
-
- case PM_TabBarTabOverlap:
- case PM_MenuHMargin:
- case PM_MenuVMargin:
- res = 2;
- break;
-#if 0
- case PM_TabBarBaseOverlap:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
- switch (tab->shape) {
- case QTabBar::RoundedNorth:
- case QTabBar::TriangularNorth:
- case QTabBar::RoundedWest:
- case QTabBar::TriangularWest:
- res = 1;
- break;
- case QTabBar::RoundedSouth:
- case QTabBar::TriangularSouth:
- res = 2;
- break;
- case QTabBar::RoundedEast:
- case QTabBar::TriangularEast:
- res = 3;
- break;
- }
- }
- break;
-#endif
- case PM_SplitterWidth:
- res = QStyleHelper::dpiScaled(5., option);
- break;
-
- case PM_MdiSubWindowMinimizedWidth:
- res = 160;
- break;
-
-#if 0 && QT_CONFIG(toolbar)
- case PM_ToolBarHandleExtent:
- res = int(QStyleHelper::dpiScaled(8., option));
- break;
-
-#endif // QT_CONFIG(toolbar)
- case PM_DockWidgetSeparatorExtent:
- case PM_DockWidgetTitleMargin:
- res = int(QStyleHelper::dpiScaled(4., option));
- break;
-
- case PM_ButtonShiftHorizontal:
- case PM_ButtonShiftVertical:
- res = qstyleoption_cast<const QStyleOptionToolButton *>(option) ? 1 : 0;
- break;
-
- default:
- res = QWindowsStyle::pixelMetric(pm, option);
- }
-
- return res;
-}
-
-/*
- This function is used by subControlRect to check if a button
- should be drawn for the given subControl given a set of window flags.
-*/
-static bool buttonVisible(const QStyle::SubControl sc, const QStyleOptionTitleBar *tb){
-
- bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
- bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
- const uint flags = tb->titleBarFlags;
- bool retVal = false;
- switch (sc) {
- case QStyle::SC_TitleBarContextHelpButton:
- if (flags & Qt::WindowContextHelpButtonHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarMinButton:
- if (!isMinimized && (flags & Qt::WindowMinimizeButtonHint))
- retVal = true;
- break;
- case QStyle::SC_TitleBarNormalButton:
- if (isMinimized && (flags & Qt::WindowMinimizeButtonHint))
- retVal = true;
- else if (isMaximized && (flags & Qt::WindowMaximizeButtonHint))
- retVal = true;
- break;
- case QStyle::SC_TitleBarMaxButton:
- if (!isMaximized && (flags & Qt::WindowMaximizeButtonHint))
- retVal = true;
- break;
- case QStyle::SC_TitleBarShadeButton:
- if (!isMinimized && flags & Qt::WindowShadeButtonHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarUnshadeButton:
- if (isMinimized && flags & Qt::WindowShadeButtonHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarCloseButton:
- if (flags & Qt::WindowSystemMenuHint)
- retVal = true;
- break;
- case QStyle::SC_TitleBarSysMenu:
- if (flags & Qt::WindowSystemMenuHint)
- retVal = true;
- break;
- default :
- retVal = true;
- }
- return retVal;
-}
-
-/*!
- \reimp
-*/
-QRect QWindowsXPStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *option,
- SubControl subControl) const
-{
- if (!QWindowsXPStylePrivate::useXP())
- return QWindowsStyle::subControlRect(cc, option, subControl);
-
- QRect rect;
-
- switch (cc) {
- case CC_GroupBox:
- rect = visualRect(option->direction, option->rect,
- QWindowsStyle::subControlRect(cc, option, subControl));
- if (subControl == QStyle::SC_GroupBoxContents) {
- // This will add the margins that was added by QLayouts in QtWidgets
- // (default to 9 for layouts inside a QGroupBox)
- rect.adjust(9, 9, -9, -9);
- }
- break;
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
- if (!buttonVisible(subControl, tb))
- return rect;
- const bool isToolTitle = false;
- const int height = tb->rect.height();
- const int width = tb->rect.width();
- const int buttonMargin = int(QStyleHelper::dpiScaled(4, option));
- const qreal factor = QWindowsStylePrivate::nativeMetricScaleFactor(option);
- int buttonHeight = qRound(qreal(GetSystemMetrics(SM_CYSIZE)) * factor)
- - buttonMargin;
- int buttonWidth = qRound(qreal(GetSystemMetrics(SM_CXSIZE)) * factor)
- - buttonMargin;
- const int delta = buttonWidth + 2;
- int controlTop = option->rect.bottom() - buttonHeight - 2;
- const int frameWidth = proxy()->pixelMetric(PM_MdiSubWindowFrameWidth, option);
- const bool sysmenuHint = (tb->titleBarFlags & Qt::WindowSystemMenuHint) != 0;
- const bool minimizeHint = (tb->titleBarFlags & Qt::WindowMinimizeButtonHint) != 0;
- const bool maximizeHint = (tb->titleBarFlags & Qt::WindowMaximizeButtonHint) != 0;
- const bool contextHint = (tb->titleBarFlags & Qt::WindowContextHelpButtonHint) != 0;
- const bool shadeHint = (tb->titleBarFlags & Qt::WindowShadeButtonHint) != 0;
- bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
- bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
- int offset = 0;
-
- switch (subControl) {
- case SC_TitleBarLabel:
- rect = QRect(frameWidth, 0, width - (buttonWidth + frameWidth + 10), height);
- if (isToolTitle) {
- if (sysmenuHint) {
- rect.adjust(0, 0, -buttonWidth - 3, 0);
- }
- if (minimizeHint || maximizeHint)
- rect.adjust(0, 0, -buttonWidth - 2, 0);
- } else {
- if (sysmenuHint) {
- const int leftOffset = height - 8;
- rect.adjust(leftOffset, 0, 0, 0);
- }
- if (minimizeHint)
- rect.adjust(0, 0, -buttonWidth - 2, 0);
- if (maximizeHint)
- rect.adjust(0, 0, -buttonWidth - 2, 0);
- if (contextHint)
- rect.adjust(0, 0, -buttonWidth - 2, 0);
- if (shadeHint)
- rect.adjust(0, 0, -buttonWidth - 2, 0);
- }
- break;
-
- case SC_TitleBarContextHelpButton:
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- offset += delta;
- Q_FALLTHROUGH();
- case SC_TitleBarMinButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (subControl == SC_TitleBarMinButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarNormalButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (subControl == SC_TitleBarNormalButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarMaxButton:
- if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (subControl == SC_TitleBarMaxButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarShadeButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (subControl == SC_TitleBarShadeButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarUnshadeButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (subControl == SC_TitleBarUnshadeButton)
- break;
- Q_FALLTHROUGH();
- case SC_TitleBarCloseButton:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- offset += delta;
- else if (subControl == SC_TitleBarCloseButton)
- break;
-
- rect.setRect(width - offset - controlTop + 1, controlTop,
- buttonWidth, buttonHeight);
- break;
-
- case SC_TitleBarSysMenu:
- {
- const int controlTop = 6;
- const int controlHeight = height - controlTop - 3;
- const int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, option);
- QSize iconSize = tb->icon.actualSize(QSize(iconExtent, iconExtent));
- if (tb->icon.isNull())
- iconSize = QSize(controlHeight, controlHeight);
- int hPad = (controlHeight - iconSize.height())/2;
- int vPad = (controlHeight - iconSize.width())/2;
- rect = QRect(frameWidth + hPad, controlTop + vPad, iconSize.width(), iconSize.height());
- }
- break;
- default:
- break;
- }
- }
- break;
-
- case CC_ComboBox:
- if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- const int x = cmb->rect.x(), y = cmb->rect.y(), wi = cmb->rect.width(), he = cmb->rect.height();
- const int xpos = x + wi - qRound(QStyleHelper::dpiScaled(1 + 16, option));
-
- switch (subControl) {
- case SC_ComboBoxFrame:
- rect = cmb->rect;
- break;
-
- case SC_ComboBoxArrow: {
- const qreal dpi = QStyleHelper::dpi(option);
- rect = QRect(xpos, y + qRound(QStyleHelper::dpiScaled(1, dpi)),
- qRound(QStyleHelper::dpiScaled(16, dpi)),
- he - qRound(QStyleHelper::dpiScaled(2, dpi)));
- }
- break;
-
- case SC_ComboBoxEditField: {
- const qreal dpi = QStyleHelper::dpi(option);
- const int frame = qRound(QStyleHelper::dpiScaled(2, dpi));
- rect = QRect(x + frame, y + frame,
- wi - qRound(QStyleHelper::dpiScaled(3 + 16, dpi)),
- he - qRound(QStyleHelper::dpiScaled(4, dpi)));
- }
- break;
-
- case SC_ComboBoxListBoxPopup:
- rect = cmb->rect;
- break;
-
- default:
- break;
- }
- }
- break;
-#if 0 && QT_CONFIG(mdiarea)
- case CC_MdiControls:
- {
- int numSubControls = 0;
- if (option->subControls & SC_MdiCloseButton)
- ++numSubControls;
- if (option->subControls & SC_MdiMinButton)
- ++numSubControls;
- if (option->subControls & SC_MdiNormalButton)
- ++numSubControls;
- if (numSubControls == 0)
- break;
-
- int buttonWidth = option->rect.width() / numSubControls;
- int offset = 0;
- switch (subControl) {
- case SC_MdiCloseButton:
- // Only one sub control, no offset needed.
- if (numSubControls == 1)
- break;
- offset += buttonWidth;
- Q_FALLTHROUGH();
- case SC_MdiNormalButton:
- // No offset needed if
- // 1) There's only one sub control
- // 2) We have a close button and a normal button (offset already added in SC_MdiClose)
- if (numSubControls == 1 || (numSubControls == 2 && !(option->subControls & SC_MdiMinButton)))
- break;
- if (option->subControls & SC_MdiNormalButton)
- offset += buttonWidth;
- break;
- default:
- break;
- }
- rect = QRect(offset, 0, buttonWidth, option->rect.height());
- break;
- }
-#endif // QT_CONFIG(mdiarea)
-
- default:
- rect = visualRect(option->direction, option->rect,
- QWindowsStyle::subControlRect(cc, option, subControl));
- break;
- }
- return visualRect(option->direction, option->rect, rect);
-}
-
-/*!
- \reimp
-*/
-QSize QWindowsXPStyle::sizeFromContents(ContentsType ct, const QStyleOption *option,
- const QSize &contentsSize) const
-{
- if (!QWindowsXPStylePrivate::useXP())
- return QWindowsStyle::sizeFromContents(ct, option, contentsSize);
-
- QSize sz(contentsSize);
- switch (ct) {
- case CT_LineEdit:
- case CT_ComboBox:
- {
- if (contentsSize.isEmpty()) {
- // Minimum size
- return QSize(20, 20);
- }
- XPThemeData buttontheme(option->window, nullptr, QWindowsXPStylePrivate::ButtonTheme, BP_PUSHBUTTON, PBS_NORMAL);
- if (buttontheme.isValid()) {
- const QMarginsF borderSize = buttontheme.margins();
- if (!borderSize.isNull()) {
- const qreal margin = qreal(2);
- sz.rwidth() += qRound(borderSize.left() + borderSize.right() - margin);
- sz.rheight() += int(borderSize.bottom() + borderSize.top() - margin);
- }
- const int textMargins = 2*(proxy()->pixelMetric(PM_FocusFrameHMargin, option) + 1);
- sz += QSize(qMax(pixelMetric(QStyle::PM_ScrollBarExtent, option)
- + textMargins, 23), 0); //arrow button
- }
- }
- break;
- case CT_TabWidget:
- sz += QSize(6, 6);
- break;
- case CT_Menu:
- sz += QSize(1, 0);
- break;
-#if 0 && QT_CONFIG(menubar)
- case CT_MenuBarItem:
- if (!sz.isEmpty())
- sz += QSize(windowsItemHMargin * 5 + 1, 6);
- break;
-#endif
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(option))
- {
- if (menuitem->menuItemType != QStyleOptionMenuItem::Separator) {
- sz = QWindowsStyle::sizeFromContents(ct, option, sz);
- sz.setHeight(sz.height() - 2);
- return sz;
- }
- }
- sz = QWindowsStyle::sizeFromContents(ct, option, sz);
- break;
-
- case CT_MdiControls: {
- sz.setHeight(int(QStyleHelper::dpiScaled(19, option)));
- int width = 54;
- if (const QStyleOptionComplex *styleOpt = qstyleoption_cast<const QStyleOptionComplex *>(option)) {
- width = 0;
- if (styleOpt->subControls & SC_MdiMinButton)
- width += 17 + 1;
- if (styleOpt->subControls & SC_MdiNormalButton)
- width += 17 + 1;
- if (styleOpt->subControls & SC_MdiCloseButton)
- width += 17 + 1;
- }
- sz.setWidth(int(QStyleHelper::dpiScaled(width, option)));
- }
- break;
-
- case CT_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- QStyle::SubControls sub = slider->subControls;
- const int TickSpace = 5;
- int thick = proxy()->pixelMetric(QStyle::PM_SliderThickness, slider);
-
- if (slider->tickPosition & QStyleOptionSlider::TicksAbove)
- thick += TickSpace;
- if (slider->tickPosition & QStyleOptionSlider::TicksBelow)
- thick += TickSpace;
- sz.setWidth(thick);
-
- if (sub & SC_SliderGroove) {
- const int SliderLength = 84;
- sz.setHeight(SliderLength);
- }
- if (slider->orientation == Qt::Horizontal)
- sz.transpose();
- if (sub & SC_SliderHandle) {
- const QSize s = proxy()->subControlRect(CC_Slider, slider, SC_SliderHandle).size();
- sz = sz.expandedTo(s);
- }
- }
- break;
- case CT_ScrollBar :
- // Make sure that the scroll bar is large enough to display the thumb indicator.
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- const int scrollBarHeight = proxy()->pixelMetric(QStyle::PM_ScrollBarExtent, slider);
- const int scrollBarSliderMin = proxy()->pixelMetric(QStyle::PM_ScrollBarSliderMin, slider);
- int &szw = slider->orientation == Qt::Horizontal ? sz.rwidth() : sz.rheight();
- int &szh = slider->orientation == Qt::Horizontal ? sz.rheight() : sz.rwidth();
- if (slider->subControls & (SC_ScrollBarSlider | SC_ScrollBarGroove)) {
- szw = qMax(szw, scrollBarSliderMin + 2 * scrollBarHeight);
- szh = scrollBarHeight;
- } else if (slider->subControls & (SC_ScrollBarAddLine| SC_ScrollBarSubLine)) {
- // Assume that the AddLine and SubLine buttons have the same size, and just query
- // for the size of AddLine
- const QSize s = proxy()->subControlRect(CC_ScrollBar, slider, SC_ScrollBarAddLine).size();
- szw = qMax(szw, s.width());
- szh = scrollBarHeight;
- }
- }
- break;
- default:
- sz = QWindowsStyle::sizeFromContents(ct, option, sz);
- break;
- }
-
- return sz;
-}
-
-
-/*! \reimp */
-int QWindowsXPStyle::styleHint(StyleHint hint, const QStyleOption *option,
- QStyleHintReturn *returnData) const
-{
- QWindowsXPStylePrivate *d = const_cast<QWindowsXPStylePrivate*>(d_func());
- if (!QWindowsXPStylePrivate::useXP())
- return QWindowsStyle::styleHint(hint, option, returnData);
-
- int res = 0;
- switch (hint) {
-
- case SH_EtchDisabledText:
- //res = (qobject_cast<const QLabel*>(widget) != 0);
- res = 0;
- break;
-
- case SH_SpinControls_DisableOnBounds:
- res = 0;
- break;
-
- case SH_TitleBar_AutoRaise:
- case SH_TitleBar_NoBorder:
- res = 1;
- break;
-
- case SH_GroupBox_TextLabelColor:
- if (option->state & QStyle::State_Enabled)
- res = d->groupBoxTextColor;
- else
- res = d->groupBoxTextColorDisabled;
- break;
-
- case SH_Table_GridLineColor:
- res = 0xC0C0C0;
- break;
-
- case SH_WindowFrame_Mask:
- {
- res = 1;
- QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask *>(returnData);
- const QStyleOptionTitleBar *titlebar = qstyleoption_cast<const QStyleOptionTitleBar *>(option);
- if (mask && titlebar) {
- // Note certain themes will not return the whole window frame but only the titlebar part when
- // queried This function needs to return the entire window mask, hence we will only fetch the mask for the
- // titlebar itself and add the remaining part of the window rect at the bottom.
- int tbHeight = proxy()->pixelMetric(PM_TitleBarHeight, option);
- QRect titleBarRect = option->rect;
- titleBarRect.setHeight(tbHeight);
- XPThemeData themeData;
- if (titlebar->titleBarState & Qt::WindowMinimized) {
- themeData = XPThemeData(option->window, nullptr,
- QWindowsXPStylePrivate::WindowTheme,
- WP_MINCAPTION, CS_ACTIVE, titleBarRect);
- } else {
- themeData = XPThemeData(option->window, nullptr,
- QWindowsXPStylePrivate::WindowTheme,
- WP_CAPTION, CS_ACTIVE, titleBarRect);
- }
- mask->region = d->region(themeData) +
- QRect(0, tbHeight, option->rect.width(), option->rect.height() - tbHeight);
- }
- }
- break;
-#if 0 && QT_CONFIG(rubberband)
- case SH_RubberBand_Mask:
- if (qstyleoption_cast<const QStyleOptionRubberBand *>(option))
- res = 0;
- break;
-#endif // QT_CONFIG(rubberband)
-
- case SH_ItemView_DrawDelegateFrame:
- res = 1;
- break;
-
- default:
- res =QWindowsStyle::styleHint(hint, option, returnData);
- }
-
- return res;
-}
-
-QMargins QWindowsXPStyle::ninePatchMargins(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, const QSize &imageSize) const
-{
- QMargins margins;
-
- switch (cc) {
- case CC_ScrollBar: {
- margins = QWindowsStyle::ninePatchMargins(cc, opt, imageSize);
- if (const auto option = qstyleoption_cast<const QStyleOptionSlider *>(opt)) {
- if (option->orientation == Qt::Horizontal) {
- margins.setTop(-1);
- margins.setBottom(-1);
- } else {
- margins.setLeft(-1);
- margins.setRight(-1);
- }
- }
- break; }
- default:
- margins = QWindowsStyle::ninePatchMargins(cc, opt, imageSize);
- break;
- }
-
- return margins;
-}
-
-
-/*! \reimp */
-QPalette QWindowsXPStyle::standardPalette() const
-{
- return QWindowsXPStylePrivate::useXP() ? QPalette() : QWindowsStyle::standardPalette();
-}
-
-/*!
- \reimp
-*/
-QPixmap QWindowsXPStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *option) const
-{
- if (!QWindowsXPStylePrivate::useXP())
- return QWindowsStyle::standardPixmap(standardPixmap, option);
-
-#if 0
- switch (standardPixmap) {
- case SP_TitleBarMaxButton:
- case SP_TitleBarCloseButton:
- if (qstyleoption_cast<const QStyleOptionDockWidget *>(option))
- {
- if (widget && widget->isWindow()) {
- XPThemeData theme(widget, nullptr, QWindowsXPStylePrivate::WindowTheme, WP_SMALLCLOSEBUTTON, CBS_NORMAL);
- if (theme.isValid()) {
- const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(option)).toSize();
- return QIcon(QWindowsStyle::standardPixmap(standardPixmap, option, widget)).pixmap(size);
- }
- }
- }
- break;
- default:
- break;
- }
-#endif
- return QWindowsStyle::standardPixmap(standardPixmap, option);
-}
-
-/*!
- \reimp
-*/
-QIcon QWindowsXPStyle::standardIcon(StandardPixmap standardIcon,
- const QStyleOption *option) const
-{
- if (!QWindowsXPStylePrivate::useXP()) {
- return QWindowsStyle::standardIcon(standardIcon, option);
- }
-#if 0
- QWindowsXPStylePrivate *d = const_cast<QWindowsXPStylePrivate*>(d_func());
- switch (standardIcon) {
- case SP_TitleBarMaxButton:
- if (qstyleoption_cast<const QStyleOptionDockWidget *>(option))
- {
- if (d->dockFloat.isNull()) {
- XPThemeData themeSize(nullptr, nullptr, QWindowsXPStylePrivate::WindowTheme,
- WP_SMALLCLOSEBUTTON, CBS_NORMAL);
- XPThemeData theme(nullptr, nullptr, QWindowsXPStylePrivate::WindowTheme,
- WP_MAXBUTTON, MAXBS_NORMAL);
- if (theme.isValid()) {
- const QSize size = (themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(option)).toSize();
- QPixmap pm(size);
- pm.fill(Qt::transparent);
- QPainter p(&pm);
- theme.painter = &p;
- theme.rect = QRect(QPoint(0, 0), size);
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Normal, QIcon::Off); // Normal
- pm.fill(Qt::transparent);
- theme.stateId = MAXBS_PUSHED;
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Normal, QIcon::On); // Pressed
- pm.fill(Qt::transparent);
- theme.stateId = MAXBS_HOT;
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Active, QIcon::Off); // Hover
- pm.fill(Qt::transparent);
- theme.stateId = MAXBS_INACTIVE;
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Disabled, QIcon::Off); // Disabled
- }
- }
- if (widget && widget->isWindow())
- return d->dockFloat;
-
- }
- break;
- case SP_TitleBarCloseButton:
- if (qstyleoption_cast<const QStyleOptionDockWidget *>(option))
- {
- if (d->dockClose.isNull()) {
- XPThemeData theme(nullptr, nullptr, QWindowsXPStylePrivate::WindowTheme,
- WP_SMALLCLOSEBUTTON, CBS_NORMAL);
- if (theme.isValid()) {
- const QSize size = (theme.size() * QWindowsStylePrivate::nativeMetricScaleFactor(option)).toSize();
- QPixmap pm(size);
- pm.fill(Qt::transparent);
- QPainter p(&pm);
- theme.painter = &p;
- theme.partId = WP_CLOSEBUTTON; // ####
- theme.rect = QRect(QPoint(0, 0), size);
- d->drawBackground(theme);
- d->dockClose.addPixmap(pm, QIcon::Normal, QIcon::Off); // Normal
- pm.fill(Qt::transparent);
- theme.stateId = CBS_PUSHED;
- d->drawBackground(theme);
- d->dockClose.addPixmap(pm, QIcon::Normal, QIcon::On); // Pressed
- pm.fill(Qt::transparent);
- theme.stateId = CBS_HOT;
- d->drawBackground(theme);
- d->dockClose.addPixmap(pm, QIcon::Active, QIcon::Off); // Hover
- pm.fill(Qt::transparent);
- theme.stateId = CBS_INACTIVE;
- d->drawBackground(theme);
- d->dockClose.addPixmap(pm, QIcon::Disabled, QIcon::Off); // Disabled
- }
- }
- if (widget && widget->isWindow())
- return d->dockClose;
- }
- break;
- case SP_TitleBarNormalButton:
- if (qstyleoption_cast<const QStyleOptionDockWidget *>(option))
- {
- if (d->dockFloat.isNull()) {
- XPThemeData themeSize(nullptr, nullptr, QWindowsXPStylePrivate::WindowTheme,
- WP_SMALLCLOSEBUTTON, CBS_NORMAL);
- XPThemeData theme(nullptr, nullptr, QWindowsXPStylePrivate::WindowTheme,
- WP_RESTOREBUTTON, RBS_NORMAL);
- if (theme.isValid()) {
- const QSize size = (themeSize.size() * QWindowsStylePrivate::nativeMetricScaleFactor(option)).toSize();
- QPixmap pm(size);
- pm.fill(Qt::transparent);
- QPainter p(&pm);
- theme.painter = &p;
- theme.rect = QRect(QPoint(0, 0), size);
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Normal, QIcon::Off); // Normal
- pm.fill(Qt::transparent);
- theme.stateId = RBS_PUSHED;
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Normal, QIcon::On); // Pressed
- pm.fill(Qt::transparent);
- theme.stateId = RBS_HOT;
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Active, QIcon::Off); // Hover
- pm.fill(Qt::transparent);
- theme.stateId = RBS_INACTIVE;
- d->drawBackground(theme);
- d->dockFloat.addPixmap(pm, QIcon::Disabled, QIcon::Off); // Disabled
- }
- }
- if (widget && widget->isWindow())
- return d->dockFloat;
-
- }
- break;
- default:
- break;
- }
-#endif
- return QWindowsStyle::standardIcon(standardIcon, option);
-}
-
-/*!
- \internal
-
- Constructs a QWindowsXPStyle object.
-*/
-QWindowsXPStyle::QWindowsXPStyle(QWindowsXPStylePrivate &dd) : QWindowsStyle(dd)
-{
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug d, const XPThemeData &t)
-{
- QDebugStateSaver saver(d);
- d.nospace();
- d << "XPThemeData(" << t.window << ", theme=#" << t.theme << ", " << t.htheme
- << ", partId=" << t.partId << ", stateId=" << t.stateId << ", rect=" << t.rect
- << ", mirrorHorizontally=" << t.mirrorHorizontally << ", mirrorVertically="
- << t.mirrorVertically << ", noBorder=" << t.noBorder << ", noContent=" << t.noContent
- << ", rotate=" << t.rotate << ')';
- return d;
-}
-
-QDebug operator<<(QDebug d, const ThemeMapKey &k)
-{
- QDebugStateSaver saver(d);
- d.nospace();
- d << "ThemeMapKey(theme=#" << k.theme
- << ", partId=" << k.partId << ", stateId=" << k.stateId
- << ", noBorder=" << k.noBorder << ", noContent=" << k.noContent << ')';
- return d;
-}
-
-QDebug operator<<(QDebug d, const ThemeMapData &td)
-{
- QDebugStateSaver saver(d);
- d.nospace();
- d << "ThemeMapData(alphaType=" << td.alphaType
- << ", dataValid=" << td.dataValid << ", partIsTransparent=" << td.partIsTransparent
- << ", hasAlphaChannel=" << td.hasAlphaChannel << ", wasAlphaSwapped=" << td.wasAlphaSwapped
- << ", hadInvalidAlpha=" << td.hadInvalidAlpha << ')';
- return d;
-}
-#endif // QT_NO_DEBUG_STREAM
-
-// Debugging code ---------------------------------------------------------------------[ START ]---
-// The code for this point on is not compiled by default, but only used as assisting
-// debugging code when you uncomment the DEBUG_XP_STYLE define at the top of the file.
-
-#ifdef DEBUG_XP_STYLE
-// The schema file expects these to be defined by the user.
-#define TMT_ENUMDEF 8
-#define TMT_ENUMVAL TEXT('A')
-#define TMT_ENUM TEXT('B')
-#define SCHEMA_STRINGS // For 2nd pass on schema file
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <tmschema.h>
-QT_END_INCLUDE_NAMESPACE
-
-// A property's value, type and name combo
-struct PropPair {
- int propValue;
- int propType;
- LPCWSTR propName;
-};
-
-// Operator for sorting of PropPairs
-bool operator<(PropPair a, PropPair b) {
- return wcscmp(a.propName, b.propName) < 0;
-}
-
-// Our list of all possible properties
-static QList<PropPair> all_props;
-
-
-/*! \internal
- Dumps a portion of the full native DIB section double buffer.
- The DIB section double buffer is only used when doing special
- transformations to the theme part, or when the real double
- buffer in the paintengine does not have an HDC we may use
- directly.
- Since we cannot rely on the pixel data we get from Microsoft
- when drawing into the DIB section, we use this function to
- see the actual data we got, and can determin the appropriate
- action.
-*/
-void QWindowsXPStylePrivate::dumpNativeDIB(int w, int h)
-{
- if (w && h) {
- static int pCount = 0;
- DWORD *bufPix = (DWORD*)bufferPixels;
-
- char *bufferDump = new char[bufferH * bufferW * 16];
- char *bufferPos = bufferDump;
-
- memset(bufferDump, 0, sizeof(bufferDump));
- bufferPos += sprintf(bufferPos, "const int pixelBufferW%d = %d;\n", pCount, w);
- bufferPos += sprintf(bufferPos, "const int pixelBufferH%d = %d;\n", pCount, h);
- bufferPos += sprintf(bufferPos, "const unsigned DWORD pixelBuffer%d[] = {", pCount);
- for (int iy = 0; iy < h; ++iy) {
- bufferPos += sprintf(bufferPos, "\n ");
- bufPix = (DWORD*)(bufferPixels + (iy * bufferW * 4));
- for (int ix = 0; ix < w; ++ix) {
- bufferPos += sprintf(bufferPos, "0x%08x, ", *bufPix);
- ++bufPix;
- }
- }
- bufferPos += sprintf(bufferPos, "\n};\n\n");
- printf(bufferDump);
-
- delete[] bufferDump;
- ++pCount;
- }
-}
-
-/*! \internal
- Shows the value of a given property for a part.
-*/
-static void showProperty(XPThemeData &themeData, const PropPair &prop)
-{
- PROPERTYORIGIN origin = PO_NOTFOUND;
- GetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &origin);
- const char *originStr;
- switch (origin) {
- case PO_STATE:
- originStr = "State ";
- break;
- case PO_PART:
- originStr = "Part ";
- break;
- case PO_CLASS:
- originStr = "Class ";
- break;
- case PO_GLOBAL:
- originStr = "Globl ";
- break;
- case PO_NOTFOUND:
- default:
- originStr = "Unkwn ";
- break;
- }
-
- switch (prop.propType) {
- case TMT_STRING:
- {
- wchar_t buffer[512];
- GetThemeString(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, buffer, 512);
- printf(" (%sString) %-20S: %S\n", originStr, prop.propName, buffer);
- }
- break;
- case TMT_ENUM:
- {
- int result = -1;
- GetThemeEnumValue(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sEnum) %-20S: %d\n", originStr, prop.propName, result);
- }
- break;
- case TMT_INT:
- {
- int result = -1;
- GetThemeInt(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sint) %-20S: %d\n", originStr, prop.propName, result);
- }
- break;
- case TMT_BOOL:
- {
- BOOL result = false;
- GetThemeBool(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sbool) %-20S: %d\n", originStr, prop.propName, result);
- }
- break;
- case TMT_COLOR:
- {
- COLORREF result = 0;
- GetThemeColor(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%scolor) %-20S: 0x%08X\n", originStr, prop.propName, result);
- }
- break;
- case TMT_MARGINS:
- {
- MARGINS result;
- memset(&result, 0, sizeof(result));
- GetThemeMargins(themeData.handle(), 0, themeData.partId, themeData.stateId, prop.propValue, 0, &result);
- printf(" (%smargins) %-20S: (%d, %d, %d, %d)\n", originStr,
- prop.propName, result.cxLeftWidth, result.cyTopHeight, result.cxRightWidth, result.cyBottomHeight);
- }
- break;
- case TMT_FILENAME:
- {
- wchar_t buffer[512];
- GetThemeFilename(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, buffer, 512);
- printf(" (%sfilename)%-20S: %S\n", originStr, prop.propName, buffer);
- }
- break;
- case TMT_SIZE:
- {
- SIZE result1;
- SIZE result2;
- SIZE result3;
- memset(&result1, 0, sizeof(result1));
- memset(&result2, 0, sizeof(result2));
- memset(&result3, 0, sizeof(result3));
- GetThemePartSize(themeData.handle(), 0, themeData.partId, themeData.stateId, 0, TS_MIN, &result1);
- GetThemePartSize(themeData.handle(), 0, themeData.partId, themeData.stateId, 0, TS_TRUE, &result2);
- GetThemePartSize(themeData.handle(), 0, themeData.partId, themeData.stateId, 0, TS_DRAW, &result3);
- printf(" (%ssize) %-20S: Min (%d, %d), True(%d, %d), Draw(%d, %d)\n", originStr, prop.propName,
- result1.cx, result1.cy, result2.cx, result2.cy, result3.cx, result3.cy);
- }
- break;
- case TMT_POSITION:
- {
- POINT result;
- memset(&result, 0, sizeof(result));
- GetThemePosition(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sPosition)%-20S: (%d, %d)\n", originStr, prop.propName, result.x, result.y);
- }
- break;
- case TMT_RECT:
- {
- RECT result;
- memset(&result, 0, sizeof(result));
- GetThemeRect(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sRect) %-20S: (%d, %d, %d, %d)\n", originStr, prop.propName, result.left, result.top, result.right, result.bottom);
- }
- break;
- case TMT_FONT:
- {
- LOGFONT result;
- memset(&result, 0, sizeof(result));
- GetThemeFont(themeData.handle(), 0, themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sFont) %-20S: %S height(%d) width(%d) weight(%d)\n", originStr, prop.propName,
- result.lfFaceName, result.lfHeight, result.lfWidth, result.lfWeight);
- }
- break;
- case TMT_INTLIST:
- {
- INTLIST result;
- memset(&result, 0, sizeof(result));
- GetThemeIntList(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &result);
- printf(" (%sInt list)%-20S: { ", originStr, prop.propName);
- for (int i = 0; i < result.iValueCount; ++i)
- printf("%d ", result.iValues[i]);
- printf("}\n");
- }
- break;
- default:
- printf(" %s%S : Unknown property type (%d)!\n", originStr, prop.propName, prop.propType);
- }
-}
-
-/*! \internal
- Dump all valid properties for a part.
- If it's the first time this function is called, then the name,
- enum value and documentation of all properties are shown, as
- well as all global properties.
-*/
-void QWindowsXPStylePrivate::showProperties(XPThemeData &themeData)
-{
- if (!all_props.count()) {
- const TMSCHEMAINFO *infoTable = GetSchemaInfo();
- for (int i = 0; i < infoTable->iPropCount; ++i) {
- int propType = infoTable->pPropTable[i].bPrimVal;
- int propValue = infoTable->pPropTable[i].sEnumVal;
- LPCWSTR propName = infoTable->pPropTable[i].pszName;
-
- switch (propType) {
- case TMT_ENUMDEF:
- case TMT_ENUMVAL:
- continue;
- default:
- if (propType != propValue) {
- PropPair prop;
- prop.propValue = propValue;
- prop.propName = propName;
- prop.propType = propType;
- all_props.append(prop);
- }
- }
- }
- std::sort(all_props.begin(), all_props.end());
-
- {// List all properties
- printf("part properties count = %d:\n", all_props.count());
- printf(" Enum Property Name Description\n");
- printf("-----------------------------------------------------------\n");
- wchar_t themeName[256];
- pGetCurrentThemeName(themeName, 256, 0, 0, 0, 0);
- for (int j = 0; j < all_props.count(); ++j) {
- PropPair prop = all_props.at(j);
- wchar_t buf[500];
- GetThemeDocumentationProperty(themeName, prop.propName, buf, 500);
- printf("%3d: (%4d) %-20S %S\n", j, prop.propValue, prop.propName, buf);
- }
- }
-
- {// Show Global values
- printf("Global Properties:\n");
- for (int j = 0; j < all_props.count(); ++j) {
- PropPair prop = all_props.at(j);
- PROPERTYORIGIN origin = PO_NOTFOUND;
- GetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &origin);
- if (origin == PO_GLOBAL) {
- showProperty(themeData, prop);
- }
- }
- }
- }
-
- for (int j = 0; j < all_props.count(); ++j) {
- PropPair prop = all_props.at(j);
- PROPERTYORIGIN origin = PO_NOTFOUND;
- GetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, prop.propValue, &origin);
- if (origin != PO_NOTFOUND)
- {
- showProperty(themeData, prop);
- }
- }
-}
-#endif
-// Debugging code -----------------------------------------------------------------------[ END ]---
-
-} //namespace QQC2
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p.h b/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p.h
deleted file mode 100644
index 5d8d5e20..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKWINDOWSXPSTYLE_P_H
-#define QQUICKWINDOWSXPSTYLE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qquickwindowsstyle_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QQC2 {
-
-class QWindowsXPStylePrivate;
-class QWindowsXPStyle : public QWindowsStyle
-{
- Q_OBJECT
-public:
- QWindowsXPStyle();
- QWindowsXPStyle(QWindowsXPStylePrivate &dd);
- ~QWindowsXPStyle() override;
-
-/*
- void polish(QApplication*) override;
- void unpolish(QApplication*) override;
- void polish(QWidget*) override;
- void unpolish(QWidget*) override;
- void polish(QPalette&) override;
-*/
- void drawPrimitive(PrimitiveElement pe, const QStyleOption *option, QPainter *p) const override;
- void drawControl(ControlElement element, const QStyleOption *option, QPainter *p) const override;
- QRect subElementRect(SubElement r, const QStyleOption *option) const override;
- QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *option, SubControl sc) const override;
- void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *option, QPainter *p) const override;
- QSize sizeFromContents(ContentsType ct, const QStyleOption *option, const QSize &contentsSize) const override;
- int pixelMetric(PixelMetric pm, const QStyleOption *option = nullptr) const override;
- int styleHint(StyleHint hint, const QStyleOption *option = nullptr,
- QStyleHintReturn *returnData = nullptr) const override;
-
- QPalette standardPalette() const override;
- QPixmap standardPixmap(StandardPixmap standardIcon, const QStyleOption *option) const override;
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr) const override;
-
- QMargins ninePatchMargins(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, const QSize &imageSize) const;
-
-private:
- Q_DISABLE_COPY_MOVE(QWindowsXPStyle)
- Q_DECLARE_PRIVATE(QWindowsXPStyle)
- friend class QStyleFactory;
-};
-
-} // namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif // QQUICKWINDOWSXPSTYLE_P_H
diff --git a/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p_p.h b/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p_p.h
deleted file mode 100644
index a449ecdd..00000000
--- a/src/quicknativestyle/qstyle/windows/qquickwindowsxpstyle_p_p.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKWINDOWSXPSTYLE_P_P_H
-#define QQUICKWINDOWSXPSTYLE_P_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-//#include <QtWidgets/private/qtwidgetsglobal_p.h>
-#include "qquickwindowsxpstyle_p.h"
-#include "qquickwindowsstyle_p_p.h"
-#include <QtCore/qmap.h>
-#include <qt_windows.h>
-
-#include <uxtheme.h>
-#include <vssym32.h>
-
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-class QDebug;
-
-namespace QQC2 {
-
-// TMT_TEXTSHADOWCOLOR is wrongly defined in mingw
-#if TMT_TEXTSHADOWCOLOR != 3818
-#undef TMT_TEXTSHADOWCOLOR
-#define TMT_TEXTSHADOWCOLOR 3818
-#endif
-#ifndef TST_NONE
-# define TST_NONE 0
-#endif
-
-// These defines are missing from the tmschema, but still exist as
-// states for their parts
-#ifndef MINBS_INACTIVE
-#define MINBS_INACTIVE 5
-#endif
-#ifndef MAXBS_INACTIVE
-#define MAXBS_INACTIVE 5
-#endif
-#ifndef RBS_INACTIVE
-#define RBS_INACTIVE 5
-#endif
-#ifndef HBS_INACTIVE
-#define HBS_INACTIVE 5
-#endif
-#ifndef CBS_INACTIVE
-#define CBS_INACTIVE 5
-#endif
-
-// Uncomment define below to build debug assisting code, and output
-// #define DEBUG_XP_STYLE
-
-// Declarations -----------------------------------------------------------------------------------
-class XPThemeData
-{
-public:
- explicit XPThemeData(const QWindow *w = nullptr, QPainter *p = nullptr, int themeIn = -1,
- int part = 0, int state = 0, const QRect &r = QRect())
- : window(w), painter(p), theme(themeIn), partId(part), stateId(state),
- mirrorHorizontally(false), mirrorVertically(false), noBorder(false),
- noContent(false), rect(r)
- {}
-
- HTHEME handle();
-
- static RECT toRECT(const QRect &qr);
- bool isValid();
-
- QSizeF size();
- QMarginsF margins(const QRect &rect, int propId = TMT_CONTENTMARGINS);
- QMarginsF margins(int propId = TMT_CONTENTMARGINS);
-
- static QSizeF themeSize(const QWindow *w = nullptr, QPainter *p = nullptr, int themeIn = -1, int part = 0, int state = 0);
- static QMarginsF themeMargins(const QRect &rect, const QWindow *w = nullptr, QPainter *p = nullptr, int themeIn = -1,
- int part = 0, int state = 0, int propId = TMT_CONTENTMARGINS);
- static QMarginsF themeMargins(const QWindow *w = nullptr, QPainter *p = nullptr, int themeIn = -1,
- int part = 0, int state = 0, int propId = TMT_CONTENTMARGINS);
-
- const QWindow *window;
- QPainter *painter;
-
- int theme;
- HTHEME htheme = nullptr;
- int partId;
- int stateId;
-
- uint mirrorHorizontally : 1;
- uint mirrorVertically : 1;
- uint noBorder : 1;
- uint noContent : 1;
- uint rotate = 0;
- QRect rect;
-};
-
-struct ThemeMapKey {
- int theme = 0;
- int partId = -1;
- int stateId = -1;
- bool noBorder = false;
- bool noContent = false;
-
- ThemeMapKey() = default;
- ThemeMapKey(const XPThemeData &data)
- : theme(data.theme), partId(data.partId), stateId(data.stateId),
- noBorder(data.noBorder), noContent(data.noContent) {}
-
-};
-
-inline size_t qHash(const ThemeMapKey &key)
-{ return key.theme ^ key.partId ^ key.stateId; }
-
-inline bool operator==(const ThemeMapKey &k1, const ThemeMapKey &k2)
-{
- return k1.theme == k2.theme
- && k1.partId == k2.partId
- && k1.stateId == k2.stateId;
-}
-
-enum AlphaChannelType {
- UnknownAlpha = -1, // Alpha of part & state not yet known
- NoAlpha, // Totally opaque, no need to touch alpha (RGB)
- MaskAlpha, // Alpha channel must be fixed (ARGB)
- RealAlpha // Proper alpha values from Windows (ARGB_Premultiplied)
-};
-
-struct ThemeMapData {
- AlphaChannelType alphaType = UnknownAlpha; // Which type of alpha on part & state
-
- bool dataValid : 1; // Only used to detect if hash value is ok
- bool partIsTransparent : 1;
- bool hasAlphaChannel : 1; // True = part & state has real Alpha
- bool wasAlphaSwapped : 1; // True = alpha channel needs to be swapped
- bool hadInvalidAlpha : 1; // True = alpha channel contained invalid alpha values
-
- ThemeMapData() : dataValid(false), partIsTransparent(false),
- hasAlphaChannel(false), wasAlphaSwapped(false), hadInvalidAlpha(false) {}
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug d, const XPThemeData &t);
-QDebug operator<<(QDebug d, const ThemeMapKey &k);
-QDebug operator<<(QDebug d, const ThemeMapData &td);
-#endif
-
-class QWindowsXPStylePrivate : public QWindowsStylePrivate
-{
- Q_DECLARE_PUBLIC(QWindowsXPStyle)
-public:
- enum Theme {
- ButtonTheme,
- ComboboxTheme,
- EditTheme,
- HeaderTheme,
- ListViewTheme,
- MenuTheme,
- ProgressTheme,
- RebarTheme,
- ScrollBarTheme,
- SpinTheme,
- TabTheme,
- TaskDialogTheme,
- ToolBarTheme,
- ToolTipTheme,
- TrackBarTheme,
- XpTreeViewTheme, // '+'/'-' shape treeview indicators (XP)
- WindowTheme,
- StatusTheme,
- VistaTreeViewTheme, // arrow shape treeview indicators (Vista) obtained from "explorer" theme.
- NThemes
- };
-
- QWindowsXPStylePrivate()
- { init(); }
-
- ~QWindowsXPStylePrivate()
- { cleanup(); }
-
- static int pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *option = nullptr);
- static int fixedPixelMetric(QStyle::PixelMetric pm, const QStyleOption *option = nullptr, const QWidget *widget = nullptr);
-
- static HWND winId(const QWindow *window);
-
- void init(bool force = false);
- void cleanup(bool force = false);
- void cleanupHandleMap();
-
- HBITMAP buffer(int w = 0, int h = 0);
- HDC bufferHDC()
- { return bufferDC;}
-
- static bool useXP(bool update = false);
- static QRect scrollBarGripperBounds(QStyle::State flags, XPThemeData *theme);
-
- bool isTransparent(XPThemeData &themeData);
- QRegion region(XPThemeData &themeData);
-
- bool drawBackground(XPThemeData &themeData, qreal correctionFactor = 1);
- bool drawBackgroundThruNativeBuffer(XPThemeData &themeData, qreal aditionalDevicePixelRatio, qreal correctionFactor);
- bool drawBackgroundDirectly(HDC dc, XPThemeData &themeData, qreal aditionalDevicePixelRatio);
-
- bool hasAlphaChannel(const QRect &rect);
- bool fixAlphaChannel(const QRect &rect);
- bool swapAlphaChannel(const QRect &rect, bool allPixels = false);
-
- QRgb groupBoxTextColor = 0;
- QRgb groupBoxTextColorDisabled = 0;
- QRgb sliderTickColor = 0;
- bool hasInitColors = false;
-
- static HTHEME createTheme(int theme, HWND hwnd);
- static QString themeName(int theme);
- static inline bool hasTheme(int theme) { return theme >= 0 && theme < NThemes && m_themes[theme]; }
- static bool isItemViewDelegateLineEdit(const QWidget *widget);
- static bool isLineEditBaseColorSet(const QStyleOption *option, const QWidget *widget);
-
- QIcon dockFloat, dockClose;
-
-private:
-#ifdef DEBUG_XP_STYLE
- void dumpNativeDIB(int w, int h);
- void showProperties(XPThemeData &themeData);
-#endif
-
- static bool initVistaTreeViewTheming();
- static void cleanupVistaTreeViewTheming();
-
- static QBasicAtomicInt ref;
- static bool use_xp;
-
- QHash<ThemeMapKey, ThemeMapData> alphaCache;
- HDC bufferDC = nullptr;
- HBITMAP bufferBitmap = nullptr;
- HBITMAP nullBitmap = nullptr;
- uchar *bufferPixels = nullptr;
- int bufferW = 0;
- int bufferH = 0;
-
- static HWND m_vistaTreeViewHelper;
- static HTHEME m_themes[NThemes];
-};
-
-inline QSizeF XPThemeData::size()
-{
- QSizeF result(0, 0);
- if (isValid()) {
- SIZE size;
- if (SUCCEEDED(GetThemePartSize(handle(), nullptr, partId, stateId, nullptr, TS_TRUE, &size)))
- result = QSize(size.cx, size.cy);
- }
- return result;
-}
-
-inline QMarginsF XPThemeData::margins(const QRect &qRect, int propId)
-{
- QMarginsF result(0, 0, 0 ,0);
- if (isValid()) {
- MARGINS margins;
- RECT rect = XPThemeData::toRECT(qRect);
- if (SUCCEEDED(GetThemeMargins(handle(), nullptr, partId, stateId, propId, &rect, &margins)))
- result = QMargins(margins.cxLeftWidth, margins.cyTopHeight, margins.cxRightWidth, margins.cyBottomHeight);
- }
- return result;
-}
-
-inline QMarginsF XPThemeData::margins(int propId)
-{
- QMarginsF result(0, 0, 0 ,0);
- if (isValid()) {
- MARGINS margins;
- if (SUCCEEDED(GetThemeMargins(handle(), nullptr, partId, stateId, propId, nullptr, &margins)))
- result = QMargins(margins.cxLeftWidth, margins.cyTopHeight, margins.cxRightWidth, margins.cyBottomHeight);
- }
- return result;
-}
-
-inline QSizeF XPThemeData::themeSize(const QWindow *w, QPainter *p, int themeIn, int part, int state)
-{
- XPThemeData theme(w, p, themeIn, part, state);
- return theme.size();
-}
-
-inline QMarginsF XPThemeData::themeMargins(const QRect &rect, const QWindow *w, QPainter *p, int themeIn,
- int part, int state, int propId)
-{
- XPThemeData theme(w, p, themeIn, part, state);
- return theme.margins(rect, propId);
-}
-
-inline QMarginsF XPThemeData::themeMargins(const QWindow *w, QPainter *p, int themeIn,
- int part, int state, int propId)
-{
- XPThemeData theme(w, p, themeIn, part, state);
- return theme.margins(propId);
-}
-
-} //namespace QQC2
-
-QT_END_NAMESPACE
-
-#endif //QQUICKWINDOWSXPSTYLE_P_P_H
diff --git a/src/quicknativestyle/qstyle/windows/windows.pri b/src/quicknativestyle/qstyle/windows/windows.pri
deleted file mode 100644
index beb50a5b..00000000
--- a/src/quicknativestyle/qstyle/windows/windows.pri
+++ /dev/null
@@ -1,18 +0,0 @@
-
-INCLUDEPATH += $$PWD
-
-HEADERS += \
- $$PWD/qquickwindowsstyle_p.h \
- $$PWD/qquickwindowsstyle_p_p.h \
-# $$PWD/qquickwindowsvistastyle_p.h \
-# $$PWD/qquickwindowsvistastyle_p_p.h \
- $$PWD/qquickwindowsxpstyle_p.h \
- $$PWD/qquickwindowsxpstyle_p_p.h
-
-SOURCES += \
- $$PWD/qquickwindowsstyle.cpp \
-# $$PWD/qquickwindowsvistastyle.cpp \
- $$PWD/qquickwindowsxpstyle.cpp
-
-QMAKE_USE_PRIVATE += user32 gdi32
-LIBS_PRIVATE *= -luxtheme
diff --git a/src/quicknativestyle/qtquickcontrols2nativestyleplugin.cpp b/src/quicknativestyle/qtquickcontrols2nativestyleplugin.cpp
deleted file mode 100644
index e09d327a..00000000
--- a/src/quicknativestyle/qtquickcontrols2nativestyleplugin.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtQml/qqml.h>
-#include <QtQuickControls2/private/qquickstyleplugin_p.h>
-#include <QtGui/qguiapplication.h>
-
-#include <QtQuickTemplates2/private/qquicktheme_p.h>
-
-#include "qquicknativestyle.h"
-#include "qquickcommonstyle.h"
-
-#if defined(Q_OS_MACOS)
-#include "qquickmacstyle_mac_p.h"
-#include "qquickmacfocusframe.h"
-#elif defined(Q_OS_WINDOWS)
-# include "qquickwindowsxpstyle_p.h"
-#endif
-
-extern void qml_register_types_QtQuick_NativeStyle();
-
-QT_BEGIN_NAMESPACE
-
-using namespace QQC2;
-
-class QtQuickControls2NativeStylePlugin : public QQuickStylePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
-
-public:
- QtQuickControls2NativeStylePlugin(QObject *parent = nullptr);
- ~QtQuickControls2NativeStylePlugin() override;
-
- void initializeEngine(QQmlEngine *engine, const char *uri) override;
- void initializeTheme(QQuickTheme *theme) override;
- QString name() const override;
-
-#if defined(Q_OS_MACOS)
- QScopedPointer<QQuickMacFocusFrame> m_focusFrame;
-#endif
-};
-
-static void deleteQStyle()
-{
- // When we delete QStyle, it will free up it's own internal resources. Especially
- // on macOS, this means releasing a lot of NSViews and NSCells from the QMacStyle
- // destructor. If we did this from ~QtQuickControls2NativeStylePlugin, it would
- // happen when the plugin was unloaded from a Q_DESTRUCTOR_FUNCTION in QLibrary,
- // which is very late in the tear-down process, and after qGuiApp has been set to
- // nullptr, NSApplication has stopped running, and perhaps also other static platform
- // variables (e.g in AppKit?) has been deleted. And to our best guess, this is also why
- // we see a crash in AppKit from the destructor in QMacStyle. So for this reason, we
- // delete QStyle from a post routine rather than from the destructor.
- QQuickNativeStyle::setStyle(nullptr);
-}
-
-QtQuickControls2NativeStylePlugin::QtQuickControls2NativeStylePlugin(QObject *parent):
- QQuickStylePlugin(parent)
-{
- volatile auto registration = &qml_register_types_QtQuick_NativeStyle;
- Q_UNUSED(registration);
-}
-
-QtQuickControls2NativeStylePlugin::~QtQuickControls2NativeStylePlugin()
-{
- if (!qGuiApp)
- return;
-
- // QGuiApplication is still running, so we need to remove the post
- // routine to not be called after we have been unloaded.
- qRemovePostRoutine(deleteQStyle);
- QQuickNativeStyle::setStyle(nullptr);
-}
-
-QString QtQuickControls2NativeStylePlugin::name() const
-{
- return QStringLiteral("NativeStyle");
-}
-
-void QtQuickControls2NativeStylePlugin::initializeEngine(QQmlEngine *engine, const char *uri)
-{
- Q_UNUSED(engine);
- Q_UNUSED(uri);
- // Enable commonstyle as a reference style while
- // the native styles are under development.
- QStyle *style = nullptr;
- if (qEnvironmentVariable("QQC2_COMMONSTYLE") == QStringLiteral("true")) {
- style = new QCommonStyle;
- } else {
- const QString envStyle = qEnvironmentVariable("QQC2_STYLE");
- if (!envStyle.isNull()) {
- if (envStyle == QLatin1String("common"))
- style = new QCommonStyle;
-#if defined(Q_OS_MACOS)
- else if (envStyle == QLatin1String("mac"))
- style = new QMacStyle;
-#endif
-#if defined(Q_OS_WINDOWS)
- else if (envStyle == QLatin1String("windows"))
- style = new QWindowsStyle;
- else if (envStyle == QLatin1String("windowsxp"))
- style = new QWindowsXPStyle;
-#endif
- }
- if (!style) {
-#if defined(Q_OS_MACOS)
- style = new QMacStyle;
-#elif defined(Q_OS_WINDOWS)
- style = new QWindowsXPStyle;
-#else
- style = new QCommonStyle;
-#endif
- }
- }
-
-#if defined(Q_OS_MACOS)
- m_focusFrame.reset(new QQuickMacFocusFrame());
-#endif
-
- qAddPostRoutine(deleteQStyle);
- QQuickNativeStyle::setStyle(style);
-}
-
-void QtQuickControls2NativeStylePlugin::initializeTheme(QQuickTheme * /*theme*/)
-{
-}
-
-QT_END_NAMESPACE
-
-#include "qtquickcontrols2nativestyleplugin.moc"
diff --git a/src/quicknativestyle/util/FocusFrame.qml b/src/quicknativestyle/util/FocusFrame.qml
deleted file mode 100644
index b3f3a80e..00000000
--- a/src/quicknativestyle/util/FocusFrame.qml
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Layouts
-
-Item {
- id: root
-
- // It's important that this item has a zero size. Otherwise, if the parent of the
- // targetItem is e.g a layout, we will change the layout if we parent this item inside it.
- width: 0
- height: 0
- // Stack on top of all siblings of the targetItem
- z: 100
-
- function moveToItem(item, margins, radius) {
- parent = item.parent
- targetItem = item
- leftOffset = margins.left
- rightOffset = margins.right
- topOffset = margins.top
- bottomOffset = margins.bottom
- frameRadius = radius
- animation.restart()
- }
-
- property Item targetItem
- property real leftOffset: 0
- property real rightOffset: 0
- property real topOffset: 0
- property real bottomOffset: 0
- property real frameOpacity: 0
- property real frameSize: 0
- property real frameRadius: 0
-
- property point targetItemPos: {
- if (!targetItem)
- return Qt.point(0, 0)
- // Force a reevaluation if
- // the target item moves
- targetItem.x
- targetItem.y
- mapFromItem(targetItem, Qt.point(0, 0))
- }
-
- // systemFrameColor is set to NSColor.keyboardFocusIndicatorColor from cpp
- property color systemFrameColor
-
- Rectangle {
- id: focusFrame
- z: 10
- x: targetItemPos.x + leftOffset - frameSize
- y: targetItemPos.y + topOffset - frameSize
- width: targetItem ? targetItem.width - leftOffset - rightOffset + (frameSize * 2) : 0
- height: targetItem ? targetItem.height - topOffset - bottomOffset + (frameSize * 2) : 0
- radius: frameRadius
- visible: targetItem && targetItem.visible
- color: "transparent"
-
- border.color: systemFrameColor
- border.width: frameSize
- }
-
- ParallelAnimation {
- id: animation
- NumberAnimation {
- target: root
- property: "frameSize"
- duration: 300
- from: 15
- to: 2.5
- easing.type: Easing.OutCubic
- }
- NumberAnimation {
- target: focusFrame
- property: "opacity"
- duration: 300
- from: 0
- to: 0.55
- easing.type: Easing.OutCubic
- }
- }
-}
diff --git a/src/quicknativestyle/util/qquickmacfocusframe.h b/src/quicknativestyle/util/qquickmacfocusframe.h
deleted file mode 100644
index 425b2a68..00000000
--- a/src/quicknativestyle/util/qquickmacfocusframe.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQUICKMACFOCUSFRAME_H
-#define QQUICKMACFOCUSFRAME_H
-
-#include <QtQuick/qquickitem.h>
-#include <QtQuick/private/qquicktextedit_p.h>
-#include "qquickstyleitem.h"
-
-QT_BEGIN_NAMESPACE
-
-Q_DECLARE_LOGGING_CATEGORY(lcFocusFrame)
-
-struct QQuickFocusFrameDescription {
- QQuickItem *target;
- QQuickStyleMargins margins;
- const qreal radius = 3;
- bool isValid() const { return target != nullptr; }
- static QQuickFocusFrameDescription Invalid;
-};
-
-class QQuickMacFocusFrame : public QObject
-{
- Q_OBJECT
-
-public:
- QQuickMacFocusFrame();
-
-private:
- static QScopedPointer<QQuickItem> m_focusFrame;
-
- void createFocusFrame(QQmlContext *context);
- void moveToItem(QQuickItem *item);
- QQuickFocusFrameDescription getDescriptionForItem(QQuickItem *focusItem) const;
-};
-
-QT_END_NAMESPACE
-
-#endif // QQUICKMACFOCUSFRAME_H
diff --git a/src/quicknativestyle/util/qquickmacfocusframe.mm b/src/quicknativestyle/util/qquickmacfocusframe.mm
deleted file mode 100644
index 75ef911b..00000000
--- a/src/quicknativestyle/util/qquickmacfocusframe.mm
+++ /dev/null
@@ -1,181 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later 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 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickmacfocusframe.h"
-
-#include <AppKit/AppKit.h>
-
-#include <QtCore/qmetaobject.h>
-
-#include <QtGui/qguiapplication.h>
-#include <QtGui/private/qcoregraphics_p.h>
-
-#include <QtQml/qqmlengine.h>
-#include <QtQml/qqmlcontext.h>
-#include <QtQml/qqmlcomponent.h>
-
-#include <QtQuick/qquickitem.h>
-#include <QtQuick/private/qquicktextinput_p.h>
-#include <QtQuick/private/qquicktextedit_p.h>
-#include <QtQuick/private/qquickflickable_p.h>
-
-#include <QtQuickTemplates2/private/qquickframe_p.h>
-#include <QtQuickTemplates2/private/qquickbutton_p.h>
-#include <QtQuickTemplates2/private/qquickscrollview_p.h>
-#include <QtQuickTemplates2/private/qquickslider_p.h>
-#include <QtQuickTemplates2/private/qquickcombobox_p.h>
-#include <QtQuickTemplates2/private/qquickcheckbox_p.h>
-#include <QtQuickTemplates2/private/qquickradiobutton_p.h>
-#include <QtQuickTemplates2/private/qquickspinbox_p.h>
-#include <QtQuickTemplates2/private/qquicktextfield_p.h>
-#include <QtQuickTemplates2/private/qquicktextarea_p.h>
-
-#include "items/qquickstyleitem.h"
-#include "qquicknativestyle.h"
-
-QT_BEGIN_NAMESPACE
-
-Q_LOGGING_CATEGORY(lcFocusFrame, "qt.quick.controls.focusframe")
-
-QQuickFocusFrameDescription QQuickFocusFrameDescription::Invalid = { nullptr, QQuickStyleMargins(), 0 };
-QScopedPointer<QQuickItem> QQuickMacFocusFrame::m_focusFrame;
-
-QQuickMacFocusFrame::QQuickMacFocusFrame()
-{
- connect(qGuiApp, &QGuiApplication::focusObjectChanged, [=]{
- if (auto item = qobject_cast<QQuickItem *>(qGuiApp->focusObject()))
- moveToItem(item);
- });
-}
-
-void QQuickMacFocusFrame::moveToItem(QQuickItem *item)
-{
- if (!m_focusFrame) {
- const auto context = QQmlEngine::contextForObject(item);
- if (!context)
- return;
- createFocusFrame(context);
- }
-
- const QQuickFocusFrameDescription &config = getDescriptionForItem(item);
- if (!config.isValid()) {
- m_focusFrame->setParentItem(nullptr);
- m_focusFrame->setVisible(false);
- return;
- }
-
- m_focusFrame->setVisible(true);
- QMetaObject::invokeMethod(m_focusFrame.data(), "moveToItem",
- Q_ARG(QVariant, QVariant::fromValue(config.target)),
- Q_ARG(QVariant, QVariant::fromValue(config.margins)),
- Q_ARG(QVariant, QVariant::fromValue(config.radius)));
-}
-
-void QQuickMacFocusFrame::createFocusFrame(QQmlContext *context)
-{
- QQmlComponent component(
- context->engine(),
- QUrl(QStringLiteral(
- "qrc:/qt-project.org/imports/QtQuick/NativeStyle/util/FocusFrame.qml")));
- m_focusFrame.reset(qobject_cast<QQuickItem *>(component.create()));
-
- auto indicatorColor = qt_mac_toQColor(NSColor.keyboardFocusIndicatorColor.CGColor);
- indicatorColor.setAlpha(255);
- m_focusFrame->setProperty("systemFrameColor", indicatorColor);
-}
-
-QQuickFocusFrameDescription QQuickMacFocusFrame::getDescriptionForItem(QQuickItem *focusItem) const
-{
- qCDebug(lcFocusFrame) << "new focusobject:" << focusItem;
- const auto parentItem = focusItem->parentItem();
- if (!parentItem)
- return QQuickFocusFrameDescription::Invalid;
-
- // The item that gets active focus can be a child of the control (e.g
- // editable ComboBox). In that case, resolve the actual control first.
- const auto proxy = focusItem->property("__focusFrameControl").value<QQuickItem *>();
- const auto control = proxy ? proxy : focusItem;
- auto target = control->property("__focusFrameTarget").value<QQuickItem *>();
- qCDebug(lcFocusFrame) << "target:" << target;
- qCDebug(lcFocusFrame) << "control:" << control;
-
- if (!target) {
- // __focusFrameTarget points to the item in the control that should
- // get the focus frame. This is usually the control itself, but can
- // sometimes be a child (CheckBox). We anyway require
- // this property to be set if we are to show the focus frame around
- // the control in the first place. So for controls that don't want
- // a frame (ProgressBar), we simply skip setting it.
- // Also, we should never show a focus frame around custom controls.
- // None of the built-in styles do that, so to be consistent, we
- // shouldn't either. Besides, drawing a focus frame around an unknown
- // item without any way to turn it off can easily be unwanted. A better
- // way for custom controls to get a native focus frame is for us to offer
- // a FocusFrame control (QTBUG-86818).
- return QQuickFocusFrameDescription::Invalid;
- }
-
- // If the control gives us a QQuickStyleItem, we use that to configure the focus frame.
- // By default we assume that the background delegate is a QQuickStyleItem, but the
- // control can override this by setting __focusFrameStyleItem.
- const auto styleItemProperty = control->property("__focusFrameStyleItem");
- auto item = styleItemProperty.value<QQuickItem *>();
- if (!item) {
- const auto styleItemProperty = control->property("background");
- item = styleItemProperty.value<QQuickItem *>();
- }
- qCDebug(lcFocusFrame) << "styleItem:" << item;
- if (!item)
- return QQuickFocusFrameDescription::Invalid;
- if (QQuickStyleItem *styleItem = qobject_cast<QQuickStyleItem *>(item))
- return { target, QQuickStyleMargins(styleItem->layoutMargins()), styleItem->focusFrameRadius() };
-
- // Some controls don't have a QQuickStyleItem. But if the __focusFrameStyleItem
- // has a "__isDefaultDelegate" property set, we show a default focus frame instead.
- if (item->property("__isDefaultDelegate").toBool() == true) {
- qCDebug(lcFocusFrame) << "'__isDefaultDelegate' property found, showing a default focus frame";
- const QStyleOption opt;
- const qreal radius = QQuickNativeStyle::style()->pixelMetric(QStyle::PM_TextFieldFocusFrameRadius, &opt);
- return { target, QQuickStyleMargins(), radius };
- }
-
- // The application has set a custom delegate on the control. In that
- // case, it's the delegates responsibility to draw a focus frame.
- qCDebug(lcFocusFrame) << "custom delegates in use, skip showing focus frame";
- return QQuickFocusFrameDescription::Invalid;
-}
-
-QT_END_NAMESPACE
diff --git a/src/quicknativestyle/util/util.pri b/src/quicknativestyle/util/util.pri
deleted file mode 100644
index 96786eac..00000000
--- a/src/quicknativestyle/util/util.pri
+++ /dev/null
@@ -1,11 +0,0 @@
-INCLUDEPATH += $$PWD
-
-macos {
- HEADERS += \
- $$PWD/qquickmacfocusframe.h \
-
- SOURCES += \
- $$PWD/qquickmacfocusframe.mm \
-
- RESOURCES += $$PWD/FocusFrame.qml
-}