Beispiel #1
0
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;
}
Beispiel #2
0
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;
}