Meshroom/meshroom/ui/qml/GraphEditor/TaskManager.qml
Candice Bentéjac 02383c68b3 [ui] Check that objects accessed by QML properties are not null before accessing them
Some QML properties access exposed Python objects that may or may not
be null upon their access. When these objects are accessed while null,
QML issues "TypeError" warnings. These warnings have no functional
impact as QML correctly handles trying to access null objects, but can
spam the logs.

This commit aims at fixing all these warnings by checking that the
Python objects are not null before being accessed.
2022-12-06 11:04:50 +01:00

289 lines
9.7 KiB
QML

import QtQuick 2.7
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
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.width
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)
}
}
}
}
}
}
}
}