mirror of
https://github.com/zhuzichu520/FluentUI.git
synced 2024-11-27 13:49:08 +08:00
160 lines
4.9 KiB
QML
160 lines
4.9 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import FluentUI
|
|
|
|
FluTextBox{
|
|
property var items:[]
|
|
property string emptyText: "没有找到结果"
|
|
property int autoSuggestBoxReplacement: FluentIcons.Search
|
|
signal itemClicked(var data)
|
|
signal handleClicked
|
|
QtObject{
|
|
id:d
|
|
property bool flagVisible: true
|
|
}
|
|
id:control
|
|
width: 300
|
|
Component.onCompleted: {
|
|
loadData()
|
|
}
|
|
Popup{
|
|
id:control_popup
|
|
y:control.height
|
|
focus: false
|
|
enter: Transition {
|
|
NumberAnimation {
|
|
property: "y"
|
|
from:0
|
|
to:control_popup.y
|
|
duration: 150
|
|
}
|
|
NumberAnimation {
|
|
property: "opacity"
|
|
from:0
|
|
to:1
|
|
duration: 150
|
|
}
|
|
}
|
|
onVisibleChanged: {
|
|
if(visible){
|
|
list_view.currentIndex = -1
|
|
}
|
|
}
|
|
background: Rectangle{
|
|
width: control.width
|
|
radius: 4
|
|
FluShadow{
|
|
radius: 4
|
|
}
|
|
color: FluTheme.dark ? Qt.rgba(51/255,48/255,48/255,1) : Qt.rgba(248/255,250/255,253/255,1)
|
|
height: 38*Math.min(Math.max(list_view.count,1),8)
|
|
ListView{
|
|
id:list_view
|
|
anchors.fill: parent
|
|
clip: true
|
|
currentIndex: -1
|
|
ScrollBar.vertical: FluScrollBar {}
|
|
header: Item{
|
|
width: control.width
|
|
height: visible ? 38 : 0
|
|
visible: list_view.count === 0
|
|
FluText{
|
|
text:emptyText
|
|
anchors{
|
|
verticalCenter: parent.verticalCenter
|
|
left: parent.left
|
|
leftMargin: 10
|
|
}
|
|
}
|
|
}
|
|
delegate:Control{
|
|
width: control.width
|
|
padding:10
|
|
background: Rectangle{
|
|
color: {
|
|
if(list_view.currentIndex === index){
|
|
return FluTheme.dark ? Qt.rgba(63/255,60/255,61/255,1) : Qt.rgba(237/255,237/255,242/255,1)
|
|
}
|
|
if(hovered){
|
|
return FluTheme.dark ? Qt.rgba(63/255,60/255,61/255,1) : Qt.rgba(237/255,237/255,242/255,1)
|
|
}
|
|
return FluTheme.dark ? Qt.rgba(51/255,48/255,48/255,1) : Qt.rgba(0,0,0,0)
|
|
}
|
|
MouseArea{
|
|
id:mouse_area
|
|
anchors.fill: parent
|
|
Connections{
|
|
target: control
|
|
function onHandleClicked(){
|
|
if((list_view.currentIndex === index)){
|
|
handleClick(modelData)
|
|
}
|
|
}
|
|
}
|
|
onClicked: handleClick(modelData)
|
|
}
|
|
Rectangle{
|
|
width: 3
|
|
color:FluTheme.primaryColor.dark
|
|
visible: list_view.currentIndex === index
|
|
radius: 3
|
|
height: 20
|
|
anchors{
|
|
left: parent.left
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
}
|
|
contentItem: FluText{
|
|
text:modelData.title
|
|
anchors{
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
onTextChanged: {
|
|
loadData()
|
|
if(d.flagVisible){
|
|
control_popup.visible = true
|
|
}
|
|
}
|
|
TapHandler {
|
|
acceptedButtons: Qt.RightButton
|
|
onTapped: control.echoMode !== TextInput.Password && menu.popup()
|
|
}
|
|
FluTextBoxMenu{
|
|
id:menu
|
|
inputItem: control
|
|
}
|
|
|
|
function handleClick(modelData){
|
|
control_popup.visible = false
|
|
control.itemClicked(modelData)
|
|
updateText(modelData.title)
|
|
}
|
|
|
|
function updateText(text){
|
|
d.flagVisible = false
|
|
control.text = text
|
|
d.flagVisible = true
|
|
}
|
|
|
|
function loadData(){
|
|
var result = []
|
|
if(items==null){
|
|
list_view.model = result
|
|
return
|
|
}
|
|
items.map(function(item){
|
|
if(item.title.indexOf(control.text)!==-1){
|
|
result.push(item)
|
|
}
|
|
})
|
|
list_view.model = result
|
|
}
|
|
|
|
}
|