Skip to content

Commit

Permalink
Add nodeEdit mode (#46)
Browse files Browse the repository at this point in the history
* Add node deletion

* NodeEdit: Add nodes

* NodeEdit: Remove nodes

* NodeEdit: Allow to move nodes

* Fixes

* Allow to remove a single node from the full inspector

* More fixes

* Selected stars are correctly updated

* Point is now const in moveNodes

* Make findNode const

* Refactor slotUpdateSelection

* NodeEdit: Fix clearing selection
  • Loading branch information
Sedictious authored and cardinot committed Aug 31, 2019
1 parent 43ed0ef commit 6e2f064
Show file tree
Hide file tree
Showing 10 changed files with 331 additions and 183 deletions.
143 changes: 107 additions & 36 deletions src/gui/basegraphgl.cpp
Expand Up @@ -44,7 +44,8 @@ BaseGraphGL::BaseGraphGL(QWidget* parent)
m_cacheStatus(CacheStatus::Ready),
m_posEntered(0,0),
m_curMode(SelectionMode::Select),
m_fullInspectorVisible(false)
m_fullInspectorVisible(false),
m_attrs(Attributes(0))
{
m_ui->setupUi(this);

Expand All @@ -54,8 +55,10 @@ BaseGraphGL::BaseGraphGL(QWidget* parent)
connect(m_ui->bZoomIn, SIGNAL(pressed()), SLOT(zoomIn()));
connect(m_ui->bZoomOut, SIGNAL(pressed()), SLOT(zoomOut()));
connect(m_ui->bReset, SIGNAL(pressed()), SLOT(resetView()));
//connect(m_ui->edgesList, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(edgesListItemClicked(QListWidgetItem*)));
connect(m_ui->deleteEdge, SIGNAL(clicked()), this, SLOT(removeEdgeEvent()));

connect(this, SIGNAL(nodesMoved()), SLOT(slotUpdateSelection()));

m_bCenter = new QtMaterialIconButton(QIcon(":/icons/material/center_white_18"), this);
m_bCenter->setToolTip("centralize selection");
m_bCenter->setCheckable(true);
Expand Down Expand Up @@ -97,6 +100,9 @@ void BaseGraphGL::setup(AbstractGraph* abstractGraph, AttributesScope nodeAttrsS
m_nodeAttrsScope = nodeAttrsScope;
setupInspector();
updateCache();
if (m_abstractGraph && !m_abstractGraph->nodes().empty()) {
m_attrs = m_abstractGraph->node(0).attrs();
}
}

void BaseGraphGL::paint(QPaintDevice* device, bool paintBackground) const
Expand Down Expand Up @@ -135,6 +141,47 @@ void BaseGraphGL::slotSelectNode(int nodeid)
}
}

void BaseGraphGL::slotDeleteSelectedNodes()
{
for (auto node : m_selectedNodes) {
m_abstractGraph->removeNode(node.second);
}

clearSelection();
updateCache();
}

void BaseGraphGL::createNode(const QPointF& pos)
{
QPointF p = nodePoint(pos - m_origin);
m_abstractGraph->addNode(m_attrs, p.x(), p.y());
updateCache();
}

void BaseGraphGL::deleteNode(const QPointF pos)
{
const Node& node = findNode(pos);
clearSelection();
m_abstractGraph->removeNode(node);
updateCache();
}

void BaseGraphGL::moveSelectedNodes(const Node& node, const QPointF pos) {
QPointF v = nodePoint(pos - m_origin) - QPointF(node.x(), node.y());
for (Node _node : m_selectedNodes) {
_node.setCoords(_node.x() + v.x(), _node.y() + v.y());
}
emit(nodesMoved());
updateCache();
}

void BaseGraphGL::moveNode(Node& node, const QPointF pos) {
QPointF p = nodePoint(pos - m_origin);
node.setCoords(p.x(), p.y());
emit(nodesMoved());
updateCache();
}

void BaseGraphGL::setupInspector()
{
// important! for some reason, changing the layout (add/delete itens)
Expand Down Expand Up @@ -360,49 +407,72 @@ void BaseGraphGL::mouseReleaseEvent(QMouseEvent *e)
return;
}

