mirror of
https://github.com/altlinux/ALTMediaWriter.git
synced 2024-10-26 08:55:03 +03:00
remove ReleaseVersion
move variants list up into Release
This commit is contained in:
parent
9ba47d938a
commit
26a00226c9
@ -81,12 +81,6 @@ Item {
|
||||
text: release.displayName
|
||||
color: palette.text
|
||||
}
|
||||
Text {
|
||||
text: " " + release.version.name
|
||||
visible: !release.isLocal
|
||||
font.pointSize: 9
|
||||
color: palette.text
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
height: 1
|
||||
|
@ -89,7 +89,6 @@ ReleaseManager::ReleaseManager(QObject *parent)
|
||||
setSourceModel(m_sourceModel);
|
||||
|
||||
qmlRegisterUncreatableType<Release>("MediaWriter", 1, 0, "Release", "");
|
||||
qmlRegisterUncreatableType<ReleaseVersion>("MediaWriter", 1, 0, "Version", "");
|
||||
qmlRegisterUncreatableType<Variant>("MediaWriter", 1, 0, "Variant", "");
|
||||
qmlRegisterUncreatableType<Architecture>("MediaWriter", 1, 0, "Architecture", "");
|
||||
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
|
||||
|
||||
@ -129,23 +130,28 @@ ReleaseManager::ReleaseManager(QObject *parent)
|
||||
|
||||
bool ReleaseManager::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
|
||||
Q_UNUSED(source_parent)
|
||||
auto release = get(source_row);
|
||||
|
||||
if (m_frontPage) {
|
||||
// Don't filter when on front page, just show 3 releases
|
||||
const bool on_front_page = (source_row < FRONTPAGE_ROW_COUNT);
|
||||
return on_front_page;
|
||||
} else if (release->isLocal()) {
|
||||
// Always show local release
|
||||
return true;
|
||||
} else {
|
||||
auto r = get(source_row);
|
||||
bool containsArch = false;
|
||||
for (auto version : r->versionList()) {
|
||||
for (auto variant : version->variantList()) {
|
||||
// Otherwise filter by arch
|
||||
const bool releaseHasVariantWithArch =
|
||||
[this, release]() {
|
||||
for (auto variant : release->variantList()) {
|
||||
if (variant->arch()->index() == m_filterArchitecture) {
|
||||
containsArch = true;
|
||||
break;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (containsArch)
|
||||
break;
|
||||
}
|
||||
return r->isLocal() || (containsArch && r->displayName().contains(m_filterText, Qt::CaseInsensitive));
|
||||
return false;
|
||||
}();
|
||||
|
||||
return releaseHasVariantWithArch;
|
||||
}
|
||||
}
|
||||
|
||||
@ -269,19 +275,22 @@ void ReleaseManager::setFilterArchitecture(int o) {
|
||||
if (m_filterArchitecture != o && m_filterArchitecture >= 0 && m_filterArchitecture < Architecture::_ARCHCOUNT) {
|
||||
m_filterArchitecture = o;
|
||||
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++) {
|
||||
Release *r = get(i);
|
||||
for (auto v : r->versionList()) {
|
||||
int j = 0;
|
||||
for (auto variant : v->variantList()) {
|
||||
if (variant->arch()->index() == o) {
|
||||
v->setSelectedVariantIndex(j);
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
Release *release = get(i);
|
||||
|
||||
for (auto variant : release->variantList()) {
|
||||
if (variant->arch()->index() == o) {
|
||||
const int index = release->variantList().indexOf(variant);
|
||||
release->setSelectedVariantIndex(index);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
invalidateFilter();
|
||||
}
|
||||
}
|
||||
@ -304,14 +313,13 @@ void ReleaseManager::setSelectedIndex(int o) {
|
||||
}
|
||||
|
||||
Variant *ReleaseManager::variant() {
|
||||
if (selected()) {
|
||||
if (selected()->selectedVersion()) {
|
||||
if (selected()->selectedVersion()->selectedVariant()) {
|
||||
return selected()->selectedVersion()->selectedVariant();
|
||||
}
|
||||
}
|
||||
Release *release = selected();
|
||||
|
||||
if (release != nullptr) {
|
||||
return release->selectedVariant();
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ReleaseManager::loadReleaseFile(const QString &fileContents) {
|
||||
@ -358,10 +366,6 @@ void ReleaseManager::loadReleaseFile(const QString &fileContents) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: handle versions if needed
|
||||
const QString version = "9";
|
||||
const QString status = "0";
|
||||
|
||||
ImageType *imageType = ImageType::fromFilename(url);
|
||||
if (!imageType->isValid()) {
|
||||
qDebug() << "Invalid image type for" << url;
|
||||
@ -374,7 +378,7 @@ void ReleaseManager::loadReleaseFile(const QString &fileContents) {
|
||||
Release *release = get(i);
|
||||
|
||||
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
|
||||
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);
|
||||
|
||||
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() {
|
||||
@ -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)
|
||||
: 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) {
|
||||
@ -555,47 +563,64 @@ void Release::setLocalFile(const QString &path) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_versions.count() == 1) {
|
||||
m_versions.first()->deleteLater();
|
||||
m_versions.removeFirst();
|
||||
}
|
||||
// TODO: don't need to delete, can change path in variant. Though have to consider the case where path doesn't exist.
|
||||
|
||||
m_versions.append(new ReleaseVersion(this, path));
|
||||
emit versionsChanged();
|
||||
emit selectedVersionChanged();
|
||||
// Delete old variant
|
||||
for (auto variant : m_variants) {
|
||||
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) {
|
||||
int finalVersions = 0;
|
||||
for (auto i : m_versions) {
|
||||
if (i->number() == version)
|
||||
return i->updateUrl(status, architecture, imageType, board, url);
|
||||
if (i->status() == ReleaseVersion::FINAL)
|
||||
finalVersions++;
|
||||
}
|
||||
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;
|
||||
void Release::updateUrl(const QString &url, Architecture *architecture, ImageType *imageType, const QString &board) {
|
||||
// If variant already exists, update it
|
||||
Variant *variant_in_list =
|
||||
[=]() -> Variant * {
|
||||
for (auto variant : m_variants) {
|
||||
// TODO: equals?
|
||||
if (variant->arch() == architecture && variant->board() == board) {
|
||||
return variant;
|
||||
}
|
||||
}
|
||||
removeVersion(oldVer);
|
||||
return nullptr;
|
||||
}();
|
||||
if (variant_in_list != nullptr) {
|
||||
variant_in_list->updateUrl(url);
|
||||
return;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
ReleaseManager *Release::manager() {
|
||||
return qobject_cast<ReleaseManager*>(parent());
|
||||
// Otherwise make a new variant
|
||||
|
||||
// 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 {
|
||||
@ -626,178 +651,27 @@ QStringList Release::screenshots() const {
|
||||
return m_screenshots;
|
||||
}
|
||||
|
||||
QString Release::prerelease() 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 {
|
||||
Variant *Release::selectedVariant() const {
|
||||
if (m_selectedVariant >= 0 && m_selectedVariant < m_variants.count())
|
||||
return m_variants[m_selectedVariant];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int ReleaseVersion::selectedVariantIndex() const {
|
||||
int Release::selectedVariantIndex() const {
|
||||
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()) {
|
||||
m_selectedVariant = o;
|
||||
emit selectedVariantChanged();
|
||||
}
|
||||
}
|
||||
|
||||
ReleaseVersion::Status ReleaseVersion::status() const {
|
||||
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() {
|
||||
QQmlListProperty<Variant> Release::variants() {
|
||||
return QQmlListProperty<Variant>(this, m_variants);
|
||||
}
|
||||
|
||||
QList<Variant *> ReleaseVersion::variantList() const {
|
||||
QList<Variant *> Release::variantList() const {
|
||||
return m_variants;
|
||||
}
|
||||
|
@ -27,7 +27,6 @@
|
||||
class ReleaseManager;
|
||||
class ReleaseListModel;
|
||||
class Release;
|
||||
class ReleaseVersion;
|
||||
class Variant;
|
||||
class Architecture;
|
||||
class ImageType;
|
||||
@ -172,7 +171,6 @@ private:
|
||||
* @property isLocal true if name is "custom"
|
||||
* @property icon path of the icon of this release
|
||||
* @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 versionNames a list of the names of the available versions
|
||||
* @property version the currently selected @ref ReleaseVersion
|
||||
@ -189,16 +187,13 @@ class Release : public QObject {
|
||||
Q_PROPERTY(QString icon READ icon CONSTANT)
|
||||
Q_PROPERTY(QStringList screenshots READ screenshots CONSTANT)
|
||||
|
||||
Q_PROPERTY(QString prerelease READ prerelease NOTIFY prereleaseChanged)
|
||||
|
||||
Q_PROPERTY(QQmlListProperty<ReleaseVersion> versions READ versions NOTIFY versionsChanged)
|
||||
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)
|
||||
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:
|
||||
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);
|
||||
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();
|
||||
|
||||
QString name() const;
|
||||
@ -208,78 +203,7 @@ public:
|
||||
bool isLocal() const;
|
||||
QString icon() 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();
|
||||
QList<Variant*> variantList() const;
|
||||
Variant *selectedVariant() const;
|
||||
@ -289,13 +213,15 @@ public:
|
||||
signals:
|
||||
void variantsChanged();
|
||||
void selectedVariantChanged();
|
||||
void statusChanged();
|
||||
|
||||
private:
|
||||
QString m_number { "0" };
|
||||
ReleaseVersion::Status m_status { FINAL };
|
||||
QList<Variant*> m_variants {};
|
||||
int m_selectedVariant { 0 };
|
||||
QString m_name;
|
||||
QString m_displayName;
|
||||
QString m_summary;
|
||||
QString m_description;
|
||||
QString m_icon;
|
||||
QStringList m_screenshots;
|
||||
QList<Variant *> m_variants;
|
||||
int m_selectedVariant = 0;
|
||||
};
|
||||
|
||||
#endif // RELEASEMANAGER_H
|
||||
|
@ -30,7 +30,7 @@
|
||||
#include <QStandardPaths>
|
||||
#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)
|
||||
, m_arch(arch)
|
||||
, 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)
|
||||
, m_image(file)
|
||||
, m_arch(Architecture::fromId(Architecture::X86_64))
|
||||
@ -63,20 +63,12 @@ bool Variant::updateUrl(const QString &url) {
|
||||
return changed;
|
||||
}
|
||||
|
||||
ReleaseVersion *Variant::releaseVersion() {
|
||||
return qobject_cast<ReleaseVersion*>(parent());
|
||||
}
|
||||
|
||||
const ReleaseVersion *Variant::releaseVersion() const {
|
||||
return qobject_cast<const ReleaseVersion*>(parent());
|
||||
}
|
||||
|
||||
Release *Variant::release() {
|
||||
return releaseVersion()->release();
|
||||
return qobject_cast<Release*>(parent());
|
||||
}
|
||||
|
||||
const Release *Variant::release() const {
|
||||
return releaseVersion()->release();
|
||||
return qobject_cast<const Release*>(parent());
|
||||
}
|
||||
|
||||
Architecture *Variant::arch() const {
|
||||
@ -99,7 +91,7 @@ QString Variant::fullName() {
|
||||
if (release()->isLocal())
|
||||
return QFileInfo(image()).fileName();
|
||||
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 {
|
||||
|
@ -29,7 +29,6 @@ class Progress;
|
||||
class ImageType;
|
||||
class Architecture;
|
||||
class Release;
|
||||
class ReleaseVersion;
|
||||
|
||||
/**
|
||||
* @brief The Variant class
|
||||
@ -93,13 +92,11 @@ public:
|
||||
tr("Error")
|
||||
};
|
||||
|
||||
Variant(ReleaseVersion *parent, QString url, Architecture *arch, ImageType *imageType, QString board);
|
||||
Variant(ReleaseVersion *parent, const QString &file);
|
||||
Variant(QString url, Architecture *arch, ImageType *imageType, QString board, Release *parent);
|
||||
Variant(const QString &file, Release *parent);
|
||||
|
||||
bool updateUrl(const QString &url);
|
||||
|
||||
ReleaseVersion *releaseVersion();
|
||||
const ReleaseVersion *releaseVersion() const;
|
||||
Release *release();
|
||||
const Release *release() const;
|
||||
|
||||
|
@ -36,22 +36,8 @@ Item {
|
||||
property bool focused: contentList.currentIndex === 1
|
||||
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() {
|
||||
archPopover.open = false
|
||||
versionPopover.open = false
|
||||
canGoBack = false
|
||||
contentList.currentIndex--
|
||||
}
|
||||
@ -104,7 +90,6 @@ Item {
|
||||
return
|
||||
deviceNotification.open = false
|
||||
archPopover.open = false
|
||||
versionPopover.open = false
|
||||
dlDialog.visible = true
|
||||
releases.variant.download()
|
||||
}
|
||||
@ -157,148 +142,21 @@ Item {
|
||||
Text {
|
||||
font.pointSize: 10
|
||||
color: mixColors(palette.window, palette.windowText, 0.3)
|
||||
visible: typeof releases.selected.version !== 'undefined'
|
||||
visible: releases.selected.variant
|
||||
text: releases.variant.name
|
||||
}
|
||||
Text {
|
||||
font.pointSize: 8
|
||||
color: mixColors(palette.window, palette.windowText, 0.3)
|
||||
visible: releases.selected.version && releases.variant
|
||||
visible: releases.variant
|
||||
text: releases.variant.imageType.name
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 0
|
||||
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 {
|
||||
Layout.alignment: Qt.AlignRight
|
||||
visible: releases.selected.version.variants.length > 1
|
||||
visible: releases.selected.variants.length > 1
|
||||
text: qsTr("Other variants...")
|
||||
font.pointSize: 8
|
||||
color: archMouse.containsPress ? Qt.lighter("#1d61bf", 1.7) : archMouse.containsMouse ? Qt.darker("#1d61bf", 1.5) : "#1d61bf"
|
||||
@ -310,12 +168,7 @@ Item {
|
||||
hoverEnabled: true
|
||||
cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
function action() {
|
||||
if (versionPopover.open) {
|
||||
versionPopover.open = false
|
||||
}
|
||||
else {
|
||||
archPopover.open = !archPopover.open
|
||||
}
|
||||
archPopover.open = !archPopover.open
|
||||
}
|
||||
Keys.onSpacePressed: action()
|
||||
onClicked: {
|
||||
@ -348,28 +201,21 @@ Item {
|
||||
topMargin: 8 + opacity * 24
|
||||
}
|
||||
|
||||
onOpenChanged: {
|
||||
if (open) {
|
||||
versionPopover.open = false
|
||||
prereleaseNotification.open = false
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 9
|
||||
ExclusiveGroup {
|
||||
id: archEG
|
||||
}
|
||||
Repeater {
|
||||
model: releases.selected.version.variants
|
||||
model: releases.selected.variants
|
||||
AdwaitaRadioButton {
|
||||
text: name
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
exclusiveGroup: archEG
|
||||
checked: index == releases.selected.version.variantIndex
|
||||
checked: index == releases.selected.variantIndex
|
||||
onCheckedChanged: {
|
||||
if (checked)
|
||||
releases.selected.version.variantIndex = index
|
||||
releases.selected.variantIndex = index
|
||||
archPopover.open = false
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user