ui: fixed some ui related bugs
* aggregation edges only connect toplevel nodes * fixed aggregation click for undo and redo * don't show edge name in search field, because they are not searchable * clear search field when clicking aggregation * leave active nodes active when clicking edges
This commit is contained in:
@@ -29,11 +29,12 @@ void FeatureController::handleMessage(MessageActivateEdge* message)
|
||||
return;
|
||||
}
|
||||
|
||||
if (message->type == Edge::EDGE_AGGREGATION)
|
||||
if (message->isAggregation())
|
||||
{
|
||||
MessageActivateTokens m(m_storageAccess->getTokenIdsForAggregationEdge(edgeId));
|
||||
m.isAggregation = true;
|
||||
m.undoRedoType = message->undoRedoType;
|
||||
m.dispatch();
|
||||
m.dispatchImmediately();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,16 +24,25 @@ GraphController::~GraphController()
|
||||
|
||||
void GraphController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
m_activeTokenIds = message->tokenIds;
|
||||
|
||||
if (message->isEdge && message->tokenIds.size() == 1)
|
||||
{
|
||||
setActiveAndVisibility(message->tokenIds);
|
||||
m_activeEdgeIds = message->tokenIds;
|
||||
setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds));
|
||||
buildGraph(message);
|
||||
return;
|
||||
}
|
||||
else if (message->isAggregation)
|
||||
{
|
||||
m_activeNodeIds.clear();
|
||||
m_activeEdgeIds = message->tokenIds;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_activeNodeIds = message->tokenIds;
|
||||
m_activeEdgeIds.clear();
|
||||
}
|
||||
|
||||
createDummyGraphForTokenIds(message->tokenIds);
|
||||
createDummyGraphForTokenIds(utility::concat(m_activeNodeIds, m_activeEdgeIds));
|
||||
|
||||
buildGraph(message);
|
||||
}
|
||||
@@ -81,7 +90,7 @@ void GraphController::handleMessage(MessageGraphNodeBundleSplit* message)
|
||||
}
|
||||
}
|
||||
|
||||
setActiveAndVisibility(m_activeTokenIds);
|
||||
setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds));
|
||||
|
||||
layoutNesting();
|
||||
GraphLayouter::layoutSpectralPrototype(m_dummyNodes, m_dummyEdges);
|
||||
@@ -97,7 +106,7 @@ void GraphController::handleMessage(MessageGraphNodeExpand* message)
|
||||
{
|
||||
node->expanded = message->expand;
|
||||
|
||||
setActiveAndVisibility(m_activeTokenIds);
|
||||
setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds));
|
||||
layoutNesting();
|
||||
|
||||
GraphPostprocessor::doPostprocessing(m_dummyNodes);
|
||||
@@ -359,8 +368,8 @@ void GraphController::setActiveAndVisibility(const std::vector<Id>& activeTokenI
|
||||
continue;
|
||||
}
|
||||
|
||||
DummyNode* from = findDummyNodeRecursive(m_dummyNodes, edge.ownerId);
|
||||
DummyNode* to = findDummyNodeRecursive(m_dummyNodes, edge.targetId);
|
||||
DummyNode* from = findTopLevelDummyNodeRecursive(m_dummyNodes, edge.ownerId);
|
||||
DummyNode* to = findTopLevelDummyNodeRecursive(m_dummyNodes, edge.targetId);
|
||||
|
||||
if (from && to && (from->active || to->active))
|
||||
{
|
||||
@@ -909,6 +918,30 @@ DummyNode* GraphController::findDummyNodeRecursive(std::vector<DummyNode>& nodes
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DummyNode* GraphController::findTopLevelDummyNodeRecursive(std::vector<DummyNode>& nodes, Id tokenId) const
|
||||
{
|
||||
for (DummyNode& node : nodes)
|
||||
{
|
||||
if (node.isGraphNode())
|
||||
{
|
||||
if (node.data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE))
|
||||
{
|
||||
DummyNode* result = findDummyNodeRecursive(node.subNodes, tokenId);
|
||||
if (result != nullptr)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else if (node.data->getId() == tokenId)
|
||||
{
|
||||
return &node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DummyNode* GraphController::findDummyNodeAccessRecursive(
|
||||
std::vector<DummyNode>& nodes, Id parentId, TokenComponentAccess::AccessType type
|
||||
) const {
|
||||
|
||||
@@ -76,6 +76,7 @@ private:
|
||||
void layoutToGrid(DummyNode& node) const;
|
||||
|
||||
DummyNode* findDummyNodeRecursive(std::vector<DummyNode>& nodes, Id tokenId) const;
|
||||
DummyNode* findTopLevelDummyNodeRecursive(std::vector<DummyNode>& nodes, Id tokenId) const;
|
||||
DummyNode* findDummyNodeAccessRecursive(std::vector<DummyNode>& nodes, Id parentId, TokenComponentAccess::AccessType type) const;
|
||||
|
||||
void buildGraph(MessageBase* message);
|
||||
@@ -85,7 +86,8 @@ private:
|
||||
std::vector<DummyNode> m_dummyNodes;
|
||||
std::vector<DummyEdge> m_dummyEdges;
|
||||
|
||||
std::vector<Id> m_activeTokenIds;
|
||||
std::vector<Id> m_activeNodeIds;
|
||||
std::vector<Id> m_activeEdgeIds;
|
||||
|
||||
std::shared_ptr<Graph> m_graph;
|
||||
};
|
||||
|
||||
@@ -14,27 +14,16 @@ SearchController::~SearchController()
|
||||
|
||||
void SearchController::handleMessage(MessageActivateEdge* message)
|
||||
{
|
||||
if (message->isIgnorable())
|
||||
if (!message->isAggregation())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SearchMatch match;
|
||||
match.fullName = message->name;
|
||||
match.nodeType = Node::NODE_CLASS;
|
||||
match.tokenIds.insert(message->tokenId);
|
||||
match.queryNodeType = QueryNode::QUERYNODETYPE_TOKEN;
|
||||
|
||||
getView()->setMatches(std::deque<SearchMatch>(1, match));
|
||||
getView()->setMatches(std::deque<SearchMatch>());
|
||||
}
|
||||
|
||||
void SearchController::handleMessage(MessageActivateFile* message)
|
||||
{
|
||||
if (message->isIgnorable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SearchMatch match;
|
||||
match.fullName = message->filePath.fileName();
|
||||
match.nodeType = Node::NODE_FILE;
|
||||
@@ -46,11 +35,6 @@ void SearchController::handleMessage(MessageActivateFile* message)
|
||||
|
||||
void SearchController::handleMessage(MessageActivateNode* message)
|
||||
{
|
||||
if (message->isIgnorable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SearchMatch match;
|
||||
match.fullName = message->name;
|
||||
match.nodeType = message->type;
|
||||
@@ -72,11 +56,6 @@ void SearchController::handleMessage(MessageFinishedParsing* message)
|
||||
|
||||
void SearchController::handleMessage(MessageSearch* message)
|
||||
{
|
||||
if (message->isIgnorable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
getView()->setMatches(message->getMatches());
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ void UndoRedoController::handleMessage(MessageActivateEdge* message)
|
||||
return;
|
||||
}
|
||||
|
||||
Command command(std::make_shared<MessageActivateEdge>(*message), (message->type == Edge::EDGE_AGGREGATION ? 0 : 1));
|
||||
Command command(std::make_shared<MessageActivateEdge>(*message), (message->isAggregation() ? 0 : 1));
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@ public:
|
||||
return "MessageActivateEdge";
|
||||
}
|
||||
|
||||
bool isAggregation() const
|
||||
{
|
||||
return type == Edge::EDGE_AGGREGATION;
|
||||
}
|
||||
|
||||
const Id tokenId;
|
||||
const Edge::EdgeType type;
|
||||
const std::string name;
|
||||
|
||||
@@ -10,6 +10,7 @@ public:
|
||||
MessageActivateTokens(const std::vector<Id>& tokenIds)
|
||||
: tokenIds(tokenIds)
|
||||
, isEdge(false)
|
||||
, isAggregation(false)
|
||||
, isFromSystem(false)
|
||||
{
|
||||
}
|
||||
@@ -17,6 +18,7 @@ public:
|
||||
MessageActivateTokens(Id tokenId)
|
||||
: tokenIds(1, tokenId)
|
||||
, isEdge(false)
|
||||
, isAggregation(false)
|
||||
, isFromSystem(false)
|
||||
{
|
||||
}
|
||||
@@ -29,6 +31,7 @@ public:
|
||||
const std::vector<Id> tokenIds;
|
||||
|
||||
bool isEdge;
|
||||
bool isAggregation;
|
||||
bool isFromSystem;
|
||||
};
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace utility
|
||||
template<typename T>
|
||||
std::vector<T> utility::concat(const std::vector<T>& a, const std::vector<T>& b)
|
||||
{
|
||||
std::vector<T> r(a.size() + b.size());
|
||||
std::vector<T> r;
|
||||
append(r, a);
|
||||
append(r, b);
|
||||
return r;
|
||||
|
||||
Reference in New Issue
Block a user