static QJsonValue readLocalValue(const QJsonObject &json, const QString &key) { // start with language_country const QString localeName = QLocale().name(); QString localKey = key + QLatin1Char('[') + localeName + QLatin1Char(']'); QJsonObject::ConstIterator it = json.constFind(localKey); if (it != json.constEnd()) { return it.value(); } // drop _country const int separatorIndex = localeName.indexOf(QLatin1Char('_')); if (separatorIndex != -1) { const int localKeySeparatorIndex = key.length() + 1 + separatorIndex; localKey[localKeySeparatorIndex] = QLatin1Char(']'); localKey.truncate(localKeySeparatorIndex + 1); it = json.constFind(localKey); if (it != json.constEnd()) { return it.value(); } } // default to unlocalized value return json.value(key); }
void PluginSettingsView::handleAddon(const QJsonObject& obj) { m_addonsToRetrieve--; if(m_addonsToRetrieve == 0) { m_progress->setHidden(true); } using Funmap = std::map<QString, std::function<void(QJsonValue)>>; RemoteAddon add; QString smallImage, largeImage; // thank you, Microsh**, for #define small char const Funmap funmap { { "name", [&] (QJsonValue v) { add.name = v.toString(); } }, { "version", [&] (QJsonValue v) { add.version = v.toString(); } }, { "url", [&] (QJsonValue v) { add.latestVersionAddress = v.toString(); } }, { "short", [&] (QJsonValue v) { add.shortDescription = v.toString(); } }, { "long", [&] (QJsonValue v) { add.longDescription = v.toString(); } }, { "small", [&] (QJsonValue v) { smallImage = v.toString(); } }, { "large", [&] (QJsonValue v) { largeImage = v.toString(); } }, { "key", [&] (QJsonValue v) { add.key = UuidKey<iscore::Addon>(v.toString().toLatin1().constData()); } } }; // Add metadata keys for(const auto& k : obj.keys()) { auto it = funmap.find(k); if(it != funmap.end()) { it->second(obj[k]); } } if(add.key.impl().is_nil() || add.name.isEmpty()) { return; } // Add architecture keys add.architectures = addonArchitectures(); for(auto& k : add.architectures) { auto it = obj.constFind(k.first); if(it != obj.constEnd()) { k.second = (*it).toString(); } } // Load images RemotePluginItemModel* model = static_cast<RemotePluginItemModel*>(m_remoteAddons->model()); if(!smallImage.isEmpty()) { // c.f. https://wiki.qt.io/Download_Data_from_URL auto dl = new iscore::FileDownloader{QUrl{smallImage}}; connect(dl, &iscore::FileDownloader::downloaded, this, [=] (QByteArray arr) { model->updateAddon(add.key, [=] (RemoteAddon& add) { add.smallImage.loadFromData(arr); }); dl->deleteLater(); }); } if(!largeImage.isEmpty()) { // c.f. https://wiki.qt.io/Download_Data_from_URL auto dl = new iscore::FileDownloader{QUrl{largeImage}}; connect(dl, &iscore::FileDownloader::downloaded, this, [=] (QByteArray arr) { model->updateAddon(add.key, [=] (RemoteAddon& add) { add.largeImage.loadFromData(arr); }); dl->deleteLater(); }); } model->addAddon(std::move(add)); }