1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#include <QApplication>
#include "CodeProgress.h"
CodeProgressHelper::CodeProgressHelper(QWidget* parentWidget) : mParentWidget{ parentWidget }, mProgressDialog(make_nullptr<QProgressDialog>()) {
moveToThread(QApplication::instance()->thread());
connect(this, &CodeProgressHelper::ShowProgressDialogSignal, this, &CodeProgressHelper::ShowProgressDialogSlot, Qt::QueuedConnection);
connect(this, &CodeProgressHelper::UpdateProgressValueSignal, this, &CodeProgressHelper::UpdateProgressValueSlot, Qt::BlockingQueuedConnection);
connect(this, &CodeProgressHelper::HideProgressDialogSignal, this, &CodeProgressHelper::HideProgressDialogSlot, Qt::QueuedConnection);
}
void CodeProgressHelper::ShowProgressDialog() {
emit ShowProgressDialogSignal();
}
void CodeProgressHelper::UpdateProgressValue(int percentage) {
emit UpdateProgressValueSignal(percentage);
}
void CodeProgressHelper::HideProgressDialog() {
emit HideProgressDialogSignal();
}
void CodeProgressHelper::ShowProgressDialogSlot() {
mProgressDialog.reset(new QProgressDialog(mParentWidget));
mProgressDialog->setWindowFlags(mProgressDialog->windowFlags() & ~Qt::WindowContextHelpButtonHint & ~Qt::WindowCloseButtonHint);
mProgressDialog->setWindowModality(Qt::WindowModal);
mProgressDialog->setCancelButton(nullptr);
mProgressDialog->setMinimum(0);
mProgressDialog->setMaximum(100);
mProgressDialog->setAutoReset(false);
mProgressDialog->setAutoClose(false);
mProgressDialog->show();
}
void CodeProgressHelper::UpdateProgressValueSlot(int percentage) {
mProgressDialog->setValue(percentage);
}
void CodeProgressHelper::HideProgressDialogSlot() {
mProgressDialog->hide();
mProgressDialog.reset();
}
void CodeProgress::Init(__int64 totalSize, bool compressing)
{
System::GC::ReRegisterForFinalize(this);
mTotalSize = totalSize;
mCompressing = compressing;
mPercentage = 0;
mHelper = new CodeProgressHelper(mParentWidget);
mHelper->ShowProgressDialog();
}
void CodeProgress::SetProgress(__int64 inSize, __int64 outSize)
{
int newPercentage = (int)(100 * inSize / (double)mTotalSize);
if (newPercentage != mPercentage)
mHelper->UpdateProgressValue(newPercentage);
mPercentage = newPercentage;
}
CodeProgress::~CodeProgress()
{
if (!mHelper)
return;
mHelper->HideProgressDialog();
this->!CodeProgress();
}
CodeProgress::!CodeProgress()
{
if (mHelper)
mHelper->deleteLater();
mHelper = nullptr;
}
void CodeProgress::setParentWidget(QWidget* parentWidget)
{
mParentWidget = parentWidget;
}
|