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()
This commit is contained in:
Dmitry Degtyarev 2020-11-03 12:27:55 +04:00
parent 00b0658ca2
commit 7666d90dba
8 changed files with 75 additions and 115 deletions

View File

@ -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: "<font color=\"gray\">" + qsTr("Selected:") + "</font> " + (releases.variant.image ? (((String)(releases.variant.image)).split("/").slice(-1)[0]) : ("<font color=\"gray\">" + qsTr("None") + "</font>"))
text: "<font color=\"gray\">" + qsTr("Selected:") + "</font> " + (releases.selected.variant.image ? (((String)(releases.selected.variant.image)).split("/").slice(-1)[0]) : ("<font color=\"gray\">" + qsTr("None") + "</font>"))
}
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

View File

@ -25,7 +25,7 @@
#include <QDebug>
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", "<p>Here you can choose a OS image from your hard drive to be written to your flash disk</p><p>Currently it is only supported to write raw disk images (.iso or .bin)</p>") }, "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", "<p>Here you can choose a OS image from your hard drive to be written to your flash disk</p><p>Currently it is only supported to write raw disk images (.iso or .bin)</p>") }, "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();

View File

@ -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);

View File

@ -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<QString> &sectionsFiles, ReleaseManager *parent)
ReleaseListModel::ReleaseListModel(const QList<QString> &sectionsFiles, QObject *parent)
: QAbstractListModel(parent)
{
qDebug() << "Creating ReleaseListModel";
@ -602,7 +582,7 @@ ReleaseListModel::ReleaseListModel(const QList<QString> &sectionsFiles, 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<QString> &sectionsFiles, 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<ReleaseManager*>(parent());
}
Release *ReleaseListModel::get(int index) {
if (index >= 0 && index < m_releases.count())
return m_releases[index];

View File

@ -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<QString> &sectionsFiles, ReleaseManager *parent);
ReleaseManager *manager();
explicit ReleaseListModel(const QList<QString> &sectionsFiles, QObject *parent);
Q_INVOKABLE Release *get(int index);

View File

@ -31,8 +31,9 @@
#include <QStandardPaths>
#include <QDir>
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<Release*>(parent());
}
const Release *Variant::release() const {
return qobject_cast<const Release*>(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 {

View File

@ -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;

View File

@ -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