1
0
Fork 0

Launcher: move favourites to its own storage class

This allows viewing/changing favourite-ness from the details view.
This commit is contained in:
James Turner 2020-04-04 09:20:23 +01:00
parent 330422faf3
commit e596eb3716
9 changed files with 194 additions and 80 deletions

View file

@ -38,6 +38,7 @@
#include <Include/version.h>
#include "QmlAircraftInfo.hxx"
#include "FavouriteAircraftData.hxx"
using namespace simgear::pkg;
@ -160,8 +161,6 @@ AircraftItemModel::AircraftItemModel(QObject* pr) :
this, &AircraftItemModel::onScanAddedItems);
connect(cache, &LocalAircraftCache::cleared,
this, &AircraftItemModel::onLocalCacheCleared);
loadFavourites();
}
AircraftItemModel::~AircraftItemModel()
@ -246,7 +245,7 @@ QVariant AircraftItemModel::data(const QModelIndex& index, int role) const
if (role == AircraftIsFavouriteRole) {
// recursive call here, hope that's okay
const auto uri = data(index, AircraftURIRole).toUrl();
return m_favourites.contains(uri);
return FavouriteAircraftData::instance()->isFavourite(uri);
}
if (row >= m_cachedLocalAircraftCount) {
@ -433,17 +432,11 @@ bool AircraftItemModel::setData(const QModelIndex &index, const QVariant &value,
emit dataChanged(index, index);
return true;
} else if (role == AircraftIsFavouriteRole) {
bool f = value.toBool();
const auto uri = data(index, AircraftURIRole).toUrl();
const auto cur = m_favourites.contains(uri);
if (f && !cur) {
m_favourites.append(uri);
} else if (!f && cur) {
m_favourites.removeOne(uri);
bool changed = FavouriteAircraftData::instance()->setFavourite(uri, value.toBool());
if (changed) {
emit dataChanged(index, index);
}
saveFavourites();
emit dataChanged(index, index);
}
return false;
@ -666,21 +659,3 @@ bool AircraftItemModel::isIndexRunnable(const QModelIndex& index) const
return !ex->isDownloading();
}
void AircraftItemModel::loadFavourites()
{
m_favourites.clear();
QSettings settings;
Q_FOREACH(auto v, settings.value("favourite-aircraft").toList()) {
m_favourites.append(v.toUrl());
}
}
void AircraftItemModel::saveFavourites()
{
QVariantList favs;
Q_FOREACH(auto u, m_favourites) {
favs.append(u);
}
QSettings settings;
settings.setValue("favourite-aircraft", favs);
}

View file

@ -146,9 +146,6 @@ private:
void installSucceeded(QModelIndex index);
void installFailed(QModelIndex index, simgear::pkg::Delegate::StatusCode reason);
void loadFavourites();
void saveFavourites();
private:
PackageDelegate* m_delegate = nullptr;
@ -156,8 +153,6 @@ private:
simgear::pkg::RootRef m_packageRoot;
simgear::pkg::PackageList m_packages;
QVector<QUrl> m_favourites;
int m_cachedLocalAircraftCount = 0;
};

View file

@ -4,6 +4,8 @@
#include <QDebug>
#include "AircraftModel.hxx"
#include "FavouriteAircraftData.hxx"
#include <simgear/package/Package.hxx>
AircraftProxyModel::AircraftProxyModel(QObject *pr, QAbstractItemModel * source) :
@ -121,6 +123,13 @@ void AircraftProxyModel::setShowFavourites(bool e)
return;
m_onlyShowFavourites = e;
if (e) {
setDynamicSortFilter(false);
connect(FavouriteAircraftData::instance(), &FavouriteAircraftData::changed,
[this]() {
this->invalidate();
});
}
invalidate();
}

View file

@ -128,6 +128,8 @@ if (HAVE_QT)
PathListModel.hxx
CarriersLocationModel.cxx
CarriersLocationModel.hxx
FavouriteAircraftData.cxx
FavouriteAircraftData.hxx
${uic_sources}
${qrc_sources}
${qml_sources})

View file

@ -0,0 +1,60 @@
#include "FavouriteAircraftData.hxx"
#include <QSettings>
static std::unique_ptr<FavouriteAircraftData> static_instance;
FavouriteAircraftData *FavouriteAircraftData::instance()
{
if (!static_instance) {
static_instance.reset(new FavouriteAircraftData);
}
return static_instance.get();
}
bool FavouriteAircraftData::isFavourite(QUrl u) const
{
return m_favourites.contains(u);
}
bool FavouriteAircraftData::setFavourite(QUrl u, bool b)
{
const auto cur = m_favourites.contains(u);
if (b == cur)
return false;
if (b && !cur) {
m_favourites.append(u);
} else if (!b && cur) {
m_favourites.removeOne(u);
}
emit changed(u);
saveFavourites();
return true;
}
FavouriteAircraftData::FavouriteAircraftData()
{
loadFavourites();
}
void FavouriteAircraftData::loadFavourites()
{
m_favourites.clear();
QSettings settings;
Q_FOREACH(auto v, settings.value("favourite-aircraft").toList()) {
m_favourites.append(v.toUrl());
}
}
void FavouriteAircraftData::saveFavourites()
{
QVariantList favs;
Q_FOREACH(auto u, m_favourites) {
favs.append(u);
}
QSettings settings;
settings.setValue("favourite-aircraft", favs);
}

