From 72c5847d755d0ede116ede69beae9abe4406f683 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 12 Nov 2014 01:42:49 +0100 Subject: [PATCH] ui: styled nodes in graph view This change styles the nodes in the QtGraphView. Since Stylesheets can't be applied to QGraphicsItems, the style implementation was done in the source files. The containers for public/protected/private nodes are now subclassed from QtGraphNode as QtGraphNodeAccess, including a helper class QtAccessArrow for indicating the opened/colapsed state. --- bin/app/data/fonts/MyriadPro-Regular.otf | Bin 0 -> 94360 bytes bin/app/data/fonts/MyriadPro-Semibold.otf | Bin 0 -> 95616 bytes bin/app/data/gui/graph_view/images/arrow.png | Bin 0 -> 760 bytes .../data/gui/graph_view/images/pattern.png | Bin 0 -> 697 bytes .../data/gui/graph_view/images/private.png | Bin 0 -> 1468 bytes .../data/gui/graph_view/images/protected.png | Bin 0 -> 2684 bytes bin/app/data/gui/graph_view/images/public.png | Bin 0 -> 2124 bytes bin/app/data/src/header.h | 11 + src/app/CMakeLists.txt | 8 +- .../qt/graphics/QtGraphicsRoundedRectItem.cpp | 39 ++ .../qt/graphics/QtGraphicsRoundedRectItem.h | 22 + src/app/qt/utility/QtDeviceScaledPixmap.h | 55 +++ src/app/qt/view/QtGraphView.cpp | 58 +-- src/app/qt/view/QtGraphView.h | 10 +- src/app/qt/view/graphElements/QtGraphEdge.cpp | 14 +- src/app/qt/view/graphElements/QtGraphNode.cpp | 460 +++++++++++------- src/app/qt/view/graphElements/QtGraphNode.h | 84 ++-- .../view/graphElements/QtGraphNodeAccess.cpp | 184 +++++++ .../qt/view/graphElements/QtGraphNodeAccess.h | 45 ++ .../QtGraphNodeComponentToggleButton.cpp | 41 -- .../QtGraphNodeComponentToggleButton.h | 17 - .../component/controller/GraphController.cpp | 2 +- src/lib/component/view/GraphView.h | 9 - .../component/view/graphElements/GraphNode.h | 16 - 24 files changed, 731 insertions(+), 344 deletions(-) create mode 100755 bin/app/data/fonts/MyriadPro-Regular.otf create mode 100755 bin/app/data/fonts/MyriadPro-Semibold.otf create mode 100644 bin/app/data/gui/graph_view/images/arrow.png create mode 100644 bin/app/data/gui/graph_view/images/pattern.png create mode 100644 bin/app/data/gui/graph_view/images/private.png create mode 100644 bin/app/data/gui/graph_view/images/protected.png create mode 100644 bin/app/data/gui/graph_view/images/public.png create mode 100644 src/app/qt/graphics/QtGraphicsRoundedRectItem.cpp create mode 100644 src/app/qt/graphics/QtGraphicsRoundedRectItem.h create mode 100644 src/app/qt/utility/QtDeviceScaledPixmap.h create mode 100644 src/app/qt/view/graphElements/QtGraphNodeAccess.cpp create mode 100644 src/app/qt/view/graphElements/QtGraphNodeAccess.h delete mode 100644 src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.cpp delete mode 100644 src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h diff --git a/bin/app/data/fonts/MyriadPro-Regular.otf b/bin/app/data/fonts/MyriadPro-Regular.otf new file mode 100755 index 0000000000000000000000000000000000000000..e7b7f262a154e7a30bae1f342dfe1e68fffd6012 GIT binary patch literal 94360 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 literal 0 HcmV?d00001 diff --git a/bin/app/data/fonts/MyriadPro-Semibold.otf b/bin/app/data/fonts/MyriadPro-Semibold.otf new file mode 100755 index 0000000000000000000000000000000000000000..1178f242fe18a46c0abaa8f0c846ad2efa647a38 GIT binary patch literal 95616 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 z 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 WK^t~dAtOZq0000KLZ*U+=)p!fv7f#TG` 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 +#include + +QtGraphicsRoundedRectItem::QtGraphicsRoundedRectItem(QGraphicsItem* parent) + : QGraphicsRectItem(parent) + , m_radius(0.0f) +{ + this->setZValue(-1.0f); +} + +QtGraphicsRoundedRectItem::~QtGraphicsRoundedRectItem() +{ +} + +void QtGraphicsRoundedRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem* options, QWidget* widget) +{ + painter->setPen(pen()); + painter->setBrush(brush()); + + painter->setRenderHint(QPainter::Antialiasing); + + painter->drawRoundedRect(this->rect(), m_radius, m_radius); +} + +void QtGraphicsRoundedRectItem::setShadow(QColor color, int blurRadius) +{ + QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(); + effect->setColor(color); + effect->setBlurRadius(5); + effect->setOffset(0, 0); + this->setGraphicsEffect(effect); +} + +void QtGraphicsRoundedRectItem::setRadius(qreal radius) +{ + m_radius = radius; +} diff --git a/src/app/qt/graphics/QtGraphicsRoundedRectItem.h b/src/app/qt/graphics/QtGraphicsRoundedRectItem.h new file mode 100644 index 00000000..764274b1 --- /dev/null +++ b/src/app/qt/graphics/QtGraphicsRoundedRectItem.h @@ -0,0 +1,22 @@ +#ifndef QT_GRAPHICS_ROUNDED_RECT_ITEM_H +#define QT_GRAPHICS_ROUNDED_RECT_ITEM_H + +#include + +class QtGraphicsRoundedRectItem + : public QGraphicsRectItem +{ +public: + QtGraphicsRoundedRectItem(QGraphicsItem* parent); + virtual ~QtGraphicsRoundedRectItem(); + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem* options, QWidget* widget); + + void setShadow(QColor color, int blurRadius); + void setRadius(qreal radius); + +private: + qreal m_radius; +}; + +#endif // QT_GRAPHICS_ROUNDED_RECT_ITEM_H diff --git a/src/app/qt/utility/QtDeviceScaledPixmap.h b/src/app/qt/utility/QtDeviceScaledPixmap.h new file mode 100644 index 00000000..bd20f101 --- /dev/null +++ b/src/app/qt/utility/QtDeviceScaledPixmap.h @@ -0,0 +1,55 @@ +#ifndef QT_DEVICE_SCALED_PIXMAP_H +#define QT_DEVICE_SCALED_PIXMAP_H + +#include +#include + +class QtDeviceScaledPixmap +{ +public: + static qreal devicePixelRatio() + { + QApplication* app = dynamic_cast(QCoreApplication::instance()); + return app->devicePixelRatio(); + } + + explicit QtDeviceScaledPixmap(QString filePath) + : m_pixmap(filePath) + { + m_pixmap.setDevicePixelRatio(devicePixelRatio()); + } + + virtual ~QtDeviceScaledPixmap() {} + + const QPixmap& pixmap() const + { + return m_pixmap; + } + + qreal width() const + { + return m_pixmap.width() / devicePixelRatio(); + } + + qreal height() const + { + return m_pixmap.height() / devicePixelRatio(); + } + + void scaleToHeight(int height) + { + m_pixmap = m_pixmap.scaledToHeight(height * devicePixelRatio(), Qt::SmoothTransformation); + m_pixmap.setDevicePixelRatio(devicePixelRatio()); + } + + void mirror(bool horizontal = false, bool vertical = true) + { + m_pixmap = QPixmap::fromImage(m_pixmap.toImage().mirrored(horizontal, vertical)); + m_pixmap.setDevicePixelRatio(devicePixelRatio()); + } + +private: + QPixmap m_pixmap; +}; + +#endif // QT_DEVICE_SCALED_PIXMAP_H diff --git a/src/app/qt/view/QtGraphView.cpp b/src/app/qt/view/QtGraphView.cpp index 432ab979..05f4f1ba 100644 --- a/src/app/qt/view/QtGraphView.cpp +++ b/src/app/qt/view/QtGraphView.cpp @@ -10,9 +10,9 @@ #include "qt/view/QtViewWidgetWrapper.h" #include "qt/view/graphElements/QtGraphEdge.h" #include "qt/view/graphElements/QtGraphNode.h" +#include "qt/view/graphElements/QtGraphNodeAccess.h" #include "qt/view/graphElements/nodeComponents/QtGraphNodeComponentClickable.h" #include "qt/view/graphElements/nodeComponents/QtGraphNodeComponentMoveable.h" -#include "qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h" QtGraphView::QtGraphView(ViewLayout* viewLayout) : GraphView(viewLayout) @@ -37,15 +37,14 @@ void QtGraphView::createWidgetWrapper() void QtGraphView::initView() { QWidget* widget = QtViewWidgetWrapper::getWidgetOfView(this); - utility::setWidgetBackgroundColor(widget, Colori(100, 20, 200, 255)); + utility::setWidgetBackgroundColor(widget, Colori(255, 255, 255, 255)); QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom); - layout->setSpacing(3); - layout->setContentsMargins(3, 3, 3, 3); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); widget->setLayout(layout); QGraphicsScene* scene = new QGraphicsScene(widget); - QGraphicsView* view = new QGraphicsView(widget); view->setScene(scene); @@ -92,12 +91,12 @@ void QtGraphView::doRebuildGraph( { // Temporary stores all nodes (existing and newly created) needed in the new graph // this is a relatively easy and cheap way to save existing nodes that are still needed - std::list> newNodes; + std::list> newNodes; // create nodes (or find existing nodes for re-use) for (unsigned int i = 0; i < nodes.size(); i++) { - std::shared_ptr newNode = createNodeRecursive(view, NULL, nodes[i]); + std::shared_ptr newNode = createNodeRecursive(view, NULL, nodes[i]); newNode->setPosition(nodes[i].position); newNodes.push_back(newNode); } @@ -107,7 +106,7 @@ void QtGraphView::doRebuildGraph( for (unsigned int i = 0; i < edges.size(); i++) { - std::shared_ptr edge = createEdge(view, edges[i]); + std::shared_ptr edge = createEdge(view, edges[i]); if (edge != NULL) { m_edges.push_back(edge); @@ -115,9 +114,9 @@ void QtGraphView::doRebuildGraph( } // hide node content by default, must be done after all edges are created to keep subnodes with connections visible - for(std::list>::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) + for (const std::shared_ptr& node : m_nodes) { - (*it)->hideContent(); + node->hideContent(); } } else @@ -134,31 +133,40 @@ void QtGraphView::doClear() m_edges.clear(); } -std::shared_ptr QtGraphView::findNodeRecursive(const std::list>& nodes, Id tokenId) +std::shared_ptr QtGraphView::findNodeRecursive(const std::list>& nodes, Id tokenId) { - for (const std::shared_ptr& node : nodes) + for (const std::shared_ptr& node : nodes) { if (node->getTokenId() == tokenId) { return node; } - std::shared_ptr result = findNodeRecursive(node->getSubNodes(), tokenId); + std::shared_ptr result = findNodeRecursive(node->getSubNodes(), tokenId); if (result != NULL) { return result; } } - return std::shared_ptr(); + return std::shared_ptr(); } -std::shared_ptr QtGraphView::createNodeRecursive( +std::shared_ptr QtGraphView::createNodeRecursive( QGraphicsView* view, std::shared_ptr parentNode, const DummyNode& node ){ if (view != NULL) { - std::shared_ptr newNode = std::make_shared(node.data, node.accessType); + std::shared_ptr newNode; + if (node.data) + { + newNode = std::make_shared(node.data); + } + else + { + newNode = std::make_shared(node.accessType); + } + newNode->addComponent(std::make_shared(newNode)); view->scene()->addItem(newNode.get()); @@ -177,18 +185,10 @@ std::shared_ptr QtGraphView::createNodeRecursive( newNode->addComponent(std::make_shared(newNode)); } - if (node.subNodes.size() > 0) + for (unsigned int i = 0; i < node.subNodes.size(); i++) { - if (!node.data || node.subNodes[0].data) - { - newNode->addComponent(std::make_shared(newNode)); - } - - for (unsigned int i = 0; i < node.subNodes.size(); i++) - { - std::shared_ptr subNode = createNodeRecursive(view, newNode, node.subNodes[i]); - newNode->addSubNode(subNode); - } + std::shared_ptr subNode = createNodeRecursive(view, newNode, node.subNodes[i]); + newNode->addSubNode(subNode); } return newNode; @@ -204,8 +204,8 @@ std::shared_ptr QtGraphView::createEdge(QGraphicsView* view, const { if (view != NULL) { - std::shared_ptr owner = findNodeRecursive(m_nodes, edge.ownerId); - std::shared_ptr target = findNodeRecursive(m_nodes, edge.targetId); + std::shared_ptr owner = findNodeRecursive(m_nodes, edge.ownerId); + std::shared_ptr target = findNodeRecursive(m_nodes, edge.targetId); if (owner != NULL && target != NULL) { diff --git a/src/app/qt/view/QtGraphView.h b/src/app/qt/view/QtGraphView.h index f7c62130..b7ed37b8 100644 --- a/src/app/qt/view/QtGraphView.h +++ b/src/app/qt/view/QtGraphView.h @@ -42,9 +42,9 @@ private: const std::vector& edges); void doClear(); - std::shared_ptr findNodeRecursive(const std::list>& nodes, Id tokenId); + std::shared_ptr findNodeRecursive(const std::list>& nodes, Id tokenId); - std::shared_ptr createNodeRecursive( + std::shared_ptr createNodeRecursive( QGraphicsView* view, std::shared_ptr parentNode, const DummyNode& node); std::shared_ptr createEdge(QGraphicsView* view, const DummyEdge& edge); @@ -55,6 +55,12 @@ private: > m_rebuildGraphFunctor; QtThreadedFunctor m_clearFunctor; + + std::shared_ptr m_graph; + std::vector m_activeTokenIds; + + std::list> m_nodes; + std::list> m_edges; }; #endif // QT_GRAPH_VIEW_H diff --git a/src/app/qt/view/graphElements/QtGraphEdge.cpp b/src/app/qt/view/graphElements/QtGraphEdge.cpp index 46fc2e31..fb2c8afd 100644 --- a/src/app/qt/view/graphElements/QtGraphEdge.cpp +++ b/src/app/qt/view/graphElements/QtGraphEdge.cpp @@ -36,14 +36,14 @@ QtGraphEdge::QtGraphEdge(const std::weak_ptr& owner, const std::weak_ this->setZValue(1); // Used to draw edges always on top of nodes. QPen pen(Qt::transparent); - pen.setWidth(10); - this->setPen(pen); + pen.setWidth(10); + this->setPen(pen); - m_child = new QGraphicsLineItem(this); - m_child->setLine(ownerPos.x, ownerPos.y, targetPos.x, targetPos.y); + m_child = new QGraphicsLineItem(this); + m_child->setLine(ownerPos.x, ownerPos.y, targetPos.x, targetPos.y); pen.setColor(Qt::black); - pen.setWidth(2); + pen.setWidth(1); switch (data->getType()) { @@ -148,11 +148,11 @@ void QtGraphEdge::setIsActive(bool isActive) QPen p = m_child->pen(); if (isActive) { - p.setWidth(4); + p.setWidth(2); } else { - p.setWidth(2); + p.setWidth(1); } m_child->setPen(p); } diff --git a/src/app/qt/view/graphElements/QtGraphNode.cpp b/src/app/qt/view/graphElements/QtGraphNode.cpp index 2f3d1230..cc30e1ce 100644 --- a/src/app/qt/view/graphElements/QtGraphNode.cpp +++ b/src/app/qt/view/graphElements/QtGraphNode.cpp @@ -1,46 +1,50 @@ #include "qt/view/graphElements/QtGraphNode.h" -#include - +#include #include -#include #include +#include -#include "qt/view/graphElements/QtGraphEdge.h" +#include "utility/messaging/type/MessageActivateToken.h" + +#include "qt/graphics/QtGraphicsRoundedRectItem.h" +#include "qt/utility/QtDeviceScaledPixmap.h" #include "qt/view/graphElements/nodeComponents/QtGraphNodeComponent.h" +#include "qt/view/graphElements/QtGraphEdge.h" -QtGraphNode::QtGraphNode(const Node* data, TokenComponentAccess::AccessType accessType) - : GraphNode(data) +QtGraphNode::QtGraphNode() + : GraphNode(nullptr) + , m_undefinedRect(nullptr) + , m_padding(0, 0, 0, 0) + , m_spacing(8) , m_isActive(false) - , m_padding(10, 10) - , m_contentHidden(false) + , m_isHovering(false) { - m_text = new QGraphicsTextItem(this); - m_text->setPos(0, 0); + this->setPen(QPen(Qt::transparent)); - std::stringstream text; - QBrush brush(Qt::white); + m_rect = new QtGraphicsRoundedRectItem(this); + m_text = new QGraphicsSimpleTextItem(this); +} - if (data) - { - text << data->getId() << ": " << data->getName(); - brush.setColor(Qt::lightGray); - } - else - { - text << TokenComponentAccess::getAccessString(accessType); - } +QtGraphNode::QtGraphNode(const Node* data) + : GraphNode(data) + , m_undefinedRect(nullptr) + , m_padding(0, 0, 0, 0) + , m_spacing(8) + , m_isActive(false) + , m_isHovering(false) +{ + this->setPen(QPen(Qt::transparent)); - m_text->setPlainText(QString(text.str().c_str())); - this->setBrush(brush); + m_rect = new QtGraphicsRoundedRectItem(this); + m_text = new QGraphicsSimpleTextItem(this); - m_baseSize.x = QFontMetrics(m_text->font()).width(m_text->toPlainText()) + 10; - m_baseSize.y = 25; - - m_currentSize = m_baseSize; - - this->setRect(0, 0, m_baseSize.x, m_baseSize.y); this->setAcceptHoverEvents(true); + + this->setName(data->getName()); + this->setStyle(); + + this->setSize(m_baseSize); } QtGraphNode::~QtGraphNode() @@ -57,7 +61,12 @@ QtGraphNode::~QtGraphNode() std::string QtGraphNode::getName() const { - return m_text->toPlainText().toStdString(); + return m_text->text().toStdString(); +} + +void QtGraphNode::setName(const std::string& name) +{ + m_text->setText(QString::fromStdString(name)); } Vec2i QtGraphNode::getPosition() const @@ -82,46 +91,17 @@ Vec2i QtGraphNode::getSize() const return m_currentSize; } -bool QtGraphNode::getIsActive() const +void QtGraphNode::setSize(Vec2i size) { - return m_isActive; -} + m_currentSize = size; -void QtGraphNode::setIsActive(bool isActive) -{ - m_isActive = isActive; + this->setRect(0, 0, size.x, size.y); + m_rect->setRect(0, 0, size.x, size.y); - QPen p = this->pen(); - if (isActive) + if (m_undefinedRect) { - p.setWidth(2); + m_undefinedRect->setRect(1, 1, size.x - 2, size.y - 2); } - else - { - p.setWidth(1); - } - this->setPen(p); -} - -QtGraphNode* QtGraphNode::getParent() const -{ - return m_parentNode.lock().get(); -} - -void QtGraphNode::setParent(std::weak_ptr parentNode) -{ - m_parentNode = parentNode; - - std::shared_ptr parent = parentNode.lock(); - if (parent != NULL) - { - QGraphicsRectItem::setParentItem(parent.get()); - } -} - -void QtGraphNode::addComponent(const std::shared_ptr& component) -{ - m_components.push_back(component); } bool QtGraphNode::addOutEdge(const std::shared_ptr& edge) @@ -173,72 +153,6 @@ void QtGraphNode::removeOutEdge(GraphEdge* edge) } } -std::list> QtGraphNode::getSubNodes() const -{ - return m_subNodes; -} - -void QtGraphNode::addSubNode(const std::shared_ptr& node) -{ - m_subNodes.push_back(node); - - rebuildLayout(); -} - -void QtGraphNode::notifyParentMoved() -{ - notifyEdgesAfterMove(); -} - -void QtGraphNode::hideContent() -{ - for (std::shared_ptr node : m_subNodes) - { - node->hideContent(); - - if (node->getTokenId() && node->getEdgeAndActiveCountRecursive() <= 0) - { - node->hide(); - } - } - - m_contentHidden = true; - - onChildSizeChanged(); -} - -void QtGraphNode::showContent() -{ - for (std::shared_ptr node : m_subNodes) - { - node->show(); - } - - m_contentHidden = false; - - onChildSizeChanged(); -} - -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(); @@ -249,6 +163,49 @@ unsigned int QtGraphNode::getInEdgeCount() const return m_inEdges.size(); } +bool QtGraphNode::getIsActive() const +{ + return m_isActive; +} + +void QtGraphNode::setIsActive(bool isActive) +{ + m_isActive = isActive; + + setStyle(); +} + +QtGraphNode* QtGraphNode::getParent() const +{ + return m_parentNode.lock().get(); +} + +void QtGraphNode::setParent(std::weak_ptr parentNode) +{ + m_parentNode = parentNode; + + std::shared_ptr parent = parentNode.lock(); + if (parent != NULL) + { + QGraphicsRectItem::setParentItem(parent.get()); + } +} + +void QtGraphNode::addComponent(const std::shared_ptr& component) +{ + m_components.push_back(component); +} + +std::list> QtGraphNode::getSubNodes() const +{ + return m_subNodes; +} + +void QtGraphNode::addSubNode(const std::shared_ptr& node) +{ + m_subNodes.push_back(node); +} + unsigned int QtGraphNode::getEdgeAndActiveCountRecursive() const { unsigned int result = 0; @@ -258,7 +215,7 @@ unsigned int QtGraphNode::getEdgeAndActiveCountRecursive() const result++; } - for (std::shared_ptr node : m_subNodes) + for (std::shared_ptr node : m_subNodes) { result += node->getEdgeAndActiveCountRecursive(); } @@ -268,9 +225,24 @@ unsigned int QtGraphNode::getEdgeAndActiveCountRecursive() const return result; } +void QtGraphNode::hideContent() +{ + for (std::shared_ptr node : m_subNodes) + { + node->hideContent(); + + if (node->getTokenId() && node->getEdgeAndActiveCountRecursive() <= 0) + { + node->hide(); + } + } + + rebuildLayout(); +} + void QtGraphNode::onClick() { - if (m_data) + if (m_data && !m_data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE)) { MessageActivateToken(m_data->getId()).dispatch(); } @@ -335,87 +307,221 @@ void QtGraphNode::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) void QtGraphNode::hoverEnterEvent(QGraphicsSceneHoverEvent* event) { - if (m_data) - { - bool isActive = m_isActive; - this->setIsActive(true); - m_isActive = isActive; - } + m_isHovering = true; + setStyle(); } void QtGraphNode::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) { - this->setIsActive(m_isActive); + m_isHovering = false; + setStyle(); } void QtGraphNode::notifyEdgesAfterMove() { - for (std::list>::iterator it = m_outEdges.begin(); it != m_outEdges.end(); it++) + for (const std::shared_ptr& edge : m_outEdges) { - (*it)->ownerMoved(); + edge->ownerMoved(); } - std::list>::iterator it2 = m_inEdges.begin(); - while (it2 != m_inEdges.end()) + for (const std::weak_ptr& e : m_inEdges) { - std::shared_ptr edge = it2->lock(); - if (edge.get() != NULL) - { - edge->targetMoved(); - ++it2; - } - else - { - m_inEdges.erase(it2++); - } + std::shared_ptr edge = e.lock(); + if (edge) + { + edge->targetMoved(); + } } - for (std::list>::iterator it3 = m_subNodes.begin(); it3 != m_subNodes.end(); it3++) + for (const std::shared_ptr& node : m_subNodes) { - (*it3)->notifyParentMoved(); + node->notifyEdgesAfterMove(); } } -void QtGraphNode::notifyParentNodeAfterSizeChanged() +void QtGraphNode::onSizeChanged() { + rebuildLayout(); + std::shared_ptr parentNode = m_parentNode.lock(); if (parentNode != NULL) { - parentNode->onChildSizeChanged(); + parentNode->onSizeChanged(); } } -void QtGraphNode::onChildSizeChanged() -{ - rebuildLayout(); - - notifyParentNodeAfterSizeChanged(); -} - void QtGraphNode::rebuildLayout() { - int nextYPos = m_baseSize.y; - int newWidth = m_baseSize.x; + setStyle(); - for (const std::shared_ptr& node : m_subNodes) + Vec2i newSize(m_baseSize); + newSize.y = newSize.y - m_padding.w; + + for (const std::shared_ptr& node : m_subNodes) { - if (!node->isHidden()) + if (node->isVisible()) { - node->setPosition(this->getPosition() + Vec2i(m_padding.x, nextYPos)); - nextYPos += node->getSize().y + m_padding.y; + node->setPosition(this->getPosition() + Vec2i(m_padding.x, m_spacing + newSize.y)); + newSize.y = newSize.y + m_spacing + node->getSize().y; - int tmpWidth = (node->getPosition().x - getPosition().x) + node->getSize().x + m_padding.x; + int tmpWidth = node->getSize().x + m_padding.x + m_padding.z; - if (tmpWidth > newWidth) + if (tmpWidth > newSize.x) { - newWidth = tmpWidth; + newSize.x = tmpWidth; } } } - m_currentSize.x = newWidth; - m_currentSize.y = nextYPos; + newSize.y = newSize.y + m_padding.w; + setSize(newSize); +} - this->setRect(0, 0, m_currentSize.x, m_currentSize.y); +void QtGraphNode::setStyle() +{ + if (!m_data) + { + return; + } + + QColor color = Qt::lightGray; + qreal radius = 0.0f; + QFont font("Source Code Pro"); + QPen p(Qt::transparent); + + bool undefined = false; + bool useUndefinedColor = false; + + switch (m_data->getType()) + { + case Node::NODE_UNDEFINED: + undefined = true; + case Node::NODE_NAMESPACE: + color = Qt::white; + + p.setColor("#cc8d91"); + p.setWidth(1); + + font.setPointSize(12); + + radius = 20.0f; + m_padding.x = m_padding.z = 15; + m_padding.y = 6; + m_padding.w = 15; + break; + + case Node::NODE_UNDEFINED_TYPE: + undefined = true; + case Node::NODE_STRUCT: + case Node::NODE_CLASS: + case Node::NODE_ENUM: + case Node::NODE_TYPEDEF: + if (m_isHovering) + { + m_rect->setShadow(QColor(0, 0, 0, 255), 5); + } + else + { + m_rect->setShadow(QColor(0, 0, 0, 128), 5); + } + + font.setPointSize(14); + + color = "#ededed"; + if (m_subNodes.size()) + { + radius = 20.0f; + m_padding.x = m_padding.z = 15; + m_padding.y = m_padding.w = 10; + } + else + { + radius = 10.0f; + m_padding.x = m_padding.z = 8; + m_padding.y = m_padding.w = 5; + } + break; + + case Node::NODE_UNDEFINED_FUNCTION: + undefined = true; + useUndefinedColor = true; + case Node::NODE_FUNCTION: + case Node::NODE_METHOD: + if (m_isActive || m_isHovering) + { + color = "#ffcc00"; + font.setWeight(QFont::Bold); + } + else + { + color = "#ffe47a"; + } + + font.setPointSize(11); + + radius = 8.0f; + m_padding.x = m_padding.z = 5; + m_padding.y = m_padding.w = 3; + break; + + case Node::NODE_UNDEFINED_VARIABLE: + undefined = true; + useUndefinedColor = true; + case Node::NODE_GLOBAL_VARIABLE: + case Node::NODE_FIELD: + if (m_isActive || m_isHovering) + { + color = "#62b29d"; + font.setWeight(QFont::Bold); + } + else + { + color = "#9ab4ad"; + } + + font.setPointSize(11); + + radius = 8.0f; + m_padding.x = m_padding.z = 5; + m_padding.y = m_padding.w = 3; + break; + } + + if (m_isActive) + { + p.setWidthF(1.5f); + p.setColor("#3c3c3c"); + } + + m_rect->setPen(p); + m_rect->setBrush(QBrush(color)); + m_rect->setRadius(radius); + + if (undefined) + { + QtDeviceScaledPixmap pixmap("data/gui/graph_view/images/pattern.png"); + pixmap.scaleToHeight(10); + + if (!m_undefinedRect) + { + m_undefinedRect = new QtGraphicsRoundedRectItem(this); + } + + p.setWidth(1); + p.setColor(Qt::transparent); + if (useUndefinedColor && !m_isActive) + { + p.setColor(color); + } + m_undefinedRect->setPen(p); + m_undefinedRect->setBrush(QBrush(pixmap.pixmap())); + m_undefinedRect->setRadius(radius); + } + + m_text->setFont(font); + m_text->setPos(m_padding.x, m_padding.y); + + m_baseSize.x = QFontMetrics(m_text->font()).width(m_text->text()) + m_padding.x + m_padding.z; + m_baseSize.y = QFontMetrics(m_text->font()).height() + m_padding.y + m_padding.w; } diff --git a/src/app/qt/view/graphElements/QtGraphNode.h b/src/app/qt/view/graphElements/QtGraphNode.h index 13546ebe..d35ad135 100644 --- a/src/app/qt/view/graphElements/QtGraphNode.h +++ b/src/app/qt/view/graphElements/QtGraphNode.h @@ -4,11 +4,12 @@ #include #include "utility/math/Vector2.h" -#include "utility/messaging/type/MessageActivateToken.h" +#include "utility/math/Vector4.h" #include "component/view/graphElements/GraphNode.h" class QtGraphEdge; +class QtGraphicsRoundedRectItem; class QtGraphNodeComponent; class QtGraphNode @@ -16,14 +17,26 @@ class QtGraphNode , public QGraphicsRectItem { public: - QtGraphNode(const Node* data, TokenComponentAccess::AccessType accessType); + QtGraphNode(); + QtGraphNode(const Node* data); virtual ~QtGraphNode(); virtual std::string getName() const; + void setName(const std::string& name); + virtual Vec2i getPosition() const; virtual void setPosition(const Vec2i& position); virtual Vec2i getSize() const; + virtual void setSize(Vec2i size); + + virtual bool addOutEdge(const std::shared_ptr& edge); + virtual bool addInEdge(const std::weak_ptr& edge); + + virtual void removeOutEdge(GraphEdge* edge); + + virtual unsigned int getOutEdgeCount() const; + virtual unsigned int getInEdgeCount() const; bool getIsActive() const; void setIsActive(bool isActive); @@ -33,69 +46,54 @@ public: void addComponent(const std::shared_ptr& component); - virtual bool addOutEdge(const std::shared_ptr& edge); - virtual bool addInEdge(const std::weak_ptr& edge); - - virtual void removeOutEdge(GraphEdge* edge); - - virtual std::list> getSubNodes() const; - virtual void addSubNode(const std::shared_ptr& node); - - 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; + std::list> getSubNodes() const; + void addSubNode(const std::shared_ptr& node); /** * @brief Returns the count of all connected edges and active nodes (including sub nodes) */ - virtual unsigned int getEdgeAndActiveCountRecursive() const; + unsigned int getEdgeAndActiveCountRecursive() const; - void onClick(); + virtual void hideContent(); + + virtual void onClick(); protected: - void mousePressEvent(QGraphicsSceneMouseEvent* event); - void mouseMoveEvent(QGraphicsSceneMouseEvent* event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent* event); + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); - void hoverEnterEvent(QGraphicsSceneHoverEvent* event); - void hoverLeaveEvent(QGraphicsSceneHoverEvent* event); + virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event); + virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* event); void notifyEdgesAfterMove(); - void notifyParentNodeAfterSizeChanged(); + void onSizeChanged(); - void onChildSizeChanged(); + virtual void rebuildLayout(); std::list> m_outEdges; std::list> m_inEdges; -private: - void rebuildLayout(); - - QGraphicsTextItem* m_text; - std::weak_ptr m_parentNode; - std::list> m_subNodes; + std::list> m_subNodes; - std::list> m_components; - - bool m_isActive; + QGraphicsSimpleTextItem* m_text; + QtGraphicsRoundedRectItem* m_rect; + QtGraphicsRoundedRectItem* m_undefinedRect; Vec2i m_baseSize; Vec2i m_currentSize; - Vec2i m_padding; + Vec4i m_padding; + int m_spacing; - bool m_contentHidden; +private: + void setStyle(); + + std::list> m_components; + + bool m_isActive; + bool m_isHovering; }; #endif // QT_GRAPH_NODE_H diff --git a/src/app/qt/view/graphElements/QtGraphNodeAccess.cpp b/src/app/qt/view/graphElements/QtGraphNodeAccess.cpp new file mode 100644 index 00000000..6f6f6f23 --- /dev/null +++ b/src/app/qt/view/graphElements/QtGraphNodeAccess.cpp @@ -0,0 +1,184 @@ +#include "qt/view/graphElements/QtGraphNodeAccess.h" + +#include +#include +#include + +#include "qt/graphics/QtGraphicsRoundedRectItem.h" +#include "qt/utility/QtDeviceScaledPixmap.h" + +QtGraphNodeAccess::QtAccessArrow::QtAccessArrow(QGraphicsItem* parent) + : QGraphicsRectItem(parent) +{ + m_icon = new QGraphicsPixmapItem(this); + + QFont font; + font.setFamily("Myriad Pro"); + font.setWeight(QFont::Normal); + font.setPointSize(9); + + m_number = new QGraphicsSimpleTextItem(this); + m_number->setFont(font); +} + +QtGraphNodeAccess::QtAccessArrow::~QtAccessArrow() +{ +} + +int QtGraphNodeAccess::QtAccessArrow::update(bool visible, int number) +{ + const int iconHeight = 4; + + int spacing = 0; + + if (!visible) + { + m_icon->hide(); + m_number->hide(); + return spacing; + } + + m_icon->show(); + + QtDeviceScaledPixmap pixmap("data/gui/graph_view/images/arrow.png"); + pixmap.scaleToHeight(iconHeight); + + if (number) + { + m_number->show(); + spacing = 13; + + QString numberStr = QString::number(number); + m_number->setText(numberStr); + m_number->setPos( + -QFontMetrics(m_number->font()).width(numberStr) / 2, + -iconHeight - QFontMetrics(m_number->font()).height() + ); + } + else + { + m_number->hide(); + spacing = 5; + + pixmap.mirror(); + } + + m_icon->setPixmap(pixmap.pixmap()); + m_icon->setPos(-pixmap.width() / 2, -iconHeight); + + return spacing; +} + + +QtGraphNodeAccess::QtGraphNodeAccess(TokenComponentAccess::AccessType accessType) + : QtGraphNode() + , m_contentHidden(false) + , m_accessIconSize(20) +{ + m_padding = Vec4i(10, 10, 10, 10); + m_spacing = 8; + + QFont font; + font.setFamily("Myriad Pro"); + font.setWeight(QFont::Bold); + font.setPointSize(11); + font.setCapitalization(QFont::AllUppercase); + m_text->setFont(font); + m_text->setPos(m_padding.x + m_accessIconSize + 3, m_padding.y + m_accessIconSize / 2 - 1); + + m_rect->setPen(QPen(Qt::transparent)); + m_rect->setBrush(QBrush(Qt::white)); + m_rect->setRadius(12.0f); + + std::string accessString = TokenComponentAccess::getAccessString(accessType); + this->setName(accessString); + + QtDeviceScaledPixmap pixmap(QString::fromStdString("data/gui/graph_view/images/" + accessString + ".png")); + pixmap.scaleToHeight(m_accessIconSize); + + m_accessIcon = new QGraphicsPixmapItem(pixmap.pixmap(), this); + m_accessIcon->setPos(m_padding.x, m_padding.y); + + m_arrow = new QtAccessArrow(this); +} + +QtGraphNodeAccess::~QtGraphNodeAccess() +{ +} + +void QtGraphNodeAccess::hideContent() +{ + m_contentHidden = true; + + QtGraphNode::hideContent(); +} + +void QtGraphNodeAccess::showContent() +{ + for (std::shared_ptr node : m_subNodes) + { + node->show(); + } + + m_contentHidden = false; +} + +void QtGraphNodeAccess::onClick() +{ + if (m_contentHidden) + { + showContent(); + } + else + { + hideContent(); + } + + onSizeChanged(); +} + +void QtGraphNodeAccess::rebuildLayout() +{ + bool allActive = true; + int visibleSubNodes = 0; + for (const std::shared_ptr& node : m_subNodes) + { + if (!node->getEdgeAndActiveCountRecursive()) + { + allActive = false; + } + + if (node->isVisible()) + { + visibleSubNodes++; + } + } + + int width = m_padding.x + m_accessIconSize; + int height = m_padding.y + m_accessIconSize; + + int arrowSpace = m_arrow->update(!allActive, m_subNodes.size() - visibleSubNodes); + + if (visibleSubNodes) + { + m_text->show(); + width += QFontMetrics(m_text->font()).width(m_text->text()) + 3; + } + else + { + m_text->hide(); + arrowSpace -= 3; + } + + m_padding.w = 10 + arrowSpace; + + width += m_padding.z; + height += m_padding.w; + + m_baseSize.x = width; + m_baseSize.y = height; + + QtGraphNode::rebuildLayout(); + + m_arrow->setPos(m_currentSize.x / 2, m_currentSize.y - 5); +} diff --git a/src/app/qt/view/graphElements/QtGraphNodeAccess.h b/src/app/qt/view/graphElements/QtGraphNodeAccess.h new file mode 100644 index 00000000..9937d18a --- /dev/null +++ b/src/app/qt/view/graphElements/QtGraphNodeAccess.h @@ -0,0 +1,45 @@ +#ifndef QT_GRAPH_NODE_ACCESS_H +#define QT_GRAPH_NODE_ACCESS_H + +#include "data/graph/token_component/TokenComponentAccess.h" +#include "qt/view/graphElements/QtGraphNode.h" + +class QtGraphNodeAccess + : public QtGraphNode +{ +public: + class QtAccessArrow + : public QGraphicsRectItem + { + public: + QtAccessArrow(QGraphicsItem* parent); + virtual ~QtAccessArrow(); + + int update(bool visible, int number); + + private: + QGraphicsPixmapItem* m_icon; + QGraphicsSimpleTextItem* m_number; + }; + + + QtGraphNodeAccess(TokenComponentAccess::AccessType accessType); + virtual ~QtGraphNodeAccess(); + + virtual void hideContent(); + virtual void showContent(); + + virtual void onClick(); + + virtual void rebuildLayout(); + +private: + bool m_contentHidden; + + QGraphicsPixmapItem* m_accessIcon; + int m_accessIconSize; + + QtAccessArrow* m_arrow; +}; + +#endif // QT_GRAPH_NODE_ACCESS_H diff --git a/src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.cpp b/src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.cpp deleted file mode 100644 index b5f4d651..00000000 --- a/src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "QtGraphNodeComponentToggleButton.h" - -#include -#include - -#include "qt/view/graphElements/QtGraphNode.h" - -QtGraphNodeComponentToggleButton::QtGraphNodeComponentToggleButton(const std::weak_ptr& graphNode) - : QtGraphNodeComponent(graphNode) -{ - this->setRect(0, 0, 10, 10); - this->setPos(0, 0); - QBrush brush(Qt::darkGray); - this->setBrush(brush); - - std::shared_ptr node = graphNode.lock(); - if(node != NULL) - { - this->setParentItem(node.get()); - } -} - -QtGraphNodeComponentToggleButton::~QtGraphNodeComponentToggleButton() -{ -} - -void QtGraphNodeComponentToggleButton::mousePressEvent(QGraphicsSceneMouseEvent* event) -{ - std::shared_ptr node = m_graphNode.lock(); - if(node != NULL) - { - if(node->contentIsHidden()) - { - node->showContent(); - } - else - { - node->hideContent(); - } - } -} diff --git a/src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h b/src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h deleted file mode 100644 index 234fba9e..00000000 --- a/src/app/qt/view/graphElements/nodeComponents/QtGraphNodeComponentToggleButton.h +++ /dev/null @@ -1,17 +0,0 @@ -#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& graphNode); - ~QtGraphNodeComponentToggleButton(); - - void mousePressEvent(QGraphicsSceneMouseEvent* event); -}; - -#endif // QT_GRAPH_NODE_COMPONENT_TOGGLE_BUTTON_H diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index e5f0eacd..afd59ebd 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -36,7 +36,7 @@ GraphView* GraphController::getView() void GraphController::createDummyGraphForTokenIds(const std::vector& tokenIds) { - const GraphLayouter::LayoutFunction layoutFunction = &GraphLayouter::layoutSimpleRing; + const GraphLayouter::LayoutFunction layoutFunction = &GraphLayouter::layoutSimpleRaster; GraphView* view = getView(); if (!view) diff --git a/src/lib/component/view/GraphView.h b/src/lib/component/view/GraphView.h index 8f8aa8a4..4bd893e2 100644 --- a/src/lib/component/view/GraphView.h +++ b/src/lib/component/view/GraphView.h @@ -11,8 +11,6 @@ struct DummyEdge; struct DummyNode; class Graph; -class GraphEdge; -class GraphNode; class GraphView : public View { @@ -29,13 +27,6 @@ public: const std::vector& edges) = 0; virtual void clear() = 0; - -protected: - std::shared_ptr m_graph; - std::vector m_activeTokenIds; - - std::list > m_nodes; - std::list > m_edges; }; #endif // GRAPH_VIEW_H \ No newline at end of file diff --git a/src/lib/component/view/graphElements/GraphNode.h b/src/lib/component/view/graphElements/GraphNode.h index dba704d7..c9fce680 100644 --- a/src/lib/component/view/graphElements/GraphNode.h +++ b/src/lib/component/view/graphElements/GraphNode.h @@ -34,25 +34,9 @@ public: virtual void removeOutEdge(GraphEdge* edge) = 0; - virtual std::list > getSubNodes() const = 0; - virtual void addSubNode(const std::shared_ptr& node) = 0; - - 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 getEdgeAndActiveCountRecursive() const = 0; - protected: const Node* m_data; };