Cleanup and reset initial render angle

master
Jeremy Hu 2018-04-09 23:10:23 +08:00
parent 2a7554b852
commit f47148a537
14 changed files with 47 additions and 341 deletions

View File

@ -18,12 +18,6 @@ HEADERS += src/modelofflinerender.h
SOURCES += src/modelwidget.cpp SOURCES += src/modelwidget.cpp
HEADERS += src/modelwidget.h HEADERS += src/modelwidget.h
SOURCES += src/skeletonnodepropertywidget.cpp
HEADERS += src/skeletonnodepropertywidget.h
SOURCES += src/skeletonedgepropertywidget.cpp
HEADERS += src/skeletonedgepropertywidget.h
SOURCES += src/skeletondocument.cpp SOURCES += src/skeletondocument.cpp
HEADERS += src/skeletondocument.h HEADERS += src/skeletondocument.h
@ -33,9 +27,6 @@ HEADERS += src/skeletondocumentwindow.h
SOURCES += src/skeletongraphicswidget.cpp SOURCES += src/skeletongraphicswidget.cpp
HEADERS += src/skeletongraphicswidget.h HEADERS += src/skeletongraphicswidget.h
SOURCES += src/skeletonhistorylistwidget.cpp
HEADERS += src/skeletonhistorylistwidget.h
SOURCES += src/skeletonpartlistwidget.cpp SOURCES += src/skeletonpartlistwidget.cpp
HEADERS += src/skeletonpartlistwidget.h HEADERS += src/skeletonpartlistwidget.h

View File

@ -117,6 +117,7 @@ void MeshGenerator::process()
void *meshliteContext = meshlite_create_context(); void *meshliteContext = meshlite_create_context();
std::map<QString, int> partBmeshMap; std::map<QString, int> partBmeshMap;
std::map<QString, int> bmeshNodeMap; std::map<QString, int> bmeshNodeMap;
bool hasSubdiv = false;
QRectF mainProfile, sideProfile; QRectF mainProfile, sideProfile;
resolveBoundingBox(&mainProfile, &sideProfile); resolveBoundingBox(&mainProfile, &sideProfile);
@ -207,8 +208,10 @@ void MeshGenerator::process()
int meshId = meshlite_bmesh_generate_mesh(meshliteContext, bmeshId, 0); int meshId = meshlite_bmesh_generate_mesh(meshliteContext, bmeshId, 0);
if (isTrueValueString(part->second["subdived"])) { if (isTrueValueString(part->second["subdived"])) {
int subdivedMeshId = subdivMesh(meshliteContext, meshId); int subdivedMeshId = subdivMesh(meshliteContext, meshId);
if (subdivedMeshId > 0) if (subdivedMeshId > 0) {
meshId = subdivedMeshId; meshId = subdivedMeshId;
hasSubdiv = true;
}
} }
if (m_requirePartPreviewMap.find(partIdIt) != m_requirePartPreviewMap.end()) { if (m_requirePartPreviewMap.find(partIdIt) != m_requirePartPreviewMap.end()) {
ModelOfflineRender *render = m_partPreviewRenderMap[partIdIt]; ModelOfflineRender *render = m_partPreviewRenderMap[partIdIt];
@ -227,7 +230,7 @@ void MeshGenerator::process()
} else if (meshIds.size() > 0) { } else if (meshIds.size() > 0) {
mergedMeshId = meshIds[0]; mergedMeshId = meshIds[0];
} }
if (mergedMeshId > 0) { if (mergedMeshId > 0 && !hasSubdiv) {
mergedMeshId = meshlite_combine_coplanar_faces(meshliteContext, mergedMeshId); mergedMeshId = meshlite_combine_coplanar_faces(meshliteContext, mergedMeshId);
} }

View File

