mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-11-04 08:30:04 +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
 |