diff --git a/include/core/tileset.h b/include/core/tileset.h index 37a9ee78..cf0bb67c 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -35,6 +35,7 @@ public: static Metatile* getMetatile(int, Tileset*, Tileset*); static QList> getBlockPalettes(Tileset*, Tileset*); static QList getPalette(int, Tileset*, Tileset*); + static bool metatileIsValid(uint16_t metatileId, Tileset *, Tileset *); bool appendToHeaders(QString headerFile, QString friendlyName); bool appendToGraphics(QString graphicsFile, QString friendlyName, bool primary); diff --git a/include/ui/metatileselector.h b/include/ui/metatileselector.h index 8fc3b9fc..1a8dc59c 100644 --- a/include/ui/metatileselector.h +++ b/include/ui/metatileselector.h @@ -48,6 +48,7 @@ private: void updateSelectedMetatiles(); uint16_t getMetatileId(int x, int y); QPoint getMetatileIdCoords(uint16_t); + bool shouldAcceptEvent(QGraphicsSceneMouseEvent*); signals: void hoveredMetatileSelectionChanged(uint16_t); diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index a6a04229..9b305e15 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -66,6 +66,19 @@ Metatile* Tileset::getMetatile(int index, Tileset *primaryTileset, Tileset *seco return metatile; } +bool Tileset::metatileIsValid(uint16_t metatileId, Tileset *primaryTileset, Tileset *secondaryTileset) { + if (metatileId >= Project::getNumMetatilesTotal()) + return false; + + if (metatileId < Project::getNumMetatilesPrimary() && metatileId >= primaryTileset->metatiles->length()) + return false; + + if (metatileId < Project::getNumMetatilesTotal() && metatileId >= Project::getNumMetatilesPrimary() + secondaryTileset->metatiles->length()) + return false; + + return true; +} + QList> Tileset::getBlockPalettes(Tileset *primaryTileset, Tileset *secondaryTileset) { QList> palettes; for (int i = 0; i < Project::getNumPalettesPrimary(); i++) { diff --git a/src/ui/imageproviders.cpp b/src/ui/imageproviders.cpp index 50853793..286badb3 100644 --- a/src/ui/imageproviders.cpp +++ b/src/ui/imageproviders.cpp @@ -18,13 +18,13 @@ QImage getMetatileImage(uint16_t tile, Tileset *primaryTileset, Tileset *seconda Metatile* metatile = Tileset::getMetatile(tile, primaryTileset, secondaryTileset); if (!metatile || !metatile->tiles) { - metatile_image.fill(0xffffffff); + metatile_image.fill(Qt::magenta); return metatile_image; } Tileset* blockTileset = Tileset::getBlockTileset(tile, primaryTileset, secondaryTileset); if (!blockTileset) { - metatile_image.fill(0xffffffff); + metatile_image.fill(Qt::magenta); return metatile_image; } QList> palettes = Tileset::getBlockPalettes(primaryTileset, secondaryTileset); diff --git a/src/ui/metatileselector.cpp b/src/ui/metatileselector.cpp index 54fef4c2..cfe270e5 100644 --- a/src/ui/metatileselector.cpp +++ b/src/ui/metatileselector.cpp @@ -24,6 +24,7 @@ void MetatileSelector::draw() { height_++; } QImage image(this->numMetatilesWide * 16, height_ * 16, QImage::Format_RGBA8888); + image.fill(Qt::magenta); QPainter painter(&image); for (int i = 0; i < length_; i++) { int tile = i; @@ -91,13 +92,20 @@ void MetatileSelector::setExternalSelection(int width, int height, QListgetCellPos(event->pos()); + return Tileset::metatileIsValid(getMetatileId(pos.x(), pos.y()), this->primaryTileset, this->secondaryTileset); +} + void MetatileSelector::mousePressEvent(QGraphicsSceneMouseEvent *event) { + if (!shouldAcceptEvent(event)) return; SelectablePixmapItem::mousePressEvent(event); this->updateSelectedMetatiles(); emit selectedMetatilesChanged(); } void MetatileSelector::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + if (!shouldAcceptEvent(event)) return; SelectablePixmapItem::mouseMoveEvent(event); this->updateSelectedMetatiles(); @@ -108,6 +116,7 @@ void MetatileSelector::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { } void MetatileSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + if (!shouldAcceptEvent(event)) return; SelectablePixmapItem::mouseReleaseEvent(event); this->updateSelectedMetatiles(); emit selectedMetatilesChanged(); @@ -147,9 +156,7 @@ uint16_t MetatileSelector::getMetatileId(int x, int y) { } QPoint MetatileSelector::getMetatileIdCoords(uint16_t metatileId) { - if (metatileId >= Project::getNumMetatilesTotal() - || (metatileId < Project::getNumMetatilesPrimary() && metatileId >= this->primaryTileset->metatiles->length()) - || (metatileId < Project::getNumMetatilesTotal() && metatileId >= Project::getNumMetatilesPrimary() + this->secondaryTileset->metatiles->length())) + if (!Tileset::metatileIsValid(metatileId, this->primaryTileset, this->secondaryTileset)) { // Invalid metatile id. return QPoint(0, 0);