porymap/include/ui/mapview.h
GriffinR f2bc3613ad
Some checks are pending
Build Porymap / build-linux (, 5.14.2) (push) Waiting to run
Build Porymap / build-linux (, 6.8.*) (push) Waiting to run
Build Porymap / build-linux (minimal, 5.14.2) (push) Waiting to run
Build Porymap / build-macos (macos-15-intel) (push) Waiting to run
Build Porymap / build-macos (macos-latest) (push) Waiting to run
Build Porymap / build-static-windows (push) Waiting to run
Render the layers of each script separately
2026-01-30 01:15:04 -05:00

122 lines
5.4 KiB
C++

#ifndef MAPVIEW_H
#define MAPVIEW_H
#if __has_include(<QJSValue>)
#include <QJSValue>
#endif
#include "graphicsview.h"
#include "overlay.h"
#include "tile.h"
class Editor;
class MapView : public GraphicsView
{
Q_OBJECT
public:
MapView() : MapView(nullptr) {}
MapView(QWidget *parent) : GraphicsView(parent) {
this->enableMiddleMouseButtonScroll = true;
}
Editor *editor;
void clearOverlay();
void renderOverlay(QPainter*);
// Overlay scripting API
#ifdef QT_QML_LIB
Q_INVOKABLE void clear(int layer);
Q_INVOKABLE void clear();
Q_INVOKABLE void hide(int layer);
Q_INVOKABLE void hide();
Q_INVOKABLE void show(int layer);
Q_INVOKABLE void show();
Q_INVOKABLE bool getVisibility(int layer = 0);
Q_INVOKABLE void setVisibility(bool visible, int layer);
Q_INVOKABLE void setVisibility(bool visible);
Q_INVOKABLE int getX(int layer = 0);
Q_INVOKABLE int getY(int layer = 0);
Q_INVOKABLE void setX(int x, int layer);
Q_INVOKABLE void setX(int x);
Q_INVOKABLE void setY(int y, int layer);
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 void setPosition(int x, int y, int layer);
Q_INVOKABLE void setPosition(int x, int y);
Q_INVOKABLE void move(int deltaX, int deltaY, int layer);
Q_INVOKABLE void move(int deltaX, int deltaY);
Q_INVOKABLE int getOpacity(int layer = 0);
Q_INVOKABLE void setOpacity(int opacity, int layer);
Q_INVOKABLE void setOpacity(int opacity);
Q_INVOKABLE qreal getHorizontalScale(int layer = 0);
Q_INVOKABLE qreal getVerticalScale(int layer = 0);
Q_INVOKABLE void setHorizontalScale(qreal scale, int layer);
Q_INVOKABLE void setHorizontalScale(qreal scale);
Q_INVOKABLE void setVerticalScale(qreal scale, int layer);
Q_INVOKABLE void setVerticalScale(qreal scale);
Q_INVOKABLE void setScale(qreal hScale, qreal vScale, int layer);
Q_INVOKABLE void setScale(qreal hScale, qreal vScale);
Q_INVOKABLE int getRotation(int layer = 0);
Q_INVOKABLE void setRotation(int angle, int layer);
Q_INVOKABLE void setRotation(int angle);
Q_INVOKABLE void rotate(int degrees, int layer);
Q_INVOKABLE void rotate(int degrees);
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 borderColor = "#000000", QString fillColor = "transparent", int rounding = 0, int layer = 0);
Q_INVOKABLE void addPath(QList<QList<int>> coords, QString borderColor = "#000000", QString fillColor = "transparent", int layer = 0);
Q_INVOKABLE void addPath(QList<int> xCoords, QList<int> yCoords, QString borderColor = "#000000", QString fillColor = "transparent", int layer = 0);
Q_INVOKABLE void addImage(int x, int y, QString filepath, int layer = 0, bool useCache = true);
Q_INVOKABLE void createImage(int x, int y, QString filepath,
int width = -1, int height = -1, int xOffset = 0, int yOffset = 0,
qreal hScale = 1, qreal vScale = 1, int paletteId = -1, bool setTransparency = false,
int layer = 0, bool useCache = true);
Q_INVOKABLE void addTileImage(int x, int y, int tileId, bool xflip, bool yflip, int paletteId, bool setTransparency = false, int layer = 0);
Q_INVOKABLE void addTileImage(int x, int y, QJSValue tileObj, bool setTransparency = false, int layer = 0);
Q_INVOKABLE void addMetatileImage(int x, int y, int metatileId, bool setTransparency = false, int layer = 0);
Q_INVOKABLE void setRenderPriority(int priority);
#endif // QT_QML_LIB
protected:
virtual void drawForeground(QPainter *painter, const QRectF &rect) override;
virtual void keyPressEvent(QKeyEvent*) override;
virtual void moveEvent(QMoveEvent *event) override;
private:
#ifdef QT_QML_LIB
// Maps a layer number to the overlay items.
// We specifically use a QMap because we guarantee a sorted
// order for the layers so that users can predict rendering.
typedef QMap<int, Overlay*> OverlayLayers;
// Maps a script's file hash to a priority value.
// This priority value is the order in which all layers
// belonging to that script will be rendered relative to
// the layers belonging to other scripts.
// These are normally unique and automatically assigned,
// but users may set this value manually to render scripts
// in an explicit order relative to one another, or even
// to have multiple scripts share layers.
// This is a QMap vs a QHash solely for performance,
// given most users will have relatively few scripts.
QMap<QString, int> hashToPriority;
// Maps a render priority provided by 'hashToPriority'
// to the corresponding overlay layers.
// A QMap is used once again to guarantee render order.
QMap<int, OverlayLayers> overlayMap;
OverlayLayers* getCurrentScriptLayers();
Overlay * getOverlay(int layer);
void updateScene();
void addTileImage(int x, int y, const Tile &tile, bool setTransparency, int layer = 0);
#endif
};
#endif // GRAPHICSVIEW_H