mirror of
https://github.com/altlinux/ALTMediaWriter.git
synced 2024-10-26 17:25:05 +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
|
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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user