import QtQuick import QtQuick.Controls import QtQuick.Layouts import MaterialIcons 2.2 import Controls 1.0 import Utils 1.0 /** * CompatibilityManager summarizes and allows to resolve compatibility issues. */ MessageDialog { id: root // The UIGraph instance property var uigraph // Alias to underlying compatibilityNodes model readonly property var nodesModel: uigraph ? uigraph.graph.compatibilityNodes : undefined // The total number of compatibility issues readonly property int issueCount: (nodesModel !== undefined && nodesModel !== null) ? nodesModel.count : 0 // The number of CompatibilityNodes that can be upgraded readonly property int upgradableCount: { var count = 0 for (var i = 0; i < issueCount; ++i) { if (nodesModel.at(i).canUpgrade) count++; } return count } // Override MessageDialog.getAsString to add compatibility report function getAsString() { var t = asString + "\n" t += '-------------------------\n' t += "Node | Issue | Upgradable\n" t += '-------------------------\n' for (var i = 0; i < issueCount; ++i) { var n = nodesModel.at(i) t += n.nodeType + " | " + n.issueDetails + " | " + n.canUpgrade + "\n" } t += "\n" + questionLabel.text return t } signal upgradeDone() title: "Compatibility issues detected" text: "This project contains " + issueCount + " node(s) incompatible with the current version of Meshroom." detailedText: { let releaseVersion = uigraph ? uigraph.graph.fileReleaseVersion : "0.0" return "Project was created with Meshroom " + releaseVersion + "." } helperText: upgradableCount ? upgradableCount + " node(s) can be upgraded but this might invalidate already computed data.\n" + "This operation is undoable and can also be done manually in the Graph Editor." : "" ColumnLayout { spacing: 16 ListView { id: listView Layout.fillWidth: true Layout.maximumHeight: 300 implicitHeight: contentHeight clip: true model: nodesModel ScrollBar.vertical: MScrollBar { id: scrollbar } spacing: 4 headerPositioning: ListView.OverlayHeader header: Pane { z: 2 width: ListView.view.width padding: 6 background: Rectangle { color: Qt.darker(parent.palette.window, 1.15) } RowLayout { width: parent.width Label { text: "Node"; Layout.preferredWidth: 150; font.bold: true } Label { text: "Issue"; Layout.fillWidth: true; font.bold: true } Label { text: "Upgradable"; font.bold: true } } } delegate: RowLayout { id: compatibilityNodeDelegate property var node: object width: ListView.view.width - 12 anchors.horizontalCenter: parent != null ? parent.horizontalCenter : undefined Label { Layout.preferredWidth: 150 text: compatibilityNodeDelegate.node ? compatibilityNodeDelegate.node.defaultLabel : "" } Label { Layout.fillWidth: true text: compatibilityNodeDelegate.node ? compatibilityNodeDelegate.node.issueDetails : "" } Label { text: compatibilityNodeDelegate.node && compatibilityNodeDelegate.node.canUpgrade ? MaterialIcons.check : MaterialIcons.clear color: compatibilityNodeDelegate.node && compatibilityNodeDelegate.node.canUpgrade ? "#4CAF50" : "#F44336" font.family: MaterialIcons.fontFamily font.pointSize: 14 font.bold: true } } } Label { id: questionLabel text: upgradableCount ? "Upgrade all possible nodes to current version?" : "Those nodes can't be upgraded, remove them manually if needed." } } standardButtons: upgradableCount ? Dialog.Yes | Dialog.No : Dialog.Ok icon { text: MaterialIcons.warning color: "#FF9800" } onAccepted: { if (upgradableCount) { uigraph.upgradeAllNodes() upgradeDone() } } }