Skip to content

Commit f953fca

Browse files
Gabrielnmdstatatupig-abiliohudsonmiranda291
authored
feat: adds zoom fit selected and zoom fit all functionalities. (#509)
--------- Co-authored-by: Taiguara Tupinambás <tatatupi@gmail.com> Co-authored-by: g-abilio <gabrielabiliobferreira2@gmail.com> Co-authored-by: Gabriel Abílio <150153171+g-abilio@users.noreply.github.com> Co-authored-by: Hudson Miranda <hudsonmiranda291@gmail.com>
1 parent e2d4520 commit f953fca

6 files changed

Lines changed: 55 additions & 18 deletions

File tree

include/QtNodes/internal/AbstractGraphModel.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
#pragma once
22

3-
#include "Export.hpp"
43
#include "ConnectionIdHash.hpp"
54
#include "Definitions.hpp"
5+
#include "Export.hpp"
66

77
#include <QtCore/QJsonObject>
88
#include <QtCore/QObject>
99
#include <QtCore/QVariant>
1010

1111
#include <unordered_set>
1212

13-
1413
namespace QtNodes {
1514

1615
/**
@@ -51,8 +50,7 @@ class NODE_EDITOR_PUBLIC AbstractGraphModel : public QObject
5150
*/
5251
virtual std::unordered_set<ConnectionId> connections(NodeId nodeId,
5352
PortType portType,
54-
PortIndex index) const
55-
= 0;
53+
PortIndex index) const = 0;
5654

5755
/// Checks if two nodes with the given `connectionId` are connected.
5856
virtual bool connectionExists(ConnectionId const connectionId) const = 0;
@@ -132,8 +130,10 @@ class NODE_EDITOR_PUBLIC AbstractGraphModel : public QObject
132130
* @returns Port Data Type, Port Data, Connection Policy, Port
133131
* Caption.
134132
*/
135-
virtual QVariant portData(NodeId nodeId, PortType portType, PortIndex index, PortRole role) const
136-
= 0;
133+
virtual QVariant portData(NodeId nodeId,
134+
PortType portType,
135+
PortIndex index,
136+
PortRole role) const = 0;
137137

138138
/**
139139
* A utility function that unwraps the `QVariant` value returned from the

include/QtNodes/internal/BasicGraphicsScene.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include <tuple>
1818
#include <unordered_map>
1919

20-
2120
class QUndoStack;
2221

2322
namespace QtNodes {
@@ -125,6 +124,9 @@ class NODE_EDITOR_PUBLIC BasicGraphicsScene : public QGraphicsScene
125124

126125
/// Signal allows showing custom context menu upon clicking a node.
127126
void nodeContextMenu(NodeId const nodeId, QPointF const pos);
127+
/// Signals to call Graphics View's zoomFit methods
128+
void zoomFitAllClicked();
129+
void zoomFitSelectedClicked();
128130

129131
private:
130132
/**

include/QtNodes/internal/DataFlowGraphModel.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
namespace QtNodes {
1616

17-
class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel, public Serializable
17+
class NODE_EDITOR_PUBLIC DataFlowGraphModel
18+
: public AbstractGraphModel
19+
, public Serializable
1820
{
1921
Q_OBJECT
2022

@@ -43,7 +45,6 @@ class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel, public
4345

4446
NodeId addNode(QString const nodeType) override;
4547

46-
4748
bool connectionPossible(ConnectionId const connectionId) const override;
4849

4950
void addConnection(ConnectionId const connectionId) override;
@@ -75,7 +76,6 @@ class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel, public
7576

7677
void loadNode(QJsonObject const &nodeJson) override;
7778

78-
7979
// From Serializable
8080
QJsonObject save() const override;
8181

include/QtNodes/internal/GraphicsView.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public Q_SLOTS:
5858

5959
virtual void onPasteObjects();
6060

61+
void zoomFitAll();
62+
63+
void zoomFitSelected();
64+
6165
Q_SIGNALS:
6266
void scaleChanged(double scale);
6367

src/BasicGraphicsScene.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111

1212
#include <QUndoStack>
1313

14+
#include <QHeaderView>
15+
#include <QLineEdit>
16+
#include <QTreeWidget>
17+
#include <QWidgetAction>
1418
#include <QtWidgets/QFileDialog>
1519
#include <QtWidgets/QGraphicsSceneMoveEvent>
1620

src/GraphicsView.cpp

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "BasicGraphicsScene.hpp"
44
#include "ConnectionGraphicsObject.hpp"
5+
#include "DataFlowGraphModel.hpp"
56
#include "NodeGraphicsObject.hpp"
67
#include "StyleCollection.hpp"
78
#include "UndoCommands.hpp"
@@ -23,7 +24,9 @@
2324
#include <cmath>
2425

2526
using QtNodes::BasicGraphicsScene;
27+
using QtNodes::DataFlowGraphModel;
2628
using QtNodes::GraphicsView;
29+
using QtNodes::NodeGraphicsObject;
2730

2831
GraphicsView::GraphicsView(QWidget *parent)
2932
: QGraphicsView(parent)
@@ -75,8 +78,7 @@ QAction *GraphicsView::deleteSelectionAction() const
7578
void GraphicsView::setScene(BasicGraphicsScene *scene)
7679
{
7780
QGraphicsView::setScene(scene);
78-
if (!scene)
79-
{
81+
if (!scene) {
8082
// Clear actions.
8183
delete _clearSelectionAction;
8284
delete _deleteSelectionAction;
@@ -186,7 +188,8 @@ void GraphicsView::contextMenuEvent(QContextMenuEvent *event)
186188
return;
187189
}
188190

189-
if (!nodeScene()) return;
191+
if (!nodeScene())
192+
return;
190193

191194
auto const scenePos = mapToScene(event->pos());
192195

@@ -291,14 +294,16 @@ void GraphicsView::setupScale(double scale)
291294

292295
void GraphicsView::onDeleteSelectedObjects()
293296
{
294-
if (!nodeScene()) return;
297+
if (!nodeScene())
298+
return;
295299

296300
nodeScene()->undoStack().push(new DeleteCommand(nodeScene()));
297301
}
298302

299303
void GraphicsView::onDuplicateSelectedObjects()
300304
{
301-
if (!nodeScene()) return;
305+
if (!nodeScene())
306+
return;
302307

303308
QPointF const pastePosition = scenePastePosition();
304309

@@ -308,14 +313,16 @@ void GraphicsView::onDuplicateSelectedObjects()
308313

309314
void GraphicsView::onCopySelectedObjects()
310315
{
311-
if (!nodeScene()) return;
316+
if (!nodeScene())
317+
return;
312318

313319
nodeScene()->undoStack().push(new CopyCommand(nodeScene()));
314320
}
315321

316322
void GraphicsView::onPasteObjects()
317323
{
318-
if (!nodeScene()) return;
324+
if (!nodeScene())
325+
return;
319326

320327
QPointF const pastePosition = scenePastePosition();
321328
nodeScene()->undoStack().push(new PasteCommand(nodeScene(), pastePosition));
@@ -360,7 +367,8 @@ void GraphicsView::mouseMoveEvent(QMouseEvent *event)
360367
{
361368
QGraphicsView::mouseMoveEvent(event);
362369

363-
if (!scene()) return;
370+
if (!scene())
371+
return;
364372

365373
if (scene()->mouseGrabberItem() == nullptr && event->buttons() == Qt::LeftButton) {
366374
// Make sure shift is not being pressed
@@ -434,3 +442,22 @@ QPointF GraphicsView::scenePastePosition()
434442

435443
return mapToScene(origin);
436444
}
445+
446+
void GraphicsView::zoomFitAll()
447+
{
448+
fitInView(scene()->itemsBoundingRect(), Qt::KeepAspectRatio);
449+
}
450+
451+
void GraphicsView::zoomFitSelected()
452+
{
453+
if (scene()->selectedItems().count() > 0) {
454+
QRectF unitedBoundingRect{};
455+
456+
for (QGraphicsItem *item : scene()->selectedItems()) {
457+
unitedBoundingRect = unitedBoundingRect.united(
458+
item->mapRectToScene(item->boundingRect()));
459+
}
460+
461+
fitInView(unitedBoundingRect, Qt::KeepAspectRatio);
462+
}
463+
}

0 commit comments

Comments
 (0)