From fee0c55d9caa15c6fec9f6cd01a6e831c4dcd830 Mon Sep 17 00:00:00 2001 From: blacksun Date: Sat, 13 May 2017 16:01:47 +0000 Subject: [PATCH] In rare case in the diagram editor, when we add an element in the diagram and quickly click left, qet crash. This commit try to avoid this crash, but without any certitude because the crash is very difficult to reproduce git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4959 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/diagram.cpp | 73 ++++++++++++++++--- .../diagramevent/diagrameventinterface.cpp | 2 +- sources/diagramevent/diagrameventinterface.h | 2 +- 3 files changed, 66 insertions(+), 11 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 1a955b533..a5b8e0109 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -179,7 +179,15 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) { */ void Diagram::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { - if (m_event_interface && m_event_interface->mouseDoubleClickEvent(event)) return; + if (m_event_interface) + if(m_event_interface->mouseDoubleClickEvent(event)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } QGraphicsScene::mouseDoubleClickEvent(event); } @@ -191,7 +199,15 @@ void Diagram::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) */ void Diagram::mousePressEvent(QGraphicsSceneMouseEvent *event) { - if (m_event_interface && m_event_interface->mousePressEvent(event)) return; + if (m_event_interface) + if(m_event_interface->mousePressEvent(event)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } QGraphicsScene::mousePressEvent(event); } @@ -203,7 +219,15 @@ void Diagram::mousePressEvent(QGraphicsSceneMouseEvent *event) */ void Diagram::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if (m_event_interface && m_event_interface->mouseMoveEvent(event)) return; + if (m_event_interface) + if(m_event_interface->mouseMoveEvent(event)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } QGraphicsScene::mouseMoveEvent(event); } @@ -215,7 +239,15 @@ void Diagram::mouseMoveEvent(QGraphicsSceneMouseEvent *event) */ void Diagram::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - if (m_event_interface && m_event_interface->mouseReleaseEvent(event)) return; + if (m_event_interface) + if(m_event_interface->mouseReleaseEvent(event)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } QGraphicsScene::mouseReleaseEvent(event); } @@ -227,7 +259,15 @@ void Diagram::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) */ void Diagram::wheelEvent(QGraphicsSceneWheelEvent *event) { - if (m_event_interface && m_event_interface->wheelEvent(event)) return; + if (m_event_interface) + if(m_event_interface->wheelEvent(event)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } QGraphicsScene::wheelEvent(event); } @@ -240,7 +280,15 @@ void Diagram::wheelEvent(QGraphicsSceneWheelEvent *event) */ void Diagram::keyPressEvent(QKeyEvent *e) { - if (m_event_interface && m_event_interface->keyPressEvent(e)) return; + if (m_event_interface) + if(m_event_interface->keyPressEvent(e)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } bool transmit_event = true; if (!isReadOnly()) { @@ -290,8 +338,16 @@ void Diagram::keyPressEvent(QKeyEvent *e) */ void Diagram::keyReleaseEvent(QKeyEvent *e) { - if (m_event_interface && m_event_interface->KeyReleaseEvent(e)) return; - + if (m_event_interface) + if(m_event_interface->keyReleaseEvent(e)) + { + if(!m_event_interface->isRunning()) + { + delete m_event_interface; m_event_interface = nullptr; + } + return; + } + bool transmit_event = true; if (!isReadOnly()) { // detecte le relachement d'une touche de direction ( = deplacement d'elements) @@ -328,7 +384,6 @@ void Diagram::setEventInterface(DiagramEventInterface *event_interface) event_interface -> init(); } m_event_interface = event_interface; - connect (m_event_interface, &DiagramEventInterface::finish, this, [this]() { delete this->m_event_interface; this->m_event_interface = nullptr;}, Qt::QueuedConnection); } /** diff --git a/sources/diagramevent/diagrameventinterface.cpp b/sources/diagramevent/diagrameventinterface.cpp index 96b384d29..5498e4194 100644 --- a/sources/diagramevent/diagrameventinterface.cpp +++ b/sources/diagramevent/diagrameventinterface.cpp @@ -72,7 +72,7 @@ bool DiagramEventInterface::keyPressEvent(QKeyEvent *event) { return false; } -bool DiagramEventInterface::KeyReleaseEvent(QKeyEvent *event) { +bool DiagramEventInterface::keyReleaseEvent(QKeyEvent *event) { Q_UNUSED (event); return false; } diff --git a/sources/diagramevent/diagrameventinterface.h b/sources/diagramevent/diagrameventinterface.h index 9a4c663e1..bc5b29da9 100644 --- a/sources/diagramevent/diagrameventinterface.h +++ b/sources/diagramevent/diagrameventinterface.h @@ -58,7 +58,7 @@ class DiagramEventInterface : public QObject virtual bool mouseReleaseEvent (QGraphicsSceneMouseEvent *event); virtual bool wheelEvent (QGraphicsSceneWheelEvent *event); virtual bool keyPressEvent (QKeyEvent *event); - virtual bool KeyReleaseEvent (QKeyEvent *event); + virtual bool keyReleaseEvent (QKeyEvent *event); virtual bool isRunning () const; virtual void init();