add EventMove command, fix extra signal call in map border resize
This commit is contained in:
parent
fb1eec1755
commit
a0dc347ad3
10 changed files with 290 additions and 160 deletions
|
@ -2,10 +2,13 @@
|
||||||
#define EDITCOMMANDS_H
|
#define EDITCOMMANDS_H
|
||||||
|
|
||||||
#include <QUndoCommand>
|
#include <QUndoCommand>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
class MapPixmapItem;
|
class MapPixmapItem;
|
||||||
class Map;
|
class Map;
|
||||||
class Blockdata;
|
class Blockdata;
|
||||||
|
class Event;
|
||||||
|
class DraggablePixmapItem;
|
||||||
|
|
||||||
enum CommandId {
|
enum CommandId {
|
||||||
ID_PaintMetatile, // - done
|
ID_PaintMetatile, // - done
|
||||||
|
@ -14,10 +17,11 @@ enum CommandId {
|
||||||
ID_ShiftMetatiles, // - done
|
ID_ShiftMetatiles, // - done
|
||||||
ID_ResizeMap, // - done
|
ID_ResizeMap, // - done
|
||||||
ID_PaintBorder, // - done
|
ID_PaintBorder, // - done
|
||||||
ID_EventMove, // -
|
ID_EventMove, // - done
|
||||||
|
ID_EventShift, // -
|
||||||
ID_EventCreate, // -
|
ID_EventCreate, // -
|
||||||
ID_EventDelete, // -
|
ID_EventDelete, // -
|
||||||
ID_EventSetData, // -
|
ID_EventSetData, // - ?
|
||||||
// Tileset editor history commands
|
// Tileset editor history commands
|
||||||
// Region map editor history commands
|
// Region map editor history commands
|
||||||
};
|
};
|
||||||
|
@ -165,4 +169,28 @@ private:
|
||||||
Blockdata *oldBorder;
|
Blockdata *oldBorder;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
class EventMove : public QUndoCommand {
|
||||||
|
public:
|
||||||
|
EventMove(QList<Event *> events,
|
||||||
|
int deltaX, int deltaY, unsigned actionId,
|
||||||
|
QUndoCommand *parent = nullptr);
|
||||||
|
~EventMove();
|
||||||
|
|
||||||
|
void undo() override;
|
||||||
|
void redo() override;
|
||||||
|
|
||||||
|
bool mergeWith(const QUndoCommand *command) override;
|
||||||
|
int id() const override { return CommandId::ID_EventMove; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<Event *> events;
|
||||||
|
int deltaX;
|
||||||
|
int deltaY;
|
||||||
|
|
||||||
|
unsigned actionId;
|
||||||
|
};
|
||||||
|
|
||||||
#endif // EDITCOMMANDS_H
|
#endif // EDITCOMMANDS_H
|
||||||
|
|
|
@ -22,6 +22,7 @@ public:
|
||||||
static QString HealLocation;
|
static QString HealLocation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DraggablePixmapItem;
|
||||||
class Project;
|
class Project;
|
||||||
class Event
|
class Event
|
||||||
{
|
{
|
||||||
|
@ -97,6 +98,9 @@ public:
|
||||||
int frame = 0;
|
int frame = 0;
|
||||||
bool hFlip = false;
|
bool hFlip = false;
|
||||||
bool usingSprite;
|
bool usingSprite;
|
||||||
|
|
||||||
|
DraggablePixmapItem *pixmapItem = nullptr;
|
||||||
|
void setPixmapItem(DraggablePixmapItem *item) { pixmapItem = item; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // EVENT_H
|
#endif // EVENT_H
|
||||||
|
|
102
include/editor.h
102
include/editor.h
|
@ -145,6 +145,8 @@ public:
|
||||||
|
|
||||||
QUndoGroup editGroup; // Manages the undo history for each map
|
QUndoGroup editGroup; // Manages the undo history for each map
|
||||||
|
|
||||||
|
bool selectingEvent = false;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setConnectionItemsVisible(bool);
|
void setConnectionItemsVisible(bool);
|
||||||
void setBorderItemsVisible(bool, qreal = 1);
|
void setBorderItemsVisible(bool, qreal = 1);
|
||||||
|
@ -204,104 +206,4 @@ signals:
|
||||||
void wheelZoom(int delta);
|
void wheelZoom(int delta);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DraggablePixmapItem : public QObject, public QGraphicsPixmapItem {
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
DraggablePixmapItem(QPixmap pixmap): QGraphicsPixmapItem(pixmap) {
|
|
||||||
}
|
|
||||||
Editor *editor = nullptr;
|
|
||||||
Event *event = nullptr;
|
|
||||||
QGraphicsItemAnimation *pos_anim = nullptr;
|
|
||||||
DraggablePixmapItem(Event *event_, Editor *editor_) : QGraphicsPixmapItem(event_->pixmap) {
|
|
||||||
event = event_;
|
|
||||||
editor = editor_;
|
|
||||||
updatePosition();
|
|
||||||
}
|
|
||||||
bool active;
|
|
||||||
int last_x;
|
|
||||||
int last_y;
|
|
||||||
void updatePosition() {
|
|
||||||
int x = event->getPixelX();
|
|
||||||
int y = event->getPixelY();
|
|
||||||
setX(x);
|
|
||||||
setY(y);
|
|
||||||
if (editor->selected_events && editor->selected_events->contains(this)) {
|
|
||||||
setZValue(event->y() + 1);
|
|
||||||
} else {
|
|
||||||
setZValue(event->y());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void move(int x, int y);
|
|
||||||
void emitPositionChanged() {
|
|
||||||
emit xChanged(event->x());
|
|
||||||
emit yChanged(event->y());
|
|
||||||
emit elevationChanged(event->elevation());
|
|
||||||
}
|
|
||||||
void updatePixmap() {
|
|
||||||
QList<Event*> objects;
|
|
||||||
objects.append(event);
|
|
||||||
event->pixmap = QPixmap();
|
|
||||||
editor->project->loadEventPixmaps(objects);
|
|
||||||
this->updatePosition();
|
|
||||||
editor->redrawObject(this);
|
|
||||||
emit spriteChanged(event->pixmap);
|
|
||||||
}
|
|
||||||
void bind(QComboBox *combo, QString key) {
|
|
||||||
connect(combo, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
|
|
||||||
this, [this, key](QString value){
|
|
||||||
this->event->put(key, value);
|
|
||||||
});
|
|
||||||
connect(this, &DraggablePixmapItem::onPropertyChanged,
|
|
||||||
this, [combo, key](QString key2, QString value){
|
|
||||||
if (key2 == key) {
|
|
||||||
combo->addItem(value);
|
|
||||||
combo->setCurrentText(value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
void bindToUserData(QComboBox *combo, QString key) {
|
|
||||||
connect(combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
|
||||||
this, [this, combo, key](int index) {
|
|
||||||
this->event->put(key, combo->itemData(index).toString());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void positionChanged(Event *event);
|
|
||||||
void xChanged(int);
|
|
||||||
void yChanged(int);
|
|
||||||
void elevationChanged(int);
|
|
||||||
void spriteChanged(QPixmap pixmap);
|
|
||||||
void onPropertyChanged(QString key, QString value);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void set_x(const QString &text) {
|
|
||||||
event->put("x", text);
|
|
||||||
updatePosition();
|
|
||||||
}
|
|
||||||
void set_y(const QString &text) {
|
|
||||||
event->put("y", text);
|
|
||||||
updatePosition();
|
|
||||||
}
|
|
||||||
void set_elevation(const QString &text) {
|
|
||||||
event->put("elevation", text);
|
|
||||||
updatePosition();
|
|
||||||
}
|
|
||||||
void set_sprite(const QString &text) {
|
|
||||||
event->put("sprite", text);
|
|
||||||
updatePixmap();
|
|
||||||
}
|
|
||||||
void set_script(const QString &text) {
|
|
||||||
event->put("script_label", text);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void mousePressEvent(QGraphicsSceneMouseEvent*);
|
|
||||||
void mouseMoveEvent(QGraphicsSceneMouseEvent*);
|
|
||||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent*);
|
|
||||||
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // EDITOR_H
|
#endif // EDITOR_H
|
||||||
|
|
78
include/ui/draggablepixmapitem.h
Normal file
78
include/ui/draggablepixmapitem.h
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
#ifndef DRAGGABLEPIXMAPITEM_H
|
||||||
|
#define DRAGGABLEPIXMAPITEM_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QGraphicsItemGroup>
|
||||||
|
#include <QGraphicsPixmapItem>
|
||||||
|
#include <QGraphicsItemAnimation>
|
||||||
|
|
||||||
|
#include <QtWidgets>
|
||||||
|
|
||||||
|
#include "event.h"
|
||||||
|
|
||||||
|
class Editor;
|
||||||
|
|
||||||
|
class DraggablePixmapItem : public QObject, public QGraphicsPixmapItem {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
DraggablePixmapItem(QPixmap pixmap): QGraphicsPixmapItem(pixmap) {}
|
||||||
|
|
||||||
|
DraggablePixmapItem(Event *event_, Editor *editor_) : QGraphicsPixmapItem(event_->pixmap) {
|
||||||
|
event = event_;
|
||||||
|
event->setPixmapItem(this);
|
||||||
|
editor = editor_;
|
||||||
|
updatePosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
Editor *editor = nullptr;
|
||||||
|
Event *event = nullptr;
|
||||||
|
QGraphicsItemAnimation *pos_anim = nullptr;
|
||||||
|
|
||||||
|
bool active;
|
||||||
|
int last_x;
|
||||||
|
int last_y;
|
||||||
|
|
||||||
|
void updatePosition();
|
||||||
|
void move(int x, int y);
|
||||||
|
void emitPositionChanged();
|
||||||
|
void updatePixmap();
|
||||||
|
void bind(QComboBox *combo, QString key);
|
||||||
|
void bindToUserData(QComboBox *combo, QString key);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void positionChanged(Event *event);
|
||||||
|
void xChanged(int);
|
||||||
|
void yChanged(int);
|
||||||
|
void elevationChanged(int);
|
||||||
|
void spriteChanged(QPixmap pixmap);
|
||||||
|
void onPropertyChanged(QString key, QString value);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void set_x(const QString &text) {
|
||||||
|
event->put("x", text);
|
||||||
|
updatePosition();
|
||||||
|
}
|
||||||
|
void set_y(const QString &text) {
|
||||||
|
event->put("y", text);
|
||||||
|
updatePosition();
|
||||||
|
}
|
||||||
|
void set_elevation(const QString &text) {
|
||||||
|
event->put("elevation", text);
|
||||||
|
updatePosition();
|
||||||
|
}
|
||||||
|
void set_sprite(const QString &text) {
|
||||||
|
event->put("sprite", text);
|
||||||
|
updatePixmap();
|
||||||
|
}
|
||||||
|
void set_script(const QString &text) {
|
||||||
|
event->put("script_label", text);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QGraphicsSceneMouseEvent*);
|
||||||
|
void mouseMoveEvent(QGraphicsSceneMouseEvent*);
|
||||||
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent*);
|
||||||
|
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DRAGGABLEPIXMAPITEM_H
|
|
@ -34,6 +34,7 @@ SOURCES += src/core/block.cpp \
|
||||||
src/lib/orderedjson.cpp \
|
src/lib/orderedjson.cpp \
|
||||||
src/mainwindow_scriptapi.cpp \
|
src/mainwindow_scriptapi.cpp \
|
||||||
src/ui/aboutporymap.cpp \
|
src/ui/aboutporymap.cpp \
|
||||||
|
src/ui/draggablepixmapitem.cpp \
|
||||||
src/ui/bordermetatilespixmapitem.cpp \
|
src/ui/bordermetatilespixmapitem.cpp \
|
||||||
src/ui/collisionpixmapitem.cpp \
|
src/ui/collisionpixmapitem.cpp \
|
||||||
src/ui/connectionpixmapitem.cpp \
|
src/ui/connectionpixmapitem.cpp \
|
||||||
|
@ -100,6 +101,7 @@ HEADERS += include/core/block.h \
|
||||||
include/lib/orderedmap.h \
|
include/lib/orderedmap.h \
|
||||||
include/lib/orderedjson.h \
|
include/lib/orderedjson.h \
|
||||||
include/ui/aboutporymap.h \
|
include/ui/aboutporymap.h \
|
||||||
|
include/ui/draggablepixmapitem.h \
|
||||||
include/ui/bordermetatilespixmapitem.h \
|
include/ui/bordermetatilespixmapitem.h \
|
||||||
include/ui/collisionpixmapitem.h \
|
include/ui/collisionpixmapitem.h \
|
||||||
include/ui/connectionpixmapitem.h \
|
include/ui/connectionpixmapitem.h \
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "editcommands.h"
|
#include "editcommands.h"
|
||||||
#include "mappixmapitem.h"
|
#include "mappixmapitem.h"
|
||||||
|
#include "draggablepixmapitem.h"
|
||||||
#include "bordermetatilespixmapitem.h"
|
#include "bordermetatilespixmapitem.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -247,6 +248,8 @@ void ResizeMap::redo() {
|
||||||
map->layout->border->copyFrom(newBorder);
|
map->layout->border->copyFrom(newBorder);
|
||||||
map->setBorderDimensions(newBorderWidth, newBorderHeight, false);
|
map->setBorderDimensions(newBorderWidth, newBorderHeight, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
map->mapNeedsRedrawing();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResizeMap::undo() {
|
void ResizeMap::undo() {
|
||||||
|
@ -262,7 +265,60 @@ void ResizeMap::undo() {
|
||||||
map->setBorderDimensions(oldBorderWidth, oldBorderHeight, false);
|
map->setBorderDimensions(oldBorderWidth, oldBorderHeight, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
map->mapNeedsRedrawing();
|
||||||
|
|
||||||
QUndoCommand::undo();
|
QUndoCommand::undo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
************************************************************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
EventMove::EventMove(QList<Event *> events,
|
||||||
|
int deltaX, int deltaY, unsigned actionId,
|
||||||
|
QUndoCommand *parent) : QUndoCommand(parent) {
|
||||||
|
setText("Move Event");
|
||||||
|
|
||||||
|
this->events = events;
|
||||||
|
|
||||||
|
this->deltaX = deltaX;
|
||||||
|
this->deltaY = deltaY;
|
||||||
|
|
||||||
|
this->actionId = actionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
EventMove::~EventMove() {}
|
||||||
|
|
||||||
|
void EventMove::redo() {
|
||||||
|
QUndoCommand::redo();
|
||||||
|
|
||||||
|
for (Event *event : events) {
|
||||||
|
event->pixmapItem->move(deltaX, deltaY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventMove::undo() {
|
||||||
|
for (Event *event : events) {
|
||||||
|
event->pixmapItem->move(-deltaX, -deltaY);
|
||||||
|
}
|
||||||
|
|
||||||
|
QUndoCommand::undo();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EventMove::mergeWith(const QUndoCommand *command) {
|
||||||
|
const EventMove *other = static_cast<const EventMove *>(command);
|
||||||
|
|
||||||
|
if (actionId != other->actionId)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
this->deltaX += other->deltaX;
|
||||||
|
this->deltaY += other->deltaY;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
************************************************************************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -345,7 +345,6 @@ void Map::setDimensions(int newWidth, int newHeight, bool setNewBlockdata) {
|
||||||
layout->height = QString::number(newHeight);
|
layout->height = QString::number(newHeight);
|
||||||
|
|
||||||
emit mapChanged(this);
|
emit mapChanged(this);
|
||||||
emit mapNeedsRedrawing();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Map::setBorderDimensions(int newWidth, int newHeight, bool setNewBlockdata) {
|
void Map::setBorderDimensions(int newWidth, int newHeight, bool setNewBlockdata) {
|
||||||
|
@ -357,7 +356,6 @@ void Map::setBorderDimensions(int newWidth, int newHeight, bool setNewBlockdata)
|
||||||
layout->border_height = QString::number(newHeight);
|
layout->border_height = QString::number(newHeight);
|
||||||
|
|
||||||
emit mapChanged(this);
|
emit mapChanged(this);
|
||||||
emit mapNeedsRedrawing();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Block* Map::getBlock(int x, int y) {
|
Block* Map::getBlock(int x, int y) {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
|
#include "draggablepixmapitem.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
#include "imageproviders.h"
|
#include "imageproviders.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
@ -1751,62 +1752,6 @@ Tileset* Editor::getCurrentMapPrimaryTileset()
|
||||||
return project->getTileset(tilesetLabel);
|
return project->getTileset(tilesetLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DraggablePixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *mouse) {
|
|
||||||
active = true;
|
|
||||||
last_x = static_cast<int>(mouse->pos().x() + this->pos().x()) / 16;
|
|
||||||
last_y = static_cast<int>(mouse->pos().y() + this->pos().y()) / 16;
|
|
||||||
this->editor->selectMapEvent(this, mouse->modifiers() & Qt::ControlModifier);
|
|
||||||
//this->editor->updateSelectedEvents();
|
|
||||||
selectingEvent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DraggablePixmapItem::move(int x, int y) {
|
|
||||||
event->setX(event->x() + x);
|
|
||||||
event->setY(event->y() + y);
|
|
||||||
updatePosition();
|
|
||||||
emitPositionChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DraggablePixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *mouse) {
|
|
||||||
if (active) {
|
|
||||||
int x = static_cast<int>(mouse->pos().x() + this->pos().x()) / 16;
|
|
||||||
int y = static_cast<int>(mouse->pos().y() + this->pos().y()) / 16;
|
|
||||||
this->editor->playerViewRect->updateLocation(x, y);
|
|
||||||
this->editor->cursorMapTileRect->updateLocation(x, y);
|
|
||||||
if (x != last_x || y != last_y) {
|
|
||||||
if (editor->selected_events->contains(this)) {
|
|
||||||
for (DraggablePixmapItem *item : *editor->selected_events) {
|
|
||||||
item->move(x - last_x, y - last_y);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
move(x - last_x, y - last_y);
|
|
||||||
}
|
|
||||||
last_x = x;
|
|
||||||
last_y = y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DraggablePixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *) {
|
|
||||||
active = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DraggablePixmapItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *) {
|
|
||||||
if (this->event->get("event_type") == EventType::Warp) {
|
|
||||||
QString destMap = this->event->get("destination_map_name");
|
|
||||||
if (destMap != NONE_MAP_NAME) {
|
|
||||||
emit editor->warpEventDoubleClicked(this->event->get("destination_map_name"), this->event->get("destination_warp"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this->event->get("event_type") == EventType::SecretBase) {
|
|
||||||
QString baseId = this->event->get("secret_base_id");
|
|
||||||
QString destMap = editor->project->mapConstantsToMapNames->value("MAP_" + baseId.left(baseId.lastIndexOf("_")));
|
|
||||||
if (destMap != NONE_MAP_NAME) {
|
|
||||||
emit editor->warpEventDoubleClicked(destMap, "0");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<DraggablePixmapItem *> *Editor::getObjects() {
|
QList<DraggablePixmapItem *> *Editor::getObjects() {
|
||||||
QList<DraggablePixmapItem *> *list = new QList<DraggablePixmapItem *>;
|
QList<DraggablePixmapItem *> *list = new QList<DraggablePixmapItem *>;
|
||||||
for (Event *event : map->getAllEvents()) {
|
for (Event *event : map->getAllEvents()) {
|
||||||
|
@ -1944,6 +1889,7 @@ void Editor::objectsView_onMousePress(QMouseEvent *event) {
|
||||||
this->ui->toolButton_Paint->setChecked(false);
|
this->ui->toolButton_Paint->setChecked(false);
|
||||||
this->ui->toolButton_Select->setChecked(true);
|
this->ui->toolButton_Select->setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool multiSelect = event->modifiers() & Qt::ControlModifier;
|
bool multiSelect = event->modifiers() & Qt::ControlModifier;
|
||||||
if (!selectingEvent && !multiSelect && selected_events->length() > 1) {
|
if (!selectingEvent && !multiSelect && selected_events->length() > 1) {
|
||||||
DraggablePixmapItem *first = selected_events->first();
|
DraggablePixmapItem *first = selected_events->first();
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "customattributestable.h"
|
#include "customattributestable.h"
|
||||||
#include "scripting.h"
|
#include "scripting.h"
|
||||||
#include "adjustingstackedwidget.h"
|
#include "adjustingstackedwidget.h"
|
||||||
|
#include "draggablepixmapitem.h"
|
||||||
#include "editcommands.h"
|
#include "editcommands.h"
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
|
115
src/ui/draggablepixmapitem.cpp
Normal file
115
src/ui/draggablepixmapitem.cpp
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
#include "draggablepixmapitem.h"
|
||||||
|
|
||||||
|
#include "editor.h"
|
||||||
|
|
||||||
|
#include "editcommands.h"
|
||||||
|
|
||||||
|
static unsigned currentActionId = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void DraggablePixmapItem::updatePosition() {
|
||||||
|
int x = event->getPixelX();
|
||||||
|
int y = event->getPixelY();
|
||||||
|
setX(x);
|
||||||
|
setY(y);
|
||||||
|
if (editor->selected_events && editor->selected_events->contains(this)) {
|
||||||
|
setZValue(event->y() + 1);
|
||||||
|
} else {
|
||||||
|
setZValue(event->y());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::emitPositionChanged() {
|
||||||
|
emit xChanged(event->x());
|
||||||
|
emit yChanged(event->y());
|
||||||
|
emit elevationChanged(event->elevation());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::updatePixmap() {
|
||||||
|
QList<Event*> objects;
|
||||||
|
objects.append(event);
|
||||||
|
event->pixmap = QPixmap();
|
||||||
|
editor->project->loadEventPixmaps(objects);
|
||||||
|
this->updatePosition();
|
||||||
|
editor->redrawObject(this);
|
||||||
|
emit spriteChanged(event->pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::bind(QComboBox *combo, QString key) {
|
||||||
|
connect(combo, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentTextChanged),
|
||||||
|
this, [this, key](QString value){
|
||||||
|
this->event->put(key, value);
|
||||||
|
});
|
||||||
|
connect(this, &DraggablePixmapItem::onPropertyChanged,
|
||||||
|
this, [combo, key](QString key2, QString value){
|
||||||
|
if (key2 == key) {
|
||||||
|
combo->addItem(value);
|
||||||
|
combo->setCurrentText(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::bindToUserData(QComboBox *combo, QString key) {
|
||||||
|
connect(combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||||
|
this, [this, combo, key](int index) {
|
||||||
|
this->event->put(key, combo->itemData(index).toString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *mouse) {
|
||||||
|
active = true;
|
||||||
|
last_x = static_cast<int>(mouse->pos().x() + this->pos().x()) / 16;
|
||||||
|
last_y = static_cast<int>(mouse->pos().y() + this->pos().y()) / 16;
|
||||||
|
this->editor->selectMapEvent(this, mouse->modifiers() & Qt::ControlModifier);
|
||||||
|
this->editor->selectingEvent = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::move(int x, int y) {
|
||||||
|
event->setX(event->x() + x);
|
||||||
|
event->setY(event->y() + y);
|
||||||
|
updatePosition();
|
||||||
|
emitPositionChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *mouse) {
|
||||||
|
if (active) {
|
||||||
|
int x = static_cast<int>(mouse->pos().x() + this->pos().x()) / 16;
|
||||||
|
int y = static_cast<int>(mouse->pos().y() + this->pos().y()) / 16;
|
||||||
|
this->editor->playerViewRect->updateLocation(x, y);
|
||||||
|
this->editor->cursorMapTileRect->updateLocation(x, y);
|
||||||
|
if (x != last_x || y != last_y) {
|
||||||
|
QList <Event *> selectedEvents;
|
||||||
|
if (editor->selected_events->contains(this)) {
|
||||||
|
for (DraggablePixmapItem *item : *editor->selected_events) {
|
||||||
|
selectedEvents.append(item->event);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
selectedEvents.append(this->event);
|
||||||
|
}
|
||||||
|
editor->map->editHistory.push(new EventMove(selectedEvents, x - last_x, y - last_y, currentActionId));
|
||||||
|
last_x = x;
|
||||||
|
last_y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *) {
|
||||||
|
active = false;
|
||||||
|
currentActionId++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DraggablePixmapItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *) {
|
||||||
|
if (this->event->get("event_type") == EventType::Warp) {
|
||||||
|
QString destMap = this->event->get("destination_map_name");
|
||||||
|
if (destMap != NONE_MAP_NAME) {
|
||||||
|
emit editor->warpEventDoubleClicked(this->event->get("destination_map_name"), this->event->get("destination_warp"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this->event->get("event_type") == EventType::SecretBase) {
|
||||||
|
QString baseId = this->event->get("secret_base_id");
|
||||||
|
QString destMap = editor->project->mapConstantsToMapNames->value("MAP_" + baseId.left(baseId.lastIndexOf("_")));
|
||||||
|
if (destMap != NONE_MAP_NAME) {
|
||||||
|
emit editor->warpEventDoubleClicked(destMap, "0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue