From 180cf6607744bc332207dd6cf43aefb6a0fc6058 Mon Sep 17 00:00:00 2001 From: James Turner Date: Tue, 9 Oct 2018 10:25:50 +0100 Subject: [PATCH] Launcher: tweak sidebar icons --- src/GUI/LauncherController.cxx | 13 ++++++++++ src/GUI/LauncherController.hxx | 9 +++++-- src/GUI/LocalAircraftCache.cxx | 8 ++++-- src/GUI/LocalAircraftCache.hxx | 1 + src/GUI/QmlAircraftInfo.cxx | 37 ++++++++++++++++++++++++---- src/GUI/QmlAircraftInfo.hxx | 1 + src/GUI/assets/icons8-helicopter.svg | 6 +++++ src/GUI/assets/icons8-rocket.svg | 6 +++++ src/GUI/qml/Sidebar.qml | 2 +- src/GUI/resources.qrc | 2 ++ 10 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 src/GUI/assets/icons8-helicopter.svg create mode 100644 src/GUI/assets/icons8-rocket.svg diff --git a/src/GUI/LauncherController.cxx b/src/GUI/LauncherController.cxx index 61cfcd9fe..5f338e936 100644 --- a/src/GUI/LauncherController.cxx +++ b/src/GUI/LauncherController.cxx @@ -826,3 +826,16 @@ void LauncherController::setMinWindowSize(QSize sz) m_window->setMinimumSize(sz); emit minWindowSizeChanged(); } + +QUrl LauncherController::flyIconUrl() const +{ + if (m_aircraftType == Helicopter) { + return QUrl{"qrc:///svg/toolbox-fly-heli"}; + } else if (m_selectedAircraftInfo) { + if (m_selectedAircraftInfo->hasTag("spaceship")) { + return QUrl{"qrc:///svg/toolbox-fly-alt"}; + } + } + + return QUrl{"qrc:///svg/toolbox-fly"}; +} diff --git a/src/GUI/LauncherController.hxx b/src/GUI/LauncherController.hxx index 4c5c7f8a5..1195304eb 100644 --- a/src/GUI/LauncherController.hxx +++ b/src/GUI/LauncherController.hxx @@ -84,6 +84,8 @@ class LauncherController : public QObject Q_PROPERTY(QSize minimumWindowSize READ minWindowSize WRITE setMinWindowSize NOTIFY minWindowSizeChanged) + Q_PROPERTY(QUrl flyIconUrl READ flyIconUrl NOTIFY selectedAircraftChanged) + public: explicit LauncherController(QObject *parent, QWindow* win); @@ -181,7 +183,10 @@ public: return m_minWindowSize; } - void setMinWindowSize(QSize sz); + void setMinWindowSize(QSize sz); + + QUrl flyIconUrl() const; + signals: void selectedAircraftChanged(QUrl selectedAircraft); @@ -265,7 +270,7 @@ private: bool m_inAppMode = false; bool m_keepRunningInAppMode = false; - bool m_appModeResult = true; + bool m_appModeResult = true; }; #endif // LAUNCHERCONTROLLER_HXX diff --git a/src/GUI/LocalAircraftCache.cxx b/src/GUI/LocalAircraftCache.cxx index 9dc929296..3290c6194 100644 --- a/src/GUI/LocalAircraftCache.cxx +++ b/src/GUI/LocalAircraftCache.cxx @@ -37,7 +37,7 @@ #include #include -static quint32 CACHE_VERSION = 11; +static quint32 CACHE_VERSION = 12; const int STANDARD_THUMBNAIL_HEIGHT = 128; //const int STANDARD_THUMBNAIL_WIDTH = 172; @@ -103,8 +103,10 @@ AircraftItem::AircraftItem(QDir dir, QString filePath) // could also consider vtol tag? usesSeaports |= (strcmp(tagName, "seaplane") == 0); usesSeaports |= (strcmp(tagName, "floats") == 0); - needsMaintenance |= (strcmp(tagName, "needs-maintenance") == 0); + + // and actually store the tags + tags.push_back(QString::fromUtf8(tagName)); } } // of tags iteration } // of set-xml has tags @@ -155,6 +157,7 @@ void AircraftItem::fromDataStream(QDataStream& ds) ds >> minFGVersion; ds >> needsMaintenance >> usesHeliports >> usesSeaports; ds >> homepageUrl >> supportUrl >> wikipediaUrl; + ds >> tags; } void AircraftItem::toDataStream(QDataStream& ds) const @@ -171,6 +174,7 @@ void AircraftItem::toDataStream(QDataStream& ds) const ds << minFGVersion; ds << needsMaintenance << usesHeliports << usesSeaports; ds << homepageUrl << supportUrl << wikipediaUrl; + ds << tags; } QPixmap AircraftItem::thumbnail(bool loadIfRequired) const diff --git a/src/GUI/LocalAircraftCache.hxx b/src/GUI/LocalAircraftCache.hxx index af27f8e5f..db229fd84 100644 --- a/src/GUI/LocalAircraftCache.hxx +++ b/src/GUI/LocalAircraftCache.hxx @@ -68,6 +68,7 @@ struct AircraftItem bool isPrimary = false; QString thumbnailPath; QString minFGVersion; + QStringList tags; bool needsMaintenance = false; QUrl homepageUrl; QUrl wikipediaUrl; diff --git a/src/GUI/QmlAircraftInfo.cxx b/src/GUI/QmlAircraftInfo.cxx index 8c97ffe5c..8c2da779b 100644 --- a/src/GUI/QmlAircraftInfo.cxx +++ b/src/GUI/QmlAircraftInfo.cxx @@ -214,7 +214,10 @@ public: QVariant data(const QModelIndex &index, int role) const override { - const StateInfo& s = _data.at(index.row()); + size_t i; + if (!makeSafeIndex(index.row(), i)) + return {}; + const StateInfo& s = _data.at(i); if (role == Qt::DisplayRole) { if (s.name.isEmpty()) { return humanNameFromStateTag(s.primaryTag()); @@ -244,19 +247,21 @@ public: Q_INVOKABLE QString descriptionForState(int row) const { - if ((row < 0) || (row >= _data.size())) + size_t index; + if (!makeSafeIndex(row, index)) return {}; - const StateInfo& s = _data.at(row); + const StateInfo& s = _data.at(index); return s.description; } Q_INVOKABLE QString tagForState(int row) const { - if ((row < 0) || (row >= _data.size())) + size_t index; + if (!makeSafeIndex(row, index)) return {}; - return QString::fromStdString(_data.at(row).primaryTag()); + return QString::fromStdString(_data.at(index).primaryTag()); } bool hasExplicitAuto() const @@ -274,6 +279,15 @@ public: return indexForTag(st.toStdString()) != -1; } private: + bool makeSafeIndex(int row, size_t& t) const + { + if (row < 0) { + return false; + } + t = static_cast(row); + return (t < _data.size()); + } + AircraftStateVec _data; bool _explicitAutoState = false; }; @@ -849,5 +863,18 @@ bool QmlAircraftInfo::isAltitudeBelowLimits(QuantityValue speed) const return true; } +bool QmlAircraftInfo::hasTag(QString tag) const +{ + if (_item) { + return resolveItem()->tags.contains(tag); + } else if (_package) { + const auto& tags = _package->tags(); + auto it = tags.find(tag.toStdString()); + return (it != tags.end()); + } + + return false; +} + #include "QmlAircraftInfo.moc" diff --git a/src/GUI/QmlAircraftInfo.hxx b/src/GUI/QmlAircraftInfo.hxx index 65266b374..ddab2a3e8 100644 --- a/src/GUI/QmlAircraftInfo.hxx +++ b/src/GUI/QmlAircraftInfo.hxx @@ -126,6 +126,7 @@ public: Q_INVOKABLE bool isSpeedBelowLimits(QuantityValue speed) const; Q_INVOKABLE bool isAltitudeBelowLimits(QuantityValue speed) const; + Q_INVOKABLE bool hasTag(QString tag) const; signals: void uriChanged(); void infoChanged(); diff --git a/src/GUI/assets/icons8-helicopter.svg b/src/GUI/assets/icons8-helicopter.svg new file mode 100644 index 000000000..7447c0122 --- /dev/null +++ b/src/GUI/assets/icons8-helicopter.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/GUI/assets/icons8-rocket.svg b/src/GUI/assets/icons8-rocket.svg new file mode 100644 index 000000000..8553c2436 --- /dev/null +++ b/src/GUI/assets/icons8-rocket.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/GUI/qml/Sidebar.qml b/src/GUI/qml/Sidebar.qml index 93e7a0409..60a7520c2 100644 --- a/src/GUI/qml/Sidebar.qml +++ b/src/GUI/qml/Sidebar.qml @@ -74,7 +74,7 @@ Rectangle { anchors.bottom: parent.bottom enabled: _launcher.canFly disabledText: qsTr("The selected aircraft is not installed or has updates pending") - icon: "qrc:///svg/toolbox-fly" + icon: _launcher.flyIconUrl onClicked: _launcher.fly(); } } diff --git a/src/GUI/resources.qrc b/src/GUI/resources.qrc index 4be553cbc..00b56e314 100644 --- a/src/GUI/resources.qrc +++ b/src/GUI/resources.qrc @@ -137,5 +137,7 @@ assets/icons8-puzzle.svg assets/icons8-home.svg assets/icons8-aircraft.svg + assets/icons8-rocket.svg + assets/icons8-helicopter.svg