Skip to content

Commit

Permalink
[GUI] Enable dragging in dependency graph view
Browse files Browse the repository at this point in the history
This commit makes it possible to drag the dependency graph using the
left mouse button.

See issue #3896.
  • Loading branch information
lvk88 authored and wwmayer committed Mar 28, 2021
1 parent 07b9cbb commit 07804a8
Showing 1 changed file with 89 additions and 1 deletion.
90 changes: 89 additions & 1 deletion src/Gui/GraphvizView.cpp
Expand Up @@ -33,8 +33,10 @@
# include <QSvgRenderer>
# include <QGraphicsSvgItem>
# include <QMessageBox>
# include <QMouseEvent>
# include <QGraphicsScene>
# include <QGraphicsView>
# include <QScrollBar>
# include <QThread>
# include <QProcess>
# include <boost_bind_bind.hpp>
Expand Down Expand Up @@ -146,6 +148,92 @@ class GraphvizWorker : public QThread {
QByteArray str, flatStr;
};

// Simple wrapper around QGraphicsView to make panning possible
class GraphvizGraphicsView final : public QGraphicsView
{
public:
GraphvizGraphicsView(QGraphicsScene* scene, QWidget* parent);
~GraphvizGraphicsView() = default;

GraphvizGraphicsView(const GraphvizGraphicsView&) = delete;
GraphvizGraphicsView(GraphvizGraphicsView&&) = delete;
GraphvizGraphicsView& operator=(const GraphvizGraphicsView&) = delete;
GraphvizGraphicsView& operator=(GraphvizGraphicsView&&) = delete;

protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;

private:
bool isPanning;
QPoint panStart;
};

GraphvizGraphicsView::GraphvizGraphicsView(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(scene, parent),
isPanning(false)
{
}

void GraphvizGraphicsView::mousePressEvent(QMouseEvent* e)
{
if(e && e->button() == Qt::LeftButton)
{
isPanning = true;
panStart = e->pos();
e->accept();
QApplication::setOverrideCursor(Qt::ClosedHandCursor);
}

QGraphicsView::mousePressEvent(e);

return;
}

void GraphvizGraphicsView::mouseMoveEvent(QMouseEvent *e)
{
if(e == nullptr)
{
return;
}

if(isPanning)
{
auto* horizontalScrollbar = horizontalScrollBar();
auto* verticalScrollbar = verticalScrollBar();
if(horizontalScrollbar == nullptr ||
verticalScrollbar == nullptr)
{
return;
}

auto direction = e->pos() - panStart;
horizontalScrollbar->setValue(horizontalScrollbar->value() - direction.x());
verticalScrollbar->setValue(verticalScrollbar->value() - direction.y());

panStart = e->pos();
e->accept();
}

QGraphicsView::mouseMoveEvent(e);

return;
}

void GraphvizGraphicsView::mouseReleaseEvent(QMouseEvent* e)
{
if(e && e->button() & Qt::LeftButton)
{
isPanning = false;
QApplication::restoreOverrideCursor();
e->accept();
}

QGraphicsView::mouseReleaseEvent(e);

return;
}

}

/* TRANSLATOR Gui::GraphvizView */
Expand All @@ -165,7 +253,7 @@ GraphvizView::GraphvizView(App::Document & _doc, QWidget* parent)
scene->addItem(svgItem);

// Create view and zoomer object
view = new QGraphicsView(scene, this);
view = new GraphvizGraphicsView(scene, this);
zoomer = new GraphicsViewZoom(view);
zoomer->set_modifiers(Qt::NoModifier);
view->show();
Expand Down

0 comments on commit 07804a8

Please sign in to comment.