FlightGear next
RecentAircraftModel.cxx
Go to the documentation of this file.
2
3#include <QSettings>
4#include <QDebug>
5
7
8const int MAX_RECENT_AIRCRAFT = 20;
9
10const QString recentAircraftKey = "recent-aircraft-2020";
11
13 QAbstractListModel(pr),
14 m_aircraftModel(acModel)
15{
16 QSettings settings;
17 const QStringList urls = settings.value(recentAircraftKey).toStringList();
18 m_data = QUrl::fromStringList(urls);
19
20 connect(m_aircraftModel, &AircraftItemModel::contentsChanged,
21 this, &RecentAircraftModel::onModelContentsChanged);
22}
23
25{
26 QSettings settings;
27 settings.setValue(recentAircraftKey, QUrl::toStringList(m_data));
28}
29
30QUrl RecentAircraftModel::uriAt(int index) const
31{
32 return m_data.at(index);
33}
34
36{
37 return m_data.empty();
38}
39
40QVariant RecentAircraftModel::data(const QModelIndex &index, int role) const
41{
42 const QUrl uri = m_data.at(index.row());
43 if (role == Qt::DisplayRole) {
44 return m_aircraftModel->nameForAircraftURI(uri);
45 } else if (role == Qt::UserRole) {
46 return uri;
47 }
48
49 return {};
50}
51
52int RecentAircraftModel::rowCount(const QModelIndex&) const
53{
54 return m_data.size();
55}
56
57QHash<int, QByteArray> RecentAircraftModel::roleNames() const
58{
59 QHash<int, QByteArray> result = QAbstractListModel::roleNames();
60 result[Qt::DisplayRole] = "display";
61 result[Qt::UserRole] = "uri";
62 return result;
63}
64
66{
67 if (m_data.empty()) {
68 return {};
69 }
70
71 return m_data.front();
72}
73
74void RecentAircraftModel::insert(QUrl aircraftUrl)
75{
76 if (aircraftUrl.isEmpty())
77 return;
78
79 int existingIndex = m_data.indexOf(aircraftUrl);
80 if (existingIndex == 0) {
81 // special, common case - nothing to do
82 return;
83 }
84
85 if (existingIndex >= 0) {
86 beginRemoveRows(QModelIndex(), existingIndex, existingIndex);
87 m_data.removeAt(existingIndex);
88 endRemoveRows();
89 }
90
91 beginInsertRows(QModelIndex(), 0, 0);
92 m_data.push_front(aircraftUrl);
93 endInsertRows();
94
95 if (m_data.size() > MAX_RECENT_AIRCRAFT) {
96 beginRemoveRows(QModelIndex(), MAX_RECENT_AIRCRAFT, m_data.size() - 1);
97 // truncate the data at the correct size
98 m_data = m_data.mid(0, MAX_RECENT_AIRCRAFT);
99 endRemoveRows();
100 }
101
102 emit isEmptyChanged();
103}
104
105void RecentAircraftModel::onModelContentsChanged()
106{
107 emit dataChanged(index(0), index(m_data.size() - 1));
108}
const int MAX_RECENT_AIRCRAFT
const QString recentAircraftKey
RecentAircraftModel(AircraftItemModel *acModel, QObject *pr=nullptr)
int rowCount(const QModelIndex &parent) const override
void insert(QUrl aircraftUrl)
QVariant data(const QModelIndex &index, int role) const override
Q_INVOKABLE QUrl uriAt(int index) const
QHash< int, QByteArray > roleNames() const override