ui: Click edges in trail to show source location
This commit is contained in:
@@ -339,6 +339,7 @@ add_files(
|
||||
utility/messaging/type/MessageActivateTokenIds.h
|
||||
utility/messaging/type/MessageActivateTokens.h
|
||||
utility/messaging/type/MessageActivateTrail.h
|
||||
utility/messaging/type/MessageActivateTrailEdge.h
|
||||
utility/messaging/type/MessageActivateWindow.h
|
||||
utility/messaging/type/MessageChangeFileView.h
|
||||
utility/messaging/type/MessageClearErrorCount.h
|
||||
|
||||
@@ -175,6 +175,25 @@ void CodeController::handleMessage(MessageActivateTokens* message)
|
||||
showContents(message);
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageActivateTrailEdge* message)
|
||||
{
|
||||
TRACE("trail edge activate");
|
||||
|
||||
CodeView* view = getView();
|
||||
view->clearCodeSnippets();
|
||||
|
||||
std::vector<Id> activeTokenIds = { message->tokenId };
|
||||
m_collection = m_storageAccess->getSourceLocationsForTokenIds(activeTokenIds);
|
||||
|
||||
view->showCodeSnippets(
|
||||
getSnippetsForActiveSourceLocations(m_collection.get(), 0),
|
||||
activeTokenIds,
|
||||
!message->isReplayed() || message->isReplayCleared()
|
||||
);
|
||||
|
||||
showContents(message);
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageChangeFileView* message)
|
||||
{
|
||||
TRACE("code change file");
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "utility/messaging/type/MessageActivateAll.h"
|
||||
#include "utility/messaging/type/MessageActivateLocalSymbols.h"
|
||||
#include "utility/messaging/type/MessageActivateTokens.h"
|
||||
#include "utility/messaging/type/MessageActivateTrailEdge.h"
|
||||
#include "utility/messaging/type/MessageChangeFileView.h"
|
||||
#include "utility/messaging/type/MessageClearErrorCount.h"
|
||||
#include "utility/messaging/type/MessageCodeViewExpandedInitialFiles.h"
|
||||
@@ -37,6 +38,7 @@ class CodeController
|
||||
, public MessageListener<MessageActivateAll>
|
||||
, public MessageListener<MessageActivateLocalSymbols>
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
, public MessageListener<MessageActivateTrailEdge>
|
||||
, public MessageListener<MessageChangeFileView>
|
||||
, public MessageListener<MessageClearErrorCount>
|
||||
, public MessageListener<MessageCodeViewExpandedInitialFiles>
|
||||
@@ -60,6 +62,7 @@ private:
|
||||
virtual void handleMessage(MessageActivateAll* message);
|
||||
virtual void handleMessage(MessageActivateLocalSymbols* message);
|
||||
virtual void handleMessage(MessageActivateTokens* message);
|
||||
virtual void handleMessage(MessageActivateTrailEdge* message);
|
||||
virtual void handleMessage(MessageChangeFileView* message);
|
||||
virtual void handleMessage(MessageClearErrorCount* message);
|
||||
virtual void handleMessage(MessageCodeViewExpandedInitialFiles* message);
|
||||
|
||||
@@ -152,11 +152,24 @@ void GraphController::handleMessage(MessageActivateTrail* message)
|
||||
|
||||
MessageStatus("Displaying graph", false, true).dispatch();
|
||||
|
||||
buildGraph(message, true, true, false);
|
||||
message->setIsReplayed(false);
|
||||
buildGraph(message, message->isLast(), true, false);
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageActivateTrailEdge* message)
|
||||
{
|
||||
TRACE("trail edge activate");
|
||||
|
||||
getView()->activateEdge(message->tokenId, message->isReplayed());
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageFlushUpdates* message)
|
||||
{
|
||||
if (m_graph->getTrailMode() != Graph::TRAIL_NONE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
buildGraph(message, true, !message->keepContent(), false);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "utility/messaging/type/MessageActivateAll.h"
|
||||
#include "utility/messaging/type/MessageActivateTokens.h"
|
||||
#include "utility/messaging/type/MessageActivateTrail.h"
|
||||
#include "utility/messaging/type/MessageActivateTrailEdge.h"
|
||||
#include "utility/messaging/type/MessageColorSchemeTest.h"
|
||||
#include "utility/messaging/type/MessageFlushUpdates.h"
|
||||
#include "utility/messaging/type/MessageFocusIn.h"
|
||||
@@ -36,6 +37,7 @@ class GraphController
|
||||
, public MessageListener<MessageActivateAll>
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
, public MessageListener<MessageActivateTrail>
|
||||
, public MessageListener<MessageActivateTrailEdge>
|
||||
, public MessageListener<MessageColorSchemeTest>
|
||||
, public MessageListener<MessageFlushUpdates>
|
||||
, public MessageListener<MessageFocusIn>
|
||||
@@ -56,6 +58,7 @@ private:
|
||||
virtual void handleMessage(MessageActivateAll* message);
|
||||
virtual void handleMessage(MessageActivateTokens* message);
|
||||
virtual void handleMessage(MessageActivateTrail* message);
|
||||
virtual void handleMessage(MessageActivateTrailEdge* message);
|
||||
virtual void handleMessage(MessageFlushUpdates* message);
|
||||
virtual void handleMessage(MessageFocusIn* message);
|
||||
virtual void handleMessage(MessageFocusOut* message);
|
||||
|
||||
@@ -90,6 +90,18 @@ void UndoRedoController::handleMessage(MessageActivateTrail* message)
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
void UndoRedoController::handleMessage(MessageActivateTrailEdge* message)
|
||||
{
|
||||
if (sameMessageTypeAsLast(message) &&
|
||||
static_cast<MessageActivateTrailEdge*>(lastMessage())->tokenId == message->tokenId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Command command(std::make_shared<MessageActivateTrailEdge>(*message), Command::ORDER_ADAPT, true);
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
void UndoRedoController::handleMessage(MessageChangeFileView* message)
|
||||
{
|
||||
Command command(std::make_shared<MessageChangeFileView>(*message), Command::ORDER_VIEW);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "utility/messaging/type/MessageActivateLocalSymbols.h"
|
||||
#include "utility/messaging/type/MessageActivateTokens.h"
|
||||
#include "utility/messaging/type/MessageActivateTrail.h"
|
||||
#include "utility/messaging/type/MessageActivateTrailEdge.h"
|
||||
#include "utility/messaging/type/MessageChangeFileView.h"
|
||||
#include "utility/messaging/type/MessageDeactivateEdge.h"
|
||||
#include "utility/messaging/type/MessageFinishedParsing.h"
|
||||
@@ -36,6 +37,7 @@ class UndoRedoController
|
||||
, public MessageListener<MessageActivateLocalSymbols>
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
, public MessageListener<MessageActivateTrail>
|
||||
, public MessageListener<MessageActivateTrailEdge>
|
||||
, public MessageListener<MessageChangeFileView>
|
||||
, public MessageListener<MessageDeactivateEdge>
|
||||
, public MessageListener<MessageFinishedParsing>
|
||||
@@ -81,6 +83,7 @@ private:
|
||||
virtual void handleMessage(MessageActivateLocalSymbols* message);
|
||||
virtual void handleMessage(MessageActivateTokens* message);
|
||||
virtual void handleMessage(MessageActivateTrail* message);
|
||||
virtual void handleMessage(MessageActivateTrailEdge* message);
|
||||
virtual void handleMessage(MessageChangeFileView* message);
|
||||
virtual void handleMessage(MessageDeactivateEdge* message);
|
||||
virtual void handleMessage(MessageFinishedParsing* message);
|
||||
|
||||
@@ -44,6 +44,8 @@ public:
|
||||
virtual Vec2i getViewSize() const = 0;
|
||||
|
||||
virtual void scrollToValues(int xValue, int yValue) = 0;
|
||||
|
||||
virtual void activateEdge(Id edgeId, bool centerOrigin) = 0;
|
||||
};
|
||||
|
||||
#endif // GRAPH_VIEW_H
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef MESSAGE_ACTIVATE_TRAIL_EDGE_H
|
||||
#define MESSAGE_ACTIVATE_TRAIL_EDGE_H
|
||||
|
||||
#include "utility/messaging/Message.h"
|
||||
#include "utility/types.h"
|
||||
|
||||
#include "data/graph/Edge.h"
|
||||
#include "data/name/NameHierarchy.h"
|
||||
|
||||
class MessageActivateTrailEdge
|
||||
: public Message<MessageActivateTrailEdge>
|
||||
{
|
||||
public:
|
||||
MessageActivateTrailEdge(
|
||||
Id tokenId, Edge::EdgeType type, const NameHierarchy& sourceNameHierarchy, const NameHierarchy& targetNameHierarchy
|
||||
)
|
||||
: tokenId(tokenId)
|
||||
, type(type)
|
||||
, sourceNameHierarchy(sourceNameHierarchy)
|
||||
, targetNameHierarchy(targetNameHierarchy)
|
||||
{
|
||||
}
|
||||
|
||||
static const std::string getStaticType()
|
||||
{
|
||||
return "MessageActivateTrailEdge";
|
||||
}
|
||||
|
||||
std::string getFullName() const
|
||||
{
|
||||
std::string name = Edge::getReadableTypeString(type) + ":";
|
||||
name += sourceNameHierarchy.getQualifiedNameWithSignature() + "->";
|
||||
name += targetNameHierarchy.getQualifiedNameWithSignature();
|
||||
return name;
|
||||
}
|
||||
|
||||
virtual void print(std::ostream& os) const
|
||||
{
|
||||
os << tokenId << " - " << getFullName();
|
||||
}
|
||||
|
||||
const Id tokenId;
|
||||
const Edge::EdgeType type;
|
||||
const NameHierarchy sourceNameHierarchy;
|
||||
const NameHierarchy targetNameHierarchy;
|
||||
};
|
||||
|
||||
#endif // MESSAGE_ACTIVATE_TRAIL_EDGE_H
|
||||
@@ -200,6 +200,31 @@ void QtGraphView::scrollToValues(int xValue, int yValue)
|
||||
m_scrollValues = Vec2i(xValue, yValue);
|
||||
}
|
||||
|
||||
void QtGraphView::activateEdge(Id edgeId, bool centerOrigin)
|
||||
{
|
||||
m_onQtThread(
|
||||
[=]()
|
||||
{
|
||||
clickedInEmptySpace();
|
||||
|
||||
for (std::shared_ptr<QtGraphEdge> edge : m_oldEdges)
|
||||
{
|
||||
if (edge->getData() && edge->getData()->getId() == edgeId)
|
||||
{
|
||||
edge->setIsActive(true);
|
||||
|
||||
if (centerOrigin)
|
||||
{
|
||||
centerNode(edge->getOwner().lock().get());
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
void QtGraphView::updateScrollBars()
|
||||
{
|
||||
QGraphicsView* view = getView();
|
||||
@@ -240,6 +265,8 @@ void QtGraphView::clickedInEmptySpace()
|
||||
{
|
||||
activeEdges.push_back(edge);
|
||||
}
|
||||
|
||||
edge->setIsFocused(false);
|
||||
}
|
||||
|
||||
if (m_graph && m_graph->getTrailMode() != Graph::TRAIL_NONE)
|
||||
@@ -503,17 +530,7 @@ void QtGraphView::switchToNewGraphData()
|
||||
{
|
||||
if (m_centerActiveNode)
|
||||
{
|
||||
Vec2i pos = m_activeNodes.front()->getPosition();
|
||||
Vec2i size = m_activeNodes.front()->getSize();
|
||||
|
||||
QRectF rect(pos.x, pos.y, size.x, size.y);
|
||||
|
||||
if (rect.height() > view->height() - 200)
|
||||
{
|
||||
rect.setHeight(view->height() - 200);
|
||||
}
|
||||
|
||||
view->ensureVisibleAnimated(rect, 100, 100);
|
||||
centerNode(m_activeNodes.front().get());
|
||||
}
|
||||
|
||||
if (m_activeNodes.size() == 1)
|
||||
@@ -603,17 +620,6 @@ void QtGraphView::doRebuildGraph(
|
||||
|
||||
m_edges.clear();
|
||||
|
||||
for (std::shared_ptr<DummyEdge> edge : edges)
|
||||
{
|
||||
for (size_t i = 0; i < edge->path.size(); i++)
|
||||
{
|
||||
edge->path[i].x = edge->path[i].x - offset.x();
|
||||
edge->path[i].z = edge->path[i].z - offset.x();
|
||||
edge->path[i].y = edge->path[i].y - offset.y();
|
||||
edge->path[i].w = edge->path[i].w - offset.y();
|
||||
}
|
||||
}
|
||||
|
||||
// create edges
|
||||
Graph::TrailMode trailMode = m_graph ? m_graph->getTrailMode() : Graph::TRAIL_NONE;
|
||||
std::set<Id> visibleEdgeIds;
|
||||
@@ -621,7 +627,7 @@ void QtGraphView::doRebuildGraph(
|
||||
{
|
||||
if (!edge->data || !edge->data->isType(Edge::EDGE_AGGREGATION))
|
||||
{
|
||||
createEdge(view, edge.get(), &visibleEdgeIds, trailMode);
|
||||
createEdge(view, edge.get(), &visibleEdgeIds, trailMode, offset);
|
||||
}
|
||||
}
|
||||
for (const std::shared_ptr<DummyEdge> edge : edges)
|
||||
@@ -784,7 +790,7 @@ std::shared_ptr<QtGraphNode> QtGraphView::createNodeRecursive(
|
||||
}
|
||||
|
||||
std::shared_ptr<QtGraphEdge> QtGraphView::createEdge(
|
||||
QGraphicsView* view, const DummyEdge* edge, std::set<Id>* visibleEdgeIds, Graph::TrailMode trailMode)
|
||||
QGraphicsView* view, const DummyEdge* edge, std::set<Id>* visibleEdgeIds, Graph::TrailMode trailMode, QPointF pathOffset)
|
||||
{
|
||||
if (!edge->visible)
|
||||
{
|
||||
@@ -801,12 +807,21 @@ std::shared_ptr<QtGraphEdge> QtGraphView::createEdge(
|
||||
|
||||
if (trailMode != Graph::TRAIL_NONE)
|
||||
{
|
||||
for (const Vec4i& rect : edge->path)
|
||||
std::vector<Vec4i> path = edge->path;
|
||||
for (size_t i = 0; i < path.size(); i++)
|
||||
{
|
||||
path[i].x = path[i].x - pathOffset.x();
|
||||
path[i].z = path[i].z - pathOffset.x();
|
||||
path[i].y = path[i].y - pathOffset.y();
|
||||
path[i].w = path[i].w - pathOffset.y();
|
||||
}
|
||||
|
||||
for (const Vec4i& rect : path)
|
||||
{
|
||||
m_virtualNodeRects.push_back(QRectF(QPointF(rect.x(), rect.y()), QPointF(rect.z(), rect.w())));
|
||||
}
|
||||
|
||||
qtEdge->setIsTrailEdge(edge->path, trailMode == Graph::TRAIL_HORIZONTAL);
|
||||
qtEdge->setIsTrailEdge(path, trailMode == Graph::TRAIL_HORIZONTAL);
|
||||
}
|
||||
|
||||
qtEdge->updateLine();
|
||||
@@ -854,7 +869,7 @@ std::shared_ptr<QtGraphEdge> QtGraphView::createAggregationEdge(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return createEdge(view, edge, visibleEdgeIds, Graph::TRAIL_NONE);
|
||||
return createEdge(view, edge, visibleEdgeIds, Graph::TRAIL_NONE, QPointF());
|
||||
}
|
||||
|
||||
QRectF QtGraphView::itemsBoundingRect(const std::list<std::shared_ptr<QtGraphNode>>& items) const
|
||||
@@ -879,6 +894,23 @@ QRectF QtGraphView::getSceneRect(const std::list<std::shared_ptr<QtGraphNode>>&
|
||||
return sceneRect.adjusted(-75, -75, 75, 75).translated(m_sceneRectOffset);
|
||||
}
|
||||
|
||||
void QtGraphView::centerNode(QtGraphNode* node)
|
||||
{
|
||||
QtGraphicsView* view = getView();
|
||||
|
||||
Vec2i pos = node->getPosition();
|
||||
Vec2i size = node->getSize();
|
||||
|
||||
QRectF rect(pos.x, pos.y, size.x, size.y);
|
||||
|
||||
if (rect.height() > view->height() - 200)
|
||||
{
|
||||
rect.setHeight(view->height() - 200);
|
||||
}
|
||||
|
||||
view->ensureVisibleAnimated(rect, 100, 100);
|
||||
}
|
||||
|
||||
void QtGraphView::compareNodesRecursive(
|
||||
std::list<std::shared_ptr<QtGraphNode>> newSubNodes,
|
||||
std::list<std::shared_ptr<QtGraphNode>> oldSubNodes,
|
||||
|
||||
@@ -55,6 +55,8 @@ public:
|
||||
|
||||
virtual void scrollToValues(int xValue, int yValue);
|
||||
|
||||
virtual void activateEdge(Id edgeId, bool centerOrigin);
|
||||
|
||||
private slots:
|
||||
void updateScrollBars();
|
||||
void finishedTransition();
|
||||
@@ -96,13 +98,15 @@ private:
|
||||
std::shared_ptr<QtGraphNode> createNodeRecursive(
|
||||
QGraphicsView* view, std::shared_ptr<QtGraphNode> parentNode, const DummyNode* node, bool multipleActive);
|
||||
std::shared_ptr<QtGraphEdge> createEdge(
|
||||
QGraphicsView* view, const DummyEdge* edge, std::set<Id>* visibleEdgeIds, Graph::TrailMode trailMode);
|
||||
QGraphicsView* view, const DummyEdge* edge, std::set<Id>* visibleEdgeIds, Graph::TrailMode trailMode, QPointF pathOffset);
|
||||
std::shared_ptr<QtGraphEdge> createAggregationEdge(
|
||||
QGraphicsView* view, const DummyEdge* edge, std::set<Id>* visibleEdgeIds);
|
||||
|
||||
QRectF itemsBoundingRect(const std::list<std::shared_ptr<QtGraphNode>>& items) const;
|
||||
QRectF getSceneRect(const std::list<std::shared_ptr<QtGraphNode>>& items) const;
|
||||
|
||||
void centerNode(QtGraphNode* node);
|
||||
|
||||
void compareNodesRecursive(
|
||||
std::list<std::shared_ptr<QtGraphNode>> newSubNodes,
|
||||
std::list<std::shared_ptr<QtGraphNode>> oldSubNodes,
|
||||
@@ -123,6 +127,7 @@ private:
|
||||
QtThreadedFunctor<void> m_refreshFunctor;
|
||||
QtThreadedFunctor<const std::vector<Id>&> m_focusInFunctor;
|
||||
QtThreadedFunctor<const std::vector<Id>&> m_focusOutFunctor;
|
||||
QtThreadedLambdaFunctor m_onQtThread;
|
||||
|
||||
std::shared_ptr<Graph> m_graph;
|
||||
std::shared_ptr<Graph> m_oldGraph;
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
#include <QGraphicsSceneEvent>
|
||||
#include <QGraphicsItemGroup>
|
||||
#include <QTimer>
|
||||
|
||||
#include "component/view/GraphViewStyle.h"
|
||||
#include "data/graph/Edge.h"
|
||||
@@ -12,12 +11,15 @@
|
||||
#include "qt/graphics/QtLineItemStraight.h"
|
||||
#include "qt/view/graphElements/QtGraphNode.h"
|
||||
#include "utility/messaging/type/MessageActivateEdge.h"
|
||||
#include "utility/messaging/type/MessageActivateTrailEdge.h"
|
||||
#include "utility/messaging/type/MessageFocusIn.h"
|
||||
#include "utility/messaging/type/MessageFocusOut.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeBundleSplit.h"
|
||||
#include "utility/utility.h"
|
||||
#include "utility/utilityString.h"
|
||||
|
||||
QtGraphEdge* QtGraphEdge::s_focusedTrailEdge = nullptr;
|
||||
|
||||
QtGraphEdge::QtGraphEdge(
|
||||
const std::weak_ptr<QtGraphNode>& owner,
|
||||
const std::weak_ptr<QtGraphNode>& target,
|
||||
@@ -40,8 +42,6 @@ QtGraphEdge::QtGraphEdge(
|
||||
, m_isHorizontalTrail(false)
|
||||
, m_mousePos(0.0f, 0.0f)
|
||||
, m_mouseMoved(false)
|
||||
, m_willFocusIn(false)
|
||||
, m_ignoreFocusIn(false)
|
||||
{
|
||||
if (m_direction == TokenComponentAggregation::DIRECTION_BACKWARD)
|
||||
{
|
||||
@@ -50,6 +50,8 @@ QtGraphEdge::QtGraphEdge(
|
||||
|
||||
m_fromActive = m_owner.lock()->getIsActive();
|
||||
m_toActive = m_target.lock()->getIsActive();
|
||||
|
||||
s_focusedTrailEdge = nullptr;
|
||||
}
|
||||
|
||||
QtGraphEdge::~QtGraphEdge()
|
||||
@@ -230,11 +232,25 @@ void QtGraphEdge::setIsActive(bool isActive)
|
||||
}
|
||||
}
|
||||
|
||||
void QtGraphEdge::setIsFocused(bool isFocused)
|
||||
{
|
||||
if (m_isFocused != isFocused)
|
||||
{
|
||||
m_isFocused = isFocused;
|
||||
updateLine();
|
||||
}
|
||||
}
|
||||
|
||||
void QtGraphEdge::onClick()
|
||||
{
|
||||
if (isTrailEdge())
|
||||
{
|
||||
setIsActive(!getIsActive());
|
||||
MessageActivateTrailEdge(
|
||||
getData()->getId(),
|
||||
getData()->getType(),
|
||||
getData()->getFrom()->getNameHierarchy(),
|
||||
getData()->getTo()->getNameHierarchy()
|
||||
).dispatch();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -307,37 +323,18 @@ void QtGraphEdge::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
|
||||
|
||||
void QtGraphEdge::hoverEnterEvent(QGraphicsSceneHoverEvent* event)
|
||||
{
|
||||
if (!m_ignoreFocusIn)
|
||||
{
|
||||
QTimer::singleShot(50, this, SLOT(doFocusIn()));
|
||||
m_ignoreFocusIn = true;
|
||||
m_willFocusIn = true;
|
||||
}
|
||||
}
|
||||
|
||||
void QtGraphEdge::hoverLeaveEvent(QGraphicsSceneHoverEvent* event)
|
||||
{
|
||||
m_willFocusIn = false;
|
||||
QTimer::singleShot(100, this, SLOT(doFocusOut()));
|
||||
|
||||
if (!getData())
|
||||
{
|
||||
focusOut();
|
||||
return;
|
||||
}
|
||||
|
||||
MessageFocusOut(std::vector<Id>(1, getData()->getId())).dispatch();
|
||||
}
|
||||
|
||||
void QtGraphEdge::doFocusIn()
|
||||
{
|
||||
if (!m_willFocusIn)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!getData() || isTrailEdge())
|
||||
{
|
||||
if (isTrailEdge())
|
||||
{
|
||||
if (s_focusedTrailEdge && s_focusedTrailEdge != this)
|
||||
{
|
||||
s_focusedTrailEdge->focusOut();
|
||||
}
|
||||
|
||||
s_focusedTrailEdge = this;
|
||||
}
|
||||
|
||||
focusIn();
|
||||
return;
|
||||
}
|
||||
@@ -345,9 +342,17 @@ void QtGraphEdge::doFocusIn()
|
||||
MessageFocusIn(std::vector<Id>(1, getData()->getId())).dispatch();
|
||||
}
|
||||
|
||||
void QtGraphEdge::doFocusOut()
|
||||
void QtGraphEdge::hoverLeaveEvent(QGraphicsSceneHoverEvent* event)
|
||||
{
|
||||
m_ignoreFocusIn = false;
|
||||
s_focusedTrailEdge = nullptr;
|
||||
|
||||
if (!getData() || isTrailEdge())
|
||||
{
|
||||
focusOut();
|
||||
return;
|
||||
}
|
||||
|
||||
MessageFocusOut(std::vector<Id>(1, getData()->getId())).dispatch();
|
||||
}
|
||||
|
||||
void QtGraphEdge::setDirection(TokenComponentAggregation::Direction direction)
|
||||
|
||||
@@ -41,6 +41,8 @@ public:
|
||||
void setIsActive(bool isActive);
|
||||
void setFromAndToActive(bool fromActive, bool toActive);
|
||||
|
||||
void setIsFocused(bool isFocused);
|
||||
|
||||
void onClick();
|
||||
|
||||
void focusIn();
|
||||
@@ -59,11 +61,10 @@ protected:
|
||||
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event);
|
||||
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* event);
|
||||
|
||||
private slots:
|
||||
void doFocusIn();
|
||||
void doFocusOut();
|
||||
|
||||
private:
|
||||
// used to unfocus recent edge, because hover leave event is not always received for trail edges (bezier)
|
||||
static QtGraphEdge* s_focusedTrailEdge;
|
||||
|
||||
const Edge* m_data;
|
||||
|
||||
std::weak_ptr<QtGraphNode> m_owner;
|
||||
@@ -87,9 +88,6 @@ private:
|
||||
|
||||
Vec2i m_mousePos;
|
||||
bool m_mouseMoved;
|
||||
|
||||
bool m_willFocusIn;
|
||||
bool m_ignoreFocusIn;
|
||||
};
|
||||
|
||||
#endif // QT_GRAPH_EDGE_H
|
||||
|
||||
Reference in New Issue
Block a user