ui/data: cleaned up UI and parsing
* HOT FIX: typename not always correctly split to name hierarchy * show node main if available as first active token after parsing * show all contents of namespaces if searched for * added missing enum type and enum value usages * added inheritance for structs * removed MessageActivateToken and replaced it with MessageActivateTokens * activating correct nodes for clicks in GraphView and CodeView * no graph change when clicking an edge, but highlighting the edge instead * only show active nodes without connections when multiple are activated * fixed snippet sorting to put file that contains declarations on top * set sizeHints on CodeView and SearchView to increase their initial size fortune cookie message = Das Leben wird eine positive Wendung nehmen.
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
#include "component/controller/CodeController.h"
|
||||
|
||||
#include "component/view/CodeView.h"
|
||||
#include "data/access/GraphAccess.h"
|
||||
#include "data/access/LocationAccess.h"
|
||||
#include "data/location/TokenLocation.h"
|
||||
@@ -8,8 +7,6 @@
|
||||
#include "data/location/TokenLocationFile.h"
|
||||
#include "utility/text/TextAccess.h"
|
||||
|
||||
const uint CodeController::s_lineRadius = 2;
|
||||
|
||||
CodeController::CodeController(GraphAccess* graphAccess, LocationAccess* locationAccess)
|
||||
: m_graphAccess(graphAccess)
|
||||
, m_locationAccess(locationAccess)
|
||||
@@ -20,17 +17,64 @@ CodeController::~CodeController()
|
||||
{
|
||||
}
|
||||
|
||||
void CodeController::setActiveTokenIds(const std::vector<Id>& ids, Id activeId, Id declarationId)
|
||||
{
|
||||
getView()->clearCodeSnippets();
|
||||
getView()->setActiveTokenIds(ids);
|
||||
const uint CodeController::s_lineRadius = 2;
|
||||
|
||||
void CodeController::handleMessage(MessageActivateTokenLocation* message)
|
||||
{
|
||||
if (message->locationId)
|
||||
{
|
||||
std::vector<Id> activeTokenIds = m_graphAccess->getActiveTokenIdsForLocationId(message->locationId);
|
||||
MessageActivateTokens(activeTokenIds).dispatch();
|
||||
}
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
std::vector<Id> activeTokenIds = message->tokenIds;
|
||||
Id declarationId = 0;
|
||||
|
||||
if (activeTokenIds.size() == 1)
|
||||
{
|
||||
activeTokenIds = m_graphAccess->getActiveTokenIdsForId(activeTokenIds[0], &declarationId);
|
||||
}
|
||||
|
||||
getView()->setActiveTokenIds(activeTokenIds);
|
||||
getView()->showCodeSnippets(getSnippetsForActiveTokenIds(activeTokenIds, declarationId));
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageRefresh* message)
|
||||
{
|
||||
getView()->refreshView();
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageShowFile* message)
|
||||
{
|
||||
CodeView::CodeSnippetParams params;
|
||||
params.startLineNumber = message->startLineNumber;
|
||||
params.endLineNumber = message->endLineNumber;
|
||||
|
||||
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(message->filePath);
|
||||
params.lineCount = textAccess->getLineCount();
|
||||
params.code = textAccess->getText();
|
||||
|
||||
params.locationFile = m_locationAccess->getTokenLocationsForFile(message->filePath);
|
||||
|
||||
getView()->showCodeFile(params);
|
||||
}
|
||||
|
||||
CodeView* CodeController::getView()
|
||||
{
|
||||
return Controller::getView<CodeView>();
|
||||
}
|
||||
|
||||
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTokenIds(
|
||||
const std::vector<Id>& ids, Id declarationId
|
||||
) const {
|
||||
std::vector<Id> locationIds = m_graphAccess->getLocationIdsForTokenIds(ids);
|
||||
TokenLocationCollection collection = m_locationAccess->getTokenLocationsForLocationIds(locationIds);
|
||||
|
||||
std::vector<CodeView::CodeSnippetParams> snippets;
|
||||
|
||||
TokenLocationCollection collection = m_locationAccess->getTokenLocationsForLocationIds(locationIds);
|
||||
|
||||
collection.forEachTokenLocationFile(
|
||||
[&](TokenLocationFile* file) -> void
|
||||
{
|
||||
@@ -38,6 +82,7 @@ void CodeController::setActiveTokenIds(const std::vector<Id>& ids, Id activeId,
|
||||
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(filePath);
|
||||
|
||||
std::vector<std::pair<uint, uint>> ranges = getSnippetRangesForFile(file, s_lineRadius);
|
||||
std::vector<CodeView::CodeSnippetParams> fileSnippets;
|
||||
|
||||
for (const std::pair<uint, uint>& range: ranges)
|
||||
{
|
||||
@@ -52,78 +97,40 @@ void CodeController::setActiveTokenIds(const std::vector<Id>& ids, Id activeId,
|
||||
|
||||
params.startLineNumber = firstLineNumber;
|
||||
params.locationFile =
|
||||
m_locationAccess->getTokenLocationsForLinesInFile(filePath, firstLineNumber, lastLineNumber);
|
||||
params.locationFile.forEachTokenLocation(
|
||||
[&](TokenLocation* location)
|
||||
{
|
||||
if(location->getTokenId() == activeId && activeId != 0)
|
||||
{
|
||||
params.isActive = true;
|
||||
}
|
||||
if(location->getTokenId() == declarationId && declarationId != 0)
|
||||
{
|
||||
params.isDeclaration = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
m_locationAccess->getTokenLocationsForLinesInFile(filePath, firstLineNumber, lastLineNumber);
|
||||
|
||||
snippets.push_back(params);
|
||||
fileSnippets.push_back(params);
|
||||
}
|
||||
|
||||
if (declarationId != 0)
|
||||
{
|
||||
bool isDeclarationFile = false;
|
||||
for (const CodeView::CodeSnippetParams& snippet : fileSnippets)
|
||||
{
|
||||
snippet.locationFile.forEachTokenLocation(
|
||||
[&](TokenLocation* location)
|
||||
{
|
||||
if (location->getTokenId() == declarationId)
|
||||
{
|
||||
isDeclarationFile = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
for (CodeView::CodeSnippetParams& snippet : fileSnippets)
|
||||
{
|
||||
snippet.isDeclaration = isDeclarationFile;
|
||||
}
|
||||
}
|
||||
|
||||
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
std::sort(snippets.begin(), snippets.end(), CodeView::CodeSnippetParams::sort);
|
||||
|
||||
for( CodeView::CodeSnippetParams p : snippets)
|
||||
{
|
||||
getView()->addCodeSnippet(p);
|
||||
}
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageActivateToken* message)
|
||||
{
|
||||
Id declarationId;
|
||||
std::vector<Id> activeTokenIds = m_graphAccess->getActiveTokenIdsForId(message->tokenId, declarationId);
|
||||
setActiveTokenIds(activeTokenIds, message->tokenId, declarationId);
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
if (message->tokenIds.size () == 1)
|
||||
{
|
||||
Id declarationId;
|
||||
std::vector<Id> activeTokenIds = m_graphAccess->getActiveTokenIdsForId(message->tokenIds[0], declarationId);
|
||||
setActiveTokenIds(activeTokenIds, message->tokenIds[0], declarationId);
|
||||
}
|
||||
else
|
||||
{
|
||||
setActiveTokenIds(message->tokenIds, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageRefresh* message)
|
||||
{
|
||||
getView()->refreshView();
|
||||
}
|
||||
|
||||
void CodeController::handleMessage(MessageShowFile* message)
|
||||
{
|
||||
CodeView::CodeSnippetParams params;
|
||||
params.startLineNumber = message->startLineNumber;
|
||||
params.endLineNumber = message->endLineNumber;
|
||||
getView()->setActiveTokenIds(message->activeTokenIds);
|
||||
|
||||
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(message->filePath);
|
||||
params.lineCount = textAccess->getLineCount();
|
||||
params.code = textAccess->getText();
|
||||
|
||||
params.locationFile = m_locationAccess->getTokenLocationsForFile(message->filePath);
|
||||
getView()->showCodeFile(params);
|
||||
}
|
||||
|
||||
CodeView* CodeController::getView()
|
||||
{
|
||||
return Controller::getView<CodeView>();
|
||||
return snippets;
|
||||
}
|
||||
|
||||
std::vector<std::pair<uint, uint>> CodeController::getSnippetRangesForFile(
|
||||
|
||||
@@ -4,27 +4,21 @@
|
||||
#include <string>
|
||||
|
||||
#include "component/controller/Controller.h"
|
||||
#include "component/view/CodeView.h"
|
||||
#include "utility/messaging/MessageListener.h"
|
||||
#include "utility/messaging/type/MessageActivateToken.h"
|
||||
#include "utility/messaging/type/MessageActivateTokenLocation.h"
|
||||
#include "utility/messaging/type/MessageActivateTokens.h"
|
||||
#include "utility/messaging/type/MessageRefresh.h"
|
||||
#include "utility/messaging/type/MessageShowFile.h"
|
||||
#include "utility/types.h"
|
||||
|
||||
class CodeView;
|
||||
class GraphAccess;
|
||||
class LocationAccess;
|
||||
class TokenLocationFile;
|
||||
|
||||
struct AnnotatedText
|
||||
{
|
||||
std::string text;
|
||||
Id tokenId;
|
||||
};
|
||||
|
||||
class CodeController
|
||||
: public Controller
|
||||
, public MessageListener<MessageActivateToken>
|
||||
, public MessageListener<MessageActivateTokenLocation>
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
, public MessageListener<MessageRefresh>
|
||||
, public MessageListener<MessageShowFile>
|
||||
@@ -33,18 +27,18 @@ public:
|
||||
CodeController(GraphAccess* graphAccess, LocationAccess* locationAccess);
|
||||
~CodeController();
|
||||
|
||||
void setActiveTokenIds(const std::vector<Id>& ids, Id activeId, Id declarationId);
|
||||
|
||||
private:
|
||||
virtual void handleMessage(MessageActivateToken* message);
|
||||
static const uint s_lineRadius;
|
||||
|
||||
virtual void handleMessage(MessageActivateTokenLocation* message);
|
||||
virtual void handleMessage(MessageActivateTokens* message);
|
||||
virtual void handleMessage(MessageRefresh* message);
|
||||
virtual void handleMessage(MessageShowFile* message);
|
||||
|
||||
CodeView* getView();
|
||||
|
||||
static const uint s_lineRadius;
|
||||
|
||||
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenIds(
|
||||
const std::vector<Id>& ids, Id declarationId) const;
|
||||
std::vector<std::pair<uint, uint>> getSnippetRangesForFile(TokenLocationFile* file, const uint lineRadius) const;
|
||||
|
||||
GraphAccess* m_graphAccess;
|
||||
|
||||
@@ -31,15 +31,29 @@ GraphController::~GraphController()
|
||||
{
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageActivateToken* message)
|
||||
{
|
||||
std::vector<Id> activeTokenIds(1, message->tokenId);
|
||||
createDummyGraphForTokenIds(activeTokenIds);
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
createDummyGraphForTokenIds(message->tokenIds);
|
||||
if (message->isEdge && message->tokenIds.size() == 1)
|
||||
{
|
||||
m_currentActiveTokenIds = m_activeTokenIds;
|
||||
m_currentActiveTokenIds.push_back(message->tokenIds[0]);
|
||||
|
||||
setActiveAndVisibility(m_currentActiveTokenIds);
|
||||
getView()->rebuildGraph(nullptr, m_dummyNodes, m_dummyEdges);
|
||||
return;
|
||||
}
|
||||
|
||||
if (message->isAggregation)
|
||||
{
|
||||
m_activeTokenIds.clear();
|
||||
m_currentActiveTokenIds = message->tokenIds;
|
||||
|
||||
createDummyGraphForTokenIds(m_currentActiveTokenIds);
|
||||
return;
|
||||
}
|
||||
|
||||
setActiveTokenIds(message->tokenIds);
|
||||
createDummyGraphForTokenIds(m_activeTokenIds);
|
||||
}
|
||||
|
||||
void GraphController::handleMessage(MessageGraphNodeExpand* message)
|
||||
@@ -49,7 +63,7 @@ void GraphController::handleMessage(MessageGraphNodeExpand* message)
|
||||
{
|
||||
node->expanded = !node->expanded;
|
||||
|
||||
setActiveAndVisibility(m_activeTokenIds);
|
||||
setActiveAndVisibility(m_currentActiveTokenIds);
|
||||
layoutNesting();
|
||||
|
||||
getView()->rebuildGraph(nullptr, m_dummyNodes, m_dummyEdges);
|
||||
@@ -70,6 +84,12 @@ GraphView* GraphController::getView() const
|
||||
return Controller::getView<GraphView>();
|
||||
}
|
||||
|
||||
void GraphController::setActiveTokenIds(const std::vector<Id>& activeTokenIds)
|
||||
{
|
||||
m_activeTokenIds = activeTokenIds;
|
||||
m_currentActiveTokenIds = activeTokenIds;
|
||||
}
|
||||
|
||||
void GraphController::createDummyGraphForTokenIds(const std::vector<Id>& tokenIds)
|
||||
{
|
||||
const GraphLayouter::LayoutFunction layoutFunction = &GraphLayouter::layoutSimpleRaster;
|
||||
@@ -83,7 +103,6 @@ void GraphController::createDummyGraphForTokenIds(const std::vector<Id>& tokenId
|
||||
|
||||
std::shared_ptr<Graph> graph = m_graphAccess->getGraphForActiveTokenIds(tokenIds);
|
||||
|
||||
|
||||
m_dummyEdges.clear();
|
||||
|
||||
std::set<Id> addedNodes;
|
||||
@@ -106,7 +125,6 @@ void GraphController::createDummyGraphForTokenIds(const std::vector<Id>& tokenId
|
||||
|
||||
m_dummyNodes = dummyNodes;
|
||||
|
||||
m_activeTokenIds = tokenIds;
|
||||
setActiveAndVisibility(tokenIds);
|
||||
|
||||
layoutNesting();
|
||||
@@ -202,6 +220,7 @@ void GraphController::setActiveAndVisibility(const std::vector<Id>& activeTokenI
|
||||
for (DummyEdge& edge : m_dummyEdges)
|
||||
{
|
||||
edge.visible = true;
|
||||
edge.active = false;
|
||||
if (find(activeTokenIds.begin(), activeTokenIds.end(), edge.data->getId()) != activeTokenIds.end())
|
||||
{
|
||||
edge.active = true;
|
||||
@@ -244,7 +263,8 @@ void GraphController::setNodeVisibilityRecursiveTopDown(DummyNode& node) const
|
||||
for (DummyNode& subNode : node.subNodes)
|
||||
{
|
||||
if (subNode.accessType != TokenComponentAccess::ACCESS_NONE || node.expanded ||
|
||||
(node.data && node.data->getType() == Node::NODE_ENUM))
|
||||
(node.data && node.data->isType(Node::NODE_ENUM)) ||
|
||||
(node.active && node.data && node.data->isType(Node::NODE_NAMESPACE | Node::NODE_UNDEFINED)))
|
||||
{
|
||||
setNodeVisibilityRecursiveTopDown(subNode);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include <vector>
|
||||
|
||||
#include "utility/messaging/MessageListener.h"
|
||||
#include "utility/messaging/type/MessageActivateToken.h"
|
||||
#include "utility/messaging/type/MessageActivateTokens.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeExpand.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeMove.h"
|
||||
@@ -21,7 +20,6 @@ class Node;
|
||||
|
||||
class GraphController
|
||||
: public Controller
|
||||
, public MessageListener<MessageActivateToken>
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
, public MessageListener<MessageGraphNodeExpand>
|
||||
, public MessageListener<MessageGraphNodeMove>
|
||||
@@ -48,13 +46,14 @@ public:
|
||||
~GraphController();
|
||||
|
||||
private:
|
||||
virtual void handleMessage(MessageActivateToken* message);
|
||||
virtual void handleMessage(MessageActivateTokens* message);
|
||||
virtual void handleMessage(MessageGraphNodeExpand* message);
|
||||
virtual void handleMessage(MessageGraphNodeMove* message);
|
||||
|
||||
GraphView* getView() const;
|
||||
|
||||
void setActiveTokenIds(const std::vector<Id>& activeTokenIds);
|
||||
|
||||
void createDummyGraphForTokenIds(const std::vector<Id>& tokenIds);
|
||||
DummyNode createDummyNodeTopDown(Node* node);
|
||||
|
||||
@@ -77,6 +76,7 @@ private:
|
||||
std::vector<DummyEdge> m_dummyEdges;
|
||||
|
||||
std::vector<Id> m_activeTokenIds;
|
||||
std::vector<Id> m_currentActiveTokenIds;
|
||||
};
|
||||
|
||||
#endif // GRAPH_CONTROLLER_H
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
SearchController::SearchController(GraphAccess* graphAccess)
|
||||
: m_graphAccess(graphAccess)
|
||||
, m_ignoreNextMessageActivateToken(false)
|
||||
, m_ignoreNextMessageActivateTokens(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -13,27 +13,18 @@ SearchController::~SearchController()
|
||||
{
|
||||
}
|
||||
|
||||
void SearchController::handleMessage(MessageActivateToken* message)
|
||||
void SearchController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
if (!m_ignoreNextMessageActivateToken && message->tokenId)
|
||||
if (!m_ignoreNextMessageActivateTokens && message->tokenIds.size())
|
||||
{
|
||||
SearchMatch match;
|
||||
match.fullName = m_graphAccess->getNameForNodeWithId(message->tokenId);
|
||||
match.tokenIds.insert(message->tokenId);
|
||||
match.fullName = m_graphAccess->getNameForNodeWithId(message->tokenIds[0]);
|
||||
match.tokenIds.insert(message->tokenIds[0]);
|
||||
|
||||
getView()->setText(match.encodeForQuery());
|
||||
}
|
||||
|
||||
m_ignoreNextMessageActivateToken = false;
|
||||
}
|
||||
|
||||
void SearchController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
if (message->tokenIds.size())
|
||||
{
|
||||
MessageActivateToken tokenMessage(message->tokenIds[0]);
|
||||
handleMessage(&tokenMessage);
|
||||
}
|
||||
m_ignoreNextMessageActivateTokens = false;
|
||||
}
|
||||
|
||||
void SearchController::handleMessage(MessageFind* message)
|
||||
@@ -52,7 +43,7 @@ void SearchController::handleMessage(MessageSearch* message)
|
||||
|
||||
LOG_INFO("search string: \"" + query + "\"");
|
||||
|
||||
m_ignoreNextMessageActivateToken = true;
|
||||
m_ignoreNextMessageActivateTokens = true;
|
||||
|
||||
std::vector<Id> ids = m_graphAccess->getTokenIdsForQuery(query);
|
||||
if (!ids.size())
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
#include "component/controller/Controller.h"
|
||||
#include "utility/messaging/MessageListener.h"
|
||||
#include "utility/messaging/type/MessageActivateToken.h"
|
||||
#include "utility/messaging/type/MessageActivateTokens.h"
|
||||
#include "utility/messaging/type/MessageFind.h"
|
||||
#include "utility/messaging/type/MessageRefresh.h"
|
||||
@@ -17,7 +16,6 @@ class SearchView;
|
||||
|
||||
class SearchController
|
||||
: public Controller
|
||||
, public MessageListener<MessageActivateToken>
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
, public MessageListener<MessageFind>
|
||||
, public MessageListener<MessageRefresh>
|
||||
@@ -29,7 +27,6 @@ public:
|
||||
~SearchController();
|
||||
|
||||
private:
|
||||
virtual void handleMessage(MessageActivateToken* message);
|
||||
virtual void handleMessage(MessageActivateTokens* message);
|
||||
virtual void handleMessage(MessageFind* message);
|
||||
virtual void handleMessage(MessageRefresh* message);
|
||||
@@ -40,7 +37,7 @@ private:
|
||||
|
||||
GraphAccess* m_graphAccess;
|
||||
|
||||
bool m_ignoreNextMessageActivateToken;
|
||||
bool m_ignoreNextMessageActivateTokens;
|
||||
};
|
||||
|
||||
#endif // SEARCH_CONTROLLER_H
|
||||
|
||||
Reference in New Issue
Block a user