mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 22:50:05 +00:00
105 lines
2.7 KiB
C++
105 lines
2.7 KiB
C++
#include <scwx/qt/ui/download_dialog.hpp>
|
|
#include <scwx/util/strings.hpp>
|
|
|
|
#include <boost/timer/timer.hpp>
|
|
#include <fmt/chrono.h>
|
|
#include <fmt/format.h>
|
|
#include <QDialogButtonBox>
|
|
#include <QPushButton>
|
|
|
|
namespace scwx
|
|
{
|
|
namespace qt
|
|
{
|
|
namespace ui
|
|
{
|
|
|
|
class DownloadDialog::Impl
|
|
{
|
|
public:
|
|
explicit Impl() {};
|
|
~Impl() = default;
|
|
|
|
boost::timer::cpu_timer timer_ {};
|
|
};
|
|
|
|
DownloadDialog::DownloadDialog(QWidget* parent) :
|
|
ProgressDialog(parent), p {std::make_unique<Impl>()}
|
|
{
|
|
auto buttonBox = button_box();
|
|
buttonBox->setStandardButtons(QDialogButtonBox::StandardButton::Ok |
|
|
QDialogButtonBox::StandardButton::Cancel);
|
|
buttonBox->button(QDialogButtonBox::StandardButton::Ok)
|
|
->setText("Install Now");
|
|
|
|
setWindowTitle(tr("Download File"));
|
|
SetRange(0, 100);
|
|
}
|
|
|
|
DownloadDialog::~DownloadDialog() {}
|
|
|
|
void DownloadDialog::set_filename(const std::string& filename)
|
|
{
|
|
QString label = tr("Downloading %1...").arg(filename.c_str());
|
|
SetTopLabelText(label);
|
|
}
|
|
|
|
void DownloadDialog::StartDownload()
|
|
{
|
|
// Hide the OK button until the download is finished
|
|
button_box()
|
|
->button(QDialogButtonBox::StandardButton::Ok)
|
|
->setVisible(false);
|
|
|
|
SetValue(0);
|
|
SetBottomLabelText(tr("Waiting for download to begin..."));
|
|
p->timer_.start();
|
|
show();
|
|
}
|
|
|
|
void DownloadDialog::UpdateProgress(std::ptrdiff_t downloadedBytes,
|
|
std::ptrdiff_t totalBytes)
|
|
{
|
|
using namespace std::chrono_literals;
|
|
|
|
const std::chrono::nanoseconds elapsed {p->timer_.elapsed().wall};
|
|
|
|
const double percentComplete =
|
|
(totalBytes > 0.0) ? static_cast<double>(downloadedBytes) / totalBytes :
|
|
0.0;
|
|
const int progressValue = static_cast<int>(percentComplete * 100.0);
|
|
|
|
SetValue(progressValue);
|
|
|
|
const std::chrono::seconds timeRemaining =
|
|
(percentComplete > 0.0) ?
|
|
std::chrono::duration_cast<std::chrono::seconds>(
|
|
elapsed / percentComplete - elapsed) :
|
|
0s;
|
|
const std::chrono::hours hoursRemaining =
|
|
std::chrono::duration_cast<std::chrono::hours>(timeRemaining);
|
|
|
|
const std::string progressText =
|
|
fmt::format("{} of {} downloaded ({}:{:%M:%S} remaining)",
|
|
util::BytesToString(downloadedBytes),
|
|
util::BytesToString(totalBytes),
|
|
hoursRemaining.count(),
|
|
timeRemaining);
|
|
|
|
SetBottomLabelText(QString::fromStdString(progressText));
|
|
}
|
|
|
|
void DownloadDialog::FinishDownload()
|
|
{
|
|
button_box()->button(QDialogButtonBox::StandardButton::Ok)->setVisible(true);
|
|
}
|
|
|
|
void DownloadDialog::CancelDownload()
|
|
{
|
|
SetValue(0);
|
|
SetBottomLabelText(tr("Error occurred while downloading"));
|
|
}
|
|
|
|
} // namespace ui
|
|
} // namespace qt
|
|
} // namespace scwx
|