ui: Hide nodes and edges from graph via context menu action or Alt + Click (issue #472)
* show all context menu actions, but disable unavailable * added hide action to undo redo stack
This commit is contained in:
@@ -243,7 +243,7 @@ add_files(
|
||||
data/storage/type/StorageOccurrence.h
|
||||
data/storage/type/StorageSourceLocation.h
|
||||
data/storage/type/StorageSymbol.h
|
||||
|
||||
|
||||
data/storage/IntermediateStorage.cpp
|
||||
data/storage/IntermediateStorage.h
|
||||
data/storage/PersistentStorage.cpp
|
||||
@@ -413,6 +413,7 @@ add_files(
|
||||
utility/messaging/type/MessageForceEnterLicense.h
|
||||
utility/messaging/type/MessageGraphNodeBundleSplit.h
|
||||
utility/messaging/type/MessageGraphNodeExpand.h
|
||||
utility/messaging/type/MessageGraphNodeHide.h
|
||||
utility/messaging/type/MessageGraphNodeMove.h
|
||||
utility/messaging/type/MessageIDECreateCDB.h
|
||||
utility/messaging/type/MessageInterruptTasks.h
|
||||
|
||||
@@ -160,39 +160,14 @@ void GraphController::handleMessage(MessageActivateTrail* message)
|
||||
|
||||
createDummyGraph(graph);
|
||||
m_graph->setTrailMode(message->horizontalLayout ? Graph::TRAIL_HORIZONTAL : Graph::TRAIL_VERTICAL);
|
||||
m_graph->setHasTrailOrigin(message->originId);
|
||||
|
||||
setVisibility(setActive(m_activeNodeIds, true));
|
||||
|
||||
layoutNesting();
|
||||
|
||||
TrailLayouter::LayoutDirection direction;
|
||||
if (message->horizontalLayout)
|
||||
{
|
||||
if (message->originId)
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_LEFT_RIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_RIGHT_LEFT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (message->originId)
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_TOP_BOTTOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_BOTTOM_TOP;
|
||||
}
|
||||
}
|
||||
|
||||
MessageStatus("Layouting graph", false, true).dispatch();
|
||||
|
||||
TrailLayouter layout(direction);
|
||||
layout.layoutGraph(m_dummyNodes, m_dummyEdges, m_topLevelAncestorIds);
|
||||
layoutNesting();
|
||||
layoutTrail(message->horizontalLayout, message->originId);
|
||||
|
||||
MessageStatus("Displaying graph", false, true).dispatch();
|
||||
|
||||
@@ -384,6 +359,73 @@ void GraphController::handleMessage(MessageGraphNodeExpand* message)
|
||||
}
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageGraphNodeHide* message)
|
||||
{
|
||||
DummyNode* node = getDummyGraphNodeById(message->tokenId);
|
||||
DummyEdge* edge = nullptr;
|
||||
if (node)
|
||||
{
|
||||
if (node->active || node->hasActiveSubNode())
|
||||
{
|
||||
MessageStatus("Can't hide active node or node with active children", true).dispatch();
|
||||
return;
|
||||
}
|
||||
|
||||
node->hidden = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
edge = getDummyGraphEdgeById(message->tokenId);
|
||||
if (edge)
|
||||
{
|
||||
edge->hidden = true;
|
||||
edge->visible = false;
|
||||
|
||||
DummyNode* from = getDummyGraphNodeById(edge->ownerId);
|
||||
DummyNode* to = getDummyGraphNodeById(edge->targetId);
|
||||
|
||||
if (from)
|
||||
{
|
||||
from->connected = false;
|
||||
}
|
||||
|
||||
if (to)
|
||||
{
|
||||
to->connected = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (node || edge)
|
||||
{
|
||||
bool showsTrail = m_graph->getTrailMode() != Graph::TRAIL_NONE;
|
||||
|
||||
setVisibility(setActive(utility::concat(m_activeNodeIds, m_activeEdgeIds), showsTrail));
|
||||
|
||||
if (hasCharacterIndex())
|
||||
{
|
||||
addCharacterIndex();
|
||||
layoutNesting();
|
||||
layoutList();
|
||||
}
|
||||
else
|
||||
{
|
||||
layoutNesting();
|
||||
|
||||
if (showsTrail)
|
||||
{
|
||||
layoutTrail(m_graph->getTrailMode() == Graph::TRAIL_HORIZONTAL, m_graph->hasTrailOrigin());
|
||||
}
|
||||
else
|
||||
{
|
||||
layoutGraph();
|
||||
}
|
||||
}
|
||||
|
||||
buildGraph(message, false, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageGraphNodeMove* message)
|
||||
{
|
||||
DummyNode* node = getDummyGraphNodeById(message->tokenId);
|
||||
@@ -674,7 +716,8 @@ bool GraphController::setActive(const std::vector<Id>& activeTokenIds, bool show
|
||||
DummyNode* to = getDummyGraphNodeById(edge->targetId);
|
||||
|
||||
bool isInheritance = edge->data->isType(Edge::EDGE_INHERITANCE);
|
||||
if (from && to && (showAllEdges || noActive || from->active || to->active || edge->active || isInheritance))
|
||||
if (from && to && !edge->hidden &&
|
||||
(showAllEdges || noActive || from->active || to->active || edge->active || isInheritance))
|
||||
{
|
||||
edge->visible = true;
|
||||
from->connected = true;
|
||||
@@ -727,7 +770,11 @@ bool GraphController::setNodeVisibilityRecursiveBottomUp(DummyNode* node, bool n
|
||||
node->visible = false;
|
||||
node->childVisible = false;
|
||||
|
||||
if (node->isExpandToggleNode())
|
||||
if (node->hidden)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (node->isExpandToggleNode())
|
||||
{
|
||||
node->visible = true;
|
||||
return false;
|
||||
@@ -765,10 +812,9 @@ bool GraphController::setNodeVisibilityRecursiveBottomUp(DummyNode* node, bool n
|
||||
|
||||
void GraphController::setNodeVisibilityRecursiveTopDown(DummyNode* node, bool parentExpanded) const
|
||||
{
|
||||
node->visible = true;
|
||||
|
||||
if (node->isGraphNode() && node->data->getType().getType() == NodeType::NODE_ENUM && !node->isExpanded())
|
||||
{
|
||||
node->visible = true;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -777,13 +823,18 @@ void GraphController::setNodeVisibilityRecursiveTopDown(DummyNode* node, bool pa
|
||||
{
|
||||
for (const std::shared_ptr<DummyNode>& subNode : node->subNodes)
|
||||
{
|
||||
if (!subNode->isQualifierNode())
|
||||
if (!subNode->isQualifierNode() && !subNode->isExpandToggleNode() && !subNode->hidden)
|
||||
{
|
||||
node->childVisible = true;
|
||||
setNodeVisibilityRecursiveTopDown(subNode.get(), node->isExpanded());
|
||||
node->childVisible |= subNode->visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!node->isAccessNode() || node->childVisible)
|
||||
{
|
||||
node->visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
void GraphController::hideBuiltinTypes()
|
||||
@@ -1276,7 +1327,7 @@ void GraphController::addCharacterIndex()
|
||||
char character = 0;
|
||||
for (size_t i = 0; i < m_dummyNodes.size(); i++)
|
||||
{
|
||||
if (!m_dummyNodes[i]->name.size())
|
||||
if (!m_dummyNodes[i]->visible || !m_dummyNodes[i]->name.size())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -1295,6 +1346,18 @@ void GraphController::addCharacterIndex()
|
||||
}
|
||||
}
|
||||
|
||||
bool GraphController::hasCharacterIndex() const
|
||||
{
|
||||
for (const std::shared_ptr<DummyNode>& node : m_dummyNodes)
|
||||
{
|
||||
if (node->isTextNode())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void GraphController::layoutNesting()
|
||||
{
|
||||
TRACE();
|
||||
@@ -1493,7 +1556,8 @@ void GraphController::addExpandToggleNode(DummyNode* node) const
|
||||
|
||||
for (const std::shared_ptr<DummyNode>& subSubNode : subNode->subNodes)
|
||||
{
|
||||
if (subSubNode->visible && (!subSubNode->isGraphNode() || !subSubNode->data->isImplicit() || node->data->isImplicit()))
|
||||
if ((subSubNode->visible || subSubNode->hidden) &&
|
||||
(!subSubNode->isGraphNode() || !subSubNode->data->isImplicit() || node->data->isImplicit()))
|
||||
{
|
||||
visibleSubNodeCount++;
|
||||
}
|
||||
@@ -1562,8 +1626,17 @@ void GraphController::layoutGraph(bool getSortedNodes)
|
||||
{
|
||||
TRACE();
|
||||
|
||||
std::vector<std::shared_ptr<DummyNode>> visibleNodes;
|
||||
for (auto node : m_dummyNodes)
|
||||
{
|
||||
if (node->visible)
|
||||
{
|
||||
visibleNodes.push_back(node);
|
||||
}
|
||||
}
|
||||
|
||||
BucketLayouter grid(getView()->getViewSize());
|
||||
grid.createBuckets(m_dummyNodes, m_dummyEdges);
|
||||
grid.createBuckets(visibleNodes, m_dummyEdges);
|
||||
grid.layoutBuckets();
|
||||
|
||||
if (getSortedNodes)
|
||||
@@ -1576,8 +1649,56 @@ void GraphController::layoutList()
|
||||
{
|
||||
TRACE();
|
||||
|
||||
std::vector<std::shared_ptr<DummyNode>> visibleNodes;
|
||||
for (auto node : m_dummyNodes)
|
||||
{
|
||||
if (node->visible)
|
||||
{
|
||||
visibleNodes.push_back(node);
|
||||
}
|
||||
}
|
||||
|
||||
ListLayouter layouter(getView()->getViewSize());
|
||||
layouter.layoutList(m_dummyNodes);
|
||||
layouter.layoutList(visibleNodes);
|
||||
}
|
||||
|
||||
void GraphController::layoutTrail(bool horizontal, bool hasOrigin)
|
||||
{
|
||||
TrailLayouter::LayoutDirection direction;
|
||||
if (horizontal)
|
||||
{
|
||||
if (hasOrigin)
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_LEFT_RIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_RIGHT_LEFT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasOrigin)
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_TOP_BOTTOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = TrailLayouter::LAYOUT_BOTTOM_TOP;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::shared_ptr<DummyNode>> visibleNodes;
|
||||
for (auto node : m_dummyNodes)
|
||||
{
|
||||
if (node->visible)
|
||||
{
|
||||
visibleNodes.push_back(node);
|
||||
}
|
||||
}
|
||||
|
||||
TrailLayouter layout(direction);
|
||||
layout.layoutGraph(visibleNodes, m_dummyEdges, m_topLevelAncestorIds);
|
||||
}
|
||||
|
||||
void GraphController::assignBundleIds()
|
||||
@@ -1608,6 +1729,19 @@ DummyNode* GraphController::getDummyGraphNodeById(Id tokenId) const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DummyEdge* GraphController::getDummyGraphEdgeById(Id tokenId) const
|
||||
{
|
||||
for (const std::shared_ptr<DummyEdge>& edge : m_dummyEdges)
|
||||
{
|
||||
if (edge->data && edge->data->getId() == tokenId)
|
||||
{
|
||||
return edge.get();
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void GraphController::buildGraph(
|
||||
MessageBase* message, bool centerActiveNode, bool animatedTransition, bool scrollToTop)
|
||||
{
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "utility/messaging/type/MessageFocusOut.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeBundleSplit.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeExpand.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeHide.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeMove.h"
|
||||
#include "utility/messaging/type/MessageScrollGraph.h"
|
||||
#include "utility/messaging/type/MessageSearchFullText.h"
|
||||
@@ -42,6 +43,7 @@ class GraphController
|
||||
, public MessageListener<MessageFocusOut>
|
||||
, public MessageListener<MessageGraphNodeBundleSplit>
|
||||
, public MessageListener<MessageGraphNodeExpand>
|
||||
, public MessageListener<MessageGraphNodeHide>
|
||||
, public MessageListener<MessageGraphNodeMove>
|
||||
, public MessageListener<MessageScrollGraph>
|
||||
, public MessageListener<MessageSearchFullText>
|
||||
@@ -62,6 +64,7 @@ private:
|
||||
virtual void handleMessage(MessageFocusOut* message);
|
||||
virtual void handleMessage(MessageGraphNodeBundleSplit* message);
|
||||
virtual void handleMessage(MessageGraphNodeExpand* message);
|
||||
virtual void handleMessage(MessageGraphNodeHide* message);
|
||||
virtual void handleMessage(MessageGraphNodeMove* message);
|
||||
virtual void handleMessage(MessageScrollGraph* message);
|
||||
virtual void handleMessage(MessageSearchFullText* message);
|
||||
@@ -100,6 +103,7 @@ private:
|
||||
void bundleNodesByType();
|
||||
|
||||
void addCharacterIndex();
|
||||
bool hasCharacterIndex() const;
|
||||
|
||||
void layoutNesting();
|
||||
void layoutNestingRecursive(DummyNode* node) const;
|
||||
@@ -108,10 +112,12 @@ private:
|
||||
|
||||
void layoutGraph(bool getSortedNodes = false);
|
||||
void layoutList();
|
||||
void layoutTrail(bool horizontal, bool hasOrigin);
|
||||
|
||||
void assignBundleIds();
|
||||
|
||||
DummyNode* getDummyGraphNodeById(Id tokenId) const;
|
||||
DummyEdge* getDummyGraphEdgeById(Id tokenId) const;
|
||||
|
||||
void buildGraph(MessageBase* message, bool centerActiveNode, bool animatedTransition, bool scrollToTop);
|
||||
|
||||
|
||||
@@ -174,6 +174,12 @@ void UndoRedoController::handleMessage(MessageGraphNodeExpand* message)
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
void UndoRedoController::handleMessage(MessageGraphNodeHide* message)
|
||||
{
|
||||
Command command(std::make_shared<MessageGraphNodeHide>(*message), Command::ORDER_ADAPT);
|
||||
processCommand(command);
|
||||
}
|
||||
|
||||
void UndoRedoController::handleMessage(MessageGraphNodeMove* message)
|
||||
{
|
||||
Command command(std::make_shared<MessageGraphNodeMove>(*message), Command::ORDER_VIEW);
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "utility/messaging/type/MessageFinishedParsing.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeBundleSplit.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeExpand.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeHide.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeMove.h"
|
||||
#include "utility/messaging/type/MessageRedo.h"
|
||||
#include "utility/messaging/type/MessageRefresh.h"
|
||||
@@ -44,6 +45,7 @@ class UndoRedoController
|
||||
, public MessageListener<MessageFinishedParsing>
|
||||
, public MessageListener<MessageGraphNodeBundleSplit>
|
||||
, public MessageListener<MessageGraphNodeExpand>
|
||||
, public MessageListener<MessageGraphNodeHide>
|
||||
, public MessageListener<MessageGraphNodeMove>
|
||||
, public MessageListener<MessageRedo>
|
||||
, public MessageListener<MessageRefresh>
|
||||
@@ -91,6 +93,7 @@ private:
|
||||
virtual void handleMessage(MessageFinishedParsing* message);
|
||||
virtual void handleMessage(MessageGraphNodeBundleSplit* message);
|
||||
virtual void handleMessage(MessageGraphNodeExpand* message);
|
||||
virtual void handleMessage(MessageGraphNodeHide* message);
|
||||
virtual void handleMessage(MessageGraphNodeMove* message);
|
||||
virtual void handleMessage(MessageRedo* message);
|
||||
virtual void handleMessage(MessageRefresh* message);
|
||||
|
||||
@@ -17,6 +17,7 @@ struct DummyEdge
|
||||
, targetId(0)
|
||||
, data(nullptr)
|
||||
, visible(false)
|
||||
, hidden(false)
|
||||
, active(false)
|
||||
, weight(0)
|
||||
, direction(TokenComponentAggregation::DIRECTION_INVALID)
|
||||
@@ -28,6 +29,7 @@ struct DummyEdge
|
||||
, targetId(targetId)
|
||||
, data(data)
|
||||
, visible(false)
|
||||
, hidden(false)
|
||||
, active(false)
|
||||
, weight(0)
|
||||
, direction(TokenComponentAggregation::DIRECTION_INVALID)
|
||||
@@ -85,6 +87,7 @@ struct DummyEdge
|
||||
const Edge* data;
|
||||
|
||||
bool visible;
|
||||
bool hidden;
|
||||
bool active;
|
||||
|
||||
std::vector<Vec4i> path;
|
||||
|
||||
@@ -52,6 +52,7 @@ public:
|
||||
|
||||
DummyNode()
|
||||
: visible(false)
|
||||
, hidden(false)
|
||||
, childVisible(false)
|
||||
, tokenId(0)
|
||||
, data(nullptr)
|
||||
@@ -342,6 +343,7 @@ public:
|
||||
Vec2i size;
|
||||
|
||||
bool visible;
|
||||
bool hidden;
|
||||
bool childVisible;
|
||||
|
||||
Id tokenId;
|
||||
|
||||
@@ -588,7 +588,14 @@ void TrailLayouter::retrievePositions(const std::map<Id, Id>& topLevelAncestorId
|
||||
{
|
||||
if (node->dummyNode)
|
||||
{
|
||||
node->dummyNode->position = node->pos;
|
||||
if (node->level != -1)
|
||||
{
|
||||
node->dummyNode->position = node->pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
node->dummyNode->visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -296,6 +296,16 @@ void Graph::setTrailMode(TrailMode trailMode)
|
||||
m_trailMode = trailMode;
|
||||
}
|
||||
|
||||
bool Graph::hasTrailOrigin() const
|
||||
{
|
||||
return m_hasTrailOrigin;
|
||||
}
|
||||
|
||||
void Graph::setHasTrailOrigin(bool hasOrigin)
|
||||
{
|
||||
m_hasTrailOrigin = hasOrigin;
|
||||
}
|
||||
|
||||
void Graph::print(std::ostream& ostream) const
|
||||
{
|
||||
ostream << "Graph:\n";
|
||||
|
||||
@@ -59,6 +59,9 @@ public:
|
||||
TrailMode getTrailMode() const;
|
||||
void setTrailMode(TrailMode trailMode);
|
||||
|
||||
bool hasTrailOrigin() const;
|
||||
void setHasTrailOrigin(bool hasOrigin);
|
||||
|
||||
void print(std::ostream& ostream) const;
|
||||
void printBasic(std::ostream& ostream) const;
|
||||
|
||||
@@ -72,6 +75,7 @@ private:
|
||||
std::map<Id, std::shared_ptr<Edge>> m_edges;
|
||||
|
||||
TrailMode m_trailMode;
|
||||
bool m_hasTrailOrigin;
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& ostream, const Graph& graph);
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef MESSAGE_GRAPH_NODE_HIDE_H
|
||||
#define MESSAGE_GRAPH_NODE_HIDE_H
|
||||
|
||||
#include "utility/messaging/Message.h"
|
||||
#include "utility/types.h"
|
||||
|
||||
class MessageGraphNodeHide
|
||||
: public Message<MessageGraphNodeHide>
|
||||
{
|
||||
public:
|
||||
MessageGraphNodeHide(Id tokenId)
|
||||
: tokenId(tokenId)
|
||||
{
|
||||
}
|
||||
|
||||
static const std::string getStaticType()
|
||||
{
|
||||
return "MessageGraphNodeHide";
|
||||
}
|
||||
|
||||
virtual void print(std::ostream& os) const
|
||||
{
|
||||
os << tokenId;
|
||||
}
|
||||
|
||||
const Id tokenId;
|
||||
};
|
||||
|
||||
#endif // MESSAGE_GRAPH_NODE_HIDE_H
|
||||
Reference in New Issue
Block a user