This example gives a minimalistic approach of interaction with a graph In this example, we are making an interactor plugin for Node link diagram view that will activate zoom and pan and display information when you click on a node/edge.
The code contains a step-by-step explanation of the process, please refer to classes documentation for more information about their usage.
#include <QPropertyAnimation>
#include <QGraphicsView>
#include <QLabel>
#include <QGraphicsProxyWidget>
#include <tulip/MouseInteractors.h>
#include <tulip/Interactor.h>
#include <tulip/GlMainView.h>
#include <tulip/GlMainWidget.h>
#include <tulip/GlScene.h>
class InteractorPluginComponent : public InteractorComponent {
QGraphicsProxyWidget *_informationWidgetItem;
QLabel *_informationLabel;
public:
InteractorPluginComponent() {
_informationLabel = new QLabel();
_informationWidgetItem = new QGraphicsProxyWidget();
_informationWidgetItem->setWidget(_informationLabel);
_informationWidgetItem->setVisible(false);
}
void viewChanged(
View *view) {
view->
graphicsView()->scene()->addItem(_informationWidgetItem);
}
bool eventFilter(QObject *, QEvent *e) {
if (_informationWidgetItem->isVisible() && e->type() == QEvent::Wheel) {
_informationWidgetItem->setVisible(false);
return false;
}
QMouseEvent *qMouseEv = dynamic_cast<QMouseEvent *>(e);
if (qMouseEv != nullptr) {
if (e->type() == QEvent::MouseButtonPress && qMouseEv->button() == Qt::LeftButton) {
if (_informationWidgetItem->isVisible()) {
_informationWidgetItem->setVisible(false);
} else {
if (glMainView->
getGlMainWidget()->
pickNodesEdges(qMouseEv->x(), qMouseEv->y(),
selectedEntity)) {
QString text("Click on ");
if (selectedEntity.
getEntityType() == SelectedEntity::NODE_SELECTED)
text += "node ";
else
text += "edge ";
text +=
" id : " + QString::number(selectedEntity.
getComplexEntityId());
_informationLabel->setText(text);
_informationLabel->adjustSize();
_informationWidgetItem->setPos(qMouseEv->pos());
_informationWidgetItem->setVisible(true);
QPropertyAnimation *animation =
new QPropertyAnimation(_informationWidgetItem, "opacity");
animation->setDuration(100);
animation->setStartValue(0.);
animation->setEndValue(0.99);
animation->start();
return true;
}
}
}
}
return false;
}
};
QLabel *_configurationLabel;
public:
PLUGININFORMATION(
"InteractorPlugin",
"Tulip Team",
"05/10/2012",
"Demo Interactor",
"1.0",
"Information")
_configurationLabel =
new QLabel(QString("This is a demo interactor.<br>") +
"You can zoom and pan and display information if you click on a node/edge.");
}
~InteractorPlugin() {
delete _configurationLabel;
}
void construct() {
push_back(new MouseNKeysNavigator);
push_back(new InteractorPluginComponent);
}
bool isCompatible(const std::string &viewName) const {
return (viewName == "Node Link Diagram view");
}
QWidget *configurationWidget() const {
return _configurationLabel;
}
unsigned int priority() const {
return 5;
}
};