Skip to content

Commit

Permalink
Add edge selection (#47)
Browse files Browse the repository at this point in the history
* Add edge selection

* Hide node attributes when on edgeEdit

* Fix edge deselection error

* Make edge/node search more efficient
  • Loading branch information
Sedictious authored and cardinot committed Sep 7, 2019
1 parent 6e2f064 commit 6e6f6b8
Show file tree
Hide file tree
Showing 10 changed files with 363 additions and 214 deletions.
57 changes: 48 additions & 9 deletions src/gui/basegraphgl.cpp
Expand Up @@ -90,7 +90,7 @@ BaseGraphGL::BaseGraphGL(QWidget* parent)

BaseGraphGL::~BaseGraphGL()
{
m_attrWidgets.clear();
m_nodeAttrWidgets.clear();
delete m_ui;
}

Expand Down Expand Up @@ -199,15 +199,15 @@ void BaseGraphGL::setupInspector()

m_ui->inspector->hide();

m_attrWidgets.clear();
m_attrWidgets.resize(static_cast<size_t>(m_nodeAttrsScope.size()));
m_nodeAttrWidgets.clear();
m_nodeAttrWidgets.resize(static_cast<size_t>(m_nodeAttrsScope.size()));

for (auto attrRange : m_nodeAttrsScope) {
auto aw = std::make_shared<AttrWidget>(attrRange, nullptr);
aw->setToolTip(attrRange->attrRangeStr());
int aId = aw->id();
connect(aw.get(), &AttrWidget::valueChanged, [this, aId]() { attrValueChanged(aId); });
m_attrWidgets.at(attrRange->id()) = aw;
m_nodeAttrWidgets.at(attrRange->id()) = aw;
m_ui->modelAttrs->insertRow(attrRange->id(), attrRange->attrName(), aw.get());
QWidget* l = m_ui->modelAttrs->labelForField(aw.get());
l->setToolTip(attrRange->attrName());
Expand All @@ -226,7 +226,7 @@ void BaseGraphGL::attrValueChanged(int attrId) const
std::shared_ptr<AttrWidget> aw;

try {
aw = m_attrWidgets.at(attrId);
aw = m_nodeAttrWidgets.at(attrId);
} catch (std::out_of_range) { return; }

for (auto node : m_selectedNodes) {
Expand Down Expand Up @@ -290,7 +290,7 @@ void BaseGraphGL::updateCache(bool force)
void BaseGraphGL::slotStatusChanged(Status s)
{
m_isReadOnly = s == Status::Running;
for (auto aw : m_attrWidgets) {
for (auto aw : m_nodeAttrWidgets) {
if (aw) {
aw->setReadOnly(m_isReadOnly);
}
Expand Down Expand Up @@ -338,6 +338,9 @@ void BaseGraphGL::setCurrentStep(int step)

void BaseGraphGL::setCurrentSelectionMode(SelectionMode m) {
m_curMode = m;
//TODO: Don't clear selection each time the mode is changed
clearSelection();
updateCache();
}

void BaseGraphGL::setNodeScale(int v)
Expand Down Expand Up @@ -432,13 +435,31 @@ void BaseGraphGL::mouseReleaseEvent(QMouseEvent *e)
} else {
clearSelection();
}
} else if (!node.isNull() && m_curMode == SelectionMode::EdgeEdit) {
if (!inSelectedNodes(node)) {
selectNode(e->localPos(), m_bCenter->isChecked());
m_selectedNodes.insert(std::make_pair(node.id(), node));

for (Edge edge : node.outEdges()) {
if (!inSelectedEdges(edge) && inSelectedNodes(edge.neighbour())) {
m_selectedEdges.insert(std::make_pair(edge.id(), edge));
selectEdge(edge);
emit(edgeSelected(edge));
}
}
} else {
for (Edge edge : node.outEdges()) {
deselectEdge(edge);
}
deselectNode(node);
}
} else {
clearSelection();
}
}
if (!node.isNull() && (!fNodeSelected || !e->modifiers().testFlag(Qt::ControlModifier))) {
if (!node.isNull() && (!fNodeSelected || !e->modifiers().testFlag(Qt::ControlModifier)) && m_curMode != SelectionMode::EdgeEdit) {
selectNode(e->localPos(), m_bCenter->isChecked());
m_selectedNodes.insert(std::make_pair(node.id(), node));
m_selectedNodes.insert(std::make_pair(node.id(), node));
updateInspector(node);
emit(nodeSelected(node));
refreshCache();
Expand Down Expand Up @@ -526,6 +547,23 @@ void BaseGraphGL::keyReleaseEvent(QKeyEvent* e)
QOpenGLWidget::keyReleaseEvent(e);
}

bool BaseGraphGL::deselectNode(const Node& node) {
if (inSelectedNodes(node)) {
m_selectedNodes.erase(node.id());
return true;
}
return false;
}

bool BaseGraphGL::deselectEdge(const Edge& edge) {
if (m_selectedEdges.find(edge.id()) != m_selectedEdges.end()) {
emit(edgeDeselected(edge));
m_selectedEdges.erase(edge.id());
return true;
}
return false;
}

void BaseGraphGL::resizeEvent(QResizeEvent* e)
{
QOpenGLWidget::resizeEvent(e);
Expand Down Expand Up @@ -619,7 +657,7 @@ void BaseGraphGL::updateInspector(const Node& node)
m_ui->nodesNeighbors->setText(neighbors);
m_ui->edges->setText(edges);

for (auto aw : m_attrWidgets) {
for (auto aw : m_nodeAttrWidgets) {
aw->blockSignals(true);
aw->setValue(node.attr(aw->id()));
aw->blockSignals(false);
Expand All @@ -637,6 +675,7 @@ void BaseGraphGL::clearSelection()
{
emit(clearedSelected());
m_selectedNodes.clear();
m_selectedEdges.clear();

m_ui->nodeIds->clear();
sedges.clear();
Expand Down
16 changes: 14 additions & 2 deletions src/gui/basegraphgl.h
Expand Up @@ -64,12 +64,15 @@ class GraphGLInterface
virtual Node findNode(const QPointF& pos) const = 0;
virtual Node selectNode(const QPointF& pos, bool center) = 0;
virtual bool selectNode(const Node& node, bool center) = 0;
virtual void selectEdge(const Edge& edge) = 0;
virtual bool deselectNode(const Node& node) = 0;
virtual bool deselectEdge(const Edge& edge) = 0;
virtual Node selectedNode() const = 0;
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 inSelectedEdges(const Edge& edge) const = 0;
virtual inline QPointF nodePoint(const QPointF& pos) = 0;

};
Expand Down Expand Up @@ -115,7 +118,10 @@ class BaseGraphGL : public QOpenGLWidget, public GraphGLInterface

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


bool deselectNode(const Node& node) override;
bool deselectEdge(const Edge& edge) override;
inline SelectionMode curSelectionMode() const;
inline void paintEvent(QPaintEvent*) override;
void mousePressEvent(QMouseEvent* e) override;
void mouseReleaseEvent(QMouseEvent* e) override;
Expand All @@ -126,7 +132,9 @@ class BaseGraphGL : public QOpenGLWidget, public GraphGLInterface

signals:
void nodeSelected(const Node&);
void edgeSelected(const Edge&);
void nodeDeselected(const Node&);
void edgeDeselected(const Edge&);
void clearedSelected();
void nodesMoved();
void updateWidgets(bool) const;
Expand Down Expand Up @@ -160,8 +168,9 @@ private slots:
QMutex m_mutex;
QRect m_inspGeo; // inspector geometry with margin
SelectionMode m_curMode;
std::vector<std::shared_ptr<AttrWidget>> m_attrWidgets;
std::vector<std::shared_ptr<AttrWidget>> m_nodeAttrWidgets;
std::map<int, Node> m_selectedNodes;
std::map<int, Edge> m_selectedEdges;
bool m_fullInspectorVisible;
QSet<int> sneighbors;
QSet<int> sedges;
Expand All @@ -179,6 +188,9 @@ private slots:
void updateNodesInspector(const Node& node);
};

inline SelectionMode BaseGraphGL::curSelectionMode() const
{ return m_curMode; }

inline void BaseGraphGL::paintEvent(QPaintEvent*)
{ paint(this, true); }

Expand Down

0 comments on commit 6e6f6b8

Please sign in to comment.