diff options
author | Jan Arve Sæther <jan-arve.saether@qt.io> | 2020-10-26 13:34:26 +0100 |
---|---|---|
committer | Jan Arve Sæther <jan-arve.saether@qt.io> | 2020-10-27 12:21:10 +0100 |
commit | 1569a601f265390502ea492a0bc68fd4ff88dd20 (patch) | |
tree | f8a7e9d12fa78e242822a47e094d375000cf710b /src/imports | |
parent | ebdb7b1ceb40c65917e9f78680c5380dce9cf5d6 (diff) |
Native style: Add ComboBox for Windows
Change-Id: I59f64b3941bd0744bba6f6079b9ab3fc30063447
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/imports')
-rw-r--r-- | src/imports/controls/windows/ComboBox.qml | 91 | ||||
-rw-r--r-- | src/imports/nativestyle/items/qquickstyleitemcombobox.cpp | 2 | ||||
-rw-r--r-- | src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp | 93 |
3 files changed, 150 insertions, 36 deletions
diff --git a/src/imports/controls/windows/ComboBox.qml b/src/imports/controls/windows/ComboBox.qml index 3891594b..237d90b5 100644 --- a/src/imports/controls/windows/ComboBox.qml +++ b/src/imports/controls/windows/ComboBox.qml @@ -35,7 +35,96 @@ ****************************************************************************/ import QtQuick +import QtQuick.Window +import QtQuick.Controls +import QtQuick.Controls.impl +import QtQuick.Templates as T import QtQuick.NativeStyle as NativeStyle -NativeStyle.DefaultComboBox { +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 + useNinePatchImage: false + } + + 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/imports/nativestyle/items/qquickstyleitemcombobox.cpp b/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp index ba903b92..7841d062 100644 --- a/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemcombobox.cpp @@ -77,7 +77,7 @@ void QQuickStyleItemComboBox::initStyleOption(QStyleOptionComboBox &styleOption) initStyleOptionBase(styleOption); auto comboBox = control<QQuickComboBox>(); - styleOption.subControls = QStyle::SC_ComboBoxFrame | QStyle::SC_ComboBoxArrow;// | QStyle::SC_ComboBoxEditField | QStyle::SC_ComboBoxArrow; + styleOption.subControls = QStyle::SC_ComboBoxArrow | QStyle::SC_ComboBoxFrame | QStyle::SC_ComboBoxEditField; styleOption.frame = true; styleOption.state |= QStyle::State_Selected; styleOption.editable = comboBox->isEditable(); diff --git a/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp b/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp index 3dd5149f..91e475b4 100644 --- a/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp +++ b/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp @@ -2438,50 +2438,75 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo case CC_ComboBox: if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { - if (sub & SC_ComboBoxEditField) { - if (cmb->frame) { - partId = EP_EDITTEXT; + 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); + + XPThemeData theme(option->window, p, + QWindowsXPStylePrivate::EditTheme, + partId, stateId, r); + d->drawBackground(theme); - } else { - QBrush editBrush = cmb->palette.brush(QPalette::Base); - p->fillRect(option->rect, editBrush); } - if (!cmb->editable) { - QRect re = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxEditField); - if (option->state & State_HasFocus) { - p->fillRect(re, option->palette.highlight()); - p->setPen(option->palette.highlightedText().color()); - p->setBackground(option->palette.highlight()); - } else { - p->fillRect(re, option->palette.base()); - p->setPen(option->palette.text().color()); - p->setBackground(option->palette.base()); - } + 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); } - } - if (sub & SC_ComboBoxArrow) { - XPThemeData theme(option->window, p, QWindowsXPStylePrivate::ComboboxTheme); - theme.rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow); - partId = CP_DROPDOWNBUTTON; - if (!(flags & State_Enabled)) - stateId = CBXS_DISABLED; - else if (cmb->activeSubControls == SC_ComboBoxArrow && (cmb->state & State_Sunken)) - stateId = CBXS_PRESSED; - else if (cmb->activeSubControls == SC_ComboBoxArrow && (cmb->state & State_MouseOver)) - 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; |