mirror of https://github.com/qt/qtdoc.git
185 lines
5.2 KiB
QML
185 lines
5.2 KiB
QML
// Copyright (C) 2025 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Controls.Basic
|
|
import qtgraphscsv
|
|
|
|
Item {
|
|
id: tableviewItem
|
|
|
|
property alias horizontalHeaderview: hHeaderView
|
|
property alias verticalalHeaderview: vHeaderView
|
|
property alias mainTableView: tv
|
|
property alias tableViewModel: tv.model
|
|
property alias horizontalHeaderViewModel: hHeaderView.model
|
|
property alias title: titleLabel.text
|
|
property alias dataSelectionModel: tv.dataSelectionModel
|
|
|
|
property color borderColor
|
|
property color primaryTextColor
|
|
property color secondaryTextColor
|
|
property color selectionColor: "#E3E3E3"
|
|
property color backgroundColor: "#FCFCFC"
|
|
property color scrollbarBackgroundColor: "#BEBEBE"
|
|
|
|
readonly property font titleFont: ({
|
|
family: "Inter",
|
|
weight: 700 * Units.px,
|
|
pixelSize: 16 * Units.px,
|
|
letterSpacing: 0 * Units.px,
|
|
bold: false
|
|
})
|
|
|
|
function extractBarSetGategories(first, count) {
|
|
var categories = [];
|
|
const last = first + count;
|
|
for (var i = first; i < last; ++i)
|
|
categories.push(tv.model.headerData(i, Qt.Horizontal, Qt.DisplayRole) + " medals");
|
|
return categories;
|
|
}
|
|
|
|
function fillHorizontalHeaderModel(rowLength) {
|
|
hHeaderView.model.clear();
|
|
for (var i = 0; i < rowLength; ++i) {
|
|
var h = tv.model.headerData(i, Qt.Horizontal, Qt.DisplayRole);
|
|
hHeaderView.model.append({
|
|
"display": h
|
|
});
|
|
}
|
|
}
|
|
|
|
Text {
|
|
id: titleLabel
|
|
text: ""
|
|
|
|
font: titleFont
|
|
color: tableviewItem.primaryTextColor
|
|
width: 132 * Units.px
|
|
height: 16 * Units.px
|
|
anchors.top: tableviewItem.top
|
|
anchors.left: vHeaderView.left
|
|
anchors.right: tableviewItem.right
|
|
anchors.rightMargin: 236 * Units.px
|
|
anchors.leftMargin: 8 * Units.px
|
|
verticalAlignment: Text.AlignBottom
|
|
}
|
|
|
|
VerticalHeaderView {
|
|
id: vHeaderView
|
|
|
|
implicitWidth: 91 * Units.px
|
|
implicitHeight: 320 * Units.px
|
|
clip: true
|
|
anchors.top: hHeaderView.bottom
|
|
anchors.bottom: tv.bottom
|
|
boundsBehavior: Flickable.StopAtBounds
|
|
syncView: tv
|
|
delegate: VerticalHeaderDelegate {
|
|
textColor: tableviewItem.primaryTextColor
|
|
borderColor: tableviewItem.borderColor
|
|
}
|
|
}
|
|
|
|
HorizontalHeaderView {
|
|
id: hHeaderView
|
|
implicitWidth: 250 * Units.px
|
|
|
|
anchors.top: titleLabel.bottom
|
|
anchors.topMargin: 25 * Units.px
|
|
anchors.left: vHeaderView.right
|
|
interactive: false
|
|
columnWidthProvider: column => {
|
|
return (column ? tv.implicitColumnWidth(column) : 0);
|
|
}
|
|
|
|
delegate: HorizontalHeaderDelegate {
|
|
textColor: tableviewItem.secondaryTextColor
|
|
borderColor: tableviewItem.borderColor
|
|
}
|
|
}
|
|
|
|
TableView {
|
|
id: tv
|
|
|
|
property alias dataSelectionModel: dataSelectionModel
|
|
anchors.top: hHeaderView.bottom
|
|
anchors.left: vHeaderView.right
|
|
|
|
implicitWidth: 255 * Units.px
|
|
implicitHeight: 310 * Units.px
|
|
reuseItems: false
|
|
clip: true
|
|
selectionBehavior: TableView.SelectCells
|
|
selectionMode: TableView.ContiguousSelection
|
|
interactive: false
|
|
|
|
columnWidthProvider: column => {
|
|
if (column === 0)
|
|
return 0;
|
|
}
|
|
rowHeightProvider: row => {
|
|
if (row === 0)
|
|
return 0;
|
|
}
|
|
|
|
ScrollBar.vertical: MyScrollBar {
|
|
parent: tv.parent
|
|
anchors.top: tv.top
|
|
anchors.bottom: tv.bottom
|
|
anchors.left: tv.right
|
|
anchors.leftMargin: 16 * Units.px
|
|
}
|
|
|
|
keyNavigationEnabled: false
|
|
|
|
selectionModel: ItemSelectionModel {
|
|
id: dataSelectionModel
|
|
}
|
|
|
|
delegate: Rectangle {
|
|
id: delegateRectangle
|
|
implicitHeight: 31 * Units.px
|
|
implicitWidth: 63 * Units.px
|
|
|
|
required property bool selected
|
|
required property bool current
|
|
required property string display
|
|
|
|
border.width: 1 * Units.px
|
|
border.color: tableviewItem.borderColor
|
|
color: selected ? tableviewItem.selectionColor : tableviewItem.backgroundColor
|
|
|
|
Text {
|
|
leftPadding: 38
|
|
topPadding: 6
|
|
bottomPadding: 5
|
|
rightPadding: 11
|
|
color: tableviewItem.primaryTextColor
|
|
text: delegateRectangle.display
|
|
}
|
|
}
|
|
}
|
|
|
|
component MyScrollBar: ScrollBar {
|
|
id: scrollBar
|
|
|
|
background: Rectangle {
|
|
implicitWidth: 8 * Units.px
|
|
implicitHeight: 320 * Units.px
|
|
radius: 8 * Units.px
|
|
color: tableviewItem.selectionColor
|
|
}
|
|
|
|
contentItem: Rectangle {
|
|
implicitWidth: 8 * Units.px
|
|
implicitHeight: 91 * Units.px
|
|
color: tableviewItem.scrollbarBackgroundColor
|
|
radius: 8 * Units.px
|
|
}
|
|
}
|
|
}
|