#ifndef GRAPH_FOCUS_HANDLER_H #define GRAPH_FOCUS_HANDLER_H #include #include #include "types.h" class QtGraphEdge; class QtGraphNode; class QPointF; class GraphFocusClient { public: virtual void focusView(bool focusIn) = 0; virtual const std::list& getGraphNodes() const = 0; virtual const std::list& getGraphEdges() const = 0; virtual QtGraphNode* getActiveNode() const = 0; virtual void ensureNodeVisible(QtGraphNode* node) = 0; }; class GraphFocusHandler { public: enum class Direction { UP, DOWN, LEFT, RIGHT }; GraphFocusHandler(GraphFocusClient* client); void clear(); void focus(); void defocus(); void focusInitialNode(); void focusTokenId( const std::list& nodes, const std::list& edges, Id tokenId); void refocusNode(const std::list& newNodes, Id oldActiveTokenId, Id newActiveTokenId); void focusNext(Direction direction, bool navigateEdges); void focusNode(QtGraphNode* node); void defocusNode(QtGraphNode* node); void focusEdge(QtGraphEdge* edge); void defocusEdge(QtGraphEdge* edge); void defocusGraph(); void activateFocus(bool openInTab); void expandFocus(); private: QtGraphNode* findNextNode(QtGraphNode* node, Direction direction); QtGraphNode* findNextNode(QtGraphEdge* edge, Direction direction); QtGraphEdge* findNextEdge(QPointF pos, Direction direction, QtGraphEdge* previousEdge = nullptr); QtGraphNode* findChildNodeRecursive(const std::list& nodes, bool first); QtGraphNode* findSibling(const QtGraphNode* node, Direction direction); std::vector> getSiblingsHierarchyRecursive(const QtGraphNode* node); void addSiblingsRecursive(const std::list& nodes, std::vector& siblings); GraphFocusClient* const m_client; QtGraphNode* m_focusNode = nullptr; QtGraphEdge* m_focusEdge = nullptr; Id m_lastFocusId = 0; }; #endif // GRAPH_FOCUS_HANDLER_H