diff options
Diffstat (limited to 'src/quickcontrols/material/ComboBox.qml')
-rw-r--r-- | src/quickcontrols/material/ComboBox.qml | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/quickcontrols/material/ComboBox.qml b/src/quickcontrols/material/ComboBox.qml new file mode 100644 index 0000000000..5694aa055c --- /dev/null +++ b/src/quickcontrols/material/ComboBox.qml @@ -0,0 +1,125 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +pragma ComponentBehavior: Bound + +import QtQuick +import QtQuick.Window +import QtQuick.Controls.impl +import QtQuick.Templates as T +import QtQuick.Controls.Material +import QtQuick.Controls.Material.impl + +T.ComboBox { + id: control + + implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding) + implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding, + implicitIndicatorHeight + topPadding + bottomPadding) + + leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) + rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) + + Material.background: flat ? "transparent" : undefined + Material.foreground: flat ? undefined : Material.primaryTextColor + + delegate: MenuItem { + required property var model + required property int index + + width: ListView.view.width + text: model[control.textRole] + Material.foreground: control.currentIndex === index ? ListView.view.contentItem.Material.accent : ListView.view.contentItem.Material.foreground + highlighted: control.highlightedIndex === index + hoverEnabled: control.hoverEnabled + } + + indicator: ColorImage { + x: control.mirrored ? control.padding : control.width - width - control.padding + y: control.topPadding + (control.availableHeight - height) / 2 + color: control.enabled ? control.Material.foreground : control.Material.hintTextColor + source: "qrc:/qt-project.org/imports/QtQuick/Controls/Material/images/drop-indicator.png" + } + + contentItem: T.TextField { + leftPadding: Material.textFieldHorizontalPadding + topPadding: Material.textFieldVerticalPadding + bottomPadding: Material.textFieldVerticalPadding + + 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 + + color: control.enabled ? control.Material.foreground : control.Material.hintTextColor + selectionColor: control.Material.accentColor + selectedTextColor: control.Material.primaryHighlightedTextColor + verticalAlignment: Text.AlignVCenter + + cursorDelegate: CursorDelegate { } + } + + background: MaterialTextContainer { + implicitWidth: 120 + implicitHeight: control.Material.textFieldHeight + + outlineColor: (enabled && control.hovered) ? control.Material.primaryTextColor : control.Material.hintTextColor + focusedOutlineColor: control.Material.accentColor + controlHasActiveFocus: control.activeFocus + controlHasText: true + horizontalPadding: control.Material.textFieldHorizontalPadding + } + + popup: T.Popup { + y: control.editable ? control.height - 5 : 0 + width: control.width + height: Math.min(contentItem.implicitHeight + verticalPadding * 2, control.Window.height - topMargin - bottomMargin) + transformOrigin: Item.Top + topMargin: 12 + bottomMargin: 12 + verticalPadding: 8 + + Material.theme: control.Material.theme + Material.accent: control.Material.accent + Material.primary: control.Material.primary + + enter: Transition { + // grow_fade_in + NumberAnimation { property: "scale"; from: 0.9; easing.type: Easing.OutQuint; duration: 220 } + NumberAnimation { property: "opacity"; from: 0.0; easing.type: Easing.OutCubic; duration: 150 } + } + + exit: Transition { + // shrink_fade_out + NumberAnimation { property: "scale"; to: 0.9; easing.type: Easing.OutQuint; duration: 220 } + NumberAnimation { property: "opacity"; to: 0.0; easing.type: Easing.OutCubic; duration: 150 } + } + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: control.delegateModel + currentIndex: control.highlightedIndex + highlightMoveDuration: 0 + + T.ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + radius: 4 + color: parent.Material.dialogColor + + layer.enabled: control.enabled + layer.effect: RoundedElevationEffect { + elevation: 4 + roundedScale: Material.ExtraSmallScale + } + } + } +} |