Launcher: move favourites to its own storage class
This allows viewing/changing favourite-ness from the details view.
This commit is contained in:
parent
330422faf3
commit
e596eb3716
9 changed files with 194 additions and 80 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -128,6 +128,8 @@ if (HAVE_QT)
|
|||
PathListModel.hxx
|
||||
CarriersLocationModel.cxx
|
||||
CarriersLocationModel.hxx
|
||||
FavouriteAircraftData.cxx
|
||||
FavouriteAircraftData.hxx
|
||||
${uic_sources}
|
||||
${qrc_sources}
|
||||
${qml_sources})
|
||||
|
|
60
src/GUI/FavouriteAircraftData.cxx
Normal file
60
src/GUI/FavouriteAircraftData.cxx
Normal 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);
|
||||
}
|
31
src/GUI/FavouriteAircraftData.hxx
Normal file
31
src/GUI/FavouriteAircraftData.hxx
Normal 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
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue