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
+1
View File
@@ -254,6 +254,7 @@ add_files(
utility/messaging/type/MessageSearchAutocomplete.h
utility/messaging/type/MessageShowFile.h
utility/messaging/type/MessageShowScope.h
utility/messaging/type/MessageShowSnippets.h
utility/messaging/type/MessageStatus.h
utility/messaging/type/MessageSwitchColorScheme.h
utility/messaging/type/MessageUndo.h
+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));
@@ -11,6 +11,7 @@
#include "utility/messaging/type/MessageFocusOut.h"
#include "utility/messaging/type/MessageShowFile.h"
#include "utility/messaging/type/MessageShowScope.h"
#include "utility/messaging/type/MessageShowSnippets.h"
#include "utility/types.h"
#include "component/controller/helper/SnippetMerger.h"
@@ -29,6 +30,7 @@ class CodeController
, public MessageListener<MessageFocusOut>
, public MessageListener<MessageShowFile>
, public MessageListener<MessageShowScope>
, public MessageListener<MessageShowSnippets>
{
public:
CodeController(StorageAccess* storageAccess);
@@ -43,11 +45,14 @@ private:
virtual void handleMessage(MessageFocusOut* message);
virtual void handleMessage(MessageShowFile* message);
virtual void handleMessage(MessageShowScope* message);
virtual void handleMessage(MessageShowSnippets* message);
CodeView* getView();
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenLocations(
const TokenLocationCollection* collection, Id declarationId) const;
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenLocationsInFile(
std::shared_ptr<TokenLocationFile>) const;
std::vector<CodeView::CodeSnippetParams> getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const;
std::shared_ptr<SnippetMerger> buildMergerHierarchy(
TokenLocation* location, SnippetMerger& fileScopedMerger, std::map<int, std::shared_ptr<SnippetMerger>>& mergers) const;
+4 -2
View File
@@ -7,9 +7,11 @@ CodeView::CodeSnippetParams::CodeSnippetParams()
: startLineNumber(0)
, endLineNumber(0)
, titleId(0)
, locationFile(std::make_shared<TokenLocationFile>(""))
, locationFile()
, refCount(0)
, isActive(false)
, isDeclaration(false)
, isCollapsed(false)
{
}
@@ -59,7 +61,7 @@ bool CodeView::CodeSnippetParams::sort(const CodeSnippetParams& a, const CodeSni
// alphabetical filepath without extension
else
{
return aFilePath.withoutExtension() < bFilePath.withoutExtension();
return aFilePath.withoutExtension().fileName() < bFilePath.withoutExtension().fileName();
}
}
+5 -2
View File
@@ -29,8 +29,11 @@ public:
std::shared_ptr<TokenLocationFile> locationFile;
uint refCount;
bool isActive;
bool isDeclaration;
bool isCollapsed;
};
CodeView(ViewLayout* viewLayout);
@@ -42,10 +45,10 @@ public:
virtual void setErrorMessages(const std::vector<std::string>& errorMessages) = 0;
virtual void showCodeSnippets(const std::vector<CodeSnippetParams>& snippets) = 0;
virtual void addCodeSnippet(const CodeSnippetParams& snippet) = 0;
virtual void addCodeSnippets(const std::vector<CodeSnippetParams>& snippets) = 0;
virtual void showCodeFile(const CodeSnippetParams& params) = 0;
virtual void scrollToFirstActiveSnippet() = 0;
virtual void showFirstActiveSnippet() = 0;
virtual void focusToken(const Id tokenId) = 0;
virtual void defocusToken() = 0;
@@ -25,6 +25,24 @@ size_t TokenLocationFile::getTokenLocationLineCount() const
return m_lines.size();
}
size_t TokenLocationFile::getUnscopedStartTokenLocationCount() const
{
size_t count = 0;
for (const TokenLocationLinePairType& line : m_lines)
{
line.second->forEachStartTokenLocation(
[&count](TokenLocation* location)
{
if (!location->isScopeTokenLocation())
{
count++;
}
}
);
}
return count;
}
const FilePath& TokenLocationFile::getFilePath() const
{
return m_filePath;
@@ -24,6 +24,7 @@ public:
const TokenLocationLineMapType& getTokenLocationLines() const;
size_t getTokenLocationLineCount() const;
size_t getUnscopedStartTokenLocationCount() const;
const FilePath& getFilePath() const;
@@ -0,0 +1,26 @@
#ifndef MESSAGE_SHOW_SNIPPETS_H
#define MESSAGE_SHOW_SNIPPETS_H
#include "utility/messaging/Message.h"
#include "utility/types.h"
class TokenLocationFile;
class MessageShowSnippets
: public Message<MessageShowSnippets>
{
public:
MessageShowSnippets(std::shared_ptr<TokenLocationFile> locationFile)
: locationFile(locationFile)
{
}
static const std::string getStaticType()
{
return "MessageShowSnippets";
}
std::shared_ptr<TokenLocationFile> locationFile;
};
#endif // MESSAGE_SHOW_SNIPPETS_H