aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-10-11 14:19:29 -0300
committerflow <flowlnlnln@gmail.com>2022-10-11 15:51:54 -0300
commitd194b02e28132df3ea3da961299e969614b8a185 (patch)
treed4c8afbd6d595fc30972b72e223abd2544c7ac55 /launcher/ui
parentd7992ab29d07c6d26377f6db1cfca6059aace471 (diff)
downloadPrismLauncher-d194b02e28132df3ea3da961299e969614b8a185.tar.gz
PrismLauncher-d194b02e28132df3ea3da961299e969614b8a185.tar.bz2
PrismLauncher-d194b02e28132df3ea3da961299e969614b8a185.zip
fix: prevent images overriding content when changing pages
Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/ui')
-rw-r--r--launcher/ui/pages/modplatform/ModPage.cpp1
-rw-r--r--launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp1
-rw-r--r--launcher/ui/widgets/ProjectDescriptionPage.cpp6
-rw-r--r--launcher/ui/widgets/ProjectDescriptionPage.h8
-rw-r--r--launcher/ui/widgets/VariableSizedImageObject.cpp13
-rw-r--r--launcher/ui/widgets/VariableSizedImageObject.h15
6 files changed, 39 insertions, 5 deletions
diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp
index 4fce0242..153bb049 100644
--- a/launcher/ui/pages/modplatform/ModPage.cpp
+++ b/launcher/ui/pages/modplatform/ModPage.cpp
@@ -350,4 +350,5 @@ void ModPage::updateUi()
HoeDown h;
ui->packDescription->setHtml(text + (current.extraData.body.isEmpty() ? current.description : h.process(current.extraData.body.toUtf8())));
+ ui->packDescription->flush();
}
diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp
index 70f1388a..4482774c 100644
--- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp
+++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp
@@ -284,6 +284,7 @@ void ModrinthPage::updateUI()
text += h.process(current.extra.body.toUtf8());
ui->packDescription->setHtml(text + current.description);
+ ui->packDescription->flush();
}
void ModrinthPage::suggestCurrent()
diff --git a/launcher/ui/widgets/ProjectDescriptionPage.cpp b/launcher/ui/widgets/ProjectDescriptionPage.cpp
index 2e6f6d97..c7e79a17 100644
--- a/launcher/ui/widgets/ProjectDescriptionPage.cpp
+++ b/launcher/ui/widgets/ProjectDescriptionPage.cpp
@@ -15,3 +15,9 @@ void ProjectDescriptionPage::setMetaEntry(QString entry)
if (m_image_text_object)
m_image_text_object->setMetaEntry(entry);
}
+
+void ProjectDescriptionPage::flush()
+{
+ if (m_image_text_object)
+ m_image_text_object->flush();
+}
diff --git a/launcher/ui/widgets/ProjectDescriptionPage.h b/launcher/ui/widgets/ProjectDescriptionPage.h
index 8387d3fb..3dd85302 100644
--- a/launcher/ui/widgets/ProjectDescriptionPage.h
+++ b/launcher/ui/widgets/ProjectDescriptionPage.h
@@ -19,6 +19,14 @@ class ProjectDescriptionPage final : public QTextBrowser {
void setMetaEntry(QString entry);
+ public slots:
+ /** Flushes the current processing happening in the page.
+ *
+ * Should be called when changing the page's content entirely, to
+ * prevent old tasks from changing the new content.
+ */
+ void flush();
+
private:
shared_qobject_ptr<VariableSizedImageObject> m_image_text_object;
};
diff --git a/launcher/ui/widgets/VariableSizedImageObject.cpp b/launcher/ui/widgets/VariableSizedImageObject.cpp
index 0efdecab..e57f7e95 100644
--- a/launcher/ui/widgets/VariableSizedImageObject.cpp
+++ b/launcher/ui/widgets/VariableSizedImageObject.cpp
@@ -66,6 +66,11 @@ void VariableSizedImageObject::drawObject(QPainter* painter,
painter->drawImage(rect, image);
}
+void VariableSizedImageObject::flush()
+{
+ m_fetching_images.clear();
+}
+
void VariableSizedImageObject::parseImage(QTextDocument* doc, QImage image, int posInDocument)
{
QTextCursor cursor(doc);
@@ -85,7 +90,7 @@ void VariableSizedImageObject::parseImage(QTextDocument* doc, QImage image, int
void VariableSizedImageObject::loadImage(QTextDocument* doc, const QUrl& source, int posInDocument)
{
- m_fetching_images.append(source);
+ m_fetching_images.insert(source);
MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry(
m_meta_entry,
@@ -99,6 +104,10 @@ void VariableSizedImageObject::loadImage(QTextDocument* doc, const QUrl& source,
connect(job, &NetJob::succeeded, [this, doc, full_entry_path, source_url, posInDocument] {
qDebug() << "Loaded resource at" << full_entry_path;
+ // If we flushed, don't proceed.
+ if (!m_fetching_images.contains(source_url))
+ return;
+
QImage image(full_entry_path);
doc->addResource(QTextDocument::ImageResource, source_url, image);
@@ -110,7 +119,7 @@ void VariableSizedImageObject::loadImage(QTextDocument* doc, const QUrl& source,
doc->adjustSize();
doc->setPageSize(size);
- m_fetching_images.removeOne(source_url);
+ m_fetching_images.remove(source_url);
});
connect(job, &NetJob::finished, job, &NetJob::deleteLater);
diff --git a/launcher/ui/widgets/VariableSizedImageObject.h b/launcher/ui/widgets/VariableSizedImageObject.h
index 11563a37..137487ee 100644
--- a/launcher/ui/widgets/VariableSizedImageObject.h
+++ b/launcher/ui/widgets/VariableSizedImageObject.h
@@ -28,7 +28,7 @@
* Why? Because we want to re-scale images dynamically based on the document's size, in order to
* not have images being weirdly cropped out in different resolutions.
*/
-class VariableSizedImageObject : public QObject, public QTextObjectInterface {
+class VariableSizedImageObject final : public QObject, public QTextObjectInterface {
Q_OBJECT
Q_INTERFACES(QTextObjectInterface)
@@ -38,7 +38,15 @@ class VariableSizedImageObject : public QObject, public QTextObjectInterface {
void setMetaEntry(QString meta_entry) { m_meta_entry = meta_entry; }
- protected:
+ public slots:
+ /** Stops all currently loading images from modifying the document.
+ *
+ * This does not stop the ongoing network tasks, it only prevents their result
+ * from impacting the document any further.
+ */
+ void flush();
+
+ private:
/** Adds the image to the document, in the given position.
*/
void parseImage(QTextDocument* doc, QImage image, int posInDocument);
@@ -49,7 +57,8 @@ class VariableSizedImageObject : public QObject, public QTextObjectInterface {
*/
void loadImage(QTextDocument* doc, const QUrl& source, int posInDocument);
+ private:
QString m_meta_entry;
- QList<QUrl> m_fetching_images;
+ QSet<QUrl> m_fetching_images;
};