remove ReleaseVersion

move variants list up into Release
This commit is contained in:
Dmitry Degtyarev 2020-11-02 13:44:10 +04:00
parent 9ba47d938a
commit 26a00226c9
6 changed files with 132 additions and 503 deletions

View File

@ -81,12 +81,6 @@ Item {
text: release.displayName text: release.displayName
color: palette.text color: palette.text
} }
Text {
text: " " + release.version.name
visible: !release.isLocal
font.pointSize: 9
color: palette.text
}
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
height: 1 height: 1

View File

@ -89,7 +89,6 @@ ReleaseManager::ReleaseManager(QObject *parent)
setSourceModel(m_sourceModel); setSourceModel(m_sourceModel);
qmlRegisterUncreatableType<Release>("MediaWriter", 1, 0, "Release", ""); qmlRegisterUncreatableType<Release>("MediaWriter", 1, 0, "Release", "");
qmlRegisterUncreatableType<ReleaseVersion>("MediaWriter", 1, 0, "Version", "");
qmlRegisterUncreatableType<Variant>("MediaWriter", 1, 0, "Variant", ""); qmlRegisterUncreatableType<Variant>("MediaWriter", 1, 0, "Variant", "");
qmlRegisterUncreatableType<Architecture>("MediaWriter", 1, 0, "Architecture", ""); qmlRegisterUncreatableType<Architecture>("MediaWriter", 1, 0, "Architecture", "");
qmlRegisterUncreatableType<ImageType>("MediaWriter", 1, 0, "ImageType", ""); qmlRegisterUncreatableType<ImageType>("MediaWriter", 1, 0, "ImageType", "");
@ -120,7 +119,9 @@ ReleaseManager::ReleaseManager(QObject *parent)
} }
} }
connect(this, SIGNAL(selectedChanged()), this, SLOT(variantChangedFilter())); connect(
this, &ReleaseManager::selectedChanged,
this, &ReleaseManager::variantChangedFilter);
// Download releases from getalt.org // Download releases from getalt.org
@ -129,23 +130,28 @@ ReleaseManager::ReleaseManager(QObject *parent)
bool ReleaseManager::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { bool ReleaseManager::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
Q_UNUSED(source_parent) Q_UNUSED(source_parent)
auto release = get(source_row);
if (m_frontPage) { if (m_frontPage) {
// Don't filter when on front page, just show 3 releases
const bool on_front_page = (source_row < FRONTPAGE_ROW_COUNT); const bool on_front_page = (source_row < FRONTPAGE_ROW_COUNT);
return on_front_page; return on_front_page;
} else if (release->isLocal()) {
// Always show local release
return true;
} else { } else {
auto r = get(source_row); // Otherwise filter by arch
bool containsArch = false; const bool releaseHasVariantWithArch =
for (auto version : r->versionList()) { [this, release]() {
for (auto variant : version->variantList()) { for (auto variant : release->variantList()) {
if (variant->arch()->index() == m_filterArchitecture) { if (variant->arch()->index() == m_filterArchitecture) {
containsArch = true; return true;
break;
} }
} }
if (containsArch) return false;
break; }();
}
return r->isLocal() || (containsArch && r->displayName().contains(m_filterText, Qt::CaseInsensitive)); return releaseHasVariantWithArch;
} }
} }
@ -269,19 +275,22 @@ void ReleaseManager::setFilterArchitecture(int o) {
if (m_filterArchitecture != o && m_filterArchitecture >= 0 && m_filterArchitecture < Architecture::_ARCHCOUNT) { if (m_filterArchitecture != o && m_filterArchitecture >= 0 && m_filterArchitecture < Architecture::_ARCHCOUNT) {
m_filterArchitecture = o; m_filterArchitecture = o;
emit filterArchitectureChanged(); emit filterArchitectureChanged();
// Select first variant with this arch
// TODO: needed? probably something goes wrong in qml if don't do this
for (int i = 0; i < m_sourceModel->rowCount(); i++) { for (int i = 0; i < m_sourceModel->rowCount(); i++) {
Release *r = get(i); Release *release = get(i);
for (auto v : r->versionList()) {
int j = 0; for (auto variant : release->variantList()) {
for (auto variant : v->variantList()) { if (variant->arch()->index() == o) {
if (variant->arch()->index() == o) { const int index = release->variantList().indexOf(variant);
v->setSelectedVariantIndex(j); release->setSelectedVariantIndex(index);
break;
} break;
j++;
} }
} }
} }
invalidateFilter(); invalidateFilter();
} }
} }
@ -304,14 +313,13 @@ void ReleaseManager::setSelectedIndex(int o) {
} }
Variant *ReleaseManager::variant() { Variant *ReleaseManager::variant() {
if (selected()) { Release *release = selected();
if (selected()->selectedVersion()) {
if (selected()->selectedVersion()->selectedVariant()) { if (release != nullptr) {
return selected()->selectedVersion()->selectedVariant(); return release->selectedVariant();
} } else {
} return nullptr;
} }
return nullptr;
} }
void ReleaseManager::loadReleaseFile(const QString &fileContents) { void ReleaseManager::loadReleaseFile(const QString &fileContents) {
@ -358,10 +366,6 @@ void ReleaseManager::loadReleaseFile(const QString &fileContents) {
continue; continue;
} }
// TODO: handle versions if needed
const QString version = "9";
const QString status = "0";
ImageType *imageType = ImageType::fromFilename(url); ImageType *imageType = ImageType::fromFilename(url);
if (!imageType->isValid()) { if (!imageType->isValid()) {
qDebug() << "Invalid image type for" << url; qDebug() << "Invalid image type for" << url;
@ -374,7 +378,7 @@ void ReleaseManager::loadReleaseFile(const QString &fileContents) {
Release *release = get(i); Release *release = get(i);
if (release->name().toLower().contains(name)) { if (release->name().toLower().contains(name)) {
release->updateUrl(version, status, arch, imageType, board, url); release->updateUrl(url, arch, imageType, board);
} }
} }
} }
@ -520,16 +524,11 @@ ReleaseListModel::ReleaseListModel(ReleaseManager *parent)
} }
} }
// Create custom release, version and variant // Create custom release and variant
// Insert custom release at the end of the front page // Insert custom release at the end of the front page
const auto customRelease = new Release(manager(), "custom", 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", {}); const auto customRelease = new Release(manager(), "custom", 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", {});
customRelease->updateUrl(QString(), Architecture::fromId(Architecture::UNKNOWN), ImageType::all()[ImageType::ISO], QString("UNKNOWN BOARD"));
m_releases.insert(FRONTPAGE_ROW_COUNT - 1, customRelease); m_releases.insert(FRONTPAGE_ROW_COUNT - 1, customRelease);
const auto customVersion = new ReleaseVersion(customRelease, QString(), ReleaseVersion::FINAL);
customRelease->addVersion(customVersion);
const auto customVariant = new Variant(customVersion, QString(), Architecture::fromId(Architecture::UNKNOWN), ImageType::all()[ImageType::ISO], "UNKNOWN BOARD");
customVersion->addVariant(customVariant);
} }
ReleaseManager *ReleaseListModel::manager() { ReleaseManager *ReleaseListModel::manager() {
@ -544,9 +543,18 @@ Release *ReleaseListModel::get(int index) {
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(ReleaseManager *parent, const QString &name, const QString &display_name, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots)
: QObject(parent), m_name(name), m_displayName(display_name), m_summary(summary), m_description(description), m_icon(icon), m_screenshots(screenshots) : QObject(parent)
, m_name(name)
, m_displayName(display_name)
, m_summary(summary)
, m_description(description)
, m_icon(icon)
, m_screenshots(screenshots)
{ {
connect(this, SIGNAL(selectedVersionChanged()), parent, SLOT(variantChangedFilter())); // 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);
} }
void Release::setLocalFile(const QString &path) { void Release::setLocalFile(const QString &path) {
@ -555,47 +563,64 @@ void Release::setLocalFile(const QString &path) {
return; return;
} }
if (m_versions.count() == 1) { // TODO: don't need to delete, can change path in variant. Though have to consider the case where path doesn't exist.
m_versions.first()->deleteLater();
m_versions.removeFirst();
}
m_versions.append(new ReleaseVersion(this, path)); // Delete old variant
emit versionsChanged(); for (auto variant : m_variants) {
emit selectedVersionChanged(); variant->deleteLater();
}
m_variants.clear();
// Add new variant
auto local_variant = new Variant(path, this);
m_variants.append(local_variant);
emit variantsChanged();
emit selectedVariantChanged();
} }
bool Release::updateUrl(const QString &version, const QString &status, Architecture *architecture, ImageType *imageType, const QString &board, const QString &url) { void Release::updateUrl(const QString &url, Architecture *architecture, ImageType *imageType, const QString &board) {
int finalVersions = 0; // If variant already exists, update it
for (auto i : m_versions) { Variant *variant_in_list =
if (i->number() == version) [=]() -> Variant * {
return i->updateUrl(status, architecture, imageType, board, url); for (auto variant : m_variants) {
if (i->status() == ReleaseVersion::FINAL) // TODO: equals?
finalVersions++; if (variant->arch() == architecture && variant->board() == board) {
} return variant;
ReleaseVersion::Status s = status == "alpha" ? ReleaseVersion::ALPHA : status == "beta" ? ReleaseVersion::BETA : ReleaseVersion::FINAL;
auto ver = new ReleaseVersion(this, version, s);
auto variant = new Variant(ver, url, architecture, imageType, board);
ver->addVariant(variant);
addVersion(ver);
if (ver->status() == ReleaseVersion::FINAL)
finalVersions++;
if (finalVersions > 2) {
QString min = "0";
ReleaseVersion *oldVer = nullptr;
for (auto i : m_versions) {
if (i->number() < min) {
min = i->number();
oldVer = i;
} }
} }
removeVersion(oldVer); return nullptr;
}();
if (variant_in_list != nullptr) {
variant_in_list->updateUrl(url);
return;
} }
return true;
}
ReleaseManager *Release::manager() { // Otherwise make a new variant
return qobject_cast<ReleaseManager*>(parent());
// NOTE: preserve the order from the Architecture::Id enum (to not have ARM first, etc.)
const int insert_index =
[this, architecture]() {
int out = 0;
for (auto variant : m_variants) {
// NOTE: doing pointer comparison because architectures are a singleton pointers
if (variant->arch() > architecture) {
return out;
}
out++;
}
return out;
}();
auto new_variant = new Variant(url, architecture, imageType, board, this);
m_variants.insert(insert_index, new_variant);
emit variantsChanged();
// Select first variant by default
// TODO: use setSelectedVariantIndex()? Need to avoid checking for (if changed) condition in there then
if (m_variants.count() == 1) {
emit selectedVariantChanged();
}
} }
QString Release::name() const { QString Release::name() const {
@ -626,178 +651,27 @@ QStringList Release::screenshots() const {
return m_screenshots; return m_screenshots;
} }
QString Release::prerelease() const { Variant *Release::selectedVariant() const {
if (m_versions.empty() || m_versions.first()->status() == ReleaseVersion::FINAL)
return "";
return m_versions.first()->name();
}
QQmlListProperty<ReleaseVersion> Release::versions() {
return QQmlListProperty<ReleaseVersion>(this, m_versions);
}
QList<ReleaseVersion *> Release::versionList() const {
return m_versions;
}
QStringList Release::versionNames() const {
QStringList ret;
for (auto i : m_versions) {
ret.append(i->name());
}
return ret;
}
void Release::addVersion(ReleaseVersion *version) {
for (int i = 0; i < m_versions.count(); i++) {
if (m_versions[i]->number() < version->number()) {
m_versions.insert(i, version);
emit versionsChanged();
if (version->status() != ReleaseVersion::FINAL && m_selectedVersion >= i) {
m_selectedVersion++;
}
emit selectedVersionChanged();
return;
}
}
m_versions.append(version);
emit versionsChanged();
emit selectedVersionChanged();
}
void Release::removeVersion(ReleaseVersion *version) {
int idx = m_versions.indexOf(version);
if (!version || idx < 0)
return;
if (m_selectedVersion == idx) {
m_selectedVersion = 0;
emit selectedVersionChanged();
}
m_versions.removeAt(idx);
version->deleteLater();
emit versionsChanged();
}
ReleaseVersion *Release::selectedVersion() const {
if (m_selectedVersion >= 0 && m_selectedVersion < m_versions.count())
return m_versions[m_selectedVersion];
return nullptr;
}
int Release::selectedVersionIndex() const {
return m_selectedVersion;
}
void Release::setSelectedVersionIndex(int o) {
if (m_selectedVersion != o && m_selectedVersion >= 0 && m_selectedVersion < m_versions.count()) {
m_selectedVersion = o;
emit selectedVersionChanged();
}
}
ReleaseVersion::ReleaseVersion(Release *parent, const QString &number, ReleaseVersion::Status status)
: QObject(parent), m_number(number), m_status(status)
{
if (status != FINAL)
emit parent->prereleaseChanged();
connect(this, SIGNAL(selectedVariantChanged()), parent->manager(), SLOT(variantChangedFilter()));
}
ReleaseVersion::ReleaseVersion(Release *parent, const QString &file)
: QObject(parent), m_variants({ new Variant(this, file) })
{
connect(this, SIGNAL(selectedVariantChanged()), parent->manager(), SLOT(variantChangedFilter()));
}
Release *ReleaseVersion::release() {
return qobject_cast<Release*>(parent());
}
const Release *ReleaseVersion::release() const {
return qobject_cast<const Release*>(parent());
}
bool ReleaseVersion::updateUrl(const QString &status, Architecture *architecture, ImageType *imageType, const QString &board, const QString &url) {
// first determine and eventually update the current alpha/beta/final level of this version
Status s = status == "alpha" ? ALPHA : status == "beta" ? BETA : FINAL;
if (s <= m_status) {
m_status = s;
emit statusChanged();
if (s == FINAL)
emit release()->prereleaseChanged();
}
else {
// return if it got downgraded in the meantime
return false;
}
for (auto i : m_variants) {
if (i->arch() == architecture && i->board() == board)
return i->updateUrl(url);
}
// preserve the order from the Architecture::Id enum (to not have ARM first, etc.)
// it's actually an array so comparing pointers is fine
int order = 0;
for (auto i : m_variants) {
if (i->arch() > architecture)
break;
order++;
}
m_variants.insert(order, new Variant(this, url, architecture, imageType, board));
return true;
}
QString ReleaseVersion::number() const {
return m_number;
}
QString ReleaseVersion::name() const {
switch (m_status) {
case ALPHA:
return tr("%1 Alpha").arg(m_number);
case BETA:
return tr("%1 Beta").arg(m_number);
case RELEASE_CANDIDATE:
return tr("%1 Release Candidate").arg(m_number);
default:
return QString("%1").arg(m_number);
}
}
Variant *ReleaseVersion::selectedVariant() const {
if (m_selectedVariant >= 0 && m_selectedVariant < m_variants.count()) if (m_selectedVariant >= 0 && m_selectedVariant < m_variants.count())
return m_variants[m_selectedVariant]; return m_variants[m_selectedVariant];
return nullptr; return nullptr;
} }
int ReleaseVersion::selectedVariantIndex() const { int Release::selectedVariantIndex() const {
return m_selectedVariant; return m_selectedVariant;
} }
void ReleaseVersion::setSelectedVariantIndex(int o) { void Release::setSelectedVariantIndex(int o) {
if (m_selectedVariant != o && m_selectedVariant >= 0 && m_selectedVariant < m_variants.count()) { if (m_selectedVariant != o && m_selectedVariant >= 0 && m_selectedVariant < m_variants.count()) {
m_selectedVariant = o; m_selectedVariant = o;
emit selectedVariantChanged(); emit selectedVariantChanged();
} }
} }
ReleaseVersion::Status ReleaseVersion::status() const { QQmlListProperty<Variant> Release::variants() {
return m_status;
}
void ReleaseVersion::addVariant(Variant *v) {
m_variants.append(v);
emit variantsChanged();
if (m_variants.count() == 1)
emit selectedVariantChanged();
}
QQmlListProperty<Variant> ReleaseVersion::variants() {
return QQmlListProperty<Variant>(this, m_variants); return QQmlListProperty<Variant>(this, m_variants);
} }
QList<Variant *> ReleaseVersion::variantList() const { QList<Variant *> Release::variantList() const {
return m_variants; return m_variants;
} }

View File

@ -27,7 +27,6 @@
class ReleaseManager; class ReleaseManager;
class ReleaseListModel; class ReleaseListModel;
class Release; class Release;
class ReleaseVersion;
class Variant; class Variant;
class Architecture; class Architecture;
class ImageType; class ImageType;
@ -172,7 +171,6 @@ private:
* @property isLocal true if name is "custom" * @property isLocal true if name is "custom"
* @property icon path of the icon of this release * @property icon path of the icon of this release
* @property screenshots a list of paths to screenshots (typically HTTP URLs) * @property screenshots a list of paths to screenshots (typically HTTP URLs)
* @property prerelease true if the release contains a prerelease version of a future version
* @property versions a list of available versions of the @ref ReleaseVersion class * @property versions a list of available versions of the @ref ReleaseVersion class
* @property versionNames a list of the names of the available versions * @property versionNames a list of the names of the available versions
* @property version the currently selected @ref ReleaseVersion * @property version the currently selected @ref ReleaseVersion
@ -189,16 +187,13 @@ class Release : public QObject {
Q_PROPERTY(QString icon READ icon CONSTANT) Q_PROPERTY(QString icon READ icon CONSTANT)
Q_PROPERTY(QStringList screenshots READ screenshots CONSTANT) Q_PROPERTY(QStringList screenshots READ screenshots CONSTANT)
Q_PROPERTY(QString prerelease READ prerelease NOTIFY prereleaseChanged) Q_PROPERTY(QQmlListProperty<Variant> variants READ variants NOTIFY variantsChanged)
Q_PROPERTY(Variant* variant READ selectedVariant NOTIFY selectedVariantChanged)
Q_PROPERTY(QQmlListProperty<ReleaseVersion> versions READ versions NOTIFY versionsChanged) Q_PROPERTY(int variantIndex READ selectedVariantIndex WRITE setSelectedVariantIndex NOTIFY selectedVariantChanged)
Q_PROPERTY(QStringList versionNames READ versionNames NOTIFY versionsChanged)
Q_PROPERTY(ReleaseVersion* version READ selectedVersion NOTIFY selectedVersionChanged)
Q_PROPERTY(int versionIndex READ selectedVersionIndex WRITE setSelectedVersionIndex NOTIFY selectedVersionChanged)
public: public:
Release(ReleaseManager *parent, const QString &name, const QString &displayName, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots); Release(ReleaseManager *parent, const QString &name, const QString &displayName, const QString &summary, const QString &description, const QString &icon, const QStringList &screenshots);
Q_INVOKABLE void setLocalFile(const QString &path); Q_INVOKABLE void setLocalFile(const QString &path);
bool updateUrl(const QString &version, const QString &status, Architecture *architecture, ImageType *imageType, const QString &board, const QString &url); void updateUrl(const QString &url, Architecture *architecture, ImageType *imageType, const QString &board);
ReleaseManager *manager(); ReleaseManager *manager();
QString name() const; QString name() const;
@ -208,78 +203,7 @@ public:
bool isLocal() const; bool isLocal() const;
QString icon() const; QString icon() const;
QStringList screenshots() const; QStringList screenshots() const;
QString prerelease() const;
void addVersion(ReleaseVersion *version);
void removeVersion(ReleaseVersion *version);
QQmlListProperty<ReleaseVersion> versions();
QList<ReleaseVersion*> versionList() const;
QStringList versionNames() const;
ReleaseVersion *selectedVersion() const;
int selectedVersionIndex() const;
void setSelectedVersionIndex(int o);
signals:
void versionsChanged();
void selectedVersionChanged();
void prereleaseChanged();
private:
QString m_name {};
QString m_displayName {};
QString m_summary {};
QString m_description {};
QString m_icon {};
QStringList m_screenshots {};
QList<ReleaseVersion *> m_versions {};
int m_selectedVersion { 0 };
};
/**
* @brief The ReleaseVersion class
*
* Represents the version of the release. It can have multiple variants (like a different architecture or netinst/live)
*
* @property number the version number (as string)
* @property name the name of the release (version + alpha/beta/etc)
* @property status the release status of the version (alpha - beta - release candidate - final)
* @property variants list of the version's variants, like architectures
* @property variant the currently selected variant
* @property variantIndex the index of the currently selected variant
*/
class ReleaseVersion : public QObject {
Q_OBJECT
Q_PROPERTY(QString number READ number CONSTANT)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(ReleaseVersion::Status status READ status NOTIFY statusChanged)
Q_PROPERTY(QQmlListProperty<Variant> variants READ variants NOTIFY variantsChanged)
Q_PROPERTY(Variant* variant READ selectedVariant NOTIFY selectedVariantChanged)
Q_PROPERTY(int variantIndex READ selectedVariantIndex WRITE setSelectedVariantIndex NOTIFY selectedVariantChanged)
public:
enum Status {
FINAL,
RELEASE_CANDIDATE,
BETA,
ALPHA
};
Q_ENUMS(Status)
ReleaseVersion(Release *parent, const QString &number, ReleaseVersion::Status status);
ReleaseVersion(Release *parent, const QString &file);
Release *release();
const Release *release() const;
bool updateUrl(const QString &status, Architecture *architecture, ImageType *imageType, const QString &board, const QString &url);
QString number() const;
QString name() const;
ReleaseVersion::Status status() const;
void addVariant(Variant *v);
QQmlListProperty<Variant> variants(); QQmlListProperty<Variant> variants();
QList<Variant*> variantList() const; QList<Variant*> variantList() const;
Variant *selectedVariant() const; Variant *selectedVariant() const;
@ -289,13 +213,15 @@ public:
signals: signals:
void variantsChanged(); void variantsChanged();
void selectedVariantChanged(); void selectedVariantChanged();
void statusChanged();
private: private:
QString m_number { "0" }; QString m_name;
ReleaseVersion::Status m_status { FINAL }; QString m_displayName;
QList<Variant*> m_variants {}; QString m_summary;
int m_selectedVariant { 0 }; QString m_description;
QString m_icon;
QStringList m_screenshots;
QList<Variant *> m_variants;
int m_selectedVariant = 0;
}; };
#endif // RELEASEMANAGER_H #endif // RELEASEMANAGER_H

View File

@ -30,7 +30,7 @@
#include <QStandardPaths> #include <QStandardPaths>
#include <QDir> #include <QDir>
Variant::Variant(ReleaseVersion *parent, QString url, Architecture *arch, ImageType *imageType, QString board) Variant::Variant(QString url, Architecture *arch, ImageType *imageType, QString board, Release *parent)
: QObject(parent) : QObject(parent)
, m_arch(arch) , m_arch(arch)
, m_image_type(imageType) , m_image_type(imageType)
@ -41,7 +41,7 @@ Variant::Variant(ReleaseVersion *parent, QString url, Architecture *arch, ImageT
} }
Variant::Variant(ReleaseVersion *parent, const QString &file) Variant::Variant(const QString &file, Release *parent)
: QObject(parent) : QObject(parent)
, m_image(file) , m_image(file)
, m_arch(Architecture::fromId(Architecture::X86_64)) , m_arch(Architecture::fromId(Architecture::X86_64))
@ -63,20 +63,12 @@ bool Variant::updateUrl(const QString &url) {
return changed; return changed;
} }
ReleaseVersion *Variant::releaseVersion() {
return qobject_cast<ReleaseVersion*>(parent());
}
const ReleaseVersion *Variant::releaseVersion() const {
return qobject_cast<const ReleaseVersion*>(parent());
}
Release *Variant::release() { Release *Variant::release() {
return releaseVersion()->release(); return qobject_cast<Release*>(parent());
} }
const Release *Variant::release() const { const Release *Variant::release() const {
return releaseVersion()->release(); return qobject_cast<const Release*>(parent());
} }
Architecture *Variant::arch() const { Architecture *Variant::arch() const {
@ -99,7 +91,7 @@ QString Variant::fullName() {
if (release()->isLocal()) if (release()->isLocal())
return QFileInfo(image()).fileName(); return QFileInfo(image()).fileName();
else else
return QString("%1 %2 %3").arg(release()->displayName()).arg(releaseVersion()->name()).arg(name()); return QString("%1 %2").arg(release()->displayName(), name());
} }
QString Variant::url() const { QString Variant::url() const {

View File

@ -29,7 +29,6 @@ class Progress;
class ImageType; class ImageType;
class Architecture; class Architecture;
class Release; class Release;
class ReleaseVersion;
/** /**
* @brief The Variant class * @brief The Variant class
@ -93,13 +92,11 @@ public:
tr("Error") tr("Error")
}; };
Variant(ReleaseVersion *parent, QString url, Architecture *arch, ImageType *imageType, QString board); Variant(QString url, Architecture *arch, ImageType *imageType, QString board, Release *parent);
Variant(ReleaseVersion *parent, const QString &file); Variant(const QString &file, Release *parent);
bool updateUrl(const QString &url); bool updateUrl(const QString &url);
ReleaseVersion *releaseVersion();
const ReleaseVersion *releaseVersion() const;
Release *release(); Release *release();
const Release *release() const; const Release *release() const;

View File

@ -36,22 +36,8 @@ Item {
property bool focused: contentList.currentIndex === 1 property bool focused: contentList.currentIndex === 1
enabled: focused enabled: focused
onFocusedChanged: {
if (focused && !prereleaseNotification.wasOpen && releases.selected.prerelease.length > 0)
prereleaseTimer.start()
}
Connections {
target: focused && releases.selected ? releases.selected : null
onPrereleaseChanged: {
if (releases.selected.prerelease.length > 0)
prereleaseTimer.start()
}
}
function toMainScreen() { function toMainScreen() {
archPopover.open = false archPopover.open = false
versionPopover.open = false
canGoBack = false canGoBack = false
contentList.currentIndex-- contentList.currentIndex--
} }
@ -104,7 +90,6 @@ Item {
return return
deviceNotification.open = false deviceNotification.open = false
archPopover.open = false archPopover.open = false
versionPopover.open = false
dlDialog.visible = true dlDialog.visible = true
releases.variant.download() releases.variant.download()
} }
@ -157,148 +142,21 @@ Item {
Text { Text {
font.pointSize: 10 font.pointSize: 10
color: mixColors(palette.window, palette.windowText, 0.3) color: mixColors(palette.window, palette.windowText, 0.3)
visible: typeof releases.selected.version !== 'undefined' visible: releases.selected.variant
text: releases.variant.name text: releases.variant.name
} }
Text { Text {
font.pointSize: 8 font.pointSize: 8
color: mixColors(palette.window, palette.windowText, 0.3) color: mixColors(palette.window, palette.windowText, 0.3)
visible: releases.selected.version && releases.variant visible: releases.variant
text: releases.variant.imageType.name text: releases.variant.imageType.name
} }
RowLayout { RowLayout {
spacing: 0 spacing: 0
width: parent.width width: parent.width
Text {
text: qsTr("Version %1").arg(releases.selected.version.name)
font.pointSize: 8
color: versionRepeater.count <= 1 ? mixColors(palette.window, palette.windowText, 0.3) : versionMouse.containsPress ? Qt.lighter("#1d61bf", 1.7) : versionMouse.containsMouse ? Qt.darker("#1d61bf", 1.5) : "#1d61bf"
Behavior on color { ColorAnimation { duration: 100 } }
MouseArea {
id: versionMouse
activeFocusOnTab: true
enabled: versionRepeater.count > 1
anchors.fill: parent
hoverEnabled: true
cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
function action() {
versionPopover.open = !versionPopover.open
}
onClicked: {
action()
}
Keys.onSpacePressed: action()
FocusRectangle {
anchors.fill: parent
anchors.margins: -2
visible: parent.activeFocus
}
}
BusyIndicator {
anchors.right: parent.left
anchors.rightMargin: 4
anchors.verticalCenter: parent.verticalCenter
height: parent.height * 0.8
width: height
opacity: releases.beingUpdated ? 0.6 : 0.0
visible: opacity > 0.01
Behavior on opacity { NumberAnimation { } }
}
Rectangle {
visible: versionRepeater.count > 1
anchors {
left: parent.left
right: parent.right
top: parent.bottom
}
radius: height / 2
color: parent.color
antialiasing: true
height: 1
}
AdwaitaPopOver {
id: versionPopover
z: 2
anchors {
horizontalCenter: parent.horizontalCenter
top: parent.bottom
topMargin: 8 + opacity * 24
}
onOpenChanged: {
if (open) {
prereleaseNotification.open = false
archPopover.open = false
}
}
ColumnLayout {
spacing: 9
ExclusiveGroup {
id: versionEG
}
Repeater {
id: versionRepeater
model: releases.selected.versions
AdwaitaRadioButton {
text: name
Layout.alignment: Qt.AlignVCenter
exclusiveGroup: versionEG
checked: index == releases.selected.versionIndex
onCheckedChanged: {
if (checked)
releases.selected.versionIndex = index
versionPopover.open = false
}
}
}
}
}
AdwaitaPopNotification {
id: prereleaseNotification
z: 2
property bool wasOpen: false
anchors {
left: parent.left
top: parent.bottom
topMargin: 8 + opacity * 24
}
onOpenChanged: {
if (open) {
versionPopover.open = false
archPopover.open = false
}
}
Text {
text: qsTr("ALT %1 was released! Check it out!<br>If you want a stable, finished system, it's better to stay at version %2.").arg(releases.selected.prerelease).arg(releases.selected.version.name)
font.pointSize: 8
color: "white"
}
Timer {
id: prereleaseTimer
interval: 300
repeat: false
onTriggered: {
prereleaseNotification.open = true
prereleaseNotification.wasOpen = true
}
}
}
}
Text {
text: " "
}
Text { Text {
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
visible: releases.selected.version.variants.length > 1 visible: releases.selected.variants.length > 1
text: qsTr("Other variants...") text: qsTr("Other variants...")
font.pointSize: 8 font.pointSize: 8
color: archMouse.containsPress ? Qt.lighter("#1d61bf", 1.7) : archMouse.containsMouse ? Qt.darker("#1d61bf", 1.5) : "#1d61bf" color: archMouse.containsPress ? Qt.lighter("#1d61bf", 1.7) : archMouse.containsMouse ? Qt.darker("#1d61bf", 1.5) : "#1d61bf"
@ -310,12 +168,7 @@ Item {
hoverEnabled: true hoverEnabled: true
cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
function action() { function action() {
if (versionPopover.open) { archPopover.open = !archPopover.open
versionPopover.open = false
}
else {
archPopover.open = !archPopover.open
}
} }
Keys.onSpacePressed: action() Keys.onSpacePressed: action()
onClicked: { onClicked: {
@ -348,28 +201,21 @@ Item {
topMargin: 8 + opacity * 24 topMargin: 8 + opacity * 24
} }
onOpenChanged: {
if (open) {
versionPopover.open = false
prereleaseNotification.open = false
}
}
ColumnLayout { ColumnLayout {
spacing: 9 spacing: 9
ExclusiveGroup { ExclusiveGroup {
id: archEG id: archEG
} }
Repeater { Repeater {
model: releases.selected.version.variants model: releases.selected.variants
AdwaitaRadioButton { AdwaitaRadioButton {
text: name text: name
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
exclusiveGroup: archEG exclusiveGroup: archEG
checked: index == releases.selected.version.variantIndex checked: index == releases.selected.variantIndex
onCheckedChanged: { onCheckedChanged: {
if (checked) if (checked)
releases.selected.version.variantIndex = index releases.selected.variantIndex = index
archPopover.open = false archPopover.open = false
} }
} }