From 01e8abf0cc4318df89e3b569f45d0160410a77c0 Mon Sep 17 00:00:00 2001 From: Jeremy Hu Date: Fri, 30 Mar 2018 15:41:29 +0800 Subject: [PATCH] Fix event conflicts between model and graphics view --- src/main.cpp | 2 +- src/modelwidget.cpp | 18 +++++- src/modelwidget.h | 5 ++ src/skeletoneditedgeitem.cpp | 8 ++- src/skeletoneditgraphicsview.cpp | 95 ++++++++++++++++++++++++-------- src/skeletoneditgraphicsview.h | 7 +++ src/theme.cpp | 5 +- src/theme.h | 1 + 8 files changed, 113 insertions(+), 28 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 185370d2..10d15643 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ int main(int argc, char ** argv) // https://gist.github.com/QuantumCD/6245215 qApp->setStyle(QStyleFactory::create("Fusion")); QPalette darkPalette; - darkPalette.setColor(QPalette::Window, QColor(53,53,53)); + darkPalette.setColor(QPalette::Window, QColor(0x25,0x25,0x25)); darkPalette.setColor(QPalette::WindowText, QColor(239,239,239)); darkPalette.setColor(QPalette::Base, QColor(25,25,25)); darkPalette.setColor(QPalette::AlternateBase, QColor(53,53,53)); diff --git a/src/modelwidget.cpp b/src/modelwidget.cpp index ab1ca272..0208f5dd 100644 --- a/src/modelwidget.cpp +++ b/src/modelwidget.cpp @@ -1,5 +1,6 @@ #include "modelwidget.h" #include "ds3file.h" +#include "skeletoneditgraphicsview.h" #include #include #include @@ -20,7 +21,8 @@ ModelWidget::ModelWidget(QWidget *parent) m_renderEdgeVertexCount(0), m_mesh(NULL), m_meshUpdated(false), - m_moveStarted(false) + m_moveStarted(false), + m_graphicsView(NULL) { m_core = QSurfaceFormat::defaultFormat().profile() == QSurfaceFormat::CoreProfile; // --transparent causes the clear color to be transparent. Therefore, on systems that @@ -39,6 +41,11 @@ ModelWidget::ModelWidget(QWidget *parent) } } +void ModelWidget::setGraphicsView(SkeletonEditGraphicsView *view) +{ + m_graphicsView = view; +} + ModelWidget::~ModelWidget() { cleanup(); @@ -292,6 +299,8 @@ void ModelWidget::resizeGL(int w, int h) void ModelWidget::mousePressEvent(QMouseEvent *event) { + if (!m_moveStarted && m_graphicsView && m_graphicsView->mousePress(event, m_graphicsView->mapToScene(m_graphicsView->mapFromGlobal(event->globalPos())))) + return; m_lastPos = event->pos(); setMouseTracking(true); if (event->button() == Qt::LeftButton) { @@ -305,6 +314,8 @@ void ModelWidget::mousePressEvent(QMouseEvent *event) void ModelWidget::mouseReleaseEvent(QMouseEvent *event) { + if (!m_moveStarted && m_graphicsView && m_graphicsView->mouseRelease(event, m_graphicsView->mapToScene(m_graphicsView->mapFromGlobal(event->globalPos())))) + return; if (m_moveStarted) { m_moveStarted = false; } @@ -312,6 +323,9 @@ void ModelWidget::mouseReleaseEvent(QMouseEvent *event) void ModelWidget::mouseMoveEvent(QMouseEvent *event) { + if (!m_moveStarted && m_graphicsView && m_graphicsView->mouseMove(event, m_graphicsView->mapToScene(m_graphicsView->mapFromGlobal(event->globalPos())))) + return; + int dx = event->x() - m_lastPos.x(); int dy = event->y() - m_lastPos.y(); @@ -331,6 +345,8 @@ void ModelWidget::mouseMoveEvent(QMouseEvent *event) void ModelWidget::wheelEvent(QWheelEvent *event) { + if (!m_moveStarted && m_graphicsView && m_graphicsView->wheel(event, m_graphicsView->mapToScene(m_graphicsView->mapFromGlobal(event->globalPos())))) + return; if (m_moveStarted) return; qreal delta = event->delta() / 10; diff --git a/src/modelwidget.h b/src/modelwidget.h index f2f9b7a8..e8fe2c40 100644 --- a/src/modelwidget.h +++ b/src/modelwidget.h @@ -12,6 +12,8 @@ QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram) +class SkeletonEditGraphicsView; + class ModelWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT @@ -25,6 +27,7 @@ public: void updateMesh(Mesh *mesh); void exportMeshAsObj(const QString &filename); + void setGraphicsView(SkeletonEditGraphicsView *view); public slots: void setXRotation(int angle); @@ -73,6 +76,8 @@ private: bool m_moveStarted; QPoint m_moveStartPos; QRect m_moveStartGeometry; + + SkeletonEditGraphicsView *m_graphicsView; }; #endif diff --git a/src/skeletoneditedgeitem.cpp b/src/skeletoneditedgeitem.cpp index a68dcdac..2cde95da 100644 --- a/src/skeletoneditedgeitem.cpp +++ b/src/skeletoneditedgeitem.cpp @@ -30,9 +30,13 @@ void SkeletonEditEdgeItem::updateAppearance() { QPen pen; if (m_firstNode) { - pen.setColor(m_firstNode->sideColor()); + QColor color = m_firstNode->sideColor(); + color.setAlphaF(Theme::edgeAlpha); + pen.setColor(color); } else if (m_secondNode) { - pen.setColor(m_secondNode->sideColor()); + QColor color = m_secondNode->sideColor(); + color.setAlphaF(Theme::edgeAlpha); + pen.setColor(color); } pen.setWidth(Theme::skeletonEdgeWidth); setPen(pen); diff --git a/src/skeletoneditgraphicsview.cpp b/src/skeletoneditgraphicsview.cpp index 2dc075f1..099ea691 100644 --- a/src/skeletoneditgraphicsview.cpp +++ b/src/skeletoneditgraphicsview.cpp @@ -34,6 +34,7 @@ SkeletonEditGraphicsView::SkeletonEditGraphicsView(QWidget *parent) : m_modelWidget->setMinimumSize(128, 128); m_modelWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); m_modelWidget->move(100, 100); + m_modelWidget->setGraphicsView(this); m_modelWidgetProxy = scene()->addWidget(m_modelWidget); m_backgroundItem = new QGraphicsPixmapItem(); @@ -133,32 +134,38 @@ SkeletonEditEdgeItem *SkeletonEditGraphicsView::findEdgeItemByNodePair(SkeletonE return NULL; } -void SkeletonEditGraphicsView::mousePressEvent(QMouseEvent *event) +bool SkeletonEditGraphicsView::mousePress(QMouseEvent *event, const QPointF &scenePos) { - QWidget::mousePressEvent(event); + bool processed = false; if (!m_backgroundLoaded) - return; - QPointF pos = mapToScene(event->pos()); + return false; + QPointF pos = scenePos; if (event->button() == Qt::LeftButton) { if (!m_inAddNodeMode) { if (m_lastHoverNodeItem) { setNextStartNodeItem(m_lastHoverNodeItem); m_lastHoverNodeItem = NULL; + processed = true; } else { if (m_nextStartNodeItem) { setNextStartNodeItem(NULL); + processed = true; } } } } m_lastMousePos = pos; + return processed; } -void SkeletonEditGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) +bool SkeletonEditGraphicsView::mouseDoubleClick(QMouseEvent *event, const QPointF &scenePos) { - QWidget::mouseDoubleClickEvent(event); - if (QApplication::keyboardModifiers() & Qt::ControlModifier) + bool processed = false; + if (QApplication::keyboardModifiers() & Qt::ControlModifier) { + processed = true; emit changeTurnaroundTriggered(); + } + return processed; } void SkeletonEditGraphicsView::removeSelectedItems() @@ -203,16 +210,19 @@ void SkeletonEditGraphicsView::removeNodeItemAndSidePairs(SkeletonEditNodeItem * } } -void SkeletonEditGraphicsView::keyPressEvent(QKeyEvent *event) +bool SkeletonEditGraphicsView::keyPress(QKeyEvent *event, const QPointF &scenePos) { - QWidget::keyPressEvent(event); + bool processed = false; if (!m_backgroundLoaded) - return; - if (event->key() == Qt::Key_A) + return false; + if (event->key() == Qt::Key_A) { toggleAddNodeMode(); - else if (event->key() == Qt::Key_Delete || event->key() ==Qt::Key_Backspace) { + processed = true; + } else if (event->key() == Qt::Key_Delete || event->key() ==Qt::Key_Backspace) { removeSelectedItems(); + processed = true; } + return processed; } void SkeletonEditGraphicsView::resizeEvent(QResizeEvent *event) @@ -267,11 +277,11 @@ void SkeletonEditGraphicsView::addEdgeItem(SkeletonEditNodeItem *first, Skeleton scene()->addItem(newEdge); } -void SkeletonEditGraphicsView::mouseReleaseEvent(QMouseEvent *event) +bool SkeletonEditGraphicsView::mouseRelease(QMouseEvent *event, const QPointF &scenePos) { - QWidget::mouseReleaseEvent(event); + bool processed = false; if (!m_backgroundLoaded) - return; + return false; if (event->button() == Qt::LeftButton) { if (m_inAddNodeMode) { if (m_lastHoverNodeItem && m_nextStartNodeItem && @@ -280,15 +290,18 @@ void SkeletonEditGraphicsView::mouseReleaseEvent(QMouseEvent *event) if (!findEdgeItemByNodePair(m_lastHoverNodeItem, m_nextStartNodeItem)) { addEdgeItem(m_nextStartNodeItem, m_lastHoverNodeItem); addEdgeItem(m_nextStartNodeItem->nextSidePair(), m_lastHoverNodeItem->nextSidePair()); + processed = true; emit nodesChanged(); } } else { addNodeItemAndSidePairs(m_pendingNodeItem->rect(), m_nextStartNodeItem); + processed = true; emit nodesChanged(); } } m_isMovingNodeItem = false; } + return processed; } bool SkeletonEditGraphicsView::canNodeItemMoveTo(SkeletonEditNodeItem *item, QPointF moveTo) @@ -304,12 +317,12 @@ bool SkeletonEditGraphicsView::canNodeItemMoveTo(SkeletonEditNodeItem *item, QPo return true; } -void SkeletonEditGraphicsView::mouseMoveEvent(QMouseEvent *event) +bool SkeletonEditGraphicsView::mouseMove(QMouseEvent *event, const QPointF &scenePos) { - QWidget::mouseMoveEvent(event); + bool processed = false; if (!m_backgroundLoaded) - return; - QPointF pos = mapToScene(event->pos()); + return false; + QPointF pos = scenePos; QPointF moveTo = QPointF(pos.x() - m_pendingNodeItem->rect().width() / 2, pos.y() - m_pendingNodeItem->rect().height() / 2); if (moveTo.x() < 0) moveTo.setX(0); @@ -331,11 +344,13 @@ void SkeletonEditGraphicsView::mouseMoveEvent(QMouseEvent *event) SkeletonEditNodeItem *hoverNodeItem = findNodeItemByPos(pos); if (hoverNodeItem) { hoverNodeItem->setHovered(true); + processed = true; } if (hoverNodeItem != m_lastHoverNodeItem) { if (m_lastHoverNodeItem) m_lastHoverNodeItem->setHovered(false); m_lastHoverNodeItem = hoverNodeItem; + processed = true; } } QPointF curMousePos = pos; @@ -363,10 +378,12 @@ void SkeletonEditGraphicsView::mouseMoveEvent(QMouseEvent *event) edgeItem->updatePosition(); } } + processed = true; emit nodesChanged(); } } m_lastMousePos = curMousePos; + return processed; } void SkeletonEditGraphicsView::AddItemRadius(QGraphicsEllipseItem *item, float delta) @@ -410,11 +427,11 @@ bool SkeletonEditGraphicsView::canAddItemRadius(QGraphicsEllipseItem *item, floa return true; } -void SkeletonEditGraphicsView::wheelEvent(QWheelEvent *event) +bool SkeletonEditGraphicsView::wheel(QWheelEvent *event, const QPointF &scenePos) { - QWidget::wheelEvent(event); + bool processed = false; if (!m_backgroundLoaded) - return; + return false; qreal delta = event->delta() / 10; if (QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) { if (delta > 0) @@ -428,8 +445,10 @@ void SkeletonEditGraphicsView::wheelEvent(QWheelEvent *event) AddItemRadius(m_pendingNodeItem, delta); if (!m_inAddNodeMode && m_lastHoverNodeItem) { AddItemRadius(m_lastHoverNodeItem, delta); + processed = true; emit nodesChanged(); } + return processed; } void SkeletonEditGraphicsView::setNextStartNodeItem(SkeletonEditNodeItem *item) @@ -625,3 +644,35 @@ void SkeletonEditGraphicsView::markAsChild() emit nodesChanged(); } } + +void SkeletonEditGraphicsView::mouseMoveEvent(QMouseEvent *event) +{ + mouseMove(event, mapToScene(event->pos())); +} + +void SkeletonEditGraphicsView::wheelEvent(QWheelEvent *event) +{ + wheel(event, mapToScene(event->pos())); +} + +void SkeletonEditGraphicsView::mouseReleaseEvent(QMouseEvent *event) +{ + mouseRelease(event, mapToScene(event->pos())); +} + +void SkeletonEditGraphicsView::mousePressEvent(QMouseEvent *event) +{ + mousePress(event, mapToScene(event->pos())); +} + +void SkeletonEditGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) +{ + mouseDoubleClick(event, mapToScene(event->pos())); +} + +void SkeletonEditGraphicsView::keyPressEvent(QKeyEvent *event) +{ + keyPress(event, QPointF()); +} + + diff --git a/src/skeletoneditgraphicsview.h b/src/skeletoneditgraphicsview.h index 54340f03..9cd3d23b 100644 --- a/src/skeletoneditgraphicsview.h +++ b/src/skeletoneditgraphicsview.h @@ -2,6 +2,7 @@ #define SKELETON_EDIT_GRAPHICS_VIEW_H #include #include +#include #include #include #include @@ -26,6 +27,12 @@ public slots: void markAsTrunk(); void markAsRoot(); void markAsChild(); + bool mouseMove(QMouseEvent *event, const QPointF &scenePos); + bool wheel(QWheelEvent *event, const QPointF &scenePos); + bool mouseRelease(QMouseEvent *event, const QPointF &scenePos); + bool mousePress(QMouseEvent *event, const QPointF &scenePos); + bool mouseDoubleClick(QMouseEvent *event, const QPointF &scenePos); + bool keyPress(QKeyEvent *event, const QPointF &scenePos); public: SkeletonEditGraphicsView(QWidget *parent = 0); void updateBackgroundImage(const QImage &image); diff --git a/src/theme.cpp b/src/theme.cpp index c7a4a01b..91001ea2 100644 --- a/src/theme.cpp +++ b/src/theme.cpp @@ -14,12 +14,13 @@ // White // 0xf7, 0xd9, 0xc8 -QColor Theme::red = QColor(0xfc, 0x66, 0x21); -QColor Theme::green = QColor(0xf7, 0xd9, 0xc8); +QColor Theme::red = QColor(0xff, 0xff, 0xff); +QColor Theme::green = QColor(0xff, 0xff, 0xff); QColor Theme::blue = QColor(0x2a, 0x5a, 0xac); float Theme::normalAlpha = 128.0 / 255; float Theme::branchAlpha = 64.0 / 255; float Theme::checkedAlpha = 1.0; +float Theme::edgeAlpha = Theme::normalAlpha / 2; float Theme::fillAlpha = 50.0 / 255; int Theme::skeletonNodeBorderSize = 2; int Theme::skeletonEdgeWidth = 2; diff --git a/src/theme.h b/src/theme.h index d2be9c9d..19e0229c 100644 --- a/src/theme.h +++ b/src/theme.h @@ -14,6 +14,7 @@ public: static float checkedAlpha; static float branchAlpha; static float fillAlpha; + static float edgeAlpha; static int skeletonNodeBorderSize; static int skeletonEdgeWidth; static QString tabButtonSelectedStylesheet;