// Copyright (c) 2021 Proton Technologies AG // // This file is part of ProtonMail Bridge. // // ProtonMail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ProtonMail Bridge is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with ProtonMail Bridge. If not, see . // input for year / month / day import QtQuick 2.8 import QtQuick.Controls 2.2 import QtQml.Models 2.2 import ProtonUI 1.0 import ImportExportUI 1.0 ComboBox { id: root property string placeholderText : "none" property var dropDownStyle : Style.dropDownLight property real radius : Style.dialog.radiusButton property bool below : true onDownChanged : { root.below = popup.y>0 } font.pointSize : Style.main.fontSize * Style.pt spacing : Style.dialog.spacing height : Style.dialog.heightInput width : 10*Style.px function updateWidth() { // make the width according to localization ( especially for Months) var max = 10*Style.px if (root.model === undefined) return for (var i=-1; i=0 ? root.displayText : placeholderText font : root.font color : root.enabled ? dropDownStyle.text : dropDownStyle.inactive verticalAlignment : Text.AlignVCenter elide : Text.ElideRight } background: Rectangle { color: Style.transparent MouseArea { anchors.fill: parent onClicked: root.down ? root.popup.close() : root.popup.open() } } DelegateModel { // FIXME QML DelegateModel: Error creating delegate id: filteredData model: root.model filterOnGroup: "filtered" groups: DelegateModelGroup { id: filtered name: "filtered" includeByDefault: true } delegate: root.delegate } function filterItems(minIndex,maxIndex) { // filter var rowCount = filteredData.items.count if (rowCount<=0) return //console.log(" filter", root.placeholderText, rowCount, minIndex, maxIndex) for (var iItem = 0; iItem < rowCount; iItem++) { var entry = filteredData.items.get(iItem); entry.inFiltered = ( iItem >= minIndex && iItem <= maxIndex ) //console.log(" inserted ", iItem, rowCount, entry.model.modelData, entry.inFiltered ) } } delegate: ItemDelegate { id: thisItem width : view.width height : Style.dialog.heightInput leftPadding : root.spacing rightPadding : root.spacing topPadding : 0 bottomPadding : 0 property int index : { //console.log( "index: ", thisItem.DelegateModel.itemsIndex ) return thisItem.DelegateModel.itemsIndex } onClicked : { //console.log("thisItem click", thisItem.index) root.currentIndex = thisItem.index root.activated(thisItem.index) root.popup.close() } contentItem: Text { text: modelData color: dropDownStyle.text font: root.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } background: Rectangle { color: thisItem.hovered ? dropDownStyle.highlight : dropDownStyle.background Text { anchors{ right: parent.right rightMargin: root.spacing verticalCenter: parent.verticalCenter } font { family: Style.fontawesome.name } text: root.currentIndex == thisItem.index ? Style.fa.check : "" color: thisItem.hovered ? dropDownStyle.text : dropDownStyle.highlight } Rectangle { anchors { left: parent.left right: parent.right bottom: parent.bottom } height: Style.dialog.borderInput color: dropDownStyle.separator } } } popup: Popup { y: root.height x: -background.strokeWidth width: root.width + 2*background.strokeWidth modal: true closePolicy: Popup.CloseOnPressOutside | Popup.CloseOnEscape topPadding: background.radiusTopLeft + 2*background.strokeWidth bottomPadding: background.radiusBottomLeft + 2*background.strokeWidth leftPadding: 2*background.strokeWidth rightPadding: 2*background.strokeWidth contentItem: ListView { id: view clip: true implicitHeight: winMain.height/3 model: filteredData // if you want to slide down to position: popup.visible ? root.delegateModel : null currentIndex: root.currentIndex ScrollIndicator.vertical: ScrollIndicator { } } background: RoundedRectangle { radiusTopLeft : root.below ? 0 : root.radius radiusBottomLeft : !root.below ? 0 : root.radius radiusTopRight : radiusTopLeft radiusBottomRight : radiusBottomLeft fillColor : dropDownStyle.background } } Component.onCompleted: { //console.log(" box ", label) root.updateWidth() root.filterItems(0,model.length-1) } onModelChanged :{ //console.log("model changed", root.placeholderText) root.updateWidth() root.filterItems(0,model.length-1) } }