TileStamp TileStamp::fromJson(const QJsonObject &json, const QDir &mapDir) { TileStamp stamp; stamp.setName(json.value(QLatin1String("name")).toString()); stamp.setQuickStampIndex(static_cast<int>(json.value(QLatin1String("quickStampIndex")).toDouble(-1))); const QJsonArray variations = json.value(QLatin1String("variations")).toArray(); for (const QJsonValue value : variations) { QJsonObject variationJson = value.toObject(); QVariant mapVariant = variationJson.value(QLatin1String("map")).toVariant(); VariantToMapConverter converter; auto map = converter.toMap(mapVariant, mapDir); if (!map) { qDebug() << "Failed to load map for stamp:" << converter.errorString(); continue; } qreal probability = variationJson.value(QLatin1String("probability")).toDouble(1); stamp.addVariation(std::move(map), probability); } return stamp; }
static TileStamp stampFromContext(AbstractTool *selectedTool) { TileStamp stamp; if (StampBrush *stampBrush = dynamic_cast<StampBrush*>(selectedTool)) { // take the stamp from the stamp brush stamp = stampBrush->stamp(); } else if (BucketFillTool *fillTool = dynamic_cast<BucketFillTool*>(selectedTool)) { // take the stamp from the fill tool stamp = fillTool->stamp(); } else if (MapDocument *mapDocument = DocumentManager::instance()->currentDocument()) { // try making a stamp from the current tile selection const TileLayer *tileLayer = dynamic_cast<TileLayer*>(mapDocument->currentLayer()); if (!tileLayer) return stamp; QRegion selection = mapDocument->selectedArea(); if (selection.isEmpty()) return stamp; selection.translate(-tileLayer->position()); QScopedPointer<TileLayer> copy(tileLayer->copy(selection)); if (copy->size().isEmpty()) return stamp; const Map *map = mapDocument->map(); Map *copyMap = new Map(map->orientation(), copy->width(), copy->height(), map->tileWidth(), map->tileHeight()); // Add tileset references to map foreach (const SharedTileset &tileset, copy->usedTilesets()) copyMap->addTileset(tileset); copyMap->setRenderOrder(map->renderOrder()); copyMap->addLayer(copy.take()); stamp.addVariation(copyMap); } return stamp; }