ui: graphView

Graph view has now toggle-able subnodes. Subnodes connected to the active node are always visible.

fortune cookie message = You will enjoy true success in whatever you do.
This commit is contained in:
Manuel Dobusch
2014-10-20 14:36:57 +02:00
parent ce666acbfd
commit 103e60b52a
16 changed files with 478 additions and 72 deletions
+21
View File
@@ -1,8 +1,10 @@
/*
#include <string>
#include <vector>
#include <map>
#include <memory>
#include <functional>
/* */
const bool *abd(int abc, int bca);
@@ -117,6 +119,25 @@ namespace
};
}
noname::V voo;
typedef A* D;
D globalD;
class E
{
public:
E(){}
~E(){}
class SubE
{
public:
SubE(){}
~SubE(){}
};
private:
int m_importantInt;
};
+7 -2
View File
@@ -22,12 +22,17 @@ add_files(
qt/utility/utilityQt.cpp
qt/utility/utilityQt.h
qt/view/graphElements/nodeComponents/QtGraphNodeComponent.cpp
qt/view/graphElements/nodeComponents/QtGraphNodeComponent.h
qt/view/graphElements/nodeComponents/QtGraphNodeComponentMoveable.cpp
qt/view/graphElements/nodeComponents/QtGraphNodeComponentMoveable.h
qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.cpp
qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h
qt/view/graphElements/QtGraphEdge.cpp
qt/view/graphElements/QtGraphEdge.h
qt/view/graphElements/QtGraphNode.cpp
qt/view/graphElements/QtGraphNode.h
qt/view/graphElements/QtGraphNodeMouseMovable.cpp
qt/view/graphElements/QtGraphNodeMouseMovable.h
qt/view/QtCodeView.cpp
qt/view/QtCodeView.h
+34 -19
View File
@@ -10,7 +10,8 @@
#include "qt/view/QtViewWidgetWrapper.h"
#include "qt/view/graphElements/QtGraphEdge.h"
#include "qt/view/graphElements/QtGraphNode.h"
#include "qt/view/graphElements/QtGraphNodeMouseMovable.h"
#include "qt/view/graphElements/nodeComponents/QtGraphNodeComponentMoveable.h"
#include "qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h"
QtGraphView::QtGraphView(ViewLayout* viewLayout)
: GraphView(viewLayout)
@@ -108,6 +109,12 @@ void QtGraphView::doRebuildGraph(const std::vector<DummyNode>& nodes, const std:
m_edges.push_back(edge);
}
}
// hide node content by default, must be done after all edges are created to keep subnodes with connections visible
for(std::list<std::shared_ptr<GraphNode>>::iterator it = m_nodes.begin(); it != m_nodes.end(); it++)
{
(*it)->hideContent();
}
}
else
{
@@ -183,21 +190,24 @@ std::shared_ptr<GraphNode> QtGraphView::createNode(QGraphicsView* view, const Du
{
if (view != NULL)
{
std::shared_ptr<QtGraphNodeMouseMovable> newNode =
std::make_shared<QtGraphNodeMouseMovable>(Vec2i(0, 0), node.name, node.tokenId);
std::shared_ptr<QtGraphNode> newNode =
std::make_shared<QtGraphNode>(Vec2i(0, 0), Vec2i(100, 30), node.name, node.tokenId);
view->scene()->addItem(newNode.get());
m_nodes.push_back(newNode);
for (unsigned int i = 0; i < node.subNodes.size(); i++)
{
std::shared_ptr<QtGraphNode> subNode = createSubNode(view, node.subNodes[i]);
subNode->setParentItem(newNode.get());
newNode->addSubNode(subNode);
subNode->setRect(0, 0, 80, 20);
subNode->moveBy(10, (i + 1) * 30);
}
newNode->addComponent(std::make_shared<QtGraphNodeComponentMoveable>(newNode));
newNode->setRect(0, 0, 100, 40 + (node.subNodes.size() * 30));
if(node.subNodes.size() > 0)
{
newNode->addComponent(std::make_shared<QtGraphNodeComponentToggleButton>(newNode));
for (unsigned int i = 0; i < node.subNodes.size(); i++)
{
std::shared_ptr<QtGraphNode> subNode = createSubNode(view, node.subNodes[i]);
subNode->setParent(newNode);
newNode->addSubNode(subNode);
}
}
return newNode;
}
@@ -212,16 +222,21 @@ std::shared_ptr<QtGraphNode> QtGraphView::createSubNode(QGraphicsView* view, con
{
if (view != NULL)
{
std::shared_ptr<QtGraphNode> newNode = std::make_shared<QtGraphNode>(Vec2i(0, 0), node.name, node.tokenId);
std::shared_ptr<QtGraphNode> newNode = std::make_shared<QtGraphNode>(Vec2i(0, 0), Vec2i(80, 20), node.name, node.tokenId);
view->scene()->addItem(newNode.get());
for (unsigned int i = 0; i < node.subNodes.size(); i++)
if(node.subNodes.size() > 0)
{
std::shared_ptr<QtGraphNode> subNode = createSubNode(view, node.subNodes[i]);
subNode->setParentItem(newNode.get());
newNode->addSubNode(subNode);
subNode->setRect(0, 0, 80, 20);
subNode->moveBy(10, (i + 1) * 30);
newNode->addComponent(std::make_shared<QtGraphNodeComponentToggleButton>(newNode));
for (unsigned int i = 0; i < node.subNodes.size(); i++)
{
std::shared_ptr<QtGraphNode> subNode = createSubNode(view, node.subNodes[i]);
subNode->setParent(newNode);
newNode->addSubNode(subNode);
}
}
return newNode;
+172 -2
View File
@@ -6,11 +6,16 @@
#include <QGraphicsSceneEvent>
#include "qt/view/graphElements/QtGraphEdge.h"
#include "qt/view/graphElements/nodeComponents/QtGraphNodeComponent.h"
QtGraphNode::QtGraphNode(const Vec2i& position, const std::string& name, const Id tokenId)
QtGraphNode::QtGraphNode(const Vec2i& position, const Vec2i& size, const std::string& name, const Id tokenId)
: GraphNode(tokenId)
, m_baseSize(size)
, m_currentSize(size)
, m_padding(10, 10)
, m_contentHidden(false)
{
this->setRect(0, 0, 100, 100);
this->setRect(0, 0, size.x, size.y);
this->setPos(position.x, position.y);
QBrush brush(Qt::lightGray);
this->setBrush(brush);
@@ -56,6 +61,27 @@ void QtGraphNode::setPosition(const Vec2i& position)
}
}
Vec2i QtGraphNode::getSize() const
{
return m_currentSize;
}
void QtGraphNode::setParent(std::weak_ptr<QtGraphNode> parentNode)
{
m_parentNode = parentNode;
std::shared_ptr<QtGraphNode> parent = parentNode.lock();
if(parent != NULL)
{
QGraphicsRectItem::setParentItem(parent.get());
}
}
void QtGraphNode::addComponent(const std::shared_ptr<QtGraphNodeComponent>& component)
{
m_components.push_back(component);
}
bool QtGraphNode::addOutEdge(const std::shared_ptr<GraphEdge>& edge)
{
for (std::list<std::shared_ptr<GraphEdge>>::iterator it = m_outEdges.begin(); it != m_outEdges.end(); it++)
@@ -113,12 +139,35 @@ std::list<std::shared_ptr<GraphNode>> QtGraphNode::getSubNodes() const
void QtGraphNode::addSubNode(const std::shared_ptr<GraphNode>& node)
{
m_subNodes.push_back(node);
rebuildLayout();
}
void QtGraphNode::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
for (std::list<std::shared_ptr<QtGraphNodeComponent>>::iterator it = m_components.begin(); it != m_components.end(); it++)
{
(*it)->nodeMousePressEvent(event);
}
}
void QtGraphNode::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
for (std::list<std::shared_ptr<QtGraphNodeComponent>>::iterator it = m_components.begin(); it != m_components.end(); it++)
{
(*it)->nodeMouseMoveEvent(event);
}
}
void QtGraphNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
{
MessageActivateToken message(m_tokenId);
message.dispatch();
for (std::list<std::shared_ptr<QtGraphNodeComponent>>::iterator it = m_components.begin(); it != m_components.end(); it++)
{
(*it)->nodeMouseDoubleClickEvent(event);
}
}
void QtGraphNode::notifyParentMoved()
@@ -126,6 +175,83 @@ void QtGraphNode::notifyParentMoved()
notifyEdgesAfterMove();
}
void QtGraphNode::hideContent()
{
for (std::list<std::shared_ptr<GraphNode>>::iterator it = m_subNodes.begin(); it != m_subNodes.end(); it++)
{
(*it)->hideContent();
if((*it)->getEdgeCountRecursive() <= 0)
{
(*it)->hide();
}
}
m_contentHidden = true;
rebuildLayout();
notifyParentNodeAfterSizeChanged();
}
void QtGraphNode::showContent()
{
for (std::list<std::shared_ptr<GraphNode>>::iterator it = m_subNodes.begin(); it != m_subNodes.end(); it++)
{
(*it)->show();
}
m_contentHidden = false;
rebuildLayout();
notifyParentNodeAfterSizeChanged();
}
void QtGraphNode::hide()
{
QGraphicsRectItem::hide();
}
void QtGraphNode::show()
{
QGraphicsRectItem::show();
}
bool QtGraphNode::isHidden()
{
return !QGraphicsRectItem::isVisible();
}
bool QtGraphNode::contentIsHidden()
{
return m_contentHidden;
}
unsigned int QtGraphNode::getOutEdgeCount() const
{
return m_outEdges.size();
}
unsigned int QtGraphNode::getInEdgeCount() const
{
return m_inEdges.size();
}
unsigned int QtGraphNode::getEdgeCountRecursive() const
{
unsigned int result = 0;
for (std::list<std::shared_ptr<GraphNode>>::const_iterator it = m_subNodes.begin(); it != m_subNodes.end(); it++)
{
result += (*it)->getEdgeCountRecursive();
}
result += (getInEdgeCount() + getOutEdgeCount());
return result;
}
void QtGraphNode::notifyEdgesAfterMove()
{
for (std::list<std::shared_ptr<GraphEdge>>::iterator it = m_outEdges.begin(); it != m_outEdges.end(); it++)
@@ -153,3 +279,47 @@ void QtGraphNode::notifyEdgesAfterMove()
(*it3)->notifyParentMoved();
}
}
void QtGraphNode::notifyParentNodeAfterSizeChanged()
{
std::shared_ptr<QtGraphNode> parentNode = m_parentNode.lock();
if(parentNode != NULL)
{
parentNode->onChildSizeChanged();
}
}
void QtGraphNode::onChildSizeChanged()
{
rebuildLayout();
notifyParentNodeAfterSizeChanged();
}
void QtGraphNode::rebuildLayout()
{
int nextYPos = m_baseSize.y;
int newWidth = m_baseSize.x;
for (std::list<std::shared_ptr<GraphNode>>::iterator it = m_subNodes.begin(); it != m_subNodes.end(); it++)
{
if((*it)->isHidden() == false)
{
(*it)->setPosition(this->getPosition() + Vec2i(m_padding.x, nextYPos));
nextYPos += (*it)->getSize().y + m_padding.y;
int tmpWidth = ((*it)->getPosition().x - getPosition().x) + (*it)->getSize().x + m_padding.x;
if(tmpWidth > newWidth)
{
newWidth = tmpWidth;
}
}
}
m_currentSize.x = newWidth;
m_currentSize.y = nextYPos;
this->setRect(0, 0, m_currentSize.x, m_currentSize.y);
}
+42 -1
View File
@@ -9,19 +9,26 @@
#include "component/view/graphElements/GraphNode.h"
class QtGraphEdge;
class QtGraphNodeComponent;
class QtGraphNode
: public GraphNode
, public QGraphicsRectItem
{
public:
QtGraphNode(const Vec2i& position, const std::string& name, const Id tokenId);
QtGraphNode(const Vec2i& position, const Vec2i& size, const std::string& name, const Id tokenId);
virtual ~QtGraphNode();
virtual std::string getName() const;
virtual Vec2i getPosition() const;
virtual void setPosition(const Vec2i& position);
virtual Vec2i getSize() const;
void setParent(std::weak_ptr<QtGraphNode> parentNode);
void addComponent(const std::shared_ptr<QtGraphNodeComponent>& component);
virtual bool addOutEdge(const std::shared_ptr<GraphEdge>& edge);
virtual bool addInEdge(const std::weak_ptr<GraphEdge>& edge);
@@ -30,20 +37,54 @@ public:
virtual std::list<std::shared_ptr<GraphNode>> getSubNodes() const;
virtual void addSubNode(const std::shared_ptr<GraphNode>& node);
void mousePressEvent(QGraphicsSceneMouseEvent* event);
void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
virtual void notifyParentMoved();
virtual void hideContent();
virtual void showContent();
virtual void hide();
virtual void show();
virtual bool isHidden();
virtual bool contentIsHidden();
virtual unsigned int getOutEdgeCount() const;
virtual unsigned int getInEdgeCount() const;
/**
* @brief Returns the count of all connected edges (including edges of sub nodes)
*/
virtual unsigned int getEdgeCountRecursive() const;
protected:
void notifyEdgesAfterMove();
void notifyParentNodeAfterSizeChanged();
void onChildSizeChanged();
std::list<std::shared_ptr<GraphEdge>> m_outEdges;
std::list<std::weak_ptr<GraphEdge>> m_inEdges;
private:
void rebuildLayout();
QGraphicsTextItem* m_text;
std::weak_ptr<QtGraphNode> m_parentNode;
std::list<std::shared_ptr<GraphNode>> m_subNodes;
std::list<std::shared_ptr<QtGraphNodeComponent>> m_components;
const Vec2i m_baseSize;
Vec2i m_currentSize;
Vec2i m_padding;
bool m_contentHidden;
};
#endif // QT_GRAPH_NODE_H
@@ -1,29 +0,0 @@
#include "qt/view/graphElements/QtGraphNodeMouseMovable.h"
#include "qgraphicssceneevent.h"
#include "qt/view/graphElements/QtGraphEdge.h"
QtGraphNodeMouseMovable::QtGraphNodeMouseMovable(const Vec2i& position, const std::string& name, const Id tokenId)
: QtGraphNode(position, name, tokenId)
{
}
QtGraphNodeMouseMovable::~QtGraphNodeMouseMovable()
{
}
void QtGraphNodeMouseMovable::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
m_mouseOffset.x = event->pos().x();
m_mouseOffset.y = event->pos().y();
}
void QtGraphNodeMouseMovable::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
this->setPos(event->scenePos().x() - m_mouseOffset.x, event->scenePos().y() - m_mouseOffset.y);
Vec2i p(event->scenePos().x(), event->scenePos().y());
notifyEdgesAfterMove();
}
@@ -1,19 +0,0 @@
#ifndef QT_GRAPH_NODE_MOUSE_MOVABLE_H
#define QT_GRAPH_NODE_MOUSE_MOVABLE_H
#include "qt/view/graphElements/QtGraphNode.h"
class QtGraphNodeMouseMovable : public QtGraphNode
{
public:
QtGraphNodeMouseMovable(const Vec2i& position, const std::string& name, const Id tokenId);
virtual ~QtGraphNodeMouseMovable();
void mousePressEvent(QGraphicsSceneMouseEvent* event);
void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
private:
Vec2i m_mouseOffset;
};
#endif // QT_GRAPH_NODE_MOUSE_MOVABLE_H
@@ -0,0 +1,10 @@
#include "QtGraphNodeComponent.h"
QtGraphNodeComponent::QtGraphNodeComponent(const std::weak_ptr<QtGraphNode>& graphNode)
: m_graphNode(graphNode)
{
}
QtGraphNodeComponent::~QtGraphNodeComponent()
{
}
@@ -0,0 +1,24 @@
#ifndef QT_GRAPH_NODE_COMPONENT_H
#define QT_GRAPH_NODE_COMPONENT_H
#include <memory>
#include <QGraphicsItem>
class QtGraphNode;
class QtGraphNodeComponent
{
public:
QtGraphNodeComponent(const std::weak_ptr<QtGraphNode>& graphNode);
~QtGraphNodeComponent();
virtual void nodeMousePressEvent(QGraphicsSceneMouseEvent* event) = 0;
virtual void nodeMouseMoveEvent(QGraphicsSceneMouseEvent* event) = 0;
virtual void nodeMouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) = 0;
protected:
std::weak_ptr<QtGraphNode> m_graphNode;
};
#endif // QT_GRAPH_NODE_COMPONENT_H
@@ -0,0 +1,35 @@
#include "QtGraphNodeComponentMoveable.h"
#include <QGraphicsSceneEvent>
#include "qt/view/graphElements/QtGraphNode.h"
QtGraphNodeComponentMoveable::QtGraphNodeComponentMoveable(const std::weak_ptr<QtGraphNode>& graphNode)
: QtGraphNodeComponent(graphNode)
, m_mouseOffset(0.0f, 0.0f)
{
}
QtGraphNodeComponentMoveable::~QtGraphNodeComponentMoveable()
{
}
void QtGraphNodeComponentMoveable::nodeMousePressEvent(QGraphicsSceneMouseEvent* event)
{
m_mouseOffset.x = event->pos().x();
m_mouseOffset.y = event->pos().y();
}
void QtGraphNodeComponentMoveable::nodeMouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
std::shared_ptr<GraphNode> node = m_graphNode.lock();
if(node != NULL)
{
node->setPosition(Vec2i(event->scenePos().x() - m_mouseOffset.x, event->scenePos().y() - m_mouseOffset.y));
}
}
void QtGraphNodeComponentMoveable::nodeMouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
{
}
@@ -0,0 +1,23 @@
#ifndef QT_GRAPH_NODE_COMPONENT_MOVEABLE
#define QT_GRAPH_NODE_COMPONENT_MOVEABLE
#include "QtGraphNodeComponent.h"
#include "utility/math/Vector2.h"
class QtGraphNodeComponentMoveable
: public QtGraphNodeComponent
{
public:
QtGraphNodeComponentMoveable(const std::weak_ptr<QtGraphNode>& graphNode);
~QtGraphNodeComponentMoveable();
virtual void nodeMousePressEvent(QGraphicsSceneMouseEvent* event);
virtual void nodeMouseMoveEvent(QGraphicsSceneMouseEvent* event);
virtual void nodeMouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
private:
Vec2i m_mouseOffset;
};
#endif // QT_GRAPH_NODE_COMPONENT_MOVEABLE
@@ -0,0 +1,61 @@
#include "QtGraphNodeComponentToggleButton.h"
#include <QGraphicsScene>
#include <QGraphicsSceneEvent>
#include "qt/view/graphElements/QtGraphNode.h"
QtGraphNodeComponentToggleButton::QtGraphNodeComponentToggleButton(const std::weak_ptr<QtGraphNode>& graphNode)
: QtGraphNodeComponent(graphNode)
{
this->setRect(0, 0, 10, 10);
this->setPos(0, 0);
QBrush brush(Qt::darkGray);
this->setBrush(brush);
std::shared_ptr<QtGraphNode> node = graphNode.lock();
if(node != NULL)
{
this->setParentItem(node.get());
}
}
QtGraphNodeComponentToggleButton::~QtGraphNodeComponentToggleButton()
{
}
void QtGraphNodeComponentToggleButton::nodeMousePressEvent(QGraphicsSceneMouseEvent* event)
{
}
void QtGraphNodeComponentToggleButton::nodeMouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
}
void QtGraphNodeComponentToggleButton::nodeMouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
{
}
void QtGraphNodeComponentToggleButton::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
std::shared_ptr<QtGraphNode> node = m_graphNode.lock();
if(node != NULL)
{
if(node->contentIsHidden())
{
node->showContent();
}
else
{
node->hideContent();
}
}
}
void QtGraphNodeComponentToggleButton::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
}
void QtGraphNodeComponentToggleButton::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
{
}
@@ -0,0 +1,23 @@
#ifndef QT_GRAPH_NODE_COMPONENT_TOGGLE_BUTTON_H
#define QT_GRAPH_NODE_COMPONENT_TOGGLE_BUTTON_H
#include "QtGraphNodeComponent.h"
class QtGraphNodeComponentToggleButton
: public QtGraphNodeComponent
, public QGraphicsRectItem
{
public:
QtGraphNodeComponentToggleButton(const std::weak_ptr<QtGraphNode>& graphNode);
~QtGraphNodeComponentToggleButton();
virtual void nodeMousePressEvent(QGraphicsSceneMouseEvent* event);
virtual void nodeMouseMoveEvent(QGraphicsSceneMouseEvent* event);
virtual void nodeMouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
void mousePressEvent(QGraphicsSceneMouseEvent* event);
void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
};
#endif // QT_GRAPH_NODE_COMPONENT_TOGGLE_BUTTON_H
@@ -20,6 +20,8 @@ public:
virtual Vec2i getPosition() const = 0;
virtual void setPosition(const Vec2i& position) = 0;
virtual Vec2i getSize() const = 0;
virtual bool addOutEdge(const std::shared_ptr<GraphEdge>& edge) = 0;
virtual bool addInEdge(const std::weak_ptr<GraphEdge>& edge) = 0;
@@ -30,6 +32,20 @@ public:
virtual void notifyParentMoved() = 0;
virtual void hideContent() = 0;
virtual void showContent() = 0;
virtual void hide() = 0;
virtual void show() = 0;
virtual bool isHidden() = 0;
virtual bool contentIsHidden() = 0;
virtual unsigned int getOutEdgeCount() const = 0;
virtual unsigned int getInEdgeCount() const = 0;
virtual unsigned int getEdgeCountRecursive() const = 0;
protected:
Id m_tokenId;
};
+8
View File
@@ -9,6 +9,7 @@ public:
~Property();
T& operator=(const T& value);
T& operator=(const Property& property);
operator const T&() const;
@@ -34,6 +35,13 @@ T& Property<T>::operator=(const T& value)
return *m_valuePointer;
}
template<class T>
T& Property<T>::operator=(const Property& property)
{
*m_valuePointer = *property.m_valuePointer;
return *m_valuePointer;
}
template<class T>
Property<T>::operator const T&() const
{
+2
View File
@@ -134,6 +134,8 @@ template<class U>
void Vector2<T>::operator=(const Vector2<U>& other)
{
this->assign(other);
x = Property(&VectorBase<T, 2>::m_values[m_xIndex]);
y = Property(&VectorBase<T, 2>::m_values[m_yIndex]);
}
typedef Vector2<float> Vec2f;