/* SPDX-FileCopyrightText: 2026 Project Tick * SPDX-FileContributor: Project Tick * SPDX-License-Identifier: GPL-3.0-or-later * * MeshMC - A Custom Launcher for Minecraft * Copyright (C) 2026 Project Tick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * This file incorporates work covered by the following copyright and * permission notice: * */// Licensed under the Apache-2.0 license. See README.md for details. #include "ProgressWidget.h" #include #include #include #include #include "tasks/Task.h" ProgressWidget::ProgressWidget(QWidget* parent) : QWidget(parent) { m_label = new QLabel(this); m_label->setWordWrap(true); m_bar = new QProgressBar(this); m_bar->setMinimum(0); m_bar->setMaximum(100); QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(m_label); layout->addWidget(m_bar); layout->addStretch(); setLayout(layout); } void ProgressWidget::start(std::shared_ptr task) { if (m_task) { disconnect(m_task.get(), 0, this, 0); } m_task = task; connect(m_task.get(), &Task::finished, this, &ProgressWidget::handleTaskFinish); connect(m_task.get(), &Task::status, this, &ProgressWidget::handleTaskStatus); connect(m_task.get(), &Task::progress, this, &ProgressWidget::handleTaskProgress); connect(m_task.get(), &Task::destroyed, this, &ProgressWidget::taskDestroyed); if (!m_task->isRunning()) { QMetaObject::invokeMethod(m_task.get(), "start", Qt::QueuedConnection); } } bool ProgressWidget::exec(std::shared_ptr task) { QEventLoop loop; connect(task.get(), &Task::finished, &loop, &QEventLoop::quit); start(task); if (task->isRunning()) { loop.exec(); } return task->wasSuccessful(); } void ProgressWidget::handleTaskFinish() { if (!m_task->wasSuccessful()) { m_label->setText(m_task->failReason()); } } void ProgressWidget::handleTaskStatus(const QString& status) { m_label->setText(status); } void ProgressWidget::handleTaskProgress(qint64 current, qint64 total) { m_bar->setMaximum(total); m_bar->setValue(current); } void ProgressWidget::taskDestroyed() { m_task = nullptr; }