diff options
author | Rachel Powers <508861+Ryex@users.noreply.github.com> | 2023-03-31 12:29:59 -0700 |
---|---|---|
committer | Rachel Powers <508861+Ryex@users.noreply.github.com> | 2023-05-01 10:47:31 -0700 |
commit | f1028fa66d556b024765ba4e21ac76d4510a3e3e (patch) | |
tree | 1a94095040254ceb02839d3b6e4674efcb7f909e | |
parent | 9d2f0e4dc8fc3995052770c6a7948cb0372fdcbb (diff) | |
download | PrismLauncher-f1028fa66d556b024765ba4e21ac76d4510a3e3e.tar.gz PrismLauncher-f1028fa66d556b024765ba4e21ac76d4510a3e3e.tar.bz2 PrismLauncher-f1028fa66d556b024765ba4e21ac76d4510a3e3e.zip |
fix: properly map progress range
- doument PCRE used for URL compacting
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
-rw-r--r-- | launcher/net/Download.cpp | 20 | ||||
-rw-r--r-- | launcher/tasks/ConcurrentTask.cpp | 7 | ||||
-rw-r--r-- | launcher/ui/dialogs/ProgressDialog.cpp | 56 | ||||
-rw-r--r-- | launcher/ui/dialogs/ProgressDialog.ui | 21 |
4 files changed, 55 insertions, 49 deletions
diff --git a/launcher/net/Download.cpp b/launcher/net/Download.cpp index a4c3ebfc..3eef9117 100644 --- a/launcher/net/Download.cpp +++ b/launcher/net/Download.cpp @@ -61,13 +61,23 @@ QString truncateUrlHumanFriendly(QUrl &url, int max_len, bool hard_limit = false if (str_url.length() <= max_len) return str_url; - QRegularExpression re(R"(^([\w]+:\/\/)([\w._-]+\/)([\w._-]+\/).*(\/[^]+[^]+)$)"); + /* this is a PCRE regular expression that splits a URL (given by the display rules above) into 5 capture groups + * the scheme (ie https://) is group 1 + * the host (with trailing /) is group 2 + * the first part of the path (with trailing /) is group 3 + * the last part of the path (with leading /) is group 5 + * the remainder of the URL is in the .* and in group 4 + * + * See: https://regex101.com/r/inHkek/1 + * for an interactive breakdown + */ + QRegularExpression re(R"(^([\w]+:\/\/)([\w._-]+\/)([\w._-]+\/)(.*)(\/[^]+[^]+)$)"); auto url_compact = QString(str_url); - url_compact.replace(re, "\\1\\2\\3...\\4"); + url_compact.replace(re, "\\1\\2\\3...\\5"); if (url_compact.length() >= max_len) { - auto url_compact = QString(str_url); - url_compact.replace(re, "\\1\\2...\\4"); + url_compact = QString(str_url); + url_compact.replace(re, "\\1\\2...\\5"); } @@ -120,7 +130,7 @@ void Download::addValidator(Validator* v) void Download::executeTask() { - setStatus(tr("Downloading %1").arg(truncateUrlHumanFriendly(m_url, 60))); + setStatus(tr("Downloading %1").arg(truncateUrlHumanFriendly(m_url, 100))); if (getState() == Task::State::AbortedByUser) { qCWarning(DownloadLogC) << getUid().toString() << "Attempt to start an aborted Download:" << m_url.toString(); diff --git a/launcher/tasks/ConcurrentTask.cpp b/launcher/tasks/ConcurrentTask.cpp index fde7d0ad..41c405db 100644 --- a/launcher/tasks/ConcurrentTask.cpp +++ b/launcher/tasks/ConcurrentTask.cpp @@ -28,12 +28,7 @@ void ConcurrentTask::addTask(Task::Ptr task) void ConcurrentTask::executeTask() { - // Start the least amount of tasks needed, but at least one - // int num_starts = qMax(1, qMin(m_total_max_size, m_queue.size())); - // for (int i = 0; i < num_starts; i++) { - // QMetaObject::invokeMethod(this, &ConcurrentTask::startNext, Qt::QueuedConnection); - // } - // Start One task, startNext hadles starting the up to the m_total_max_size + // Start One task, startNext hadels starting the up to the m_total_max_size // while tracking the number currently being done QMetaObject::invokeMethod(this, &ConcurrentTask::startNext, Qt::QueuedConnection); } diff --git a/launcher/ui/dialogs/ProgressDialog.cpp b/launcher/ui/dialogs/ProgressDialog.cpp index f7a3a862..7ab766e4 100644 --- a/launcher/ui/dialogs/ProgressDialog.cpp +++ b/launcher/ui/dialogs/ProgressDialog.cpp @@ -45,21 +45,18 @@ #include "ui/widgets/SubTaskProgressBar.h" -template<typename T> -int map_int_range(T value) +// map a value in a numaric range of an arbatray type to between 0 and INT_MAX +// for getting the best percision out of the qt progress bar +template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> +std::tuple<int, int> map_int_zero_max(T current, T range_max, T range_min) { - // auto type_min = std::numeric_limits<T>::min(); - auto type_min = 0; - auto type_max = std::numeric_limits<T>::max(); + int int_max = std::numeric_limits<int>::max(); - // auto int_min = std::numeric_limits<int>::min(); - auto int_min = 0; - auto int_max = std::numeric_limits<int>::max(); + auto type_range = range_max - range_min; + double percentage = static_cast<double>(current - range_min) / static_cast<double>(type_range); + int mapped_current = percentage * int_max; - auto type_range = type_max - type_min; - auto int_range = int_max - int_min; - - return static_cast<int>((value - type_min) * int_range / type_range + int_min); + return {mapped_current, int_max}; } @@ -100,14 +97,21 @@ void ProgressDialog::updateSize() { QSize lastSize = this->size(); QSize qSize = QSize(480, minimumSizeHint().height()); - resize(qSize); - setFixedSize(qSize); - // keep the dialog in the center after a resize - if (lastSize != qSize) + + // if the current window is too small + if ((lastSize != qSize) && (lastSize.height() < qSize.height())) + { + resize(qSize); + + // keep the dialog in the center after a resize this->move( this->parentWidget()->x() + (this->parentWidget()->width() - this->width()) / 2, this->parentWidget()->y() + (this->parentWidget()->height() - this->height()) / 2 ); + } + + setMinimumSize(qSize); + } int ProgressDialog::execWithTask(Task* task) @@ -147,9 +151,6 @@ int ProgressDialog::execWithTask(Task* task) changeProgress(task->getProgress(), task->getTotalProgress()); } - // auto size_hint = ui->verticalLayout->sizeHint(); - // resize(size_hint.width(), size_hint.height()); - return QDialog::exec(); } @@ -209,26 +210,31 @@ void ProgressDialog::addTaskProgress(TaskStepProgress* progress) { SubTaskProgressBar* task_bar = new SubTaskProgressBar(this); taskProgress.insert(progress->uid, task_bar); - ui->taskProgressLayout->insertWidget(0, task_bar); + ui->taskProgressLayout->addWidget(task_bar); } void ProgressDialog::changeStepProgress(TaskStepProgressList task_progress) { m_is_multi_step = true; - ui->taskProgressScrollArea->setHidden(false); + if(ui->taskProgressScrollArea->isHidden()) { + ui->taskProgressScrollArea->setHidden(false); + updateSize(); + } for (auto tp : task_progress) { if (!taskProgress.contains(tp->uid)) addTaskProgress(tp.get()); auto task_bar = taskProgress.value(tp->uid); - if (tp->total < 0) { + + auto const [mapped_current, mapped_total] = map_int_zero_max<qint64>(tp->current, tp->total, 0); + if (tp->total <= 0) { task_bar->setRange(0, 0); } else { - task_bar->setRange(0, map_int_range<qint64>(tp->total)); + task_bar->setRange(0, mapped_total); } - task_bar->setValue(map_int_range<qint64>(tp->current)); + task_bar->setValue(mapped_current); task_bar->setStatus(tp->status); task_bar->setDetails(tp->details); @@ -237,8 +243,6 @@ void ProgressDialog::changeStepProgress(TaskStepProgressList task_progress) } } - - updateSize(); } void ProgressDialog::changeProgress(qint64 current, qint64 total) diff --git a/launcher/ui/dialogs/ProgressDialog.ui b/launcher/ui/dialogs/ProgressDialog.ui index 47597689..a4d08124 100644 --- a/launcher/ui/dialogs/ProgressDialog.ui +++ b/launcher/ui/dialogs/ProgressDialog.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>600</width> - <height>260</height> + <width>480</width> + <height>210</height> </rect> </property> <property name="sizePolicy"> @@ -18,19 +18,16 @@ </property> <property name="minimumSize"> <size> - <width>600</width> - <height>260</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>600</width> - <height>16777215</height> + <width>480</width> + <height>210</height> </size> </property> <property name="windowTitle"> <string>Please wait...</string> </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,0"> <item> <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0"> @@ -112,8 +109,8 @@ <rect> <x>0</x> <y>0</y> - <width>584</width> - <height>146</height> + <width>464</width> + <height>96</height> </rect> </property> <layout class="QVBoxLayout" name="taskProgressLayout"> |