From 7666d90dbaac53ae6dbef4636f74ce33ee89f4c8 Mon Sep 17 00:00:00 2001 From: Dmitry Degtyarev Date: Tue, 3 Nov 2020 12:27:55 +0400 Subject: [PATCH] use remove uses of releases.variant access variant through releases.selected.variant removed variantChanged() signal juggling make parents of release and variant generic QObject's pass release name to variant through ctor, not through release reference add Variant::custom() --- app/dialogs/DownloadDialog.qml | 70 +++++++++++++++++----------------- app/release.cpp | 20 ++++------ app/release.h | 8 +--- app/releasemanager.cpp | 30 ++------------- app/releasemanager.h | 11 +----- app/variant.cpp | 30 ++++++++------- app/variant.h | 9 ++--- app/views/ImageDetails.qml | 12 +++--- 8 files changed, 75 insertions(+), 115 deletions(-) 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