Skip to content

Commit

Permalink
Don't raise an error when a tileset image isn't found
Browse files Browse the repository at this point in the history
For now it will just load the map. The used tiles won't render in the
map view but will show with a "missing image" icon in the tileset view.

Using the previously added Edit Tileset functionality, the user can
restore any broken image reference.

Issue #913
  • Loading branch information
bjorn committed Oct 26, 2015
1 parent f5aabed commit fc289a1
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 17 deletions.
9 changes: 2 additions & 7 deletions src/libtiled/mapreader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,13 +268,8 @@ Map *MapReaderPrivate::readMap()
// Try to load the tileset images
auto tilesets = mMap->tilesets();
for (SharedTileset &tileset : tilesets) {
if (!tileset->imageSource().isEmpty()) {
if (!tileset->loadImage()) {
mError = tr("Error loading tileset image:\n'%1'").arg(tileset->imageSource());
mMap.reset();
return nullptr;
}
}
if (!tileset->imageSource().isEmpty())
tileset->loadImage();
}

mMap->recomputeDrawMargins();
Expand Down
28 changes: 19 additions & 9 deletions src/libtiled/varianttomapconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ Map *VariantToMapConverter::toMap(const QVariant &variant,
map->addLayer(layer);
}

// Try to load the tileset images
auto tilesets = map->tilesets();
for (SharedTileset &tileset : tilesets) {
if (!tileset->imageSource().isEmpty())
tileset->loadImage();
}

return map.take();
}

Expand Down Expand Up @@ -175,20 +182,23 @@ SharedTileset VariantToMapConverter::toTileset(const QVariant &variant)

tileset->setTileOffset(QPoint(tileOffsetX, tileOffsetY));

const QString trans = variantMap[QLatin1String("transparentcolor")].toString();
if (!trans.isEmpty() && QColor::isValidColor(trans))
tileset->setTransparentColor(QColor(trans));

QVariant imageVariant = variantMap[QLatin1String("image")];

if (!imageVariant.isNull()) {
QString imagePath = resolvePath(mMapDir, imageVariant);
if (!tileset->loadFromImage(imagePath)) {
mError = tr("Error loading tileset image:\n'%1'").arg(imagePath);
return SharedTileset();
}
const int imageWidth = variantMap[QLatin1String("imagewidth")].toInt();
const int imageHeight = variantMap[QLatin1String("imageheight")].toInt();

ImageReference imageRef;
imageRef.source = resolvePath(mMapDir, imageVariant);
imageRef.size = QSize(imageWidth, imageHeight);

tileset->setImageReference(imageRef);
}

const QString trans = variantMap[QLatin1String("transparentcolor")].toString();
if (!trans.isEmpty() && QColor::isValidColor(trans))
tileset->setTransparentColor(QColor(trans));

tileset->setProperties(toProperties(variantMap[QLatin1String("properties")]));

// Read terrains
Expand Down
14 changes: 13 additions & 1 deletion src/tiled/tilesetview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,19 @@ void TileDelegate::paint(QPainter *painter,
const QPixmap &tileImage = tile->image();
const int extra = mTilesetView->drawGrid() ? 1 : 0;
const qreal zoom = mTilesetView->scale();
const QSize tileSize = (tileImage.isNull() ? QSize(32, 32) : tileImage.size()) * zoom;

QSize tileSize = tileImage.size();
if (tileImage.isNull()) {
Tileset *tileset = model->tileset();
if (tileset->imageSource().isEmpty()) {
tileSize = QSize(32, 32);
} else {
int max = std::max(tileset->tileWidth(), tileset->tileWidth());
int min = std::min(max, 32);
tileSize = QSize(min, min);
}
}
tileSize *= zoom;

// Compute rectangle to draw the image in: bottom- and left-aligned
QRect targetRect = option.rect.adjusted(0, 0, -extra, -extra);
Expand Down

0 comments on commit fc289a1

Please # to comment.