Add clipping capabilities to overlay scripting api

This commit is contained in:
Marcus Huderle 2022-10-10 11:22:38 -05:00
parent fc2f91023f
commit 47b6669feb
4 changed files with 54 additions and 0 deletions

View file

@ -32,6 +32,10 @@ public:
Q_INVOKABLE void setX(int x); Q_INVOKABLE void setX(int x);
Q_INVOKABLE void setY(int y, int layer); Q_INVOKABLE void setY(int y, int layer);
Q_INVOKABLE void setY(int y); Q_INVOKABLE void setY(int y);
Q_INVOKABLE void setClippingRect(int x, int y, int width, int height, int layer);
Q_INVOKABLE void setClippingRect(int x, int y, int width, int height);
Q_INVOKABLE void clearClippingRect(int layer);
Q_INVOKABLE void clearClippingRect();
Q_INVOKABLE QJSValue getPosition(int layer = 0); Q_INVOKABLE QJSValue getPosition(int layer = 0);
Q_INVOKABLE void setPosition(int x, int y, int layer); Q_INVOKABLE void setPosition(int x, int y, int layer);
Q_INVOKABLE void setPosition(int x, int y); Q_INVOKABLE void setPosition(int x, int y);

View file

@ -76,6 +76,7 @@ public:
this->y = 0; this->y = 0;
this->hidden = false; this->hidden = false;
this->opacity = 1.0; this->opacity = 1.0;
this->clippingRect = nullptr;
} }
~Overlay() { ~Overlay() {
this->clearItems(); this->clearItems();
@ -88,6 +89,8 @@ public:
int getY(); int getY();
void setX(int x); void setX(int x);
void setY(int y); void setY(int y);
void setClippingRect(QRectF rect);
void clearClippingRect();
void setPosition(int x, int y); void setPosition(int x, int y);
void move(int deltaX, int deltaY); void move(int deltaX, int deltaY);
void renderItems(QPainter *painter); void renderItems(QPainter *painter);
@ -103,6 +106,7 @@ private:
int y; int y;
bool hidden; bool hidden;
qreal opacity; qreal opacity;
QRectF *clippingRect;
}; };
#endif // OVERLAY_H #endif // OVERLAY_H

View file

@ -79,6 +79,29 @@ void MapView::setY(int y) {
this->scene()->update(); this->scene()->update();
} }
void MapView::setClippingRect(int x, int y, int width, int height, int layer) {
this->getOverlay(layer)->setClippingRect(QRectF(x, y, width, height));
this->scene()->update();
}
void MapView::setClippingRect(int x, int y, int width, int height) {
QRectF rect = QRectF(x, y, width, height);
foreach (Overlay * layer, this->overlayMap)
layer->setClippingRect(rect);
this->scene()->update();
}
void MapView::clearClippingRect(int layer) {
this->getOverlay(layer)->clearClippingRect();
this->scene()->update();
}
void MapView::clearClippingRect() {
foreach (Overlay * layer, this->overlayMap)
layer->clearClippingRect();
this->scene()->update();
}
QJSValue MapView::getPosition(int layer) { QJSValue MapView::getPosition(int layer) {
Overlay * overlay = this->getOverlay(layer); Overlay * overlay = this->getOverlay(layer);
return Scripting::position(overlay->getX(), overlay->getY()); return Scripting::position(overlay->getX(), overlay->getY());

View file

@ -26,11 +26,20 @@ void OverlayImage::render(QPainter *painter, int x, int y) {
void Overlay::renderItems(QPainter *painter) { void Overlay::renderItems(QPainter *painter) {
if (this->hidden) return; if (this->hidden) return;
if (this->clippingRect) {
painter->setClipping(true);
painter->setClipRect(*this->clippingRect);
}
qreal oldOpacity = painter->opacity(); qreal oldOpacity = painter->opacity();
painter->setOpacity(this->opacity); painter->setOpacity(this->opacity);
for (auto item : this->items) for (auto item : this->items)
item->render(painter, this->x, this->y); item->render(painter, this->x, this->y);
painter->setOpacity(oldOpacity); painter->setOpacity(oldOpacity);
if (this->clippingRect) {
painter->setClipping(false);
}
} }
void Overlay::clearItems() { void Overlay::clearItems() {
@ -80,6 +89,20 @@ void Overlay::setY(int y) {
this->y = y; this->y = y;
} }
void Overlay::setClippingRect(QRectF rect) {
if (this->clippingRect) {
delete this->clippingRect;
}
this->clippingRect = new QRectF(rect);
}
void Overlay::clearClippingRect() {
if (this->clippingRect) {
delete this->clippingRect;
}
this->clippingRect = nullptr;
}
void Overlay::setPosition(int x, int y) { void Overlay::setPosition(int x, int y) {
this->x = x; this->x = x;
this->y = y; this->y = y;