@ -54,8 +54,8 @@ QImage ModelOfflineRender::toImage(const QSize &size)
m_context->functions()->glViewport(0, 0, size.width(), size.height()); m_context->functions()->glViewport(0, 0, size.width(), size.height());
if (nullptr != m_mesh) { if (nullptr != m_mesh) {
int xRot = 0; int xRot = -30 * 16;
int yRot = 0; int yRot = 45 * 16;
int zRot = 0; int zRot = 0;
QMatrix4x4 proj; QMatrix4x4 proj;
QMatrix4x4 camera; QMatrix4x4 camera;

View File

@ -13,8 +13,8 @@ bool ModelWidget::m_transparent = true;
ModelWidget::ModelWidget(QWidget *parent) ModelWidget::ModelWidget(QWidget *parent)
: QOpenGLWidget(parent), : QOpenGLWidget(parent),
m_xRot(0), m_xRot(-30 * 16),
m_yRot(0), m_yRot(45 * 16),
m_zRot(0), m_zRot(0),
m_program(nullptr), m_program(nullptr),
m_moveStarted(false), m_moveStarted(false),

View File

@ -482,26 +482,6 @@ void SkeletonDocument::splitPartByEdge(std::vector<std::vector<QUuid>> *groups,
} }
} }
void SkeletonDocument::setEdgeBranchMode(QUuid edgeId, SkeletonEdgeBranchMode mode)
{
auto edgeIt = edgeMap.find(edgeId);
if (edgeIt == edgeMap.end()) {
qDebug() << "Find edge failed:" << edgeId;
return;
}
edgeIt->second.branchMode = mode;
}
void SkeletonDocument::setNodeRootMarkMode(QUuid nodeId, SkeletonNodeRootMarkMode mode)
{
auto nodeIt = nodeMap.find(nodeId);
if (nodeIt == nodeMap.end()) {
qDebug() << "Find node failed:" << nodeId;
return;
}
nodeIt->second.rootMarkMode = mode;
}
void SkeletonDocument::toSnapshot(SkeletonSnapshot *snapshot, const std::set<QUuid> &limitNodeIds) const void SkeletonDocument::toSnapshot(SkeletonSnapshot *snapshot, const std::set<QUuid> &limitNodeIds) const
{ {
std::set<QUuid> limitPartIds; std::set<QUuid> limitPartIds;
@ -532,7 +512,6 @@ void SkeletonDocument::toSnapshot(SkeletonSnapshot *snapshot, const std::set<QUu
node["x"] = QString::number(nodeIt.second.x); node["x"] = QString::number(nodeIt.second.x);
node["y"] = QString::number(nodeIt.second.y); node["y"] = QString::number(nodeIt.second.y);
node["z"] = QString::number(nodeIt.second.z); node["z"] = QString::number(nodeIt.second.z);
node["rootMarkMode"] = SkeletonNodeRootMarkModeToString(nodeIt.second.rootMarkMode);
node["partId"] = nodeIt.second.partId.toString(); node["partId"] = nodeIt.second.partId.toString();
if (!nodeIt.second.name.isEmpty()) if (!nodeIt.second.name.isEmpty())
node["name"] = nodeIt.second.name; node["name"] = nodeIt.second.name;
@ -550,7 +529,6 @@ void SkeletonDocument::toSnapshot(SkeletonSnapshot *snapshot, const std::set<QUu
edge["id"] = edgeIt.second.id.toString(); edge["id"] = edgeIt.second.id.toString();
edge["from"] = edgeIt.second.nodeIds[0].toString(); edge["from"] = edgeIt.second.nodeIds[0].toString();
edge["to"] = edgeIt.second.nodeIds[1].toString(); edge["to"] = edgeIt.second.nodeIds[1].toString();
edge["branchMode"] = SkeletonEdgeBranchModeToString(edgeIt.second.branchMode);
edge["partId"] = edgeIt.second.partId.toString(); edge["partId"] = edgeIt.second.partId.toString();
if (!edgeIt.second.name.isEmpty()) if (!edgeIt.second.name.isEmpty())
edge["name"] = edgeIt.second.name; edge["name"] = edgeIt.second.name;
@ -591,7 +569,6 @@ void SkeletonDocument::addFromSnapshot(const SkeletonSnapshot &snapshot)
node.y = valueOfKeyInMapOrEmpty(nodeKv.second, "y").toFloat(); node.y = valueOfKeyInMapOrEmpty(nodeKv.second, "y").toFloat();
node.z = valueOfKeyInMapOrEmpty(nodeKv.second, "z").toFloat(); node.z = valueOfKeyInMapOrEmpty(nodeKv.second, "z").toFloat();
node.partId = oldNewIdMap[QUuid(valueOfKeyInMapOrEmpty(nodeKv.second, "partId"))]; node.partId = oldNewIdMap[QUuid(valueOfKeyInMapOrEmpty(nodeKv.second, "partId"))];
node.rootMarkMode = SkeletonNodeRootMarkModeFromString(valueOfKeyInMapOrEmpty(nodeKv.second, "rootMarkMode"));
nodeMap[node.id] = node; nodeMap[node.id] = node;
} }
for (const auto &edgeKv : snapshot.edges) { for (const auto &edgeKv : snapshot.edges) {
@ -603,7 +580,6 @@ void SkeletonDocument::addFromSnapshot(const SkeletonSnapshot &snapshot)
oldNewIdMap[QUuid(edgeKv.first)] = edge.id; oldNewIdMap[QUuid(edgeKv.first)] = edge.id;
edge.name = valueOfKeyInMapOrEmpty(edgeKv.second, "name"); edge.name = valueOfKeyInMapOrEmpty(edgeKv.second, "name");
edge.partId = oldNewIdMap[QUuid(valueOfKeyInMapOrEmpty(edgeKv.second, "partId"))]; edge.partId = oldNewIdMap[QUuid(valueOfKeyInMapOrEmpty(edgeKv.second, "partId"))];
edge.branchMode = SkeletonEdgeBranchModeFromString(valueOfKeyInMapOrEmpty(edgeKv.second, "branchMode"));
QString fromNodeId = valueOfKeyInMapOrEmpty(edgeKv.second, "from"); QString fromNodeId = valueOfKeyInMapOrEmpty(edgeKv.second, "from");
if (!fromNodeId.isEmpty()) { if (!fromNodeId.isEmpty()) {
QUuid fromId = oldNewIdMap[QUuid(fromNodeId)]; QUuid fromId = oldNewIdMap[QUuid(fromNodeId)];
@ -660,56 +636,6 @@ void SkeletonDocument::fromSnapshot(const SkeletonSnapshot &snapshot)
addFromSnapshot(snapshot); addFromSnapshot(snapshot);
} }
const char *SkeletonNodeRootMarkModeToString(SkeletonNodeRootMarkMode mode)
{
switch (mode) {
case SkeletonNodeRootMarkMode::Auto:
return "auto";
case SkeletonNodeRootMarkMode::MarkAsRoot:
return "markAsRoot";
case SkeletonNodeRootMarkMode::MarkAsNotRoot:
return "markAsNotRoot";
default:
return "";
}
}
SkeletonNodeRootMarkMode SkeletonNodeRootMarkModeFromString(const QString &mode)
{
if (mode == "auto")
return SkeletonNodeRootMarkMode::Auto;
if (mode == "markAsRoot")
return SkeletonNodeRootMarkMode::MarkAsRoot;
if (mode == "markAsNotRoot")
return SkeletonNodeRootMarkMode::MarkAsNotRoot;
return SkeletonNodeRootMarkMode::Auto;
}
const char *SkeletonEdgeBranchModeToString(SkeletonEdgeBranchMode mode)
{
switch (mode) {
case SkeletonEdgeBranchMode::Auto:
return "auto";
case SkeletonEdgeBranchMode::NoTrivial:
return "noTrivial";
case SkeletonEdgeBranchMode::Trivial:
return "trivial";
default:
return "";
}
}
SkeletonEdgeBranchMode SkeletonEdgeBranchModeFromString(const QString &mode)
{
if (mode == "auto")
return SkeletonEdgeBranchMode::Auto;
if (mode == "noTrivial")
return SkeletonEdgeBranchMode::NoTrivial;
if (mode == "trivial")
return SkeletonEdgeBranchMode::Trivial;
return SkeletonEdgeBranchMode::Auto;
}
Mesh *SkeletonDocument::takeResultMesh() Mesh *SkeletonDocument::takeResultMesh()
{ {
Mesh *resultMesh = m_resultMesh; Mesh *resultMesh = m_resultMesh;
@ -787,12 +713,8 @@ void SkeletonDocument::generateMesh()
toSnapshot(snapshot); toSnapshot(snapshot);
m_meshGenerator = new MeshGenerator(snapshot, thread); m_meshGenerator = new MeshGenerator(snapshot, thread);
m_meshGenerator->moveToThread(thread); m_meshGenerator->moveToThread(thread);
//m_meshGenerator->addPreviewRequirement();
for (auto &part: partMap) { for (auto &part: partMap) {
//if (part.second.previewIsObsolete) {
// part.second.previewIsObsolete = false;
m_meshGenerator->addPartPreviewRequirement(part.first.toString()); m_meshGenerator->addPartPreviewRequirement(part.first.toString());
//}
} }
connect(thread, &QThread::started, m_meshGenerator, &MeshGenerator::process); connect(thread, &QThread::started, m_meshGenerator, &MeshGenerator::process);
connect(m_meshGenerator, &MeshGenerator::finished, this, &SkeletonDocument::meshReady); connect(m_meshGenerator, &MeshGenerator::finished, this, &SkeletonDocument::meshReady);
@ -895,3 +817,12 @@ bool SkeletonDocument::hasPastableContentInClipboard() const
return false; return false;
} }
bool SkeletonDocument::undoable() const
{
return !m_undoItems.empty();
}
bool SkeletonDocument::redoable() const
{
return !m_redoItems.empty();
}

View File

@ -11,16 +11,6 @@
#include "mesh.h" #include "mesh.h"
#include "meshgenerator.h" #include "meshgenerator.h"
enum class SkeletonNodeRootMarkMode
{
Auto = 0,
MarkAsRoot,
MarkAsNotRoot
};
const char *SkeletonNodeRootMarkModeToString(SkeletonNodeRootMarkMode mode);
SkeletonNodeRootMarkMode SkeletonNodeRootMarkModeFromString(const QString &mode);
class SkeletonNode class SkeletonNode
{ {
public: public:
@ -28,8 +18,7 @@ public:
x(0), x(0),
y(0), y(0),
z(0), z(0),
radius(0), radius(0)
rootMarkMode(SkeletonNodeRootMarkMode::Auto)
{ {
id = withId.isNull() ? QUuid::createUuid() : withId; id = withId.isNull() ? QUuid::createUuid() : withId;
} }
@ -48,34 +37,19 @@ public:
float y; float y;
float z; float z;
float radius; float radius;
bool xMirrored;
bool zMirrored;
SkeletonNodeRootMarkMode rootMarkMode;
std::vector<QUuid> edgeIds; std::vector<QUuid> edgeIds;
}; };
enum class SkeletonEdgeBranchMode
{
Auto = 0,
Trivial,
NoTrivial
};
const char *SkeletonEdgeBranchModeToString(SkeletonEdgeBranchMode mode);
SkeletonEdgeBranchMode SkeletonEdgeBranchModeFromString(const QString &mode);
class SkeletonEdge class SkeletonEdge
{ {
public: public:
SkeletonEdge(const QUuid &withId=QUuid()) : SkeletonEdge(const QUuid &withId=QUuid())
branchMode(SkeletonEdgeBranchMode::Auto)
{ {
id = withId.isNull() ? QUuid::createUuid() : withId; id = withId.isNull() ? QUuid::createUuid() : withId;
} }
QUuid id; QUuid id;
QUuid partId; QUuid partId;
QString name; QString name;
SkeletonEdgeBranchMode branchMode;
std::vector<QUuid> nodeIds; std::vector<QUuid> nodeIds;
QUuid neighborOf(QUuid nodeId) const QUuid neighborOf(QUuid nodeId) const
{ {
@ -95,12 +69,10 @@ public:
bool subdived; bool subdived;
QImage preview; QImage preview;
std::vector<QUuid> nodeIds; std::vector<QUuid> nodeIds;
bool previewIsObsolete;
SkeletonPart(const QUuid &withId=QUuid()) : SkeletonPart(const QUuid &withId=QUuid()) :
visible(true), visible(true),
locked(false), locked(false),
subdived(false), subdived(false)
previewIsObsolete(true)
{ {
id = withId.isNull() ? QUuid::createUuid() : withId; id = withId.isNull() ? QUuid::createUuid() : withId;
} }
@ -171,6 +143,8 @@ public:
QImage preview; QImage preview;
void updateTurnaround(const QImage &image); void updateTurnaround(const QImage &image);
bool hasPastableContentInClipboard() const; bool hasPastableContentInClipboard() const;
bool undoable() const;
bool redoable() const;
public slots: public slots:
void removeNode(QUuid nodeId); void removeNode(QUuid nodeId);
void removeEdge(QUuid edgeId); void removeEdge(QUuid edgeId);
@ -182,8 +156,6 @@ public slots:
void setNodeRadius(QUuid nodeId, float radius); void setNodeRadius(QUuid nodeId, float radius);
void addEdge(QUuid fromNodeId, QUuid toNodeId); void addEdge(QUuid fromNodeId, QUuid toNodeId);
void setEditMode(SkeletonDocumentEditMode mode); void setEditMode(SkeletonDocumentEditMode mode);
void setEdgeBranchMode(QUuid edgeId, SkeletonEdgeBranchMode mode);
void setNodeRootMarkMode(QUuid nodeId, SkeletonNodeRootMarkMode mode);
void uiReady(); void uiReady();
void generateMesh(); void generateMesh();
void meshReady(); void meshReady();

View File

@ -9,8 +9,6 @@
#include "skeletondocumentwindow.h" #include "skeletondocumentwindow.h"
#include "skeletongraphicswidget.h" #include "skeletongraphicswidget.h"
#include "skeletonpartlistwidget.h" #include "skeletonpartlistwidget.h"
#include "skeletonedgepropertywidget.h"
#include "skeletonnodepropertywidget.h"
#include "theme.h" #include "theme.h"
SkeletonDocumentWindow::SkeletonDocumentWindow() : SkeletonDocumentWindow::SkeletonDocumentWindow() :
@ -41,18 +39,6 @@ SkeletonDocumentWindow::SkeletonDocumentWindow() :
QPushButton *zoomOutButton = new QPushButton(QChar(fa::searchminus)); QPushButton *zoomOutButton = new QPushButton(QChar(fa::searchminus));
initButton(zoomOutButton); initButton(zoomOutButton);
QPushButton *changeTurnaroundButton = new QPushButton(QChar(fa::image));
initButton(changeTurnaroundButton);
QPushButton *markCenterButton = new QPushButton(QChar(fa::bullseye));
initButton(markCenterButton);
QPushButton *markTrivialBranchButton = new QPushButton(QChar(fa::link));
initButton(markTrivialBranchButton);
QPushButton *markMirrorButton = new QPushButton(QChar(fa::clone));
initButton(markMirrorButton);
toolButtonLayout->addWidget(undoButton); toolButtonLayout->addWidget(undoButton);
toolButtonLayout->addSpacing(10); toolButtonLayout->addSpacing(10);
toolButtonLayout->addWidget(addButton); toolButtonLayout->addWidget(addButton);
@ -60,12 +46,6 @@ SkeletonDocumentWindow::SkeletonDocumentWindow() :
toolButtonLayout->addWidget(dragButton); toolButtonLayout->addWidget(dragButton);
toolButtonLayout->addWidget(zoomInButton); toolButtonLayout->addWidget(zoomInButton);
toolButtonLayout->addWidget(zoomOutButton); toolButtonLayout->addWidget(zoomOutButton);
//toolButtonLayout->addSpacing(10);
//toolButtonLayout->addWidget(changeTurnaroundButton);
//toolButtonLayout->addSpacing(30);
//toolButtonLayout->addWidget(markCenterButton);
//toolButtonLayout->addWidget(markTrivialBranchButton);
//toolButtonLayout->addWidget(markMirrorButton);
QLabel *dust3dJezzasoftLabel = new QLabel; QLabel *dust3dJezzasoftLabel = new QLabel;
QImage dust3dJezzasoftImage; QImage dust3dJezzasoftImage;
@ -105,36 +85,10 @@ SkeletonDocumentWindow::SkeletonDocumentWindow() :
SkeletonPartListWidget *partListWidget = new SkeletonPartListWidget(m_document); SkeletonPartListWidget *partListWidget = new SkeletonPartListWidget(m_document);
partListWidget->setMaximumWidth(Theme::previewImageSize); partListWidget->setMaximumWidth(Theme::previewImageSize);
//QTabWidget *firstTabWidget = new QTabWidget;
//firstTabWidget->setFont(Theme::awesome()->font(Theme::toolIconFontSize * 3 / 4));
//firstTabWidget->setMaximumWidth(200);
//firstTabWidget->addTab(partListWidget, QChar(fa::puzzlepiece));
//firstTabWidget->addTab(new QWidget, QChar(fa::history));
//firstTabWidget->addTab(new QWidget, QChar(fa::wrench));
//SkeletonEdgePropertyWidget *edgePropertyWidget = new SkeletonEdgePropertyWidget(m_document);
//SkeletonNodePropertyWidget *nodePropertyWidget = new SkeletonNodePropertyWidget(m_document);
//QVBoxLayout *propertyLayout = new QVBoxLayout;
//propertyLayout->addWidget(edgePropertyWidget);
//propertyLayout->addWidget(nodePropertyWidget);
//QWidget *propertyWidget = new QWidget;
//propertyWidget->setLayout(propertyLayout);
//QTabWidget *secondTabWidget = new QTabWidget;
//secondTabWidget->setFont(Theme::awesome()->font(Theme::toolIconFontSize * 3 / 4));
//secondTabWidget->setMaximumWidth(200);
//secondTabWidget->setMaximumHeight(90);
//secondTabWidget->addTab(propertyWidget, QChar(fa::adjust));
QVBoxLayout *mainRightLayout = new QVBoxLayout; QVBoxLayout *mainRightLayout = new QVBoxLayout;
mainRightLayout->setSpacing(0); mainRightLayout->setSpacing(0);
//mainRightLayout->setContentsMargins(5, 5, 5, 5);
mainRightLayout->setContentsMargins(0, 0, 0, 0); mainRightLayout->setContentsMargins(0, 0, 0, 0);
mainRightLayout->addWidget(partListWidget); mainRightLayout->addWidget(partListWidget);
//mainRightLayout->addWidget(firstTabWidget);
//mainRightLayout->addWidget(secondTabWidget);
QHBoxLayout *mainLayout = new QHBoxLayout; QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->setSpacing(0); mainLayout->setSpacing(0);
@ -155,8 +109,6 @@ SkeletonDocumentWindow::SkeletonDocumentWindow() :
connect(m_document, &SkeletonDocument::turnaroundChanged, connect(m_document, &SkeletonDocument::turnaroundChanged,
graphicsWidget, &SkeletonGraphicsWidget::turnaroundChanged); graphicsWidget, &SkeletonGraphicsWidget::turnaroundChanged);
connect(changeTurnaroundButton, &QPushButton::clicked, this, &SkeletonDocumentWindow::changeTurnaround);
connect(undoButton, &QPushButton::clicked, [=]() { connect(undoButton, &QPushButton::clicked, [=]() {
m_document->undo(); m_document->undo();
}); });

View File

@ -1,53 +0,0 @@
#include <QFormLayout>
#include <QObject>
#include <QComboBox>
#include <QtGlobal>
#include "skeletonedgepropertywidget.h"
SkeletonEdgePropertyWidget::SkeletonEdgePropertyWidget(const SkeletonDocument *document) :
m_branchModeComboBox(nullptr),
m_document(document)
{
m_branchModeComboBox = new QComboBox;
m_branchModeComboBox->insertItem(0, tr("Auto"), (int)SkeletonEdgeBranchMode::Auto);
m_branchModeComboBox->insertItem(1, tr("No Trivial"), (int)SkeletonEdgeBranchMode::NoTrivial);
m_branchModeComboBox->insertItem(2, tr("Trivial"), (int)SkeletonEdgeBranchMode::Trivial);
QFormLayout *formLayout = new QFormLayout;
formLayout->addRow(tr("Joint Branch Mode:"), m_branchModeComboBox);
setLayout(formLayout);
hide();
connect(m_branchModeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int index) {
if (-1 != index) {
int mode = m_branchModeComboBox->itemData(index).toInt();
emit setEdgeBranchMode(m_edgeId, static_cast<SkeletonEdgeBranchMode>(mode));
}
});
}
void SkeletonEdgePropertyWidget::showProperties(QUuid edgeId)
{
m_edgeId = edgeId;
updateData();
show();
}
void SkeletonEdgePropertyWidget::updateData()
{
const SkeletonEdge *edge = m_document->findEdge(m_edgeId);
if (nullptr == edge) {
hide();
return;
}
int selectIndex = m_branchModeComboBox->findData((int)edge->branchMode);
m_branchModeComboBox->setCurrentIndex(selectIndex);
}
QUuid SkeletonEdgePropertyWidget::currentEdgeId()
{
return m_edgeId;
}

View File

@ -1,26 +0,0 @@
#ifndef SKELETON_EDGE_PROPERTY_WIDGET_H
#define SKELETON_EDGE_PROPERTY_WIDGET_H
#include <QWidget>
#include <QComboBox>
#include <QObject>
#include "skeletondocument.h"
class SkeletonEdgePropertyWidget : public QWidget
{
Q_OBJECT
signals:
void setEdgeBranchMode(QUuid edgeId, SkeletonEdgeBranchMode mode);
public slots:
void showProperties(QUuid edgeId);
public:
SkeletonEdgePropertyWidget(const SkeletonDocument *document);
QUuid currentEdgeId();
private:
void updateData();
private:
QComboBox *m_branchModeComboBox;
const SkeletonDocument *m_document;
QUuid m_edgeId;
};
#endif

View File

@ -77,61 +77,73 @@ void SkeletonGraphicsWidget::showContextMenu(const QPoint &pos)
QMenu contextMenu(this); QMenu contextMenu(this);
QAction addAction("Add..", this); QAction addAction(tr("Add.."), this);
connect(&addAction, &QAction::triggered, [=]() { connect(&addAction, &QAction::triggered, [=]() {
emit setEditMode(SkeletonDocumentEditMode::Add); emit setEditMode(SkeletonDocumentEditMode::Add);
}); });
contextMenu.addAction(&addAction); contextMenu.addAction(&addAction);
QAction deleteAction("Delete", this); QAction undoAction(tr("Undo"), this);
if (m_document->undoable()) {
connect(&undoAction, &QAction::triggered, m_document, &SkeletonDocument::undo);
contextMenu.addAction(&undoAction);
}
QAction redoAction(tr("Redo"), this);
if (m_document->redoable()) {
connect(&redoAction, &QAction::triggered, m_document, &SkeletonDocument::redo);
contextMenu.addAction(&redoAction);
}
QAction deleteAction(tr("Delete"), this);
if (!m_rangeSelectionSet.empty()) { if (!m_rangeSelectionSet.empty()) {
connect(&deleteAction, &QAction::triggered, this, &SkeletonGraphicsWidget::deleteSelected); connect(&deleteAction, &QAction::triggered, this, &SkeletonGraphicsWidget::deleteSelected);
contextMenu.addAction(&deleteAction); contextMenu.addAction(&deleteAction);
} }
QAction cutAction("Cut", this); QAction cutAction(tr("Cut"), this);
if (!m_rangeSelectionSet.empty()) { if (!m_rangeSelectionSet.empty()) {
connect(&cutAction, &QAction::triggered, this, &SkeletonGraphicsWidget::cut); connect(&cutAction, &QAction::triggered, this, &SkeletonGraphicsWidget::cut);
contextMenu.addAction(&cutAction); contextMenu.addAction(&cutAction);
} }
QAction copyAction("Copy", this); QAction copyAction(tr("Copy"), this);
if (!m_rangeSelectionSet.empty()) { if (!m_rangeSelectionSet.empty()) {
connect(&copyAction, &QAction::triggered, this, &SkeletonGraphicsWidget::copy); connect(&copyAction, &QAction::triggered, this, &SkeletonGraphicsWidget::copy);
contextMenu.addAction(&copyAction); contextMenu.addAction(&copyAction);
} }
QAction pasteAction("Paste", this); QAction pasteAction(tr("Paste"), this);
if (m_document->hasPastableContentInClipboard()) { if (m_document->hasPastableContentInClipboard()) {
connect(&pasteAction, &QAction::triggered, m_document, &SkeletonDocument::paste); connect(&pasteAction, &QAction::triggered, m_document, &SkeletonDocument::paste);
contextMenu.addAction(&pasteAction); contextMenu.addAction(&pasteAction);
} }
QAction flipHorizontallyAction("H Flip", this); QAction flipHorizontallyAction(tr("H Flip"), this);
if (!m_rangeSelectionSet.empty() && !isSingleNodeSelected()) { if (!m_rangeSelectionSet.empty() && !isSingleNodeSelected()) {
connect(&flipHorizontallyAction, &QAction::triggered, this, &SkeletonGraphicsWidget::flipHorizontally); connect(&flipHorizontallyAction, &QAction::triggered, this, &SkeletonGraphicsWidget::flipHorizontally);
contextMenu.addAction(&flipHorizontallyAction); contextMenu.addAction(&flipHorizontallyAction);
} }
QAction flipVerticallyAction("V Flip", this); QAction flipVerticallyAction(tr("V Flip"), this);
if (!m_rangeSelectionSet.empty() && !isSingleNodeSelected()) { if (!m_rangeSelectionSet.empty() && !isSingleNodeSelected()) {
connect(&flipVerticallyAction, &QAction::triggered, this, &SkeletonGraphicsWidget::flipVertically); connect(&flipVerticallyAction, &QAction::triggered, this, &SkeletonGraphicsWidget::flipVertically);
contextMenu.addAction(&flipVerticallyAction); contextMenu.addAction(&flipVerticallyAction);
} }
QAction selectAllAction("Select All", this); QAction selectAllAction(tr("Select All"), this);
if (!nodeItemMap.empty()) { if (!nodeItemMap.empty()) {
connect(&selectAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::selectAll); connect(&selectAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::selectAll);
contextMenu.addAction(&selectAllAction); contextMenu.addAction(&selectAllAction);
} }
QAction selectPartAllAction("Select Part", this); QAction selectPartAllAction(tr("Select Part"), this);
if (!nodeItemMap.empty()) { if (!nodeItemMap.empty()) {
connect(&selectPartAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::selectPartAll); connect(&selectPartAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::selectPartAll);
contextMenu.addAction(&selectPartAllAction); contextMenu.addAction(&selectPartAllAction);
} }
QAction unselectAllAction("Unselect All", this); QAction unselectAllAction(tr("Unselect All"), this);
if (!m_rangeSelectionSet.empty()) { if (!m_rangeSelectionSet.empty()) {
connect(&unselectAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::unselectAll); connect(&unselectAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::unselectAll);
contextMenu.addAction(&unselectAllAction); contextMenu.addAction(&unselectAllAction);
@ -139,7 +151,7 @@ void SkeletonGraphicsWidget::showContextMenu(const QPoint &pos)
contextMenu.addSeparator(); contextMenu.addSeparator();
QAction changeTurnaroundAction("Change Turnaround..", this); QAction changeTurnaroundAction(tr("Change Turnaround.."), this);
connect(&changeTurnaroundAction, &QAction::triggered, [=]() { connect(&changeTurnaroundAction, &QAction::triggered, [=]() {
emit changeTurnaround(); emit changeTurnaround();
}); });

View File

@ -1,50 +0,0 @@
#include <QFormLayout>
#include "skeletonnodepropertywidget.h"
SkeletonNodePropertyWidget::SkeletonNodePropertyWidget(const SkeletonDocument *document) :
m_rootMarkModeComboBox(nullptr),
m_document(document)
{
m_rootMarkModeComboBox = new QComboBox;
m_rootMarkModeComboBox->insertItem(0, tr("Auto"), (int)SkeletonNodeRootMarkMode::Auto);
m_rootMarkModeComboBox->insertItem(1, tr("Mark as Root"), (int)SkeletonNodeRootMarkMode::MarkAsRoot);
m_rootMarkModeComboBox->insertItem(2, tr("Mark as Not Root"), (int)SkeletonNodeRootMarkMode::MarkAsNotRoot);
QFormLayout *formLayout = new QFormLayout;
formLayout->addRow(tr("Root Mark:"), m_rootMarkModeComboBox);
setLayout(formLayout);
hide();
connect(m_rootMarkModeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int index) {
if (-1 != index) {
int mode = m_rootMarkModeComboBox->itemData(index).toInt();
emit setNodeRootMarkMode(m_nodeId, static_cast<SkeletonNodeRootMarkMode>(mode));
}
});
}
void SkeletonNodePropertyWidget::showProperties(QUuid nodeId)
{
m_nodeId = nodeId;
updateData();
show();
}
void SkeletonNodePropertyWidget::updateData()
{
const SkeletonNode *node = m_document->findNode(m_nodeId);
if (nullptr == node) {
hide();
return;
}
int selectIndex = m_rootMarkModeComboBox->findData((int)node->rootMarkMode);
m_rootMarkModeComboBox->setCurrentIndex(selectIndex);
}
QUuid SkeletonNodePropertyWidget::currentNodeId()
{
return m_nodeId;
}

View File

@ -1,26 +0,0 @@
#ifndef SKELETON_NODE_PROPERTY_WIDGET_H
#define SKELETON_NODE_PROPERTY_WIDGET_H
#include <QWidget>
#include <QDoubleSpinBox>
#include <QComboBox>
#include "skeletondocument.h"
class SkeletonNodePropertyWidget : public QWidget
{
Q_OBJECT
signals:
void setNodeRootMarkMode(QUuid nodeId, SkeletonNodeRootMarkMode mode);
public slots:
void showProperties(QUuid nodeId);
public:
SkeletonNodePropertyWidget(const SkeletonDocument *document);
QUuid currentNodeId();
private:
void updateData();
private:
QComboBox *m_rootMarkModeComboBox;
const SkeletonDocument *m_document;
QUuid m_nodeId;
};
#endif