diff --git a/app/dialogs/DownloadDialog.qml b/app/dialogs/DownloadDialog.qml index 9755bf2..8578c7c 100644 --- a/app/dialogs/DownloadDialog.qml +++ b/app/dialogs/DownloadDialog.qml @@ -46,8 +46,8 @@ Dialog { if (!visible) { if (drives.selected) drives.selected.cancel() - releases.variant.cancelDownload() - releases.variant.resetStatus() + releases.selected.variant.cancelDownload() + releases.selected.variant.resetStatus() } reset() } @@ -61,7 +61,7 @@ Dialog { states: [ State { name: "preparing" - when: releases.variant.status === Variant.PREPARING + when: releases.selected.variant.status === Variant.PREPARING PropertyChanges { target: progressBar; value: 0.0/0.0 @@ -69,19 +69,19 @@ Dialog { }, State { name: "downloading" - when: releases.variant.status === Variant.DOWNLOADING + when: releases.selected.variant.status === Variant.DOWNLOADING PropertyChanges { target: messageDownload visible: true } PropertyChanges { target: progressBar; - value: releases.variant.progress.ratio + value: releases.selected.variant.progress.ratio } }, State { name: "resuming" - when: releases.variant.status === Variant.DOWNLOAD_RESUMING + when: releases.selected.variant.status === Variant.DOWNLOAD_RESUMING PropertyChanges { target: progressBar; value: 0.0/0.0 @@ -89,38 +89,38 @@ Dialog { }, State { name: "download_verifying" - when: releases.variant.status === Variant.DOWNLOAD_VERIFYING + when: releases.selected.variant.status === Variant.DOWNLOAD_VERIFYING PropertyChanges { target: messageDownload visible: true } PropertyChanges { target: progressBar; - value: releases.variant.progress.ratio; + value: releases.selected.variant.progress.ratio; progressColor: Qt.lighter("green") } }, State { name: "ready_no_drives" - when: releases.variant.status === Variant.READY && drives.length <= 0 + when: releases.selected.variant.status === Variant.READY && drives.length <= 0 }, State { name: "ready" - when: releases.variant.status === Variant.READY && drives.length > 0 + when: releases.selected.variant.status === Variant.READY && drives.length > 0 PropertyChanges { target: messageLoseData; visible: true } PropertyChanges { target: rightButton; - enabled: releases.variant.imageType.canWrite; + enabled: releases.selected.variant.imageType.canWrite; color: "red"; - onClicked: drives.selected.write(releases.variant) + onClicked: drives.selected.write(releases.selected.variant) } }, State { name: "writing_not_possible" - when: releases.variant.status === Variant.WRITING_NOT_POSSIBLE + when: releases.selected.variant.status === Variant.WRITING_NOT_POSSIBLE PropertyChanges { target: driveCombo; enabled: false; @@ -129,7 +129,7 @@ Dialog { }, State { name: "writing" - when: releases.variant.status === Variant.WRITING + when: releases.selected.variant.status === Variant.WRITING PropertyChanges { target: messageDriveSize enabled: false @@ -150,7 +150,7 @@ Dialog { }, State { name: "write_verifying" - when: releases.variant.status === Variant.WRITE_VERIFYING + when: releases.selected.variant.status === Variant.WRITE_VERIFYING PropertyChanges { target: messageDriveSize enabled: false @@ -171,7 +171,7 @@ Dialog { }, State { name: "finished" - when: releases.variant.status === Variant.FINISHED + when: releases.selected.variant.status === Variant.FINISHED PropertyChanges { target: messageDriveSize enabled: false @@ -192,7 +192,7 @@ Dialog { }, State { name: "failed_download" - when: releases.variant.status === Variant.FAILED_DOWNLOAD + when: releases.selected.variant.status === Variant.FAILED_DOWNLOAD PropertyChanges { target: driveCombo; enabled: false @@ -202,23 +202,23 @@ Dialog { text: qsTr("Retry"); enabled: true; color: "#628fcf"; - onClicked: releases.variant.download() + onClicked: releases.selected.variant.download() } }, State { name: "failed_no_drives" - when: releases.variant.status === Variant.FAILED && drives.length <= 0 + when: releases.selected.variant.status === Variant.FAILED && drives.length <= 0 PropertyChanges { target: rightButton; text: qsTr("Retry"); enabled: false; color: "red"; - onClicked: drives.selected.write(releases.variant) + onClicked: drives.selected.write(releases.selected.variant) } }, State { name: "failed" - when: releases.variant.status === Variant.FAILED && drives.length > 0 + when: releases.selected.variant.status === Variant.FAILED && drives.length > 0 PropertyChanges { target: messageLoseData; visible: true @@ -228,13 +228,13 @@ Dialog { text: qsTr("Retry"); enabled: true; color: "red"; - onClicked: drives.selected.write(releases.variant) + onClicked: drives.selected.write(releases.selected.variant) } } ] Keys.onEscapePressed: { - if ([Variant.WRITING, Variant.WRITE_VERIFYING].indexOf(releases.variant.status) < 0) + if ([Variant.WRITING, Variant.WRITE_VERIFYING].indexOf(releases.selected.variant.status) < 0) dialog.visible = false } @@ -288,7 +288,7 @@ Dialog { id: messageSelectedImage width: infoColumn.width visible: releases.selected.isCustom - text: "" + qsTr("Selected:") + " " + (releases.variant.image ? (((String)(releases.variant.image)).split("/").slice(-1)[0]) : ("" + qsTr("None") + "")) + text: "" + qsTr("Selected:") + " " + (releases.selected.variant.image ? (((String)(releases.selected.variant.image)).split("/").slice(-1)[0]) : ("" + qsTr("None") + "")) } InfoMessage { @@ -302,8 +302,8 @@ Dialog { InfoMessage { error: true width: infoColumn.width - visible: releases.variant && releases.variant.errorString.length > 0 - text: releases.variant ? releases.variant.errorString : "" + visible: releases.selected.variant && releases.selected.variant.errorString.length > 0 + text: releases.selected.variant ? releases.selected.variant.errorString : "" } } @@ -323,13 +323,13 @@ Dialog { Layout.fillHeight: true horizontalAlignment: Text.AlignHCenter font.pointSize: 9 - property double leftSize: releases.variant.progress.leftSize + property double leftSize: releases.selected.variant.progress.leftSize property string leftStr: leftSize <= 0 ? "" : (leftSize < 1024) ? qsTr("(%1 B left)").arg(leftSize) : (leftSize < (1024 * 1024)) ? qsTr("(%1 KB left)").arg((leftSize / 1024).toFixed(1)) : (leftSize < (1024 * 1024 * 1024)) ? qsTr("(%1 MB left)").arg((leftSize / 1024 / 1024).toFixed(1)) : qsTr("(%1 GB left)").arg((leftSize / 1024 / 1024 / 1024).toFixed(1)) - text: releases.variant.statusString + (releases.variant.status == Variant.DOWNLOADING ? (" " + leftStr) : "") + text: releases.selected.variant.statusString + (releases.selected.variant.status == Variant.DOWNLOADING ? (" " + leftStr) : "") color: palette.windowText } Item { @@ -344,11 +344,11 @@ Dialog { } AdwaitaCheckBox { text: qsTr("Write the image after downloading") - enabled: drives.selected && ((releases.variant.status == Variant.DOWNLOADING) || (releases.variant.status == Variant.DOWNLOAD_RESUMING)) && releases.variant.imageType.canWrite + enabled: drives.selected && ((releases.selected.variant.status == Variant.DOWNLOADING) || (releases.selected.variant.status == Variant.DOWNLOAD_RESUMING)) && releases.selected.variant.imageType.canWrite visible: enabled onCheckedChanged: { - releases.variant.delayedWrite = checked + releases.selected.variant.delayedWrite = checked } } } @@ -369,10 +369,10 @@ Dialog { Layout.alignment : Qt.AlignVCenter scale: 1.4 SequentialAnimation { - running: releases.variant.status == Variant.WRITING + running: releases.selected.variant.status == Variant.WRITING loops: -1 onStopped: { - if (releases.variant.status == Variant.FINISHED) + if (releases.selected.variant.status == Variant.FINISHED) writeArrow.color = "#00dd00" else writeArrow.color = palette.text @@ -409,8 +409,8 @@ Dialog { value: driveCombo.currentIndex } onActivated: { - if ([Variant.FINISHED, Variant.FAILED].indexOf(releases.variant.status) >= 0) - releases.variant.resetStatus() + if ([Variant.FINISHED, Variant.FAILED].indexOf(releases.selected.variant.status) >= 0) + releases.selected.variant.resetStatus() } placeholderText: qsTr("There are no portable drives connected") } @@ -425,7 +425,7 @@ Dialog { width: 1 } Text { - visible: !releases.variant.imageType.canWrite + visible: !releases.selected.variant.imageType.canWrite font.pointSize: 10 Layout.fillWidth: true width: Layout.width diff --git a/app/release.cpp b/app/release.cpp index 66a6a10..91521e1 100644 --- a/app/release.cpp +++ b/app/release.cpp @@ -25,7 +25,7 @@ #include -Release::Release(ReleaseManager *parent, const QString &name, const QString &display_name, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots) +Release::Release(const QString &name, const QString &display_name, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots, QObject *parent) : QObject(parent) , m_name(name) , m_displayName(display_name) @@ -35,14 +35,11 @@ Release::Release(ReleaseManager *parent, const QString &name, const QString &dis , m_screenshots(screenshots) , m_isCustom(false) { - // TODO: connect to release's signal in parent, not the other way around, won't need to have parent be releasemanager then - connect( - this, &Release::selectedVariantChanged, - parent, &ReleaseManager::variantChangedFilter); + } -Release *Release::custom(ReleaseManager *parent) { - auto customRelease = new Release(parent, QString(), tr("Custom image"), QT_TRANSLATE_NOOP("Release", "Pick a file from your drive(s)"), { QT_TRANSLATE_NOOP("Release", "

Here you can choose a OS image from your hard drive to be written to your flash disk

Currently it is only supported to write raw disk images (.iso or .bin)

") }, "qrc:/logo/custom", {}); +Release *Release::custom(QObject *parent) { + auto customRelease = new Release(QString(), tr("Custom image"), QT_TRANSLATE_NOOP("Release", "Pick a file from your drive(s)"), { QT_TRANSLATE_NOOP("Release", "

Here you can choose a OS image from your hard drive to be written to your flash disk

Currently it is only supported to write raw disk images (.iso or .bin)

") }, "qrc:/logo/custom", {}, parent); customRelease->m_isCustom = true; customRelease->setLocalFile(QString()); @@ -84,7 +81,7 @@ void Release::updateUrl(const QString &url, Architecture *architecture, ImageTyp } return out; }(); - auto new_variant = new Variant(url, architecture, imageType, board, live, this); + auto new_variant = new Variant(url, m_displayName, architecture, imageType, board, live, this); m_variants.insert(insert_index, new_variant); emit variantsChanged(); @@ -97,17 +94,14 @@ void Release::updateUrl(const QString &url, Architecture *architecture, ImageTyp } void Release::setLocalFile(const QString &path) { - // Delete old custom variant (there's only one, but iterate anyway) + // Delete old custom variant (there's really only one, but iterate anyway) for (auto variant : m_variants) { variant->deleteLater(); } m_variants.clear(); // Add new variant - ImageType *image_type = ImageType::fromFilename(path); - auto customVariant = new Variant(path, Architecture::fromId(Architecture::UNKNOWN), image_type, QString(), false, this); - // NOTE: start out in ready because don't need to download - customVariant->setStatus(Variant::READY); + auto customVariant = Variant::custom(path, this); m_variants.append(customVariant); emit variantsChanged(); diff --git a/app/release.h b/app/release.h index 9e82a1d..ae36665 100644 --- a/app/release.h +++ b/app/release.h @@ -20,9 +20,6 @@ #ifndef RELEASE_H #define RELEASE_H - -class ReleaseManager; -class Release; class Variant; class Architecture; class ImageType; @@ -63,12 +60,11 @@ class Release : public QObject { Q_PROPERTY(Variant* variant READ selectedVariant NOTIFY selectedVariantChanged) Q_PROPERTY(int variantIndex READ selectedVariantIndex WRITE setSelectedVariantIndex NOTIFY selectedVariantChanged) public: - Release(ReleaseManager *parent, const QString &name, const QString &displayName, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots); + Release(const QString &name, const QString &displayName, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots, QObject *parent); - static Release *custom(ReleaseManager *parent); + static Release *custom(QObject *parent); void updateUrl(const QString &url, Architecture *architecture, ImageType *imageType, const QString &board, const bool live); - ReleaseManager *manager(); Q_INVOKABLE void setLocalFile(const QString &path); diff --git a/app/releasemanager.cpp b/app/releasemanager.cpp index 66a333c..98aa7ae 100644 --- a/app/releasemanager.cpp +++ b/app/releasemanager.cpp @@ -121,10 +121,6 @@ ReleaseManager::ReleaseManager(QObject *parent) loadVariants(variantsFile); } - connect( - this, &ReleaseManager::selectedChanged, - this, &ReleaseManager::variantChangedFilter); - // Download releases from getalt.org QTimer::singleShot(0, this, &ReleaseManager::downloadMetadata); } @@ -315,12 +311,6 @@ void ReleaseManager::setBeingUpdated(const bool value) { emit beingUpdatedChanged(); } -void ReleaseManager::variantChangedFilter() { - // TODO here we could add some filters to help signal/slot performance - // TODO otherwise this can just go away and connections can be directly to the signal - emit variantChanged(); -} - bool ReleaseManager::beingUpdated() const { return m_beingUpdated; } @@ -394,16 +384,6 @@ void ReleaseManager::setSelectedIndex(int o) { } } -Variant *ReleaseManager::variant() { - Release *release = selected(); - - if (release != nullptr) { - return release->selectedVariant(); - } else { - return nullptr; - } -} - void ReleaseManager::loadVariants(const QString &variantsFile) { YAML::Node variants = YAML::Load(variantsFile.toStdString()); @@ -556,7 +536,7 @@ QVariant ReleaseListModel::data(const QModelIndex &index, int role) const { return QVariant(); } -ReleaseListModel::ReleaseListModel(const QList §ionsFiles, ReleaseManager *parent) +ReleaseListModel::ReleaseListModel(const QList §ionsFiles, QObject *parent) : QAbstractListModel(parent) { qDebug() << "Creating ReleaseListModel"; @@ -602,7 +582,7 @@ ReleaseListModel::ReleaseListModel(const QList §ionsFiles, ReleaseM // NOTE: icon_path is consumed by QML, so it needs to begin with "qrc:/" not ":/" const QString icon_path = "qrc" + icon_path_test; - const auto release = new Release(manager(), name, display_name, summary, description, icon_path, screenshots); + const auto release = new Release(name, display_name, summary, description, icon_path, screenshots, this); // Reorder releases because default order in // sections files is not good. Try to put @@ -627,14 +607,10 @@ ReleaseListModel::ReleaseListModel(const QList §ionsFiles, ReleaseM } } - auto customRelease = Release::custom(manager()); + auto customRelease = Release::custom(this); m_releases.insert(FRONTPAGE_ROW_COUNT - 1, customRelease); } -ReleaseManager *ReleaseListModel::manager() { - return qobject_cast(parent()); -} - Release *ReleaseListModel::get(int index) { if (index >= 0 && index < m_releases.count()) return m_releases[index]; diff --git a/app/releasemanager.h b/app/releasemanager.h index 689c65b..dfa2b2c 100644 --- a/app/releasemanager.h +++ b/app/releasemanager.h @@ -79,8 +79,6 @@ class ReleaseManager : public QSortFilterProxyModel { Q_PROPERTY(Release* selected READ selected NOTIFY selectedChanged) Q_PROPERTY(int selectedIndex READ selectedIndex WRITE setSelectedIndex NOTIFY selectedChanged) - Q_PROPERTY(Variant* variant READ variant NOTIFY variantChanged) - Q_PROPERTY(QStringList architectures READ architectures CONSTANT) Q_PROPERTY(QStringList fileNameFilters READ fileNameFilters CONSTANT) public: @@ -106,18 +104,12 @@ public: int selectedIndex() const; void setSelectedIndex(int o); - Variant *variant(); - -public slots: - void variantChangedFilter(); - signals: void beingUpdatedChanged(); void frontPageChanged(); void filterTextChanged(); void filterArchitectureChanged(); void selectedChanged(); - void variantChanged(); private: ReleaseListModel *m_sourceModel { nullptr }; @@ -141,8 +133,7 @@ private: class ReleaseListModel : public QAbstractListModel { Q_OBJECT public: - explicit ReleaseListModel(const QList §ionsFiles, ReleaseManager *parent); - ReleaseManager *manager(); + explicit ReleaseListModel(const QList §ionsFiles, QObject *parent); Q_INVOKABLE Release *get(int index); diff --git a/app/variant.cpp b/app/variant.cpp index 78069f3..f3abe67 100644 --- a/app/variant.cpp +++ b/app/variant.cpp @@ -31,8 +31,9 @@ #include #include -Variant::Variant(QString url, Architecture *arch, ImageType *imageType, QString board, const bool live, Release *parent) +Variant::Variant(QString url, const QString &releaseName_arg, Architecture *arch, ImageType *imageType, QString board, const bool live, QObject *parent) : QObject(parent) +, releaseName(releaseName_arg) , m_arch(arch) , m_image_type(imageType) , m_board(board) @@ -43,6 +44,20 @@ Variant::Variant(QString url, Architecture *arch, ImageType *imageType, QString } +Variant *Variant::custom(const QString &path, QObject *parent) { + const QString releaseName = tr("Custom"); + ImageType *image_type = ImageType::fromFilename(path); + Architecture *arch = Architecture::fromId(Architecture::UNKNOWN); + const QString board = QString(); + const bool live = false; + + auto variant = new Variant(path, releaseName, arch, image_type, board, live, parent); + // NOTE: start out in ready because don't need to download + variant->setStatus(Variant::READY); + + return variant; +} + bool Variant::updateUrl(const QString &url) { bool changed = false; if (!url.isEmpty() && m_url.toUtf8().trimmed() != url.toUtf8().trimmed()) { @@ -54,14 +69,6 @@ bool Variant::updateUrl(const QString &url) { return changed; } -Release *Variant::release() { - return qobject_cast(parent()); -} - -const Release *Variant::release() const { - return qobject_cast(parent()); -} - Architecture *Variant::arch() const { return m_arch; } @@ -89,10 +96,7 @@ QString Variant::name() const { } QString Variant::fullName() { - if (release()->isCustom()) - return QFileInfo(image()).fileName(); - else - return QString("%1 %2").arg(release()->displayName(), name()); + return QString("%1 %2").arg(releaseName, name()); } QString Variant::url() const { diff --git a/app/variant.h b/app/variant.h index e6d186f..f01ba1b 100644 --- a/app/variant.h +++ b/app/variant.h @@ -28,7 +28,6 @@ class Progress; class ImageType; class Architecture; -class Release; /** * @brief The Variant class @@ -92,13 +91,12 @@ public: tr("Error") }; - Variant(QString url, Architecture *arch, ImageType *imageType, QString board, const bool live, Release *parent); + Variant(QString url, const QString &releaseName_arg, Architecture *arch, ImageType *imageType, QString board, const bool live, QObject *parent); + + static Variant *custom(const QString &path, QObject *parent); bool updateUrl(const QString &url); - Release *release(); - const Release *release() const; - Architecture *arch() const; ImageType *imageType() const; QString name() const; @@ -136,6 +134,7 @@ public slots: void onImageDownloadFinished(); private: + const QString releaseName; QString m_image {}; Architecture *m_arch; ImageType *m_image_type; diff --git a/app/views/ImageDetails.qml b/app/views/ImageDetails.qml index adefa1f..dbfc356 100644 --- a/app/views/ImageDetails.qml +++ b/app/views/ImageDetails.qml @@ -91,9 +91,9 @@ Item { deviceNotification.open = false archPopover.open = false dlDialog.visible = true - releases.variant.download() + releases.selected.variant.download() } - enabled: !releases.selected.isCustom || releases.variant.image + enabled: !releases.selected.isCustom || releases.selected.variant.image } } @@ -125,7 +125,7 @@ Item { } Text { font.pointSize: 12 - property double size: releases.variant.size + property double size: releases.selected.variant.size text: size <= 0 ? "" : (size < 1024) ? (size + " B") : (size < (1024 * 1024)) ? ((size / 1024).toFixed(1) + " KB") : @@ -143,13 +143,13 @@ Item { font.pointSize: 10 color: mixColors(palette.window, palette.windowText, 0.3) visible: releases.selected.variant - text: releases.variant.name + text: releases.selected.variant.name } Text { font.pointSize: 8 color: mixColors(palette.window, palette.windowText, 0.3) - visible: releases.variant - text: releases.variant && releases.variant.imageType.name + visible: releases.selected.variant + text: releases.selected.variant && releases.selected.variant.imageType.name } RowLayout { spacing: 0