Add overlay x/y, split singular/plural overlay functions

This commit is contained in:
GriffinR 2021-12-09 12:32:19 -05:00 committed by huderlem
parent 206a1d12b3
commit a6395eefbb
8 changed files with 221 additions and 38 deletions

View file

@ -67,10 +67,26 @@ public:
Q_INVOKABLE void setDimensions(int width, int height);
Q_INVOKABLE void setWidth(int width);
Q_INVOKABLE void setHeight(int height);
Q_INVOKABLE void clearOverlay(int layer = INT_MAX);
Q_INVOKABLE void hideOverlay(int layer = INT_MAX);
Q_INVOKABLE void showOverlay(int layer = INT_MAX);
Q_INVOKABLE void setOverlayVisibility(bool visible, int layer = INT_MAX);
Q_INVOKABLE void clearOverlay(int layer = 0);
Q_INVOKABLE void clearOverlays();
Q_INVOKABLE void hideOverlay(int layer = 0);
Q_INVOKABLE void hideOverlays();
Q_INVOKABLE void showOverlay(int layer = 0);
Q_INVOKABLE void showOverlays();
Q_INVOKABLE bool getOverlayVisibility(int layer = 0);
Q_INVOKABLE void setOverlayVisibility(bool visible, int layer = 0);
Q_INVOKABLE void setOverlaysVisibility(bool visible);
Q_INVOKABLE int getOverlayX(int layer = 0);
Q_INVOKABLE int getOverlayY(int layer = 0);
Q_INVOKABLE void setOverlayX(int x, int layer = 0);
Q_INVOKABLE void setOverlayY(int y, int layer = 0);
Q_INVOKABLE void setOverlaysX(int x);
Q_INVOKABLE void setOverlaysY(int y);
Q_INVOKABLE QJSValue getOverlayPosition(int layer = 0);
Q_INVOKABLE void setOverlayPosition(int x, int y, int layer = 0);
Q_INVOKABLE void setOverlaysPosition(int x, int y);
Q_INVOKABLE void moveOverlay(int deltaX, int deltaY, int layer = 0);
Q_INVOKABLE void moveOverlays(int deltaX, int deltaY);
Q_INVOKABLE void addText(QString text, int x, int y, QString color = "#000000", int fontSize = 12, int layer = 0);
Q_INVOKABLE void addRect(int x, int y, int width, int height, QString color = "#000000", int layer = 0);
Q_INVOKABLE void addFilledRect(int x, int y, int width, int height, QString color = "#000000", int layer = 0);

View file

@ -25,6 +25,7 @@ public:
static QJSValue fromTile(Tile tile);
static Tile toTile(QJSValue obj);
static QJSValue dimensions(int width, int height);
static QJSValue position(int x, int y);
static QJSEngine *getEngine();
static QImage getImage(QString filepath);
static void init(MainWindow *mainWindow);

View file

@ -15,6 +15,10 @@ public:
Overlay * getOverlay(int layer);
void clearOverlays();
void setOverlaysHidden(bool hidden);
void setOverlaysX(int x);
void setOverlaysY(int y);
void setOverlaysPosition(int x, int y);
void moveOverlays(int deltaX, int deltaY);
public:
// GraphicsView_Object object;

View file

@ -10,7 +10,7 @@ class OverlayItem {
public:
OverlayItem() {}
virtual ~OverlayItem() {};
virtual void render(QPainter *) {};
virtual void render(QPainter *, int, int) {};
};
class OverlayText : public OverlayItem {
@ -23,7 +23,7 @@ public:
this->fontSize = fontSize;
}
~OverlayText() {}
virtual void render(QPainter *painter);
virtual void render(QPainter *painter, int x, int y);
private:
QString text;
int x;
@ -43,7 +43,7 @@ public:
this->filled = filled;
}
~OverlayRect() {}
virtual void render(QPainter *painter);
virtual void render(QPainter *painter, int x, int y);
private:
int x;
int y;
@ -61,7 +61,7 @@ public:
this->image = image;
}
~OverlayImage() {}
virtual void render(QPainter *painter);
virtual void render(QPainter *painter, int x, int y);
private:
int x;
int y;
@ -71,11 +71,22 @@ private:
class Overlay
{
public:
Overlay() {}
Overlay() {
this->x = 0;
this->y = 0;
this->hidden = false;
}
~Overlay() {
this->clearItems();
}
bool getHidden();
void setHidden(bool hidden);
int getX();
int getY();
void setX(int x);
void setY(int y);
void setPosition(int x, int y);
void move(int deltaX, int deltaY);
void renderItems(QPainter *painter);
QList<OverlayItem*> getItems();
void clearItems();
@ -85,6 +96,8 @@ public:
bool addImage(int x, int y, QImage image);
private:
QList<OverlayItem*> items;
int x;
int y;
bool hidden;
};

