]> git.mxchange.org Git - flightgear.git/commitdiff
AircraftModel hacking for package support.
authorJames Turner <zakalawe@mac.com>
Fri, 13 Mar 2015 16:29:20 +0000 (17:29 +0100)
committerJames Turner <zakalawe@mac.com>
Fri, 10 Apr 2015 13:44:44 +0000 (14:44 +0100)
src/GUI/AircraftModel.cxx
src/GUI/AircraftModel.hxx

index 0802767eb2c07891dfbe6d0c6b2372510e675e7a..4fd0a08df0bbed1b024aa6eeb1a28812138b0b86 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by James Turner, started March 2015.
 //
-// Copyright (C) 2014 James Turner <zakalawe@mac.com>
+// Copyright (C) 2015 James Turner <zakalawe@mac.com>
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 #include <simgear/props/props_io.hxx>
 #include <simgear/structure/exception.hxx>
 #include <simgear/misc/sg_path.hxx>
+#include <simgear/package/Package.hxx>
+#include <simgear/package/Catalog.hxx>
+#include <simgear/package/Install.hxx>
 
 // FlightGear
 #include <Main/globals.hxx>
 
+using namespace simgear::pkg;
+
 AircraftItem::AircraftItem()
 {
     // oh for C++11 initialisers
@@ -338,46 +343,89 @@ void AircraftItemModel::abandonCurrentScan()
 }
 
 QVariant AircraftItemModel::data(const QModelIndex& index, int role) const
-  {
-      if (role == AircraftVariantRole) {
-          return m_activeVariant.at(index.row());
-      }
+{
+    if (role == AircraftVariantRole) {
+        return m_activeVariant.at(index.row());
+    }
 
-      const AircraftItem* item(m_items.at(index.row()));
+    const AircraftItem* item(m_items.at(index.row()));
+    quint32 variantIndex = m_activeVariant.at(index.row());
+    return dataFromItem(item, variantIndex, role);
+}
 
-      if (role == AircraftVariantCountRole) {
-          return item->variants.count();
-      }
+QVariant AircraftItemModel::dataFromItem(const AircraftItem* item, quint32 variantIndex, int role) const
+{
+    if (role == AircraftVariantCountRole) {
+        return item->variants.count();
+    }
 
-      if (role >= AircraftVariantDescriptionRole) {
-          int variantIndex = role - AircraftVariantDescriptionRole;
-          return item->variants.at(variantIndex)->description;
-      }
+    if (role == AircraftThumbnailCountRole) {
+        QPixmap p = item->thumbnail();
+        return p.isNull() ? 0 : 1;
+    }
 
-      quint32 variantIndex = m_activeVariant.at(index.row());
-      if (variantIndex) {
-          if (variantIndex <= item->variants.count()) {
-              // show the selected variant
-              item = item->variants.at(variantIndex - 1);
-          }
-      }
+    if ((role >= AircraftVariantDescriptionRole) && (role < AircraftThumbnailRole)) {
+        int variantIndex = role - AircraftVariantDescriptionRole;
+        return item->variants.at(variantIndex)->description;
+    }
 
-      if (role == Qt::DisplayRole) {
-          return item->description;
-      } else if (role == Qt::DecorationRole) {
-          return item->thumbnail();
-      } else if (role == AircraftPathRole) {
-          return item->path;
-      } else if (role == AircraftAuthorsRole) {
-          return item->authors;
-      } else if ((role >= AircraftRatingRole) && (role < AircraftVariantDescriptionRole)) {
-          return item->ratings[role - AircraftRatingRole];
-      } else if (role == Qt::ToolTipRole) {
-          return item->path;
-      }
+    if (variantIndex) {
+        if (variantIndex <= item->variants.count()) {
+            // show the selected variant
+            item = item->variants.at(variantIndex - 1);
+        }
+    }
 
-      return QVariant();
-  }
+    if (role == Qt::DisplayRole) {
+        return item->description;
+    } else if (role == Qt::DecorationRole) {
+        return item->thumbnail();
+    } else if (role == AircraftPathRole) {
+        return item->path;
+    } else if (role == AircraftAuthorsRole) {
+        return item->authors;
+    } else if ((role >= AircraftRatingRole) && (role < AircraftVariantDescriptionRole)) {
+        return item->ratings[role - AircraftRatingRole];
+    } else if (role >= AircraftThumbnailRole) {
+        return item->thumbnail();
+    } else if (role == AircraftPackageIdRole) {
+        // can we fake an ID? otherwise fall through to a null variant
+    } else if (role == AircraftPackageStatusRole) {
+        return PackageInstalled; // always the case
+    } else if (role == Qt::ToolTipRole) {
+        return item->path;
+    }
+
+    return QVariant();
+}
+
+QVariant AircraftItemModel::dataFromPackage(const PackageRef& item, quint32 variantIndex, int role) const
+{
+    if (role == Qt::DisplayRole) {
+        return QString::fromStdString(item->description());
+    } else if (role == AircraftPathRole) {
+        // can we return the theoretical path?
+    } else if (role == AircraftPackageIdRole) {
+        return QString::fromStdString(item->id());
+    } else if (role == AircraftPackageStatusRole) {
+        bool installed = item->isInstalled();
+        if (installed) {
+            InstallRef i = item->existingInstall();
+            if (i->isDownloading()) {
+                return PackageDownloading;
+            }
+            if (i->hasUpdate()) {
+                return PackageUpdateAvailable;
+            }
+
+            return PackageInstalled;
+        } else {
+            return PackageNotInstalled;
+        }
+    }
+
+    return QVariant();
+}
 
 bool AircraftItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
   {
index 24236a2816f0303ca4e28b7167822121565769b6..6771cf665d3504a10941fec0836997b1e3c11fcb 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by James Turner, started March 2015.
 //
-// Copyright (C) 2014 James Turner <zakalawe@mac.com>
+// Copyright (C) 2015 James Turner <zakalawe@mac.com>
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -33,8 +33,14 @@ const int AircraftPathRole = Qt::UserRole + 1;
 const int AircraftAuthorsRole = Qt::UserRole + 2;
 const int AircraftVariantRole = Qt::UserRole + 3;
 const int AircraftVariantCountRole = Qt::UserRole + 4;
+const int AircraftThumbnailCountRole = Qt::UserRole + 5;
+const int AircraftPackageIdRole = Qt::UserRole + 6;
+const int AircraftPackageStatusRole = Qt::UserRole + 7;
+const int AircraftPackageProgressRole = Qt::UserRole + 8;
+
 const int AircraftRatingRole = Qt::UserRole + 100;
 const int AircraftVariantDescriptionRole = Qt::UserRole + 200;
+const int AircraftThumbnailRole = Qt::UserRole + 300;
 
 class AircraftScanThread;
 class QDataStream;
@@ -87,14 +93,29 @@ public:
     
     virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
 
-  QModelIndex indexOfAircraftPath(QString path) const;
-
+    /**
+     * given a -set.xml path, return the corresponding model index, if one
+     * exists.
+     */
+    QModelIndex indexOfAircraftPath(QString path) const;
+
+    enum {
+        PackageNotInstalled,
+        PackageInstalled,
+        PackageUpdateAvailable,
+        PackageDownloading
+    };
 private slots:
     void onScanResults();
     
     void onScanFinished();
 
 private:
+    QVariant dataFromItem(const AircraftItem* item, quint32 variantIndex, int role) const;
+
+    QVariant dataFromPackage(const simgear::pkg::PackageRef& item,
+                             quint32 variantIndex, int role) const;
+
     void abandonCurrentScan();
 
     QStringList m_paths;