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);
}
Example #2
0
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));
}