FlightGear next
LauncherController.hxx
Go to the documentation of this file.
1// LauncherController.hxx - GUI launcher dialog using Qt5
2//
3// Written by James Turner, started March 2018.
4//
5// Copyright (C) 2018 James Turner <james@flightgear.org>
6//
7// This program is free software; you can redistribute it and/or
8// modify it under the terms of the GNU General Public License as
9// published by the Free Software Foundation; either version 2 of the
10// License, or (at your option) any later version.
11//
12// This program is distributed in the hope that it will be useful, but
13// WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15// General Public License for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with this program; if not, write to the Free Software
19// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
21#ifndef LAUNCHERCONTROLLER_HXX
22#define LAUNCHERCONTROLLER_HXX
23
24#include <QObject>
25#include <QUrl>
26#include <QModelIndex>
27#include <QSize>
28#include <QPointF>
29
30#include <simgear/package/Package.hxx>
31#include <simgear/package/Catalog.hxx>
32
33#include "AircraftItemModel.hxx"
37#include "MPServersModel.h"
38#include "QmlAircraftInfo.hxx"
41
42// forward decls
43class QTimer;
44class QWindow;
45class QQuickItem;
46class LaunchConfig;
47
48class LauncherController : public QObject
49{
50 Q_OBJECT
51
52 Q_PROPERTY(AircraftProxyModel* installedAircraftModel MEMBER m_installedAircraftModel CONSTANT)
53 Q_PROPERTY(AircraftProxyModel* aircraftWithUpdatesModel MEMBER m_aircraftWithUpdatesModel CONSTANT)
54 Q_PROPERTY(AircraftProxyModel* browseAircraftModel MEMBER m_browseAircraftModel CONSTANT)
55 Q_PROPERTY(AircraftProxyModel* searchAircraftModel MEMBER m_aircraftSearchModel CONSTANT)
56 Q_PROPERTY(AircraftProxyModel* favouriteAircraftModel MEMBER m_favouriteAircraftModel CONSTANT)
57
58 Q_PROPERTY(AircraftItemModel* baseAircraftModel MEMBER m_aircraftModel CONSTANT)
59
60 Q_PROPERTY(LocationController* location MEMBER m_location CONSTANT)
61 Q_PROPERTY(FlightPlanController* flightPlan MEMBER m_flightPlan CONSTANT)
62
63 Q_PROPERTY(MPServersModel* mpServersModel MEMBER m_serversModel CONSTANT)
64
66
68
69 Q_PROPERTY(QString selectedAircraftState MEMBER m_aircraftState NOTIFY selectedAircraftStateChanged)
70
71 Q_PROPERTY(bool isSearchActive READ isSearchActive NOTIFY searchChanged)
73
74 Q_PROPERTY(QStringList settingsSummary READ settingsSummary WRITE setSettingsSummary NOTIFY summaryChanged)
76
77 Q_PROPERTY(QStringList combinedSummary READ combinedSummary NOTIFY summaryChanged)
78
79 Q_PROPERTY(QString versionString READ versionString CONSTANT)
80
83
84 Q_PROPERTY(bool canFly READ canFly NOTIFY canFlyChanged)
85
87
89
90 Q_PROPERTY(QUrl flyIconUrl READ flyIconUrl NOTIFY selectedAircraftChanged)
92
93 Q_PROPERTY(bool inAppMode READ inApp NOTIFY inAppChanged)
94
96
97 Q_PROPERTY(int launchCount READ launchCount CONSTANT);
98 Q_PROPERTY(int versionLaunchCount READ versionLaunchCount CONSTANT);
99
100 // property to indicate if we're disabling the aircraft selection because the user entered it manuall
101 Q_PROPERTY(bool skipAircraftFromArgs MEMBER m_skipAircraftFromArgs NOTIFY skipAircraftFromArgsChanged)
102public:
103 explicit LauncherController(QObject *parent, QWindow* win);
104
105 void initQML(int& styleTypeId);
106
107 Q_INVOKABLE bool validateMetarString(QString metar);
108
109 Q_INVOKABLE void requestInstallUpdate(QUrl aircraftUri);
110
111 Q_INVOKABLE void requestUninstall(QUrl aircraftUri);
112
113 Q_INVOKABLE void requestInstallCancel(QUrl aircraftUri);
114
115 Q_INVOKABLE void downloadDirChanged(QString path);
116
117 Q_INVOKABLE void requestUpdateAllAircraft();
118
119 Q_INVOKABLE void queryMPServers();
120
121 QUrl selectedAircraft() const;
122
123 // work around the fact, that this is not available on QQuickItem until 5.7
124 Q_INVOKABLE QPointF mapToGlobal(QQuickItem* item, const QPointF& pos) const;
125
127
128 Q_INVOKABLE void restoreLocation(QVariant var);
129
130 Q_INVOKABLE bool matchesSearch(QString term, QStringList keywords) const;
131
132 bool isSearchActive() const;
133
134 QString settingsSearchTerm() const
135 {
136 return m_settingsSearchTerm;
137 }
138
139 QStringList settingsSummary() const;
140
141 QStringList environmentSummary() const;
142
143 QStringList combinedSummary() const;
144
145 QString versionString() const;
146
148
150
151 Q_INVOKABLE void launchUrl(QUrl url);
152
153 // list of QUrls containing the default splash images from FGData.
154 // used on the summary screen
155 Q_INVOKABLE QVariantList defaultSplashUrls() const;
156
157 Q_INVOKABLE QVariant loadUISetting(QString name, QVariant defaultValue) const;
158 Q_INVOKABLE void saveUISetting(QString name, QVariant value) const;
159
165 Q_INVOKABLE QUrl urlToDataPath(QString relPath) const;
166
168 { return m_config; }
169
170 void doRun();
171 void doApply();
172
173 bool canFly() const;
174
176 { return m_aircraftModel; }
177
179 void saveSettings();
180
182 { return m_location; }
183
192
193 Q_ENUMS(AircraftType)
194
196 { return m_aircraftType; }
197
198 void setInAppMode();
199 bool keepRunningInAppMode() const;
200 bool inAppResult() const;
201
202 QSize minWindowSize() const
203 {
204 return m_minWindowSize;
205 }
206
207 void setMinWindowSize(QSize sz);
208
209 QUrl flyIconUrl() const;
210
211 bool aircraftGridMode() const
212 {
213 return m_aircraftGridMode;
214 }
215
216 bool inApp() const
217 {
218 return m_inAppMode;
219 }
220
221 int launchCount() const
222 {
223 return m_launchCount;
224 }
225
227 {
228 return m_versionLaunchCount;
229 }
230
231 QString flyButtonLabel() const;
232signals:
233
236
241
243
245
247 void installedAircraftCountChanged(int installedAircraftCount);
248
251public slots:
253
255
256 void setSettingsSummary(QStringList settingsSummary);
257
259
260 void fly();
261 void quit();
262
264
266
267 void openConfig();
268 void saveConfigAs();
270
272
273private slots:
274
275 void onAircraftInstalledCompleted(QModelIndex index);
276 void onAircraftInstallFailed(QModelIndex index, QString errorMessage);
277
278 void saveAircraft();
279 void restoreAircraft();
280
281 void checkForOldDownloadDir();
282
283private:
288 void maybeUpdateSelectedAircraft(QModelIndex index);
289 void updateSelectedAircraft();
290
291
292 simgear::pkg::PackageRef packageForAircraftURI(QUrl uri) const;
293
294 // need to wait after a model reset before restoring selection and
295 // scrolling, to give the view time it seems.
296 void delayedAircraftModelReset();
297
298 void collectAircraftArgs();
299
300 QString selectAircraftStateAutomatically();
301 bool haveOldWindowsDownloadDir() const;
302
303private:
304 QWindow* m_window = nullptr;
305
306 AircraftProxyModel* m_installedAircraftModel;
307 AircraftItemModel* m_aircraftModel;
308 AircraftProxyModel* m_aircraftSearchModel;
309 AircraftProxyModel* m_browseAircraftModel;
310 AircraftProxyModel* m_aircraftWithUpdatesModel;
311 AircraftProxyModel* m_favouriteAircraftModel;
312
313 MPServersModel* m_serversModel = nullptr;
314 LocationController* m_location = nullptr;
315 FlightPlanController* m_flightPlan = nullptr;
316
317 QUrl m_selectedAircraft;
318 QString m_aircraftState;
319 AircraftType m_aircraftType = Airplane;
320 int m_ratingFilters[4] = {3, 3, 3, 3};
321 LaunchConfig* m_config = nullptr;
322 QmlAircraftInfo* m_selectedAircraftInfo = nullptr;
323 QString m_settingsSearchTerm;
324 QStringList m_settingsSummary, m_environmentSummary;
325 RecentAircraftModel* m_aircraftHistory = nullptr;
326 RecentLocationsModel* m_locationHistory = nullptr;
327 QSize m_minWindowSize;
328 QTimer* m_subsystemIdleTimer = nullptr;
329
330 bool m_inAppMode = false;
331 bool m_keepRunningInAppMode = false;
332 bool m_appModeResult = true;
333 bool m_aircraftGridMode;
334 int m_launchCount = 0;
335 int m_versionLaunchCount = 0;
336 bool m_flyRequested = false;
337 bool m_skipAircraftFromArgs = false;
338};
339
340#endif // LAUNCHERCONTROLLER_HXX
Q_INVOKABLE QVariant loadUISetting(QString name, QVariant defaultValue) const
LocationController * location
LocationController * location() const
FlightPlanController * flightPlan
AircraftProxyModel * searchAircraftModel
RecentAircraftModel * aircraftHistory
Q_INVOKABLE QUrl urlToDataPath(QString relPath) const
urlToDataPath - convetr a FGData path into a gloabl file:/// URL suitable for Qt.openExternally()
Q_INVOKABLE void requestInstallUpdate(QUrl aircraftUri)
bool keepRunningInAppMode() const
Q_INVOKABLE void launchUrl(QUrl url)
Q_INVOKABLE QPointF mapToGlobal(QQuickItem *item, const QPointF &pos) const
void setSettingsSummary(QStringList settingsSummary)
void skipAircraftFromArgsChanged()
Q_INVOKABLE void requestUpdateAllAircraft()
void setEnvironmentSummary(QStringList environmentSummary)
AircraftProxyModel * aircraftWithUpdatesModel
Q_INVOKABLE void requestInstallCancel(QUrl aircraftUri)
LaunchConfig * config() const
void setSelectedAircraft(QUrl selectedAircraft)
QmlAircraftInfo * selectedAircraftInfo
Q_INVOKABLE bool matchesSearch(QString term, QStringList keywords) const
Q_INVOKABLE QVariantList defaultSplashUrls() const
void selectedAircraftStateChanged()
void aircraftGridModeChanged(bool aircraftGridMode)
void installedAircraftCountChanged(int installedAircraftCount)
AircraftItemModel * baseAircraftModel
Q_INVOKABLE void downloadDirChanged(QString path)
AircraftProxyModel * installedAircraftModel
void minWindowSizeChanged()
AircraftProxyModel * favouriteAircraftModel
RecentAircraftModel * aircraftHistory()
void selectedAircraftChanged(QUrl selectedAircraft)
Q_INVOKABLE void requestUninstall(QUrl aircraftUri)
void initQML(int &styleTypeId)
RecentLocationsModel * locationHistory()
Q_INVOKABLE void queryMPServers()
RecentLocationsModel * locationHistory
MPServersModel * mpServersModel
AircraftItemModel * baseAircraftModel() const
Q_INVOKABLE void restoreLocation(QVariant var)
void didResetGettingStartedTips()
Q_INVOKABLE bool validateMetarString(QString metar)
void setMinWindowSize(QSize sz)
void setAircraftGridMode(bool aircraftGridMode)
void setSettingsSearchTerm(QString settingsSearchTerm)
AircraftProxyModel * browseAircraftModel
LauncherController(QObject *parent, QWindow *win)
Q_INVOKABLE void saveUISetting(QString name, QVariant value) const
const char * name