ProtocolParser/app_source/qml/components/ListTable.qml

170 lines
6.5 KiB
QML

import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import RibbonUI
Item {
clip: true
property var header_items:[]
property var header_items_width:[]
property int row_spacing: 1
property double margins: 30
property int has_selected: 0
property alias data_model: list_model
property alias current_index: list_table.currentIndex
property double max_height: 250
ListModel{
id: list_model
}
implicitHeight: (list_table.implicitHeight + list_table.anchors.margins * 2) > implicitWidth ?
implicitWidth : (list_table.implicitHeight + list_table.anchors.margins * 2)
implicitWidth: getWidth()
ListView{
id: list_table
anchors{
top:parent.top
horizontalCenter: parent.horizontalCenter
margins: margins
}
implicitHeight: contentHeight > max_height ? max_height : contentHeight
implicitWidth: parent.width - anchors.margins * 2
clip: true
model: list_model
header: Item{
implicitHeight: header_row.implicitHeight + 6
implicitWidth: header_row.implicitWidth
RowLayout{
id:header_row
spacing: row_spacing
Repeater{
model: header_items
RibbonRectangle{
implicitHeight: head.implicitHeight + 10
implicitWidth: header_items_width[index]
topLeftRadius: index == 0 ? 5 : 0
bottomLeftRadius: index == 0 ? 5 : 0
topRightRadius: index == (header_items.length - 1) ? 5 : 0
bottomRightRadius: index == (header_items.length - 1) ? 5 : 0
color: RibbonTheme.dark_mode ? "#5E5C5B" : "#CBCAC9"
RibbonText{
id:head
anchors.centerIn: parent
width: implicitWidth > parent.width - 10 ? parent.width - 10 : implicitWidth
text: modelData
wrapMode: RibbonText.WordWrap
view_only: true
}
}
}
}
}
delegate: Item{
implicitHeight: row_bg.implicitHeight + 6
implicitWidth: row_bg.implicitWidth
Rectangle{
id: row_bg
implicitHeight: row.implicitHeight
implicitWidth: row.implicitWidth
radius: 5
color: mouse.containsMouse || row_bg.selected ? "#506BBD" : "transparent"
property bool selected: false
property bool is_focused: list_table.currentIndex === index
onIs_focusedChanged: {
if (!is_focused && selected)
row_bg.selected = !row_bg.selected
}
onSelectedChanged: has_selected += row_bg.selected ? 1 : -1
RowLayout{
id: row
spacing: row_spacing
Repeater{
model: getRowValues(index)
RibbonRectangle{
implicitHeight: text.implicitHeight + 10
implicitWidth: modelData.width
color: "transparent"
RibbonText{
id:text
anchors.centerIn: parent
width: implicitWidth > parent.width - 10 ? parent.width - 10 : implicitWidth
view_only: true
text: modelData.data
wrapMode: RibbonText.WordWrap
color: {
if(RibbonTheme.dark_mode)
{
if(mouse.containsMouse&&!row_bg.selected)
return 'black'
else if(mouse.containsMouse&&row_bg.selected)
return 'white'
else if(!mouse.containsMouse&&row_bg.selected)
return 'black'
else
return 'white'
}
else
{
if(mouse.containsMouse&&!row_bg.selected)
return 'white'
else if(mouse.containsMouse&&row_bg.selected)
return 'black'
else if(!mouse.containsMouse&&row_bg.selected)
return 'white'
else
return 'black'
}
}
}
}
}
}
MouseArea{
id: mouse
anchors.fill: parent
hoverEnabled: true
onClicked:
{
list_table.currentIndex = index
row_bg.selected = !row_bg.selected
}
}
}
}
add: Transition {
NumberAnimation { properties: "y"; from: list_table.height; duration: 200 }
}
ScrollBar.vertical: RibbonScrollBar {
anchors.right: list_table.right
anchors.rightMargin: 2
}
}
function getRowValues(index) {
var obj = list_model.get(index)
if(!obj)
return
var data = []
for(let i=0;i<header_items.length;i++){
data.push({data:obj[header_items[i]],width:header_items_width[i]})
}
return data;
}
function getWidth(){
let width = 0;
for (let i=0;i<header_items_width.length;i++)
{
width += header_items_width[i]
}
width += list_table.anchors.margins * 2
width += (header_items_width.length - 1) * row_spacing
return width
}
}