From 1e1326d8f3edb41724517c4521ac2aebeedb50df Mon Sep 17 00:00:00 2001 From: James Turner Date: Wed, 11 Mar 2015 23:20:18 +0000 Subject: [PATCH] Aircraft path support in the Qt launcher - aircraft dirs are re-scanned when the paths change. --- src/GUI/AircraftModel.cxx | 30 +++++- src/GUI/AircraftModel.hxx | 8 ++ src/GUI/Launcher.ui | 207 ++++++++++++++++++++++++++------------ src/GUI/QtLauncher.cxx | 50 ++++++++- src/GUI/QtLauncher.hxx | 8 +- 5 files changed, 234 insertions(+), 69 deletions(-) diff --git a/src/GUI/AircraftModel.cxx b/src/GUI/AircraftModel.cxx index a5cac436a..0802767eb 100644 --- a/src/GUI/AircraftModel.cxx +++ b/src/GUI/AircraftModel.cxx @@ -283,9 +283,33 @@ private: AircraftItemModel::AircraftItemModel(QObject* pr, simgear::pkg::RootRef& rootRef) : QAbstractListModel(pr), + m_scanThread(NULL), m_packageRoot(rootRef) { - QStringList dirs; +} + +AircraftItemModel::~AircraftItemModel() +{ + abandonCurrentScan(); +} + +void AircraftItemModel::setPaths(QStringList paths) +{ + m_paths = paths; +} + +void AircraftItemModel::scanDirs() +{ + abandonCurrentScan(); + + beginResetModel(); + qDeleteAll(m_items); + m_items.clear(); + m_activeVariant.clear(); + endResetModel(); + + QStringList dirs = m_paths; + Q_FOREACH(std::string ap, globals->get_aircraft_paths()) { dirs << QString::fromStdString(ap); } @@ -300,14 +324,16 @@ AircraftItemModel::AircraftItemModel(QObject* pr, simgear::pkg::RootRef& rootRef connect(m_scanThread, &AircraftScanThread::addedItems, this, &AircraftItemModel::onScanResults); m_scanThread->start(); + } -AircraftItemModel::~AircraftItemModel() +void AircraftItemModel::abandonCurrentScan() { if (m_scanThread) { m_scanThread->setDone(); m_scanThread->wait(1000); delete m_scanThread; + m_scanThread = NULL; } } diff --git a/src/GUI/AircraftModel.hxx b/src/GUI/AircraftModel.hxx index 61322b09a..24236a281 100644 --- a/src/GUI/AircraftModel.hxx +++ b/src/GUI/AircraftModel.hxx @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -73,6 +74,10 @@ public: ~AircraftItemModel(); + void setPaths(QStringList paths); + + void scanDirs(); + virtual int rowCount(const QModelIndex& parent) const { return m_items.size(); @@ -90,6 +95,9 @@ private slots: void onScanFinished(); private: + void abandonCurrentScan(); + + QStringList m_paths; AircraftScanThread* m_scanThread; QList m_items; QList m_activeVariant; diff --git a/src/GUI/Launcher.ui b/src/GUI/Launcher.ui index ab9af86ae..521938756 100644 --- a/src/GUI/Launcher.ui +++ b/src/GUI/Launcher.ui @@ -6,8 +6,8 @@ 0 0 - 700 - 700 + 667 + 821 @@ -373,15 +373,15 @@ Settings - + - 10 + 8 - 10 + 8 - 10 + 8 @@ -441,6 +441,34 @@ + + + + + + Season: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Summer + + + + + Winter + + + + + + @@ -448,7 +476,7 @@ - + Enable deferred rendering (Rembrandt) @@ -462,7 +490,7 @@ - + @@ -502,6 +530,13 @@ + + + + Start full-screen + + + @@ -509,7 +544,28 @@ - + + + + + + Custom aircraft directory: + + + + + + + Open in Finder + + + false + + + + + + Additional scenery locations @@ -530,9 +586,6 @@ 0 - - - @@ -584,66 +637,91 @@ + + + - - - - - - Season: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - + + + + Additional aircraft locations + + + + 8 + + + 8 + + + 8 + + + 8 + + + 0 + + + + + + + + Qt::Horizontal + + + + 567 + 20 + + + + + + + + + 0 + 0 + + + + + 20 + 20 + + - Summer + - + + + + + + + + 0 + 0 + + + + + 20 + 20 + - - - Winter + + - - - - - - - - - Start full-screen - + + + - - - - - - Custom aircraft directory: - - - - - - - Open in Finder - - - false - - - - - - + Additional options @@ -662,8 +740,7 @@ 8 - - + diff --git a/src/GUI/QtLauncher.cxx b/src/GUI/QtLauncher.cxx index b1fd032ee..86eb19e3a 100644 --- a/src/GUI/QtLauncher.cxx +++ b/src/GUI/QtLauncher.cxx @@ -411,7 +411,8 @@ QtLauncher::QtLauncher() : // will happen as normal http->init(); - m_aircraftProxy->setSourceModel(new AircraftItemModel(this, r)); + m_aircraftModel = new AircraftItemModel(this, r); + m_aircraftProxy->setSourceModel(m_aircraftModel); m_aircraftProxy->setFilterCaseSensitivity(Qt::CaseInsensitive); m_aircraftProxy->setSortCaseSensitivity(Qt::CaseInsensitive); @@ -498,6 +499,15 @@ QtLauncher::QtLauncher() : this, &QtLauncher::onAddSceneryPath); connect(m_ui->removeSceneryPath, &QToolButton::clicked, this, &QtLauncher::onRemoveSceneryPath); + + connect(m_ui->addAircraftPath, &QToolButton::clicked, + this, &QtLauncher::onAddAircraftPath); + connect(m_ui->removeAircraftPath, &QToolButton::clicked, + this, &QtLauncher::onRemoveAircraftPath); + + QSettings settings; + m_aircraftModel->setPaths(settings.value("aircraft-paths").toStringList()); + m_aircraftModel->scanDirs(); } QtLauncher::~QtLauncher() @@ -598,6 +608,9 @@ void QtLauncher::restoreSettings() QStringList sceneryPaths = settings.value("scenery-paths").toStringList(); m_ui->sceneryPathsList->addItems(sceneryPaths); + QStringList aircraftPaths = settings.value("aircraft-paths").toStringList(); + m_ui->aircraftPathsList->addItems(aircraftPaths); + m_ui->commandLineArgs->setPlainText(settings.value("additional-args").toString()); } @@ -622,6 +635,13 @@ void QtLauncher::saveSettings() } settings.setValue("scenery-paths", paths); + paths.clear(); + + for (int i=0; iaircraftPathsList->count(); ++i) { + paths.append(m_ui->aircraftPathsList->item(i)->text()); + } + + settings.setValue("aircraft-paths", paths); settings.setValue("additional-args", m_ui->commandLineArgs->toPlainText()); } @@ -712,6 +732,12 @@ void QtLauncher::onRun() opt->addOption("fg-scenery", path.toStdString()); } + // aircraft paths + for (int i=0; iaircraftPathsList->count(); ++i) { + QString path = m_ui->aircraftPathsList->item(i)->text(); + opt->addOption("fg-aircraft", path.toStdString()); + } + // additional arguments ArgumentsTokenizer tk; Q_FOREACH(ArgumentsTokenizer::Arg a, tk.tokenize(m_ui->commandLineArgs->toPlainText())) { @@ -1043,6 +1069,28 @@ void QtLauncher::onRemoveSceneryPath() } } +void QtLauncher::onAddAircraftPath() +{ + QString path = QFileDialog::getExistingDirectory(this, tr("Choose aircraft folder")); + if (!path.isEmpty()) { + m_ui->aircraftPathsList->addItem(path); + saveSettings(); + + // re-scan the aircraft list + QSettings settings; + m_aircraftModel->setPaths(settings.value("aircraft-paths").toStringList()); + m_aircraftModel->scanDirs(); + } +} + +void QtLauncher::onRemoveAircraftPath() +{ + if (m_ui->aircraftPathsList->currentItem()) { + delete m_ui->aircraftPathsList->currentItem(); + saveSettings(); + } +} + void QtLauncher::onRembrandtToggled(bool b) { // Rembrandt and multi-sample are exclusive diff --git a/src/GUI/QtLauncher.hxx b/src/GUI/QtLauncher.hxx index e4557cb54..43e4602b7 100644 --- a/src/GUI/QtLauncher.hxx +++ b/src/GUI/QtLauncher.hxx @@ -37,6 +37,7 @@ namespace Ui class AirportSearchModel; class QModelIndex; class AircraftProxyModel; +class AircraftItemModel; class QCheckBox; class QtLauncher : public QDialog @@ -76,6 +77,10 @@ private slots: void onAddSceneryPath(); void onRemoveSceneryPath(); + void onAddAircraftPath(); + void onRemoveAircraftPath(); + + void onRembrandtToggled(bool b); void onSubsytemIdleTimeout(); @@ -94,7 +99,8 @@ private: QScopedPointer m_ui; AirportSearchModel* m_airportsModel; AircraftProxyModel* m_aircraftProxy; - + AircraftItemModel* m_aircraftModel; + FGAirportRef m_selectedAirport; QString m_selectedAircraft; -- 2.39.5