import QtQuick 2.0 import QtQuick.Controls 2.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.0 ///About property ///@hilightColor - color of the selected item ///@normalColor - color of item ///@normalColorText and @hilightColorText - normal and selected text color ///@normalColorTopText and @hilightColorTopText - text color in the main line in normal and active state ///@fontSizeComboBox - font size for the entire widget (px). ///@widthPopupComboBoxActive and @widthPopupComboBoxNormal - width of the combo box /// in the active state and in the normal state ///@heightComboBoxNormal and @heightComboBoxActive - height of the combo box /// in the active state and in the normal state ///@sidePaddingActive and @sidePaddingNormal - padding width of the combo box in the active state /// and in the normal state ///@sidePaddingActive and @sidePaddingNormal - sets the indent from the edge of the right and left /// edges of the parent in the active and normal state ///@topIndentActive and @topIndentNormal ///@bottomIndentActive and @bottomIndentNormal /// - sets the indent from the edge of the upper and lower edges of the parent in the active and normal state ///@indicatorImageNormal and @indicatorImageActive - indicator picture address for active and normal state ///@indicatorWidth and @indicatorHeight - indicator width and height ///@heightListElement - List item height ///@intervalListElement - spacing between items in a list ///@bottomIntervalListElement - spacing from bottom to bottom ///@topEffect - Using an effect for the top element ///@colorTopNormalDropShadow - Color of the shadow effect of the combo box when minimized ///@colorDropShadow - Unboxed shadow color in expanded state ///@paddingTopItemDelegate - indent above and below from item delegate ComboBox { property string normalColorText: "#070023" property string hilightColorText: "#FFFFFF" property string normalColorTopText:normalColorText property string hilightColorTopText:normalColorText property string normalColor: "#FFFFFF" property string hilightColor: "#330F54" property string normalTopColor: normalColor property string hilightTopColor: normalColor property int fontSizeComboBox: 16*pt property int widthPopupComboBoxNormal: parent.width property int widthPopupComboBoxActive: widthPopupComboBoxNormal property int heightComboBoxNormal: parent.height property int heightComboBoxActive: heightComboBoxNormal property int sidePaddingNormal:16 * pt property int sidePaddingActive:sidePaddingNormal property int topIndentNormal:12 * pt property int topIndentActive:topIndentNormal property int bottomIndentNormal:14 * pt property int bottomIndentActive:bottomIndentNormal property int paddingTopItemDelegate:8 * pt property int paddingBottomItemDelegate:paddingTopItemDelegate property int heightListElement: 32 * pt property int intervalListElement: 10 * pt property int bottomIntervalListElement:intervalListElement property bool topEffect: true property string indicatorImageNormal: "qrc:/res/icons/ic_arrow_drop_down_dark_blue.png" property string indicatorImageActive: "qrc:/res/icons/ic_arrow_drop_up_dark_blue.png" property int indicatorWidth: 24*pt property int indicatorHeight: indicatorWidth property string colorTopNormalDropShadow:"#00000000" property string colorDropShadow:"#40ABABAB" id: customComboBox width: popup.visible ? widthPopupComboBoxActive : widthPopupComboBoxNormal height: popup.visible ? heightComboBoxActive : heightComboBoxNormal anchors.verticalCenter: parent.verticalCenter delegate:ItemDelegate { width: parent.width ///Adjusting the height of the line, taking into account that the second element from the end may be the last. height:{ if(index != currentIndex) { if(index == customComboBox.count - 2) { if(index+1 == currentIndex) return heightListElement + bottomIntervalListElement else return heightListElement + intervalListElement } if (index == customComboBox.count - 1) return heightListElement + bottomIntervalListElement return heightListElement + intervalListElement } else return 0 } ///Text item contentItem: Text { id:textDelegateComboBox anchors.fill: parent anchors.topMargin: paddingTopItemDelegate anchors.leftMargin: popup.visible ? sidePaddingActive : sidePaddingNormal font.family: fontRobotoRegular.name font.pixelSize: fontSizeComboBox text: {if(index != currentIndex) return modelData;} color: hovered ? hilightColorText : normalColorText } //Indent from the bottom edge or the next line that will not stand out when you hover over the mouse background: Rectangle { anchors.fill: parent anchors.bottomMargin: { if(index == customComboBox.count - 2) { if(index+1 == currentIndex) return bottomIntervalListElement else return intervalListElement } if (index == customComboBox.count - 1) return bottomIntervalListElement return intervalListElement } color: hovered ? hilightColor : normalColor //the list text } highlighted: parent.highlightedIndex === index } //Icon icon near the text (arrow) indicator: Image { source: parent.popup.visible ? indicatorImageActive : indicatorImageNormal width: indicatorWidth height: indicatorHeight anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right anchors.rightMargin: popup.visible ? sidePaddingActive : sidePaddingNormal } ///Defining the background for the main line background: Rectangle { anchors.fill: parent color: parent.popup.visible ? hilightTopColor : normalTopColor radius: 2 * pt height: parent.height } ///Main line text settings contentItem: Text { anchors.fill: parent anchors.leftMargin: popup.visible ? sidePaddingActive : sidePaddingNormal text: parent.displayText font.family: fontRobotoRegular.name font.pixelSize: fontSizeComboBox color: popup.visible ? hilightColorTopText : normalColorTopText verticalAlignment: Text.AlignVCenter } ///Customize drop-down list with shadow effect popup: Popup { y: parent.height - 1 width: parent.width + 1 padding: 1 contentItem: ListView { clip: true implicitHeight: contentHeight model: customComboBox.popup.visible ? customComboBox.delegateModel : null ScrollIndicator.vertical: ScrollIndicator { } } background: Rectangle { width: customComboBox.background.width color: parent.color Rectangle { id: contentCorner anchors.fill: parent } DropShadow { anchors.fill: parent source: contentCorner verticalOffset: 9 * pt samples: 13 * pt color: colorDropShadow } } } ///Shadow effect for the top element. DropShadow { anchors.fill: if(topEffect) parent source: if(topEffect) background verticalOffset: if(topEffect) 9 * pt samples: if(topEffect) 13 * pt color: if(topEffect) customComboBox.popup.visible ? colorDropShadow : colorTopNormalDropShadow } }