Revision control

++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ pragma ComponentBehavior: Bound
++ import QtQuick
++ import QtQuick.Controls
++ import QtQuick.Layouts
++
++ Pane {
++ id: root
++ anchors.fill: parent
++
++ property double totalProgress: 0
++ property int totalTimeRemaining: -1
++ property string stage : "Preparing..."
++
++ function clearText() {
++ textArea.clear();
++ }
++
++ function update(payload) {
++ if ("message" in payload && typeof payload.message === "string" && payload.message) {
++ textArea.insert(textArea.length, payload.message + "\n");
++ }
++
++ if ("totalProgress" in payload && typeof payload.totalProgress === "number") {
++ root.totalProgress = payload.totalProgress;
++ }
++
++ if ("totalTimeRemaining" in payload && typeof payload.totalTimeRemaining === "number") {
++ root.totalTimeRemaining = payload.totalTimeRemaining;
++ }
++
++ if ("stage" in payload && typeof payload.stage === "string") {
++ root.stage = payload.stage;
++ }
++ }
++
++ function formatDuration(milliseconds, showMilliseconds = true) {
++ if (milliseconds < 0)
++ return " Estimating..."
++ const partSeconds = Math.floor(milliseconds / 1000) % 60;
++ const partMinutes = Math.floor(milliseconds / 60000) % 60;
++ const partHours = Math.floor(milliseconds / 3600000) % 60;
++
++ if (partHours > 0) {
++ return partHours + "h " + partMinutes + "m " + partSeconds + "s";
++ }
++ if (partMinutes > 0) {
++ return partMinutes + "m " + partSeconds + "s";
++ }
++ if (partSeconds > 0) {
++ return partSeconds + "s";
++ }
++ return "0s";
++ }
++
++ ColumnLayout {
++ anchors.fill: parent
++
++ RowLayout {
++ Label {
++ padding: 0
++ text: root.stage
++ }
++ Item {
++ Layout.fillWidth: true
++ }
++ Label {
++ padding: 0
++ text: (root.totalProgress * 100).toFixed(0) + "%"
++ }
++ }
++
++ ProgressBar {
++ Layout.fillWidth: true
++ value: root.totalProgress
++ }
++
++ RowLayout {
++ Label {
++ padding: 0
++ text: root.totalTimeRemaining > 0 ? "Remaining: " + root.formatDuration(root.totalTimeRemaining) : ""
++ }
++ Item {
++ Layout.fillWidth: true
++ }
++ }
++
++ Frame {
++ Layout.fillWidth: true
++ Layout.fillHeight: true
++ ScrollView {
++ width: parent.width
++ height: parent.height
++ id: scroll
++ TextArea {
++ id: textArea
++ width: parent.width
++ height: parent.height
++ readOnly: true
++ placeholderText: qsTr("Qt Lightmapper")
++ font.pixelSize: 12
++ wrapMode: Text.WordWrap
++ }
++ }
++ }
++
++ Button {
++ objectName: "cancelButton"
++ Layout.fillWidth: true
++ text: "Cancel"
++ }
++ }
++ }