PrismLauncher/launcher/ui/widgets/ProgressWidget.h
flow 6a18079953
refactor: generalize mod models and APIs to resources
Firstly, this abstract away behavior in the mod download models that can
also be applied to other types of resources into a superclass, allowing
other resource types to be implemented without so much code duplication.

For that, this also generalizes the APIs used (currently, ModrinthAPI
and FlameAPI) to be able to make requests to other types of resources.

It also does a general cleanup of both of those. In particular, this
makes use of std::optional instead of invalid values for errors and,
well, optional values :p

This is a squash of some commits that were becoming too interlaced
together to be cleanly separated.

Signed-off-by: flow <flowlnlnln@gmail.com>
2023-01-13 16:23:00 -03:00

57 lines
1.4 KiB
C++

// Licensed under the Apache-2.0 license. See README.md for details.
#pragma once
#include <QWidget>
#include <memory>
class Task;
class QProgressBar;
class QLabel;
class ProgressWidget : public QWidget {
Q_OBJECT
public:
explicit ProgressWidget(QWidget* parent = nullptr, bool show_label = true);
/** Whether to hide the widget automatically if it's watching no running task. */
void hideIfInactive(bool hide) { m_hide_if_inactive = hide; }
/** Reset the displayed progress to 0 */
void reset();
/** The text that shows up in the middle of the progress bar.
* By default it's '%p%', with '%p' being the total progress in percentage.
*/
void progressFormat(QString);
public slots:
/** Watch the progress of a task. */
void watch(const Task* task);
/** Watch the progress of a task, and start it if needed */
void start(const Task* task);
/** Blocking way of waiting for a task to finish. */
bool exec(std::shared_ptr<Task> task);
/** Un-hide the widget if needed. */
void show();
/** Make the widget invisible. */
void hide();
private slots:
void handleTaskFinish();
void handleTaskStatus(const QString& status);
void handleTaskProgress(qint64 current, qint64 total);
void taskDestroyed();
private:
QLabel* m_label = nullptr;
QProgressBar* m_bar = nullptr;
const Task* m_task = nullptr;
bool m_hide_if_inactive = false;
};