presentation/MapTileStyles.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "MapTileStyles.h" | ||
| 2 | |||
| 3 | #include <QFile> | ||
| 4 | #include <QJsonArray> | ||
| 5 | #include <QJsonDocument> | ||
| 6 | #include <QJsonObject> | ||
| 7 | #include <QLoggingCategory> | ||
| 8 | #include <algorithm> | ||
| 9 | |||
| 10 | Q_DECLARE_LOGGING_CATEGORY(lcMapTiles) | ||
| 11 | |||
| 12 | namespace MapTileStyles { | ||
| 13 | namespace { | ||
| 14 | |||
| 15 | 44 | QJsonObject catalog() { | |
| 16 |
1/1✓ Branch 5 → 6 taken 44 times.
|
44 | QFile file(QStringLiteral(":/contacts/map-styles.json")); |
| 17 |
2/3✓ Branch 9 → 10 taken 44 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 13 taken 44 times.
|
44 | if (!file.open(QIODevice::ReadOnly)) |
| 18 | ✗ | return {}; | |
| 19 |
3/3✓ Branch 13 → 14 taken 44 times.
✓ Branch 14 → 15 taken 44 times.
✓ Branch 15 → 16 taken 44 times.
|
44 | return QJsonDocument::fromJson(file.readAll()).object(); |
| 20 | 44 | } | |
| 21 | |||
| 22 | } // namespace | ||
| 23 | |||
| 24 | 1508 | const QList<Provider> &providers() { | |
| 25 | 22 | static const QList<Provider> catalogProviders = [] { | |
| 26 | 22 | QList<Provider> loaded; | |
| 27 |
8/8✓ Branch 2 → 3 taken 22 times.
✓ Branch 6 → 7 taken 22 times.
✓ Branch 7 → 8 taken 22 times.
✓ Branch 12 → 13 taken 22 times.
✓ Branch 13 → 14 taken 22 times.
✓ Branch 16 → 17 taken 110 times.
✓ Branch 50 → 15 taken 110 times.
✓ Branch 50 → 51 taken 22 times.
|
154 | for (const QJsonValue &item : catalog().value(QStringLiteral("providers")).toArray()) { |
| 28 |
1/1✓ Branch 17 → 18 taken 110 times.
|
110 | const QJsonObject object = item.toObject(); |
| 29 |
2/2✓ Branch 21 → 22 taken 110 times.
✓ Branch 26 → 27 taken 110 times.
|
330 | Provider provider{object.value(QStringLiteral("id")).toString(), object.value(QStringLiteral("name")).toString(), |
| 30 |
4/8✓ Branch 22 → 23 taken 110 times.
✓ Branch 27 → 28 taken 110 times.
✓ Branch 31 → 32 taken 110 times.
✓ Branch 32 → 33 taken 110 times.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 103 not taken.
|
330 | object.value(QStringLiteral("keyUrl")).toString()}; |
| 31 |
1/2✓ Branch 43 → 44 taken 110 times.
✗ Branch 43 → 45 not taken.
|
110 | if (!provider.id.isEmpty()) |
| 32 |
1/1✓ Branch 44 → 45 taken 110 times.
|
110 | loaded.append(provider); |
| 33 | 132 | } | |
| 34 |
1/2✗ Branch 53 → 54 not taken.
✓ Branch 53 → 65 taken 22 times.
|
22 | if (loaded.isEmpty()) |
| 35 | ✗ | loaded.append(Provider{QStringLiteral("osm"), QStringLiteral("OpenStreetMap"), QString()}); | |
| 36 | 22 | return loaded; | |
| 37 |
4/7✓ Branch 2 → 3 taken 22 times.
✓ Branch 2 → 9 taken 1486 times.
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 22 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
|
1508 | }(); |
| 38 | 1508 | return catalogProviders; | |
| 39 | } | ||
| 40 | |||
| 41 | 12 | const Provider &providerById(const QString &id) { | |
| 42 |
2/3✓ Branch 2 → 3 taken 12 times.
✓ Branch 11 → 5 taken 28 times.
✗ Branch 11 → 12 not taken.
|
28 | for (const Provider &provider : providers()) |
| 43 |
2/2✓ Branch 7 → 8 taken 12 times.
✓ Branch 7 → 9 taken 16 times.
|
28 | if (provider.id == id) |
| 44 | 12 | return provider; | |
| 45 | ✗ | return providers().first(); | |
| 46 | } | ||
| 47 | |||
| 48 | 3709 | const QList<Style> &all() { | |
| 49 | 22 | static const QList<Style> styles = [] { | |
| 50 | 22 | QList<Style> loaded; | |
| 51 |
8/8✓ Branch 2 → 3 taken 22 times.
✓ Branch 6 → 7 taken 22 times.
✓ Branch 7 → 8 taken 22 times.
✓ Branch 12 → 13 taken 22 times.
✓ Branch 13 → 14 taken 22 times.
✓ Branch 16 → 17 taken 638 times.
✓ Branch 105 → 15 taken 638 times.
✓ Branch 105 → 106 taken 22 times.
|
682 | for (const QJsonValue &item : catalog().value(QStringLiteral("styles")).toArray()) { |
| 52 |
1/1✓ Branch 17 → 18 taken 638 times.
|
638 | const QJsonObject object = item.toObject(); |
| 53 | 638 | Style style; | |
| 54 |
2/2✓ Branch 21 → 22 taken 638 times.
✓ Branch 22 → 23 taken 638 times.
|
638 | style.id = object.value(QStringLiteral("id")).toString(); |
| 55 |
2/2✓ Branch 31 → 32 taken 638 times.
✓ Branch 32 → 33 taken 638 times.
|
638 | style.provider = object.value(QStringLiteral("provider")).toString(); |
| 56 |
2/2✓ Branch 41 → 42 taken 638 times.
✓ Branch 42 → 43 taken 638 times.
|
638 | style.name = object.value(QStringLiteral("name")).toString(); |
| 57 |
2/2✓ Branch 51 → 52 taken 638 times.
✓ Branch 52 → 53 taken 638 times.
|
638 | style.templateUrl = object.value(QStringLiteral("template")).toString(); |
| 58 |
2/2✓ Branch 61 → 62 taken 638 times.
✓ Branch 62 → 63 taken 638 times.
|
638 | style.attribution = object.value(QStringLiteral("attribution")).toString(); |
| 59 |
3/3✓ Branch 71 → 72 taken 638 times.
✓ Branch 72 → 73 taken 638 times.
✓ Branch 73 → 74 taken 638 times.
|
1276 | style.maxZoom = qBound(1, object.value(QStringLiteral("maxZoom")).toInt(19), 19); |
| 60 |
3/3✓ Branch 80 → 81 taken 638 times.
✓ Branch 81 → 82 taken 638 times.
✓ Branch 82 → 83 taken 638 times.
|
1276 | style.parallel = qBound(1, object.value(QStringLiteral("parallel")).toInt(2), 4); |
| 61 | // A style of an unknown provider is left out: its key could not be asked for. | ||
| 62 |
3/3✓ Branch 86 → 87 taken 638 times.
✓ Branch 88 → 89 taken 638 times.
✓ Branch 90 → 91 taken 638 times.
|
638 | const bool known = std::any_of(providers().cbegin(), providers().cend(), |
| 63 | 1958 | [&style](const Provider &provider) { return provider.id == style.provider; }); | |
| 64 |
4/8✓ Branch 92 → 93 taken 638 times.
✗ Branch 92 → 97 not taken.
✓ Branch 94 → 95 taken 638 times.
✗ Branch 94 → 97 not taken.
✓ Branch 95 → 96 taken 638 times.
✗ Branch 95 → 97 not taken.
✓ Branch 98 → 99 taken 638 times.
✗ Branch 98 → 100 not taken.
|
638 | if (!style.id.isEmpty() && !style.templateUrl.isEmpty() && known) |
| 65 |
1/1✓ Branch 99 → 100 taken 638 times.
|
638 | loaded.append(style); |
| 66 | 660 | } | |
| 67 |
1/2✗ Branch 108 → 109 not taken.
✓ Branch 108 → 141 taken 22 times.
|
22 | if (loaded.isEmpty()) { |
| 68 | ✗ | qCWarning(lcMapTiles) << "Map style catalog missing or empty; using OpenStreetMap"; | |
| 69 | ✗ | loaded.append({QStringLiteral("osm"), providers().first().id, QStringLiteral("OpenStreetMap"), | |
| 70 | ✗ | QStringLiteral("https://tile.openstreetmap.org/{z}/{x}/{y}.png"), | |
| 71 | ✗ | QStringLiteral("© OpenStreetMap contributors"), 19, 2}); | |
| 72 | } | ||
| 73 | 22 | return loaded; | |
| 74 |
4/19✓ Branch 2 → 3 taken 22 times.
✓ Branch 2 → 9 taken 3687 times.
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 22 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
✗ Branch 122 → 123 not taken.
✗ Branch 134 → 135 not taken.
✗ Branch 247 → 248 not taken.
✗ Branch 247 → 249 not taken.
✗ Branch 253 → 254 not taken.
✗ Branch 253 → 255 not taken.
✗ Branch 259 → 260 not taken.
✗ Branch 259 → 261 not taken.
✗ Branch 265 → 266 not taken.
✗ Branch 265 → 267 not taken.
✗ Branch 268 → 269 not taken.
✗ Branch 268 → 270 not taken.
|
3709 | }(); |
| 75 | 3709 | return styles; | |
| 76 | } | ||
| 77 | |||
| 78 | 1475 | const Style &byId(const QString &id) { | |
| 79 |
2/3✓ Branch 2 → 3 taken 1475 times.
✓ Branch 11 → 5 taken 3657 times.
✗ Branch 11 → 12 not taken.
|
3657 | for (const Style &style : all()) |
| 80 |
2/2✓ Branch 7 → 8 taken 1475 times.
✓ Branch 7 → 9 taken 2182 times.
|
3657 | if (style.id == id) |
| 81 | 1475 | return style; | |
| 82 | ✗ | return all().first(); | |
| 83 | } | ||
| 84 | |||
| 85 | 859 | bool known(const QString &id) { | |
| 86 | 1968 | return std::any_of(all().cbegin(), all().cend(), [&id](const Style &style) { return style.id == id; }); | |
| 87 | } | ||
| 88 | |||
| 89 | } // namespace MapTileStyles | ||
| 90 |