View file

@ -0,0 +1,31 @@
#ifndef FAVOURITEAIRCRAFTDATA_HXX
#define FAVOURITEAIRCRAFTDATA_HXX
#include <QObject>
#include <QUrl>
#include <QVector>
class FavouriteAircraftData : public QObject
{
Q_OBJECT
public:
static FavouriteAircraftData* instance();
bool isFavourite(QUrl u) const;
bool setFavourite(QUrl u, bool b);
signals:
void changed(QUrl u);
private:
FavouriteAircraftData();
void loadFavourites();
void saveFavourites();
QVector<QUrl> m_favourites;
};
#endif // FAVOURITEAIRCRAFTDATA_HXX

View file

@ -14,6 +14,7 @@
#include <Main/globals.hxx>
#include "LocalAircraftCache.hxx"
#include "FavouriteAircraftData.hxx"
using namespace simgear::pkg;
@ -305,6 +306,8 @@ QmlAircraftInfo::QmlAircraftInfo(QObject *parent)
, _delegate(new Delegate(this))
{
qmlRegisterUncreatableType<StatesModel>("FlightGear.Launcher", 1, 0, "StatesModel", "no");
connect(FavouriteAircraftData::instance(), &FavouriteAircraftData::changed,
this, &QmlAircraftInfo::onFavouriteChanged);
}
QmlAircraftInfo::~QmlAircraftInfo()
@ -673,6 +676,7 @@ void QmlAircraftInfo::setUri(QUrl u)
emit uriChanged();
emit infoChanged();
emit downloadChanged();
emit favouriteChanged();
}
void QmlAircraftInfo::setVariant(quint32 variant)
@ -697,6 +701,19 @@ void QmlAircraftInfo::setVariant(quint32 variant)
emit variantChanged(_variant);
}
void QmlAircraftInfo::setFavourite(bool favourite)
{
FavouriteAircraftData::instance()->setFavourite(uri(), favourite);
}
void QmlAircraftInfo::onFavouriteChanged(QUrl u)
{
if (u != uri())
return;
emit favouriteChanged();
}
QVariant QmlAircraftInfo::packageAircraftStatus(simgear::pkg::PackageRef p)
{
if (p->hasTag("needs-maintenance")) {
@ -882,4 +899,9 @@ bool QmlAircraftInfo::hasTag(QString tag) const
return false;
}
bool QmlAircraftInfo::favourite() const
{
return FavouriteAircraftData::instance()->isFavourite(uri());
}
#include "QmlAircraftInfo.moc"

View file

@ -59,6 +59,7 @@ class QmlAircraftInfo : public QObject
Q_PROPERTY(bool hasStates READ hasStates NOTIFY infoChanged)
Q_PROPERTY(StatesModel* statesModel READ statesModel NOTIFY infoChanged)
Q_PROPERTY(bool favourite READ favourite WRITE setFavourite NOTIFY favouriteChanged)
public:
explicit QmlAircraftInfo(QObject *parent = nullptr);
virtual ~QmlAircraftInfo();
@ -127,11 +128,14 @@ public:
Q_INVOKABLE bool isAltitudeBelowLimits(QuantityValue speed) const;
Q_INVOKABLE bool hasTag(QString tag) const;
bool favourite() const;
signals:
void uriChanged();
void infoChanged();
void downloadChanged();
void variantChanged(quint32 variant);
void favouriteChanged();
public slots:
@ -139,6 +143,10 @@ public slots:
void setVariant(quint32 variant);
void setFavourite(bool favourite);
private slots:
void onFavouriteChanged(QUrl u);
private:
AircraftItemPtr resolveItem() const;
void checkForStates();

View file

@ -155,59 +155,71 @@ Rectangle {
visible: aircraft.previews.length > 0
}
Grid {
id: ratingGrid
anchors.left: parent.left
Row {
height: ratingGrid.height
width: parent.width
spacing: Style.strutSize
visible: aircraft.ratings !== undefined
rows: 2
columns: 3
rowSpacing: Style.margin
columnSpacing: Style.margin
StyledText {
id: ratingsLabel
text: qsTr("Ratings:")
}
AircraftRating {
title: qsTr("Flight model")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[0]
FavouriteToggleButton {
checked: aircraft.favourite
onToggle: {
aircraft.favourite = on;
}
}
AircraftRating {
title: qsTr("Systems")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[1]
}
}
Grid {
id: ratingGrid
Item {
width: ratingsLabel.width
height: 1
} // placeholder
visible: aircraft.ratings !== undefined
AircraftRating {
title: qsTr("Cockpit")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[2]
}
}
rows: 2
columns: 3
rowSpacing: Style.margin
columnSpacing: Style.margin
AircraftRating {
title: qsTr("Exterior")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[3]
StyledText {
id: ratingsLabel
text: qsTr("Ratings:")
}
}
AircraftRating {
title: qsTr("Flight model")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[0]
}
}
AircraftRating {
title: qsTr("Systems")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[1]
}
}
Item {
width: ratingsLabel.width
height: 1
} // placeholder
AircraftRating {
title: qsTr("Cockpit")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[2]
}
}
AircraftRating {
title: qsTr("Exterior")
Binding on value {
when: aircraft.ratings !== undefined
value: aircraft.ratings[3]
}
}
} // of rating grid
}
StyledText {