Meshroom/meshroom/ui/qml/GraphEditor/TaskManager.qml
2023-11-06 16:28:22 +01:00

289 lines
9.6 KiB
QML

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)
}
}
}
}
}
}
}
}