From 780e0f5a02537278578328cd05771734e767010d Mon Sep 17 00:00:00 2001
From: James Turner <zakalawe@mac.com>
Date: Fri, 18 Nov 2016 17:10:02 +0100
Subject: [PATCH] Restore active aircraft variant also.

---
 src/GUI/AircraftModel.cxx | 54 +++++++++++++++++++++++++++++++++++++++
 src/GUI/AircraftModel.hxx |  8 +++++-
 src/GUI/QtLauncher.cxx    |  7 ++++-
 3 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/src/GUI/AircraftModel.cxx b/src/GUI/AircraftModel.cxx
index a9c35f18f..f3ec94944 100644
--- a/src/GUI/AircraftModel.cxx
+++ b/src/GUI/AircraftModel.cxx
@@ -879,6 +879,60 @@ QModelIndex AircraftItemModel::indexOfAircraftURI(QUrl uri) const
     return QModelIndex();
 }
 
+void AircraftItemModel::selectVariantForAircraftURI(QUrl uri)
+{
+    if (uri.isEmpty()) {
+        return;
+    }
+
+    int variantIndex = 0;
+    QModelIndex modelIndex;
+
+    if (uri.isLocalFile()) {
+        QString path = uri.toLocalFile();
+        for (int row=0; row <m_items.size(); ++row) {
+            const AircraftItemPtr item(m_items.at(row));
+            if (item->path == path) {
+                modelIndex = index(row);
+                variantIndex = 0;
+                break;
+            }
+
+            // check variants too
+            for (int vr=0; vr < item->variants.size(); ++vr) {
+                if (item->variants.at(vr)->path == path) {
+                    modelIndex = index(row);
+                    variantIndex = vr + 1;
+                    break;
+                }
+            }
+        }
+    } else if (uri.scheme() == "package") {
+        QString ident = uri.path();
+        int rowOffset = m_items.size();
+
+        PackageRef pkg = m_packageRoot->getPackageById(ident.toStdString());
+        if (pkg) {
+            for (size_t i=0; i < m_packages.size(); ++i) {
+                if (m_packages[i] == pkg) {
+                    modelIndex =  index(rowOffset + i);
+                    variantIndex = pkg->indexOfVariant(ident.toStdString());
+                    break;
+                }
+            } // of linear package scan
+        }
+    } else {
+        qWarning() << "Unknown aircraft URI scheme" << uri << uri.scheme();
+        return;
+    }
+
+    if (modelIndex.isValid()) {
+        qDebug() << "selected variant index" << variantIndex << "at" << modelIndex
+        << "for variant" << uri;
+        setData(modelIndex, variantIndex, AircraftVariantRole);
+    }
+}
+
 void AircraftItemModel::onScanResults()
 {
     QVector<AircraftItemPtr> newItems = m_scanThread->items();
diff --git a/src/GUI/AircraftModel.hxx b/src/GUI/AircraftModel.hxx
index 71fc8fe4e..3731c167f 100644
--- a/src/GUI/AircraftModel.hxx
+++ b/src/GUI/AircraftModel.hxx
@@ -127,7 +127,13 @@ public:
      */
 
     QModelIndex indexOfAircraftURI(QUrl uri) const;
-    
+
+    /**
+     * ensure the appropriate variant index is active in the model, for the
+     * corresponding aircraft URI
+     */
+    void selectVariantForAircraftURI(QUrl uri);
+
     /**
      * return if a given aircraft is ready to be run, or not. Aircraft which
      * are not installed, or are downloading, are not runnable.
diff --git a/src/GUI/QtLauncher.cxx b/src/GUI/QtLauncher.cxx
index 9eb8dddf9..329cdbe78 100644
--- a/src/GUI/QtLauncher.cxx
+++ b/src/GUI/QtLauncher.cxx
@@ -869,6 +869,9 @@ void QtLauncher::maybeRestoreAircraftSelection()
         m_ui->aircraftList->selectionModel()->select(proxyIndex,
                                                      QItemSelectionModel::ClearAndSelect);
         m_ui->aircraftList->scrollTo(proxyIndex);
+
+        // and also select the correct variant on the model
+        m_aircraftModel->selectVariantForAircraftURI(m_selectedAircraft);
     }
 }
 
@@ -1340,11 +1343,13 @@ void QtLauncher::onPopupAircraftHistory()
     QPoint popupPos = m_ui->aircraftHistory->mapToGlobal(m_ui->aircraftHistory->rect().bottomLeft());
     QAction* triggered = m.exec(popupPos);
     if (triggered) {
-        m_selectedAircraft = triggered->data().toUrl();
+        const QUrl uri = triggered->data().toUrl();
+        m_selectedAircraft = uri;
         QModelIndex index = proxyIndexForAircraftURI(m_selectedAircraft);
         m_ui->aircraftList->selectionModel()->setCurrentIndex(index,
                                                               QItemSelectionModel::ClearAndSelect);
         m_ui->aircraftFilter->clear();
+        m_aircraftModel->selectVariantForAircraftURI(uri);
         updateSelectedAircraft();
     }
 }