dust3d/src/skeletoneditgraphicsview.cpp

596 lines
22 KiB
C++
Raw Normal View History

2018-03-11 16:02:15 +00:00
#include <QGraphicsPixmapItem>
2018-03-14 15:22:00 +00:00
#include <QXmlStreamWriter>
#include <QFile>
#include <QApplication>
2018-03-28 11:41:33 +00:00
#include <QGuiApplication>
2018-03-13 12:49:24 +00:00
#include <cmath>
2018-03-14 15:22:00 +00:00
#include <map>
#include <vector>
2018-03-19 07:58:51 +00:00
#include <assert.h>
2018-03-11 16:02:15 +00:00
#include "skeletoneditgraphicsview.h"
#include "skeletoneditnodeitem.h"
#include "skeletoneditedgeitem.h"
#include "theme.h"
2018-03-11 16:02:15 +00:00
qreal SkeletonEditGraphicsView::m_initialNodeSize = 128;
2018-03-13 12:49:24 +00:00
qreal SkeletonEditGraphicsView::m_minimalNodeSize = 8;
2018-03-11 16:02:15 +00:00
SkeletonEditGraphicsView::SkeletonEditGraphicsView(QWidget *parent) :
QGraphicsView(parent),
m_pendingNodeItem(NULL),
m_pendingEdgeItem(NULL),
m_inAddNodeMode(true),
m_nextStartNodeItem(NULL),
m_lastHoverNodeItem(NULL),
2018-03-12 13:40:42 +00:00
m_lastMousePos(0, 0),
2018-03-13 06:39:36 +00:00
m_isMovingNodeItem(false),
m_backgroundLoaded(false)
2018-03-11 16:02:15 +00:00
{
setScene(new QGraphicsScene());
2018-03-13 06:39:36 +00:00
m_backgroundItem = new QGraphicsPixmapItem();
2018-03-13 12:49:24 +00:00
m_backgroundItem->setOpacity(0.25);
2018-03-11 16:02:15 +00:00
scene()->addItem(m_backgroundItem);
m_pendingNodeItem = new QGraphicsEllipseItem(0, 0, m_initialNodeSize, m_initialNodeSize);
2018-03-13 06:39:36 +00:00
m_pendingNodeItem->setVisible(false);
2018-03-11 16:02:15 +00:00
scene()->addItem(m_pendingNodeItem);
m_pendingEdgeItem = new QGraphicsLineItem(0, 0, 0, 0);
2018-03-13 06:39:36 +00:00
m_pendingEdgeItem->setVisible(false);
2018-03-11 16:02:15 +00:00
scene()->addItem(m_pendingEdgeItem);
}
void SkeletonEditGraphicsView::toggleAddNodeMode()
{
2018-03-14 02:55:59 +00:00
if (!m_backgroundLoaded)
return;
2018-03-11 16:02:15 +00:00
m_inAddNodeMode = !m_inAddNodeMode;
applyAddNodeMode();
}
void SkeletonEditGraphicsView::applyAddNodeMode()
{
m_pendingNodeItem->setVisible(m_inAddNodeMode);
m_pendingEdgeItem->setVisible(m_inAddNodeMode && m_nextStartNodeItem);
2018-03-11 16:02:15 +00:00
setMouseTracking(true);
}
void SkeletonEditGraphicsView::turnOffAddNodeMode()
{
2018-03-14 02:55:59 +00:00
if (!m_backgroundLoaded)
return;
2018-03-11 16:02:15 +00:00
m_inAddNodeMode = false;
applyAddNodeMode();
}
void SkeletonEditGraphicsView::turnOnAddNodeMode()
{
2018-03-14 02:55:59 +00:00
if (!m_backgroundLoaded)
return;
2018-03-11 16:02:15 +00:00
m_inAddNodeMode = true;
applyAddNodeMode();
}
SkeletonEditNodeItem *SkeletonEditGraphicsView::findNodeItemByPos(QPointF pos)
{
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "node") {
SkeletonEditNodeItem *nodeItem = static_cast<SkeletonEditNodeItem *>(*it);
2018-03-19 07:58:51 +00:00
if (nodeItem->shape().contains(pos)) {
2018-03-11 16:02:15 +00:00
return nodeItem;
}
}
}
return NULL;
}
2018-03-19 07:58:51 +00:00
SkeletonEditEdgeItem *SkeletonEditGraphicsView::findEdgeItemByPos(QPointF pos)
{
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "edge") {
SkeletonEditEdgeItem *edgeItem = static_cast<SkeletonEditEdgeItem *>(*it);
if (edgeItem->shape().contains(pos)) {
return edgeItem;
}
}
}
return NULL;
}
SkeletonEditEdgeItem *SkeletonEditGraphicsView::findEdgeItemByNodePair(SkeletonEditNodeItem *first,
SkeletonEditNodeItem *second)
{
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
assert(first != second);
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "edge") {
SkeletonEditEdgeItem *edgeItem = static_cast<SkeletonEditEdgeItem *>(*it);
if ((edgeItem->firstNode() == first || edgeItem->secondNode() == first) &&
(edgeItem->firstNode() == second || edgeItem->secondNode() == second)) {
return edgeItem;
}
}
}
return NULL;
}
2018-03-11 16:02:15 +00:00
void SkeletonEditGraphicsView::mousePressEvent(QMouseEvent *event)
{
2018-03-13 06:39:36 +00:00
QWidget::mousePressEvent(event);
if (!m_backgroundLoaded)
return;
2018-03-19 07:58:51 +00:00
QPointF pos = mapToScene(event->pos());
2018-03-11 16:02:15 +00:00
if (event->button() == Qt::LeftButton) {
if (!m_inAddNodeMode) {
if (m_lastHoverNodeItem) {
setNextStartNodeItem(m_lastHoverNodeItem);
2018-03-11 16:02:15 +00:00
m_lastHoverNodeItem = NULL;
} else {
if (m_nextStartNodeItem) {
setNextStartNodeItem(NULL);
}
2018-03-11 16:02:15 +00:00
}
}
}
2018-03-19 07:58:51 +00:00
m_lastMousePos = pos;
}
2018-03-14 02:55:59 +00:00
void SkeletonEditGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
{
QWidget::mouseDoubleClickEvent(event);
if (QApplication::keyboardModifiers() & Qt::ControlModifier)
emit changeTurnaroundTriggered();
2018-03-14 02:55:59 +00:00
}
2018-03-18 08:46:53 +00:00
void SkeletonEditGraphicsView::removeSelectedItems()
{
if (m_nextStartNodeItem) {
SkeletonEditNodeItem *nodeItem = m_nextStartNodeItem;
setNextStartNodeItem(NULL);
2018-03-28 11:41:33 +00:00
removeNodeItem(nodeItem->nextSidePair());
2018-03-18 08:46:53 +00:00
removeNodeItem(nodeItem);
emit nodesChanged();
}
}
void SkeletonEditGraphicsView::removeNodeItem(SkeletonEditNodeItem *nodeItem)
{
scene()->removeItem(nodeItem);
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "edge") {
SkeletonEditEdgeItem *edgeItem = static_cast<SkeletonEditEdgeItem *>(*it);
if (edgeItem->firstNode() == nodeItem || edgeItem->secondNode() == nodeItem) {
scene()->removeItem(edgeItem);
}
}
}
}
void SkeletonEditGraphicsView::fetchNodeItemAndAllSidePairs(SkeletonEditNodeItem *nodeItem, std::vector<SkeletonEditNodeItem *> *sidePairs)
2018-03-18 08:46:53 +00:00
{
sidePairs->push_back(nodeItem);
sidePairs->push_back(nodeItem->nextSidePair());
sidePairs->push_back(nodeItem->nextSidePair()->nextSidePair());
}
void SkeletonEditGraphicsView::removeNodeItemAndSidePairs(SkeletonEditNodeItem *nodeItem)
{
std::vector<SkeletonEditNodeItem *> nodes;
fetchNodeItemAndAllSidePairs(nodeItem, &nodes);
for (size_t i = 0; i < nodes.size(); i++) {
removeNodeItem(nodes[i]);
2018-03-18 08:46:53 +00:00
}
}
void SkeletonEditGraphicsView::keyPressEvent(QKeyEvent *event)
{
QWidget::keyPressEvent(event);
if (!m_backgroundLoaded)
return;
if (event->key() == Qt::Key_A)
toggleAddNodeMode();
2018-03-18 08:46:53 +00:00
else if (event->key() == Qt::Key_Delete || event->key() ==Qt::Key_Backspace) {
removeSelectedItems();
}
}
void SkeletonEditGraphicsView::resizeEvent(QResizeEvent *event)
{
QFrame::resizeEvent(event);
emit sizeChanged();
}
SkeletonEditNodeItem *SkeletonEditGraphicsView::addNodeItemAndSidePairs(QRectF area, SkeletonEditNodeItem *fromNodeItem, const QString &sideColorName)
{
float pairedX = 0;
QRectF pairedRect = area;
if (fromNodeItem) {
pairedX = fromNodeItem->nextSidePair()->rect().x();
} else {
if (area.center().x() < scene()->sceneRect().width() / 2) {
pairedX = area.center().x() + scene()->sceneRect().width() / 4;
} else {
pairedX = area.center().x() - scene()->sceneRect().width() / 4;
}
}
pairedRect.translate(pairedX - area.x(), 0);
SkeletonEditNodeItem *firstNode = new SkeletonEditNodeItem(area);
scene()->addItem(firstNode);
firstNode->setSideColorName(fromNodeItem ? fromNodeItem->sideColorName() : sideColorName);
SkeletonEditNodeItem *secondNode = new SkeletonEditNodeItem(pairedRect);
scene()->addItem(secondNode);
secondNode->setSideColorName(firstNode->nextSideColorName());
firstNode->setNextSidePair(secondNode);
secondNode->setNextSidePair(firstNode);
setNextStartNodeItem(firstNode);
if (!fromNodeItem) {
return firstNode;
}
addEdgeItem(fromNodeItem, firstNode);
addEdgeItem(fromNodeItem->nextSidePair(), firstNode->nextSidePair());
return firstNode;
}
SkeletonEditNodeItem *SkeletonEditGraphicsView::addNodeItem(float originX, float originY, float radius)
{
QRectF area(originX - radius, originY - radius, radius * 2, radius * 2);
SkeletonEditNodeItem *firstNode = new SkeletonEditNodeItem(area);
scene()->addItem(firstNode);
return firstNode;
}
void SkeletonEditGraphicsView::addEdgeItem(SkeletonEditNodeItem *first, SkeletonEditNodeItem *second)
{
SkeletonEditEdgeItem *newEdge = new SkeletonEditEdgeItem();
newEdge->setNodes(first, second);
scene()->addItem(newEdge);
}
2018-03-11 16:02:15 +00:00
void SkeletonEditGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
2018-03-13 06:39:36 +00:00
QWidget::mouseReleaseEvent(event);
if (!m_backgroundLoaded)
return;
2018-03-11 16:02:15 +00:00
if (event->button() == Qt::LeftButton) {
if (m_inAddNodeMode) {
if (m_lastHoverNodeItem && m_nextStartNodeItem &&
m_lastHoverNodeItem != m_nextStartNodeItem &&
m_lastHoverNodeItem->sideColor() == m_nextStartNodeItem->sideColor()) {
if (!findEdgeItemByNodePair(m_lastHoverNodeItem, m_nextStartNodeItem)) {
addEdgeItem(m_nextStartNodeItem, m_lastHoverNodeItem);
addEdgeItem(m_nextStartNodeItem->nextSidePair(), m_lastHoverNodeItem->nextSidePair());
2018-03-19 07:58:51 +00:00
emit nodesChanged();
}
2018-03-16 03:06:51 +00:00
} else {
addNodeItemAndSidePairs(m_pendingNodeItem->rect(), m_nextStartNodeItem);
2018-03-19 07:58:51 +00:00
emit nodesChanged();
2018-03-11 16:02:15 +00:00
}
}
2018-03-12 13:40:42 +00:00
m_isMovingNodeItem = false;
2018-03-11 16:02:15 +00:00
}
}
2018-03-12 13:40:42 +00:00
bool SkeletonEditGraphicsView::canNodeItemMoveTo(SkeletonEditNodeItem *item, QPointF moveTo)
{
if (moveTo.x() < 0)
return false;
if (moveTo.y() < 0)
return false;
if (moveTo.x() + item->rect().width() >= scene()->sceneRect().width())
2018-03-12 13:40:42 +00:00
return false;
if (moveTo.y() + item->rect().height() >= scene()->sceneRect().height())
2018-03-12 13:40:42 +00:00
return false;
return true;
}
2018-03-11 16:02:15 +00:00
void SkeletonEditGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
QWidget::mouseMoveEvent(event);
2018-03-13 06:39:36 +00:00
if (!m_backgroundLoaded)
return;
2018-03-11 16:02:15 +00:00
QPointF pos = mapToScene(event->pos());
QPointF moveTo = QPointF(pos.x() - m_pendingNodeItem->rect().width() / 2, pos.y() - m_pendingNodeItem->rect().height() / 2);
if (moveTo.x() < 0)
moveTo.setX(0);
if (moveTo.y() < 0)
moveTo.setY(0);
if (moveTo.x() + m_pendingNodeItem->rect().width() >= scene()->sceneRect().width())
moveTo.setX(scene()->sceneRect().width() - m_pendingNodeItem->rect().width());
if (moveTo.y() + m_pendingNodeItem->rect().height() >= scene()->sceneRect().height())
moveTo.setY(scene()->sceneRect().height() - m_pendingNodeItem->rect().height());
2018-03-11 16:02:15 +00:00
QSizeF oldSize = m_pendingNodeItem->rect().size();
m_pendingNodeItem->setRect(moveTo.x(), moveTo.y(),
oldSize.width(),
oldSize.height());
if (m_nextStartNodeItem) {
m_pendingEdgeItem->setLine(QLineF(m_nextStartNodeItem->origin(), QPointF(moveTo.x() + m_pendingNodeItem->rect().width() / 2,
moveTo.y() + m_pendingNodeItem->rect().height() / 2)));
}
2018-03-12 13:40:42 +00:00
if (!m_isMovingNodeItem) {
2018-03-19 07:58:51 +00:00
SkeletonEditNodeItem *hoverNodeItem = findNodeItemByPos(pos);
if (hoverNodeItem) {
hoverNodeItem->setHovered(true);
2018-03-19 07:58:51 +00:00
}
if (hoverNodeItem != m_lastHoverNodeItem) {
if (m_lastHoverNodeItem)
m_lastHoverNodeItem->setHovered(false);
2018-03-19 07:58:51 +00:00
m_lastHoverNodeItem = hoverNodeItem;
2018-03-11 16:02:15 +00:00
}
}
QPointF curMousePos = pos;
if (m_lastHoverNodeItem) {
2018-03-12 13:40:42 +00:00
if ((event->buttons() & Qt::LeftButton) &&
(curMousePos != m_lastMousePos || m_isMovingNodeItem)) {
m_isMovingNodeItem = true;
QRectF rect = m_lastHoverNodeItem->rect();
QRectF pairedRect;
rect.translate(curMousePos.x() - m_lastMousePos.x(), curMousePos.y() - m_lastMousePos.y());
pairedRect = m_lastHoverNodeItem->nextSidePair()->rect();
pairedRect.translate(0, curMousePos.y() - m_lastMousePos.y());
m_lastHoverNodeItem->setRect(rect);
m_lastHoverNodeItem->nextSidePair()->setRect(pairedRect);
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "edge") {
SkeletonEditEdgeItem *edgeItem = static_cast<SkeletonEditEdgeItem *>(*it);
if (edgeItem->connects(m_lastHoverNodeItem) ||
edgeItem->connects(m_lastHoverNodeItem->nextSidePair()))
edgeItem->updatePosition();
2018-03-12 13:40:42 +00:00
}
}
emit nodesChanged();
}
}
m_lastMousePos = curMousePos;
2018-03-11 16:02:15 +00:00
}
2018-03-12 13:40:42 +00:00
void SkeletonEditGraphicsView::AddItemRadius(QGraphicsEllipseItem *item, float delta)
2018-03-11 16:02:15 +00:00
{
2018-03-12 13:40:42 +00:00
QSizeF oldSize = item->rect().size();
QPointF originPt = QPointF(item->rect().left() + oldSize.width() / 2,
item->rect().top() + oldSize.height() / 2);
2018-03-11 16:02:15 +00:00
QSizeF newSize = QSizeF(oldSize.width() + delta, oldSize.height() + delta);
if (newSize.width() < m_minimalNodeSize || newSize.height() < m_minimalNodeSize) {
newSize.setWidth(m_minimalNodeSize);
newSize.setHeight(m_minimalNodeSize);
}
QPointF newLeftTop = QPointF(originPt.x() - newSize.width() / 2,
originPt.y() - newSize.height() / 2);
if (newLeftTop.x() < 0 || newLeftTop.x() + newSize.width() >= scene()->sceneRect().width())
2018-03-11 16:02:15 +00:00
return;
if (newLeftTop.y() < 0 || newLeftTop.y() + newSize.height() >= scene()->sceneRect().height())
2018-03-11 16:02:15 +00:00
return;
2018-03-12 13:40:42 +00:00
item->setRect(newLeftTop.x(),
2018-03-11 16:02:15 +00:00
newLeftTop.y(),
newSize.width(),
newSize.height());
}
2018-03-12 13:40:42 +00:00
bool SkeletonEditGraphicsView::canAddItemRadius(QGraphicsEllipseItem *item, float delta)
{
QSizeF oldSize = item->rect().size();
QPointF originPt = QPointF(item->rect().left() + oldSize.width() / 2,
item->rect().top() + oldSize.height() / 2);
QSizeF newSize = QSizeF(oldSize.width() + delta, oldSize.height() + delta);
if (newSize.width() < m_minimalNodeSize || newSize.height() < m_minimalNodeSize) {
newSize.setWidth(m_minimalNodeSize);
newSize.setHeight(m_minimalNodeSize);
}
QPointF newLeftTop = QPointF(originPt.x() - newSize.width() / 2,
originPt.y() - newSize.height() / 2);
if (newLeftTop.x() < 0 || newLeftTop.x() + newSize.width() >= scene()->sceneRect().width())
2018-03-12 13:40:42 +00:00
return false;
if (newLeftTop.y() < 0 || newLeftTop.y() + newSize.height() >= scene()->sceneRect().height())
2018-03-12 13:40:42 +00:00
return false;
return true;
}
void SkeletonEditGraphicsView::wheelEvent(QWheelEvent *event)
{
QWidget::wheelEvent(event);
2018-03-13 06:39:36 +00:00
if (!m_backgroundLoaded)
return;
2018-03-13 12:49:24 +00:00
qreal delta = event->delta() / 10;
2018-03-28 11:41:33 +00:00
if (QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) {
if (delta > 0)
delta = 1;
else
delta = -1;
} else {
if (fabs(delta) < 1)
delta = delta < 0 ? -1.0 : 1.0;
}
2018-03-12 13:40:42 +00:00
AddItemRadius(m_pendingNodeItem, delta);
if (!m_inAddNodeMode && m_lastHoverNodeItem) {
2018-03-28 11:41:33 +00:00
AddItemRadius(m_lastHoverNodeItem, delta);
2018-03-12 13:40:42 +00:00
emit nodesChanged();
}
}
2018-03-11 16:02:15 +00:00
void SkeletonEditGraphicsView::setNextStartNodeItem(SkeletonEditNodeItem *item)
{
if (m_nextStartNodeItem != item) {
if (m_nextStartNodeItem)
m_nextStartNodeItem->setChecked(false);
2018-03-11 16:02:15 +00:00
}
m_nextStartNodeItem = item;
if (m_nextStartNodeItem)
m_nextStartNodeItem->setChecked(true);
applyAddNodeMode();
2018-03-11 16:02:15 +00:00
}
2018-03-13 06:39:36 +00:00
void SkeletonEditGraphicsView::updateBackgroundImage(const QImage &image)
{
2018-03-14 02:55:59 +00:00
QSizeF oldSceneSize = scene()->sceneRect().size();
2018-03-13 06:39:36 +00:00
QPixmap pixmap = QPixmap::fromImage(image);
scene()->setSceneRect(pixmap.rect());
m_backgroundItem->setPixmap(pixmap);
2018-03-14 02:55:59 +00:00
adjustItems(oldSceneSize, scene()->sceneRect().size());
2018-03-13 06:39:36 +00:00
if (!m_backgroundLoaded) {
m_backgroundLoaded = true;
applyAddNodeMode();
}
}
2018-03-14 02:55:59 +00:00
QPixmap SkeletonEditGraphicsView::backgroundImage()
{
return m_backgroundItem->pixmap();
}
bool SkeletonEditGraphicsView::hasBackgroundImage()
{
return m_backgroundLoaded;
}
2018-03-14 02:55:59 +00:00
void SkeletonEditGraphicsView::adjustItems(QSizeF oldSceneSize, QSizeF newSceneSize)
{
if (oldSceneSize == newSceneSize)
return;
float radiusMul = (float)newSceneSize.height() / oldSceneSize.height();
float xMul = (float)newSceneSize.width() / oldSceneSize.width();
float yMul = radiusMul;
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "node") {
SkeletonEditNodeItem *nodeItem = static_cast<SkeletonEditNodeItem *>(*it);
nodeItem->setRadius(nodeItem->radius() * radiusMul);
QPointF oldOrigin = nodeItem->origin();
nodeItem->setOrigin(QPointF(oldOrigin.x() * xMul, oldOrigin.y() * yMul));
}
}
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "edge") {
SkeletonEditEdgeItem *edgeItem = static_cast<SkeletonEditEdgeItem *>(*it);
edgeItem->updatePosition();
}
}
}
2018-03-14 15:22:00 +00:00
void SkeletonEditGraphicsView::loadFromSnapshot(SkeletonSnapshot *snapshot)
2018-03-14 15:22:00 +00:00
{
float radiusMul = 1.0;
float xMul = 1.0;
float yMul = radiusMul;
QString canvasWidth = snapshot->canvas["width"];
QString canvasHeight = snapshot->canvas["height"];
float canvasWidthVal = canvasWidth.toFloat();
float canvasHeightVal = canvasHeight.toFloat();
if (!hasBackgroundImage()) {
QPixmap emptyImage((int)canvasWidthVal, (int)canvasHeightVal);
emptyImage.fill(QWidget::palette().color(QWidget::backgroundRole()));
updateBackgroundImage(emptyImage.toImage());
2018-03-14 15:22:00 +00:00
}
if (canvasHeightVal > 0)
radiusMul = (float)scene()->sceneRect().height() / canvasHeightVal;
if (canvasWidthVal > 0)
xMul = (float)scene()->sceneRect().width() / canvasWidthVal;
yMul = radiusMul;
2018-03-14 15:22:00 +00:00
std::map<QString, SkeletonEditNodeItem *> nodeItemMap;
std::map<QString, std::map<QString, QString>>::iterator nodeIterator;
for (nodeIterator = snapshot->nodes.begin(); nodeIterator != snapshot->nodes.end(); nodeIterator++) {
std::map<QString, QString> *snapshotNode = &nodeIterator->second;
SkeletonEditNodeItem *nodeItem = addNodeItem((*snapshotNode)["x"].toFloat() * xMul,
(*snapshotNode)["y"].toFloat() * yMul,
(*snapshotNode)["radius"].toFloat() * radiusMul);
nodeItem->setSideColorName((*snapshotNode)["sideColorName"]);
2018-03-29 01:46:43 +00:00
nodeItem->markAsBranch("true" == (*snapshotNode)["isBranch"]);
nodeItemMap[nodeIterator->first] = nodeItem;
2018-03-14 15:22:00 +00:00
}
for (nodeIterator = snapshot->nodes.begin(); nodeIterator != snapshot->nodes.end(); nodeIterator++) {
std::map<QString, QString> *snapshotNode = &nodeIterator->second;
SkeletonEditNodeItem *nodeItem = nodeItemMap[nodeIterator->first];
nodeItem->setNextSidePair(nodeItemMap[(*snapshotNode)["nextSidePair"]]);
2018-03-14 15:22:00 +00:00
}
std::map<QString, std::map<QString, QString>>::iterator edgeIterator;
for (edgeIterator = snapshot->edges.begin(); edgeIterator != snapshot->edges.end(); edgeIterator++) {
std::map<QString, QString> *snapshotEdge = &edgeIterator->second;
addEdgeItem(nodeItemMap[(*snapshotEdge)["from"]], nodeItemMap[(*snapshotEdge)["to"]]);
2018-03-14 15:22:00 +00:00
}
emit nodesChanged();
}
void SkeletonEditGraphicsView::saveToSnapshot(SkeletonSnapshot *snapshot)
2018-03-14 15:22:00 +00:00
{
snapshot->canvas["width"] = QString("%1").arg(scene()->sceneRect().width());
snapshot->canvas["height"] = QString("%1").arg(scene()->sceneRect().height());
2018-03-14 15:22:00 +00:00
QList<QGraphicsItem *>::iterator it;
QList<QGraphicsItem *> list = scene()->items();
2018-03-14 15:22:00 +00:00
int nextNodeId = 1;
std::map<SkeletonEditNodeItem *, QString> nodeIdMap;
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "node") {
SkeletonEditNodeItem *nodeItem = static_cast<SkeletonEditNodeItem *>(*it);
QString nodeId = QString("node%1").arg(nextNodeId);
std::map<QString, QString> *snapshotNode = &snapshot->nodes[nodeId];
(*snapshotNode)["id"] = nodeId;
(*snapshotNode)["sideColorName"] = nodeItem->sideColorName();
(*snapshotNode)["radius"] = QString("%1").arg(nodeItem->radius());
2018-03-29 01:46:43 +00:00
(*snapshotNode)["isBranch"] = QString("%1").arg(nodeItem->isBranch() ? "true" : "false");
QPointF origin = nodeItem->origin();
(*snapshotNode)["x"] = QString("%1").arg(origin.x());
(*snapshotNode)["y"] = QString("%1").arg(origin.y());
nodeIdMap[nodeItem] = nodeId;
nextNodeId++;
2018-03-14 15:22:00 +00:00
}
}
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "node") {
SkeletonEditNodeItem *nodeItem = static_cast<SkeletonEditNodeItem *>(*it);
QString nodeId = nodeIdMap[nodeItem];
std::map<QString, QString> *snapshotNode = &snapshot->nodes[nodeId];
(*snapshotNode)["nextSidePair"] = nodeIdMap[nodeItem->nextSidePair()];
2018-03-14 15:22:00 +00:00
}
}
2018-03-14 15:22:00 +00:00
int nextEdgeId = 1;
for (it = list.begin(); it != list.end(); ++it) {
if ((*it)->data(0).toString() == "edge") {
SkeletonEditEdgeItem *edgeItem = static_cast<SkeletonEditEdgeItem *>(*it);
QString edgeId = QString("edge%1").arg(nextEdgeId);
std::map<QString, QString> *snapshotEdge = &snapshot->edges[edgeId];
(*snapshotEdge)["id"] = edgeId;
(*snapshotEdge)["from"] = nodeIdMap[edgeItem->firstNode()];
(*snapshotEdge)["to"] = nodeIdMap[edgeItem->secondNode()];
nextEdgeId++;
}
}
2018-03-14 15:22:00 +00:00
}
2018-03-29 01:46:43 +00:00
void SkeletonEditGraphicsView::markAsBranch()
{
if (m_nextStartNodeItem) {
m_nextStartNodeItem->markAsBranch(true);
m_nextStartNodeItem->nextSidePair()->markAsBranch(true);
emit nodesChanged();
}
}
2018-03-29 01:46:43 +00:00
void SkeletonEditGraphicsView::markAsTrunk()
{
if (m_nextStartNodeItem) {
m_nextStartNodeItem->markAsBranch(false);
m_nextStartNodeItem->nextSidePair()->markAsBranch(false);
emit nodesChanged();
}
}