ui: precollapse files in code view

This change shows the files in the code view minimized, if more than 5. This greatly improves performance, because code
and annotations won't get loaded until needed. Files including declarations or definitions of the active symbol are
still expanded. The number of references in each file is now shown in it's title bar. Clicking the title bar allows for
expanding and collapsing as well now.
This commit is contained in:
Eberhard Graether
2015-09-28 15:18:52 +02:00
parent 27ed5a0635
commit dd4d74a1d9
20 changed files with 353 additions and 85 deletions
+47 -26
View File
@@ -4,6 +4,7 @@
#include "utility/messaging/type/MessageStatus.h"
#include "utility/text/TextAccess.h"
#include "utility/utility.h"
#include "data/access/StorageAccess.h"
#include "data/location/TokenLocation.h"
@@ -45,7 +46,7 @@ void CodeController::handleMessage(MessageActivateTokens* message)
if (message->isEdge)
{
view->scrollToFirstActiveSnippet();
view->showFirstActiveSnippet();
return;
}
@@ -141,7 +142,12 @@ void CodeController::handleMessage(MessageShowScope* message)
return;
}
getView()->addCodeSnippet(snippets[0]);
getView()->addCodeSnippets(snippets);
}
void CodeController::handleMessage(MessageShowSnippets* message)
{
getView()->addCodeSnippets(getSnippetsForActiveTokenLocationsInFile(message->locationFile));
}
CodeView* CodeController::getView()
@@ -157,40 +163,37 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
collection->forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
{
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
if (!file->isWholeCopy)
{
for (CodeView::CodeSnippetParams& params : fileSnippets)
bool isDeclarationFile = false;
file->forEachTokenLocation(
[&](TokenLocation* location)
{
params.locationFile = m_storageAccess->getTokenLocationsForLinesInFile(
file->getFilePath().str(), params.startLineNumber, params.endLineNumber);
if (location->getTokenId() == declarationId)
{
isDeclarationFile = true;
}
}
}
);
if (declarationId != 0)
if (isDeclarationFile || collection->getTokenLocationFileCount() < 5)
{
bool isDeclarationFile = false;
for (const CodeView::CodeSnippetParams& snippet : fileSnippets)
{
snippet.locationFile->forEachTokenLocation(
[&](TokenLocation* location)
{
if (location->getTokenId() == declarationId)
{
isDeclarationFile = true;
}
}
);
}
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForActiveTokenLocationsInFile(file);
for (CodeView::CodeSnippetParams& snippet : fileSnippets)
{
snippet.isDeclaration = isDeclarationFile;
}
}
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
utility::append(snippets, fileSnippets);
}
else
{
CodeView::CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.isCollapsed = true;
snippets.push_back(params);
}
}
);
@@ -199,6 +202,23 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
return snippets;
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocationsInFile(
std::shared_ptr<TokenLocationFile> file
) const {
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
if (!file->isWholeCopy)
{
for (CodeView::CodeSnippetParams& params : fileSnippets)
{
params.locationFile = m_storageAccess->getTokenLocationsForLinesInFile(
file->getFilePath().str(), params.startLineNumber, params.endLineNumber);
}
}
return fileSnippets;
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const
{
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(file->getFilePath().str());
@@ -232,6 +252,7 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForFile(std:
{
CodeView::CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.startLineNumber = std::max<int>(1, range.start.row - (range.start.strong ? 0 : snippetExpandRange));
params.endLineNumber = std::min<int>(textAccess->getLineCount(), range.end.row + (range.end.strong ? 0 : snippetExpandRange));