if (m_curMode == SelectionMode::Select) {
if (e->button() == Qt::LeftButton) {
bool fNodeSelected;
const Node& node = findNode(e->localPos());
Node prevSelection = selectedNode();

if (!node.isNull() && inSelectedNodes(node)) {
fNodeSelected = true;
if (e->modifiers().testFlag(Qt::ControlModifier)) {
deselectNode(node);
emit(nodeDeselected(node));
refreshCache();
}
} else {
fNodeSelected = false;
const Node _prevNode = findNode(m_posEntered);
Node node = findNode(e->localPos());
if (e->button() == Qt::LeftButton) {
bool fNodeSelected;
Node prevSelection = selectedNode();

if (!node.isNull() && inSelectedNodes(node)) {
fNodeSelected = true;
if (e->modifiers().testFlag(Qt::ControlModifier)) {
deselectNode(node);
emit(nodeDeselected(node));
refreshCache();
}
} else {
fNodeSelected = false;
}

if (e->pos() == m_posEntered) {
if (!e->modifiers().testFlag(Qt::ControlModifier)) {
if (e->pos() == m_posEntered) {
if (!e->modifiers().testFlag(Qt::ControlModifier)) {
if (m_curMode == SelectionMode::NodeEdit && node.isNull()) {
if (m_selectedNodes.empty()) {
createNode(e->localPos());
} else {
clearSelection();
}
} else {
clearSelection();
}
if (!node.isNull() && (!fNodeSelected || !e->modifiers().testFlag(Qt::ControlModifier))) {
selectNode(e->localPos(), m_bCenter->isChecked());
m_selectedNodes.insert(std::make_pair(node.id(), node));
updateInspector(node);
emit(nodeSelected(node));
refreshCache();
}
if (!node.isNull() && (!fNodeSelected || !e->modifiers().testFlag(Qt::ControlModifier))) {
selectNode(e->localPos(), m_bCenter->isChecked());
m_selectedNodes.insert(std::make_pair(node.id(), node));
updateInspector(node);
emit(nodeSelected(node));
refreshCache();
}
m_bCenter->isChecked() ? updateCache() : update();
} else {
if (m_curMode == SelectionMode::NodeEdit && !_prevNode.isNull()) {
Node movedNode;
if (inSelectedNodes(_prevNode)) {
moveSelectedNodes(_prevNode, e->localPos());
} else {
clearSelection();
movedNode = selectNode(m_posEntered, false);
moveNode(movedNode, e->localPos());
m_selectedNodes.insert(std::make_pair(movedNode.id(), movedNode));
updateInspector(movedNode);
emit(nodeSelected(movedNode));
}
m_bCenter->isChecked() ? updateCache() : update();
} else {
m_origin += (e->pos() - m_posEntered);
updateCache();
}
} else if (e->button() == Qt::RightButton && m_nodeAttr >= 0 && !m_isReadOnly) {
Node node = selectNode(e->localPos(), false);
if (!node.isNull()) {
const QString& attrName = node.attrs().name(m_nodeAttr);
auto attrRange = m_nodeAttrsScope.value(attrName);
node.setAttr(m_nodeAttr, attrRange->next(node.attr(m_nodeAttr)));
clearSelection();
emit(updateWidgets(true));
updateCache();
}
}
} else if (e->button() == Qt::RightButton && m_curMode == SelectionMode::NodeEdit && !node.isNull()) {
deleteNode(e->localPos());
} else if (e->button() == Qt::RightButton && m_nodeAttr >= 0 && !m_isReadOnly) {
Node node = selectNode(e->localPos(), false);
if (!node.isNull()) {
const QString& attrName = node.attrs().name(m_nodeAttr);
auto attrRange = m_nodeAttrsScope.value(attrName);
node.setAttr(m_nodeAttr, attrRange->next(node.attr(m_nodeAttr)));
clearSelection();
emit(updateWidgets(true));
updateCache();
}
}
}
Expand Down Expand Up @@ -517,6 +587,7 @@ void BaseGraphGL::updateNodesInspector(const Node& node)
void BaseGraphGL::updateInspector(const Node& node)
{
m_ui->inspector->setCurrentIndex(0);

QString nodes;
QString neighbors;
QString edges;
Expand Down
14 changes: 13 additions & 1 deletion src/gui/basegraphgl.h
Expand Up @@ -69,7 +69,9 @@ class GraphGLInterface
virtual QPointF selectedNodePos() const = 0;
virtual void clearSelection() = 0;
virtual CacheStatus refreshCache() = 0;
virtual inline bool inSelectedNodes(const Node node) const = 0;
virtual inline bool inSelectedNodes(const Node& node) const = 0;
virtual inline QPointF nodePoint(const QPointF& pos) = 0;

};

class BaseGraphGL : public QOpenGLWidget, public GraphGLInterface
Expand Down Expand Up @@ -110,6 +112,9 @@ class BaseGraphGL : public QOpenGLWidget, public GraphGLInterface
void clearSelection() override;

void updateCache(bool force=false);

void createNode(const QPointF& pos);
void deleteNode(const QPointF pos);

inline void paintEvent(QPaintEvent*) override;
void mousePressEvent(QMouseEvent* e) override;
Expand All @@ -123,18 +128,21 @@ class BaseGraphGL : public QOpenGLWidget, public GraphGLInterface
void nodeSelected(const Node&);
void nodeDeselected(const Node&);
void clearedSelected();
void nodesMoved();
void updateWidgets(bool) const;

public slots:
virtual void zoomIn();
virtual void zoomOut();
virtual void slotUpdateSelection() = 0;

void slotFullInspectorVisible(int visible);
void setCurrentStep(int step);
void setCurrentSelectionMode(SelectionMode m);
void setNodeScale(int v);
void slotRestarted();
void slotStatusChanged(Status s);
void slotDeleteSelectedNodes();

private slots:
void slotSelectNode(int nodeid);
Expand All @@ -157,9 +165,13 @@ private slots:
bool m_fullInspectorVisible;
QSet<int> sneighbors;
QSet<int> sedges;
Attributes m_attrs;

void attrValueChanged(int attrId) const;

void moveSelectedNodes(const Node& node, const QPointF pos);
void moveNode(Node& node, const QPointF pos);

void setupInspector();

void updateInspector(const Node& node);
Expand Down

0 comments on commit 6e2f064

Please sign in to comment.