diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
| commit | 7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch) | |
| tree | 27fb39be241fdb5ac2734c574de678977d1856d0 /libs/installer_fomod/src/scalelabel.cpp | |
Fluorine Manager: full Linux port of Mod Organizer 2
Complete native Linux port with FUSE-based virtual filesystem,
Proton/umu-run integration, and Flatpak packaging.
Key features:
- FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak)
- Proton/GE-Proton/umu-run launcher with env var forwarding
- Flatpak support (sandbox-aware VFS, NXM handler, umu-run)
- Wine prefix management UI
- Case-insensitive path resolution for Linux filesystems
- QSettings-safe INI handling (avoids Bethesda INI corruption)
- Portable instance support with auto-generated launcher scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'libs/installer_fomod/src/scalelabel.cpp')
| -rw-r--r-- | libs/installer_fomod/src/scalelabel.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/libs/installer_fomod/src/scalelabel.cpp b/libs/installer_fomod/src/scalelabel.cpp new file mode 100644 index 0000000..e654bf5 --- /dev/null +++ b/libs/installer_fomod/src/scalelabel.cpp @@ -0,0 +1,107 @@ +#include "scalelabel.h" + +#include <QResizeEvent> + +static bool isResourceMovie(const QString& path) +{ + for (QByteArray format : QMovie::supportedFormats()) { + QString fileExtension = "." + QString::fromUtf8(format); + if (path.endsWith(fileExtension)) { + return true; + } + } + + return false; +} + +ScaleLabel::ScaleLabel(QWidget* parent) : QLabel(parent) {} + +void ScaleLabel::setScalableResource(const QString& path) +{ + if (auto m = movie()) { + setMovie(nullptr); + delete m; + m_OriginalMovieSize = QSize(); + } + if (!pixmap().isNull()) { + setPixmap(QPixmap()); + m_UnscaledImage = QImage(); + } + + if (path.isEmpty()) { + return; + } + + if (isResourceMovie(path)) { + setScalableMovie(path); + } else { + setScalableImage(path); + } +} + +void ScaleLabel::setStatic(bool isStatic) +{ + m_isStatic = isStatic; + + if (auto m = movie()) { + if (isStatic) { + m->stop(); + } else { + m->start(); + } + } +} + +void ScaleLabel::setScalableMovie(const QString& path) +{ + QMovie* m = new QMovie(path); + if (!m->isValid()) { + qWarning(">%s< is an invalid movie. Reason: %s", qUtf8Printable(path), + m->lastErrorString().toStdString().c_str()); + delete m; + return; + } + + m->setParent(this); + setMovie(m); + m->start(); + m->stop(); + m_OriginalMovieSize = m->currentImage().size(); + + m->setScaledSize(m_OriginalMovieSize.scaled(size(), Qt::KeepAspectRatio)); + if (!m_isStatic) { + m->start(); + } +} + +void ScaleLabel::setScalableImage(const QString& path) +{ + QImage image(path); + if (image.isNull()) { + qWarning(">%s< is a null image", qUtf8Printable(path)); + } else { + m_UnscaledImage = image; + setPixmap(QPixmap::fromImage(image).scaled(size(), Qt::KeepAspectRatio)); + } +} + +void ScaleLabel::resizeEvent(QResizeEvent* event) +{ + if (auto m = movie()) { + m->stop(); + m->setScaledSize(m_OriginalMovieSize.scaled(event->size(), Qt::KeepAspectRatio)); + m->start(); + + // We can't just skip the start() above since that is what triggers the label to + // resize the movie The only way to resize the movie but keep it paused is to start + // and then re-stop it + if (m_isStatic) { + m->stop(); + } + } + auto p = pixmap(); + if (!p.isNull()) { + setPixmap( + QPixmap::fromImage(m_UnscaledImage).scaled(event->size(), Qt::KeepAspectRatio)); + } +} |
