import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.11 import Controls 1.0 import Utils 1.0 import MaterialIcons 2.2 Item { id: root implicitWidth: 500 implicitHeight: 500 property var uigraph property var taskManager SystemPalette { id: activePalette } property color textColor: Colors.sysPalette.text property color bgColor: Qt.darker(Colors.sysPalette.window, 1.15) property color headBgColor: Qt.darker(Colors.sysPalette.window, 1.30) property color tableBorder: Colors.sysPalette.window property int borderWidth: 3 function selectNode(node) { uigraph.selectedNode = node } ScrollBar { id: hbar hoverEnabled: true active: true orientation: Qt.Horizontal size: root.width / taskList.width anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom } TextMetrics { id: nbMetrics text: root.taskManager ? root.taskManager.nodes.count : "0" } TextMetrics { id: statusMetrics text: "SUBMITTED" } TextMetrics { id: chunksMetrics text: "Chunks Done" } TextMetrics { id: execMetrics text: "Exec Mode" } TextMetrics { id: progressMetrics text: "Progress" } ListView { id: taskList anchors.fill: parent ScrollBar.vertical: ScrollBar {} model: parent.taskManager ? parent.taskManager.nodes : null spacing: 3 headerPositioning: ListView.OverlayHeader header: RowLayout { height: 30 spacing: 3 width: parent.width z: 2 Label { text: qsTr("Nb") Layout.preferredWidth: nbMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter background: Rectangle { color: headBgColor } } Label { text: qsTr("Node") Layout.preferredWidth: 250 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter background: Rectangle { color: headBgColor } } Label { text: qsTr("State") Layout.preferredWidth: statusMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter background: Rectangle { color: headBgColor } } Label { text: qsTr("Chunks Done") Layout.preferredWidth: chunksMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter background: Rectangle { color: headBgColor } } Label { text: qsTr("Exec Mode") Layout.preferredWidth: execMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter background: Rectangle { color: headBgColor } } Label { text: qsTr("Progress") Layout.fillWidth: true Layout.minimumWidth: progressMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter background: Rectangle { color: headBgColor } } } delegate: RowLayout { width: parent != null ? parent.width : undefined height: 18 spacing: 3 function getNbFinishedChunks(chunks) { var nbSuccess = 0 for (var i = 0; i < chunks.count; i++) { if (chunks.at(i).statusName === "SUCCESS") { nbSuccess += 1 } } return nbSuccess } Label { text: index + 1 Layout.preferredWidth: nbMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter color: object === uigraph.selectedNode ? Colors.sysPalette.window : Colors.sysPalette.text background: Rectangle { color: object === uigraph.selectedNode ? Colors.sysPalette.text : bgColor } MouseArea { anchors.fill: parent onPressed: { selectNode(object) } } } Label { text: object.label Layout.preferredWidth: 250 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter color: object === uigraph.selectedNode ? Colors.sysPalette.window : Colors.sysPalette.text background: Rectangle { color: object === uigraph.selectedNode ? Colors.sysPalette.text : bgColor } MouseArea { anchors.fill: parent onPressed: { selectNode(object) } } } Label { text: object.globalStatus Layout.preferredWidth: statusMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter color: object === uigraph.selectedNode ? Colors.sysPalette.window : Colors.sysPalette.text background: Rectangle { color: object === uigraph.selectedNode ? Colors.sysPalette.text : bgColor } MouseArea { anchors.fill: parent onPressed: { selectNode(object) } } } Label { text: getNbFinishedChunks(object.chunks) + "/" + object.chunks.count Layout.preferredWidth: chunksMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter color: object === uigraph.selectedNode ? Colors.sysPalette.window : Colors.sysPalette.text background: Rectangle { color: object === uigraph.selectedNode ? Colors.sysPalette.text : bgColor } MouseArea { anchors.fill: parent onPressed: { selectNode(object) } } } Label { text: object.globalExecMode Layout.preferredWidth: execMetrics.width + 20 Layout.preferredHeight: parent.height horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter color: object === uigraph.selectedNode ? Colors.sysPalette.window : Colors.sysPalette.text background: Rectangle { color: object === uigraph.selectedNode ? Colors.sysPalette.text : bgColor } MouseArea { anchors.fill: parent onPressed: { selectNode(object) } } } Item { Layout.fillWidth: true Layout.minimumWidth: progressMetrics.width + 20 Layout.preferredHeight: parent.height ListView { id: chunkList width: parent.width height: parent.height orientation: ListView.Horizontal model: object.chunks property var node: object spacing: 3 delegate: Label { width: (ListView.view.width / ListView.view.model.count) - 3 height: ListView.view.height anchors.verticalCenter: parent.verticalCenter background: Rectangle { color: Colors.getChunkColor(object, {"NONE": bgColor}) radius: 3 border.width: 2 border.color: chunkList.node === uigraph.selectedNode ? Colors.sysPalette.text : Colors.getChunkColor(object, {"NONE": bgColor}) } MouseArea { anchors.fill: parent onPressed: { selectNode(chunkList.node) } } } } } } } }