View file

@ -231,11 +231,14 @@ void MainWindow::setHeight(int height) {
void MainWindow::clearOverlay(int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
// INT_MAX is used as an indicator value to refer to all overlays
if (layer == INT_MAX)
this->ui->graphicsView_Map->clearOverlays();
else
this->ui->graphicsView_Map->getOverlay(layer)->clearItems();
this->ui->graphicsView_Map->getOverlay(layer)->clearItems();
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::clearOverlays() {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->clearOverlays();
this->ui->graphicsView_Map->scene()->update();
}
@ -243,51 +246,143 @@ void MainWindow::hideOverlay(int layer) {
this->setOverlayVisibility(false, layer);
}
void MainWindow::hideOverlays() {
this->setOverlaysVisibility(false);
}
void MainWindow::showOverlay(int layer) {
this->setOverlayVisibility(true, layer);
}
void MainWindow::showOverlays() {
this->setOverlaysVisibility(true);
}
bool MainWindow::getOverlayVisibility(int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return false;
return !(this->ui->graphicsView_Map->getOverlay(layer)->getHidden());
}
void MainWindow::setOverlayVisibility(bool visible, int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
if (layer == INT_MAX)
this->ui->graphicsView_Map->setOverlaysHidden(!visible);
else
this->ui->graphicsView_Map->getOverlay(layer)->setHidden(!visible);
this->ui->graphicsView_Map->getOverlay(layer)->setHidden(!visible);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::setOverlaysVisibility(bool visible) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->setOverlaysHidden(!visible);
this->ui->graphicsView_Map->scene()->update();
}
int MainWindow::getOverlayX(int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return 0;
return this->ui->graphicsView_Map->getOverlay(layer)->getX();
}
int MainWindow::getOverlayY(int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return 0;
return this->ui->graphicsView_Map->getOverlay(layer)->getY();
}
void MainWindow::setOverlayX(int x, int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->setX(x);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::setOverlayY(int y, int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->setY(y);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::setOverlaysX(int x) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->setOverlaysX(x);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::setOverlaysY(int y) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->setOverlaysY(y);
this->ui->graphicsView_Map->scene()->update();
}
QJSValue MainWindow::getOverlayPosition(int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return QJSValue();
Overlay * overlay = this->ui->graphicsView_Map->getOverlay(layer);
return Scripting::position(overlay->getX(), overlay->getY());
}
void MainWindow::setOverlayPosition(int x, int y, int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->setPosition(x, y);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::setOverlaysPosition(int x, int y) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->setOverlaysPosition(x, y);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::moveOverlay(int deltaX, int deltaY, int layer) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->move(deltaX, deltaY);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::moveOverlays(int deltaX, int deltaY) {
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->moveOverlays(deltaX, deltaY);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::addText(QString text, int x, int y, QString color, int fontSize, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX)
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->addText(text, x, y, color, fontSize);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::addRect(int x, int y, int width, int height, QString color, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX)
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->addRect(x, y, width, height, color, false);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::addFilledRect(int x, int y, int width, int height, QString color, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX)
if (!this->ui || !this->ui->graphicsView_Map)
return;
this->ui->graphicsView_Map->getOverlay(layer)->addRect(x, y, width, height, color, true);
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::addImage(int x, int y, QString filepath, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX)
if (!this->ui || !this->ui->graphicsView_Map)
return;
if (this->ui->graphicsView_Map->getOverlay(layer)->addImage(x, y, filepath))
this->ui->graphicsView_Map->scene()->update();
}
void MainWindow::createImage(int x, int y, QString filepath, int width, int height, unsigned offset, bool xflip, bool yflip, int paletteId, bool setTransparency, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX
|| !this->editor || !this->editor->map || !this->editor->map->layout
if (!this->ui || !this->ui->graphicsView_Map || !this->editor || !this->editor->map || !this->editor->map->layout
|| !this->editor->map->layout->tileset_primary || !this->editor->map->layout->tileset_secondary)
return;
QList<QRgb> palette;
@ -298,8 +393,7 @@ void MainWindow::createImage(int x, int y, QString filepath, int width, int heig
}
void MainWindow::addTileImage(int x, int y, int tileId, bool xflip, bool yflip, int paletteId, bool setTransparency, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX
|| !this->editor || !this->editor->map || !this->editor->map->layout
if (!this->ui || !this->ui->graphicsView_Map || !this->editor || !this->editor->map || !this->editor->map->layout
|| !this->editor->map->layout->tileset_primary || !this->editor->map->layout->tileset_secondary)
return;
QImage image = getPalettedTileImage(tileId,
@ -314,8 +408,7 @@ void MainWindow::addTileImage(int x, int y, int tileId, bool xflip, bool yflip,
}
void MainWindow::addTilesImage(int x, int y, QJSValue tilesObj, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX
|| !this->editor || !this->editor->map || !this->editor->map->layout
if (!this->ui || !this->ui->graphicsView_Map || !this->editor || !this->editor->map || !this->editor->map->layout
|| !this->editor->map->layout->tileset_primary || !this->editor->map->layout->tileset_secondary)
return;
@ -340,8 +433,7 @@ void MainWindow::addTilesImage(int x, int y, QJSValue tilesObj, int layer) {
}
void MainWindow::addMetatileImage(int x, int y, int metatileId, int layer) {
if (!this->ui || !this->ui->graphicsView_Map || layer == INT_MAX
|| !this->editor || !this->editor->map || !this->editor->map->layout
if (!this->ui || !this->ui->graphicsView_Map || !this->editor || !this->editor->map || !this->editor->map->layout
|| !this->editor->map->layout->tileset_primary || !this->editor->map->layout->tileset_secondary)
return;
QImage image = getMetatileImage(static_cast<uint16_t>(metatileId),

View file

@ -179,6 +179,13 @@ QJSValue Scripting::dimensions(int width, int height) {
return obj;
}
QJSValue Scripting::position(int x, int y) {
QJSValue obj = instance->engine->newObject();
obj.setProperty("x", x);
obj.setProperty("y", y);
return obj;
}
Tile Scripting::toTile(QJSValue obj) {
if (!obj.hasProperty("tileId")
|| !obj.hasProperty("xflip")

View file

@ -34,6 +34,26 @@ void GraphicsView::setOverlaysHidden(bool hidden) {
overlay->setHidden(hidden);
}
void GraphicsView::setOverlaysX(int x) {
foreach (Overlay * overlay, this->overlayMap)
overlay->setX(x);
}
void GraphicsView::setOverlaysY(int y) {
foreach (Overlay * overlay, this->overlayMap)
overlay->setY(y);
}
void GraphicsView::setOverlaysPosition(int x, int y) {
foreach (Overlay * overlay, this->overlayMap)
overlay->setPosition(x, y);
}
void GraphicsView::moveOverlays(int deltaX, int deltaY) {
foreach (Overlay * overlay, this->overlayMap)
overlay->move(deltaX, deltaY);
}
Overlay * GraphicsView::getOverlay(int layer) {
Overlay * overlay = this->overlayMap.value(layer, nullptr);
if (!overlay) {

View file

@ -2,32 +2,32 @@
#include "scripting.h"
#include "log.h"
void OverlayText::render(QPainter *painter) {
void OverlayText::render(QPainter *painter, int x, int y) {
QFont font = painter->font();
font.setPixelSize(this->fontSize);
painter->setFont(font);
painter->setPen(this->color);
painter->drawText(this->x, this->y, this->text);
painter->drawText(this->x + x, this->y + y, this->text);
}
void OverlayRect::render(QPainter *painter) {
void OverlayRect::render(QPainter *painter, int x, int y) {
if (this->filled) {
painter->fillRect(this->x, this->y, this->width, this->height, this->color);
painter->fillRect(this->x + x, this->y + y, this->width, this->height, this->color);
} else {
painter->setPen(this->color);
painter->drawRect(this->x, this->y, this->width, this->height);
painter->drawRect(this->x + x, this->y + y, this->width, this->height);
}
}
void OverlayImage::render(QPainter *painter) {
painter->drawImage(this->x, this->y, this->image);
void OverlayImage::render(QPainter *painter, int x, int y) {
painter->drawImage(this->x + x, this->y + y, this->image);
}
void Overlay::renderItems(QPainter *painter) {
if (this->hidden) return;
for (auto item : this->items)
item->render(painter);
item->render(painter, this->x, this->y);
}
void Overlay::clearItems() {
@ -41,10 +41,40 @@ QList<OverlayItem*> Overlay::getItems() {
return this->items;
}
bool Overlay::getHidden() {
return this->hidden;
}
void Overlay::setHidden(bool hidden) {
this->hidden = hidden;
}
int Overlay::getX() {
return this->x;
}
int Overlay::getY() {
return this->y;
}
void Overlay::setX(int x) {
this->x = x;
}
void Overlay::setY(int y) {
this->y = y;
}
void Overlay::setPosition(int x, int y) {
this->x = x;
this->y = y;
}
void Overlay::move(int deltaX, int deltaY) {
this->x += deltaX;
this->y += deltaY;
}
void Overlay::addText(QString text, int x, int y, QString color, int fontSize) {
this->items.append(new OverlayText(text, x, y, QColor(color), fontSize));
}