logic: Added namespaces to overview and fixed namespace activation

This commit is contained in:
Eberhard Graether
2016-02-08 03:39:08 +01:00
parent d6c03ffb02
commit 29149f313a
24 changed files with 147 additions and 52 deletions
+12 -4
View File
@@ -31,8 +31,8 @@
<hover>#CCCCCC</hover>
</none>
<command>
<normal>#406D4D</normal>
<hover>#4E855E</hover>
<normal>#86BD40</normal>
<hover>#9EC769</hover>
</command>
<operator>
<normal>#7D2724</normal>
@@ -192,6 +192,9 @@
<normal>transparent</normal>
<focus>#FFFFFF</focus>
</border>
<hatching>
<normal>#FFFFFF</normal>
</hatching>
</function>
<method>
<like>function</like>
@@ -206,6 +209,9 @@
<normal>transparent</normal>
<focus>#FFFFFF</focus>
</border>
<hatching>
<normal>#FFFFFF</normal>
</hatching>
</global_variable>
<field>
<like>global_variable</like>
@@ -216,10 +222,12 @@
<undefined>
<fill>
<normal>#00000000</normal>
<normal>#EE7326</normal>
<focus>#EE8A4C</focus>
</fill>
<border>
<normal>#78282D</normal>
<normal>#80FFFFFF</normal>
<focus>#FFFFFF</focus>
</border>
</undefined>
<namespace>
+3 -2
View File
@@ -210,10 +210,11 @@
<undefined>
<fill>
<normal>#00000000</normal>
<normal>#CC8D91</normal>
</fill>
<border>
<normal>#CC8D91</normal>
<normal>#803C3C3C</normal>
<focus>#3C3C3C</focus>
</border>
</undefined>
<namespace>
+3 -2
View File
@@ -225,10 +225,11 @@
<undefined>
<fill>
<normal>#00000000</normal>
<normal>#78282D</normal>
</fill>
<border>
<normal>#78282D</normal>
<normal>#80C3C3C3</normal>
<focus>#C3C3C3</focus>
</border>
</undefined>
<namespace>
@@ -88,18 +88,26 @@ void CodeController::handleMessage(MessageActivateAll* message)
void CodeController::handleMessage(MessageActivateTokens* message)
{
std::vector<Id> activeTokenIds = message->tokenIds;
Id declarationId = 0; // 0 means that no token is found.
if (activeTokenIds.size() == 1)
{
activeTokenIds = m_storageAccess->getActiveTokenIdsForId(activeTokenIds[0], &declarationId);
}
// TODO: what about declarationId if more than 1 token is active? FIX THIS!
CodeView* view = getView();
view->setErrorMessages(std::vector<std::string>());
std::vector<Id> activeTokenIds =
(message->originalTokenIds.size() > 0 ? message->originalTokenIds : message->tokenIds);
if (activeTokenIds.size() != 1)
{
view->clear();
return;
}
Id declarationId = 0; // 0 means that no token is found.
activeTokenIds = m_storageAccess->getActiveTokenIdsForId(activeTokenIds[0], &declarationId);
if (message->originalTokenIds.size() > 0)
{
declarationId = 0;
}
if (message->isEdge)
{
view->showFirstActiveSnippet(activeTokenIds, message->isLast());
@@ -67,10 +67,16 @@ void GraphController::handleMessage(MessageActivateTokens* message)
std::vector<Id> tokenIds = utility::concat(m_activeNodeIds, m_activeEdgeIds);
std::shared_ptr<Graph> graph = m_storageAccess->getGraphForActiveTokenIds(tokenIds);
std::shared_ptr<Graph> graph =
m_storageAccess->getGraphForActiveTokenIds(tokenIds, message->originalTokenIds.size() > 0);
createDummyGraphForTokenIds(tokenIds, graph);
if (message->originalTokenIds.size() > 0)
{
deactivateNodesRecursive(&m_dummyNodes);
}
bundleNodes();
layoutNesting();
@@ -434,6 +440,15 @@ void GraphController::setNodeVisibilityRecursiveTopDown(DummyNode& node, bool pa
}
}
void GraphController::deactivateNodesRecursive(std::vector<DummyNode>* nodes) const
{
for (DummyNode& node : *nodes)
{
node.active = false;
deactivateNodesRecursive(&node.subNodes);
}
}
void GraphController::bundleNodes()
{
bundleNodesMatching(
@@ -762,6 +777,7 @@ bool GraphController::isTypeUserNode(const DummyNode& node) const
void GraphController::bundleNodesByType()
{
BUNDLE_BY_TYPE(Node::NODE_NAMESPACE, "Namespaces");
BUNDLE_BY_TYPE(Node::NODE_CLASS, "Classes");
BUNDLE_BY_TYPE(Node::NODE_STRUCT, "Structs");
@@ -782,7 +798,6 @@ void GraphController::bundleNodesByType()
BUNDLE_BY_TYPE(Node::NODE_ENUM_CONSTANT, "Enum Constants");
BUNDLE_BY_TYPE(Node::NODE_TEMPLATE_PARAMETER_TYPE, "Template Parameter Types");
BUNDLE_BY_TYPE(Node::NODE_UNDEFINED, "Undefined Symbols");
BUNDLE_BY_TYPE(Node::NODE_NAMESPACE, "Namespaces");
for (DummyNode& node : m_dummyNodes)
{
@@ -65,6 +65,7 @@ private:
void setNodeActiveRecursive(DummyNode& node, const std::vector<Id>& activeTokenIds) const;
bool setNodeVisibilityRecursiveBottomUp(DummyNode& node, bool noActive) const;
void setNodeVisibilityRecursiveTopDown(DummyNode& node, bool parentExpanded) const;
void deactivateNodesRecursive(std::vector<DummyNode>* nodes) const;
void bundleNodes();
void bundleNodesMatching(std::function<bool(const DummyNode&)> matcher, size_t count, const std::string& name);
@@ -22,7 +22,10 @@ void SearchController::handleMessage(MessageActivateTokens* message)
{
if (!message->keepContent() && !message->isFromSearch)
{
getView()->setMatches(m_storageAccess->getSearchMatchesForTokenIds(message->tokenIds));
const std::vector<Id>& tokenIds =
(message->originalTokenIds.size() > 0 ? message->originalTokenIds : message->tokenIds);
getView()->setMatches(m_storageAccess->getSearchMatchesForTokenIds(tokenIds));
}
}
@@ -95,7 +95,11 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
}
std::shared_ptr<MessageActivateTokens> m;
m = std::make_shared<MessageActivateTokens>(message, nodeIds);
m = std::make_shared<MessageActivateTokens>(message, m_storageAccess->getActiveTokenIdsForTokenIds(nodeIds));
if (nodeIds != m->tokenIds)
{
m->originalTokenIds = nodeIds;
}
m->isFromSystem = message->isFromSystem;
return m;
}
@@ -130,9 +134,13 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
}
std::vector<Id> tokenIds = m_storageAccess->getTokenIdsForMatches(matches);
tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds);
std::shared_ptr<MessageActivateTokens> m = std::make_shared<MessageActivateTokens>(message, tokenIds);
std::shared_ptr<MessageActivateTokens> m =
std::make_shared<MessageActivateTokens>(message, m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds));
if (tokenIds != m->tokenIds)
{
m->originalTokenIds = tokenIds;
}
if (message->isFresh())
{
m->isFromSearch = true;
@@ -85,6 +85,23 @@ public:
return false;
}
size_t getActiveSubNodeCount() const
{
size_t count = 0;
if (active)
{
count += 1;
}
for (const DummyNode& node : subNodes)
{
count += node.getActiveSubNodeCount();
}
return count;
}
bool hasConnectedSubNode() const
{
if (connected)
+2
View File
@@ -26,6 +26,8 @@ public:
virtual std::string getName() const;
virtual void clear() = 0;
virtual void setActiveTokenIds(const std::vector<Id>& activeTokenIds) = 0;
virtual void setErrorMessages(const std::vector<std::string>& errorMessages) = 0;
+2 -15
View File
@@ -130,8 +130,6 @@ size_t GraphViewStyle::getFontSizeForNodeType(Node::NodeType type)
{
case Node::NODE_UNDEFINED:
case Node::NODE_NAMESPACE:
return s_fontSize - 2;
case Node::NODE_TYPE:
case Node::NODE_STRUCT:
case Node::NODE_CLASS:
@@ -189,18 +187,13 @@ GraphViewStyle::NodeMargins GraphViewStyle::getMarginsForNodeType(Node::NodeType
switch (type)
{
case Node::NODE_UNDEFINED:
case Node::NODE_NAMESPACE:
margins.left = margins.right = 15;
margins.top = 10;
margins.bottom = 15;
break;
case Node::NODE_ENUM:
case Node::NODE_TYPEDEF:
case Node::NODE_FILE:
case Node::NODE_MACRO:
margins.iconWidth = s_fontSize + 11;
case Node::NODE_UNDEFINED:
case Node::NODE_NAMESPACE:
case Node::NODE_TYPE:
case Node::NODE_STRUCT:
case Node::NODE_CLASS:
@@ -306,12 +299,6 @@ GraphViewStyle::NodeStyle GraphViewStyle::getStyleForNodeType(
style.borderDashed = true;
case Node::NODE_NAMESPACE:
style.cornerRadius = 20;
style.textOffset.x = 15;
style.textOffset.y = 6;
break;
case Node::NODE_TYPE:
case Node::NODE_STRUCT:
case Node::NODE_CLASS:
+15 -4
View File
@@ -903,7 +903,8 @@ std::shared_ptr<Graph> Storage::getGraphForAll() const
std::vector<Id> tokenIds;
for (StorageNode node: m_sqliteStorage.getAllNodes())
{
if (node.defined && !m_hierarchyCache.isChildOfVisibleNodeOrInvisible(node.id))
if (node.defined && (!m_hierarchyCache.isChildOfVisibleNodeOrInvisible(node.id) ||
Node::intToType(node.type) == Node::NODE_NAMESPACE))
{
tokenIds.push_back(node.id);
}
@@ -914,12 +915,12 @@ std::shared_ptr<Graph> Storage::getGraphForAll() const
return graph;
}
std::shared_ptr<Graph> Storage::getGraphForActiveTokenIds(const std::vector<Id>& tokenIds) const
std::shared_ptr<Graph> Storage::getGraphForActiveTokenIds(const std::vector<Id>& tokenIds, bool activeOnly) const
{
std::shared_ptr<Graph> g = std::make_shared<Graph>();
Graph* graph = g.get();
if (tokenIds.size() == 1)
if (tokenIds.size() == 1 && !activeOnly)
{
const Id elementId = tokenIds[0];
@@ -946,7 +947,7 @@ std::shared_ptr<Graph> Storage::getGraphForActiveTokenIds(const std::vector<Id>&
addEdgeAndAllChildrenToGraph(elementId, graph);
}
}
else if (tokenIds.size() > 1)
else if (tokenIds.size() >= 1)
{
for (size_t i = 0; i < tokenIds.size(); i++)
{
@@ -970,6 +971,7 @@ std::shared_ptr<Graph> Storage::getGraphForActiveTokenIds(const std::vector<Id>&
std::vector<Id> Storage::getActiveTokenIdsForTokenIds(const std::vector<Id>& tokenIds) const
{
bool different = false;
std::vector<Id> activeIds;
for (Id id : tokenIds)
@@ -977,6 +979,10 @@ std::vector<Id> Storage::getActiveTokenIdsForTokenIds(const std::vector<Id>& tok
if (m_sqliteStorage.isNode(id))
{
m_hierarchyCache.addFirstVisibleChildIdsForNodeId(id, &activeIds);
if (id != activeIds.back())
{
different = true;
}
}
else
{
@@ -984,6 +990,11 @@ std::vector<Id> Storage::getActiveTokenIdsForTokenIds(const std::vector<Id>& tok
}
}
if (!different)
{
return tokenIds;
}
std::set<Id> idSet(activeIds.begin(), activeIds.end());
activeIds.clear();
activeIds.insert(activeIds.end(), idSet.begin(), idSet.end());
+1 -1
View File
@@ -147,7 +147,7 @@ public:
virtual std::vector<SearchMatch> getSearchMatchesForTokenIds(const std::vector<Id>& tokenIds) const;
virtual std::shared_ptr<Graph> getGraphForAll() const;
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(const std::vector<Id>& tokenIds) const;
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(const std::vector<Id>& tokenIds, bool activeOnly) const;
virtual std::vector<Id> getActiveTokenIdsForTokenIds(const std::vector<Id>& tokenIds) const;
virtual std::vector<Id> getActiveTokenIdsForId(Id tokenId, Id* declarationId) const;
+1 -1
View File
@@ -39,7 +39,7 @@ public:
virtual std::vector<SearchMatch> getSearchMatchesForTokenIds(const std::vector<Id>& tokenIds) const = 0;
virtual std::shared_ptr<Graph> getGraphForAll() const = 0;
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(const std::vector<Id>& tokenIds) const = 0;
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(const std::vector<Id>& tokenIds, bool activeOnly) const = 0;
virtual std::vector<Id> getActiveTokenIdsForTokenIds(const std::vector<Id>& tokenIds) const = 0;
virtual std::vector<Id> getActiveTokenIdsForId(Id tokenId, Id* declarationId) const = 0;
+2 -2
View File
@@ -123,11 +123,11 @@ std::shared_ptr<Graph> StorageAccessProxy::getGraphForAll() const
return std::make_shared<Graph>();
}
std::shared_ptr<Graph> StorageAccessProxy::getGraphForActiveTokenIds(const std::vector<Id>& tokenIds) const
std::shared_ptr<Graph> StorageAccessProxy::getGraphForActiveTokenIds(const std::vector<Id>& tokenIds, bool activeOnly) const
{
if (hasSubject())
{
return m_subject->getGraphForActiveTokenIds(tokenIds);
return m_subject->getGraphForActiveTokenIds(tokenIds, activeOnly);
}
return std::make_shared<Graph>();
+1 -1
View File
@@ -27,7 +27,7 @@ public:
virtual std::vector<SearchMatch> getSearchMatchesForTokenIds(const std::vector<Id>& tokenIds) const;
virtual std::shared_ptr<Graph> getGraphForAll() const;
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(const std::vector<Id>& tokenIds) const;
virtual std::shared_ptr<Graph> getGraphForActiveTokenIds(const std::vector<Id>& tokenIds, bool activeOnly) const;
virtual std::vector<Id> getActiveTokenIdsForTokenIds(const std::vector<Id>& tokenIds) const;
virtual std::vector<Id> getActiveTokenIdsForId(Id tokenId, Id* declarationId) const;
@@ -34,6 +34,7 @@ public:
}
const std::vector<Id> tokenIds;
std::vector<Id> originalTokenIds;
bool isEdge;
bool isAggregation;
+13
View File
@@ -12,6 +12,7 @@
QtCodeView::QtCodeView(ViewLayout* viewLayout)
: CodeView(viewLayout)
, m_refreshViewFunctor(std::bind(&QtCodeView::doRefreshView, this))
, m_clearFunctor(std::bind(&QtCodeView::doClear, this))
, m_showCodeSnippetsFunctor(std::bind(&QtCodeView::doShowCodeSnippets, this, std::placeholders::_1, std::placeholders::_2))
, m_addCodeSnippetsFunctor(std::bind(&QtCodeView::doAddCodeSnippets, this, std::placeholders::_1, std::placeholders::_2))
, m_showCodeFileFunctor(std::bind(&QtCodeView::doShowCodeFile, this, std::placeholders::_1))
@@ -45,6 +46,11 @@ void QtCodeView::refreshView()
m_refreshViewFunctor();
}
void QtCodeView::clear()
{
m_clearFunctor();
}
void QtCodeView::setActiveTokenIds(const std::vector<Id>& activeTokenIds)
{
m_activeTokenIds = activeTokenIds;
@@ -112,6 +118,11 @@ void QtCodeView::doRefreshView()
QtCodeArea::clearAnnotationColors();
}
void QtCodeView::doClear()
{
m_widget->clearCodeSnippets();
}
void QtCodeView::doShowCodeSnippets(const std::vector<CodeSnippetParams>& snippets, const std::vector<Id>& activeTokenIds)
{
m_widget->clearCodeSnippets();
@@ -143,6 +154,8 @@ void QtCodeView::doAddCodeSnippets(const std::vector<CodeSnippetParams>& snippet
m_widget->addCodeSnippet(params, insert);
}
m_widget->updateFiles();
setStyleSheet(); // so property "isLast" of QtCodeSnippet is computed correctly
m_widget->scrollToActiveFileIfRequested();
+4
View File
@@ -26,6 +26,8 @@ public:
virtual void refreshView();
// CodeView implementation
virtual void clear();
virtual void setActiveTokenIds(const std::vector<Id>& activeTokenIds);
virtual void setErrorMessages(const std::vector<std::string>& errorMessages);
@@ -47,6 +49,7 @@ public:
private:
void doRefreshView();
void doClear();
void doShowCodeSnippets(const std::vector<CodeSnippetParams>& snippets, const std::vector<Id>& activeTokenIds);
void doAddCodeSnippets(const std::vector<CodeSnippetParams>& snippets, bool insert);
@@ -67,6 +70,7 @@ private:
void setStyleSheet() const;
QtThreadedFunctor<> m_refreshViewFunctor;
QtThreadedFunctor<> m_clearFunctor;
QtThreadedFunctor<const std::vector<CodeSnippetParams>&, const std::vector<Id>&> m_showCodeSnippetsFunctor;
QtThreadedFunctor<const std::vector<CodeSnippetParams>&, bool> m_addCodeSnippetsFunctor;
QtThreadedFunctor<const CodeSnippetParams&> m_showCodeFileFunctor;
+10 -3
View File
@@ -230,10 +230,16 @@ void QtGraphView::doRebuildGraph(
QGraphicsView* view = getView();
size_t activeNodeCount = 0;
for (unsigned int i = 0; i < nodes.size(); i++)
{
activeNodeCount += nodes[i].getActiveSubNodeCount();
}
m_nodes.clear();
for (unsigned int i = 0; i < nodes.size(); i++)
{
std::shared_ptr<QtGraphNode> node = createNodeRecursive(view, NULL, nodes[i]);
std::shared_ptr<QtGraphNode> node = createNodeRecursive(view, NULL, nodes[i], activeNodeCount > 1);
if (node)
{
m_nodes.push_back(node);
@@ -317,7 +323,7 @@ std::shared_ptr<QtGraphNode> QtGraphView::findNodeRecursive(const std::list<std:
}
std::shared_ptr<QtGraphNode> QtGraphView::createNodeRecursive(
QGraphicsView* view, std::shared_ptr<QtGraphNode> parentNode, const DummyNode& node
QGraphicsView* view, std::shared_ptr<QtGraphNode> parentNode, const DummyNode& node, bool multipleActive
){
if (!node.visible)
{
@@ -345,6 +351,7 @@ std::shared_ptr<QtGraphNode> QtGraphView::createNodeRecursive(
newNode->setPosition(node.position);
newNode->setSize(node.size);
newNode->setIsActive(node.active);
newNode->setMultipleActive(multipleActive);
newNode->addComponent(std::make_shared<QtGraphNodeComponentClickable>(newNode));
@@ -361,7 +368,7 @@ std::shared_ptr<QtGraphNode> QtGraphView::createNodeRecursive(
for (unsigned int i = 0; i < node.subNodes.size(); i++)
{
std::shared_ptr<QtGraphNode> subNode = createNodeRecursive(view, newNode, node.subNodes[i]);
std::shared_ptr<QtGraphNode> subNode = createNodeRecursive(view, newNode, node.subNodes[i], multipleActive);
if (subNode)
{
newNode->addSubNode(subNode);
+1 -1
View File
@@ -79,7 +79,7 @@ private:
std::shared_ptr<QtGraphNode> findNodeRecursive(const std::list<std::shared_ptr<QtGraphNode>>& nodes, Id tokenId);
std::shared_ptr<QtGraphNode> createNodeRecursive(
QGraphicsView* view, std::shared_ptr<QtGraphNode> parentNode, const DummyNode& node);
QGraphicsView* view, std::shared_ptr<QtGraphNode> parentNode, const DummyNode& node, bool multipleActive);
std::shared_ptr<QtGraphEdge> createEdge(QGraphicsView* view, const DummyEdge& edge);
QRectF itemsBoundingRect(const std::list<std::shared_ptr<QtGraphNode>>& items) const;
@@ -46,6 +46,7 @@ QtGraphNode::QtGraphNode()
: m_undefinedRect(nullptr)
, m_icon(nullptr)
, m_isActive(false)
, m_multipleActive(false)
, m_isHovering(false)
{
this->setPen(QPen(Qt::transparent));
@@ -186,6 +187,11 @@ void QtGraphNode::setIsActive(bool isActive)
updateStyle();
}
void QtGraphNode::setMultipleActive(bool multipleActive)
{
m_multipleActive = multipleActive;
}
std::string QtGraphNode::getName() const
{
return m_text->text().toStdString();
@@ -60,6 +60,7 @@ public:
bool getIsActive() const;
void setIsActive(bool isActive);
void setMultipleActive(bool multipleActive);
std::string getName() const;
void setName(const std::string& name);
@@ -108,6 +109,7 @@ protected:
Vec2i m_size;
bool m_isActive;
bool m_multipleActive;
bool m_isHovering;
private:
@@ -55,7 +55,7 @@ Id QtGraphNodeData::getTokenId() const
void QtGraphNodeData::onClick()
{
if (m_isActive)
if (m_isActive && !m_multipleActive)
{
MessageDeactivateEdge().dispatch();
return;