ui: Display scope name at bottom of snippet if available

* Show scope name at bottom looking like top one
* Refactored CodeSnippetParams out of CodeView and use them everywhere
* Fixed border radius clipping problem at bottom of file by defining a small padding
* Scroll to line number when inserting a scope
This commit is contained in:
Eberhard Graether
2016-02-03 13:54:46 +01:00
parent e7224e0c46
commit b40e49b633
17 changed files with 296 additions and 294 deletions
+43 -22
View File
@@ -29,10 +29,10 @@ const uint CodeController::s_lineRadius = 2;
void CodeController::handleMessage(MessageActivateAll* message)
{
std::vector<std::string> errorMessages;
std::vector<CodeView::CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errorMessages);
std::vector<CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errorMessages);
StorageStats stats = m_storageAccess->getStorageStats();
CodeView::CodeSnippetParams statsSnippet;
CodeSnippetParams statsSnippet;
statsSnippet.startLineNumber = 1;
statsSnippet.endLineNumber = 1;
@@ -157,9 +157,9 @@ void CodeController::handleMessage(MessageChangeFileView* message)
case MessageChangeFileView::FILE_MAXIMIZED:
if (message->needsData)
{
CodeView::CodeSnippetParams params;
params.startLineNumber = 0;
params.endLineNumber = 0;
CodeSnippetParams params;
params.startLineNumber = 1;
params.refCount = -1;
std::shared_ptr<TextAccess> textAccess = m_storageAccess->getFileContent(message->filePath);
params.code = textAccess->getText();
@@ -213,7 +213,7 @@ void CodeController::handleMessage(MessageScrollCode* message)
void CodeController::handleMessage(MessageShowErrors* message)
{
std::vector<std::string> errorMessages;
std::vector<CodeView::CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errorMessages);
std::vector<CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errorMessages);
CodeView* view = getView();
view->setErrorMessages(errorMessages);
@@ -234,7 +234,7 @@ void CodeController::handleMessage(MessageShowScope* message)
return;
}
std::vector<CodeView::CodeSnippetParams> snippets = getSnippetsForActiveTokenLocations(collection.get(), 0);
std::vector<CodeSnippetParams> snippets = getSnippetsForActiveTokenLocations(collection.get(), 0);
if (snippets.size() != 1)
{
@@ -260,10 +260,10 @@ void CodeController::showContents(MessageBase* message)
}
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocations(
std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocations(
const TokenLocationCollection* collection, Id declarationId
) const {
std::vector<CodeView::CodeSnippetParams> snippets;
std::vector<CodeSnippetParams> snippets;
collection->forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
@@ -281,9 +281,9 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
if (isDeclarationFile || collection->getTokenLocationFileCount() < 5 || file->isWholeCopy)
{
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForActiveTokenLocationsInFile(file);
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForActiveTokenLocationsInFile(file);
for (CodeView::CodeSnippetParams& snippet : fileSnippets)
for (CodeSnippetParams& snippet : fileSnippets)
{
snippet.isDeclaration = isDeclarationFile;
}
@@ -292,7 +292,7 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
}
else
{
CodeView::CodeSnippetParams params;
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.modificationTime = m_storageAccess->getFileModificationTime(file->getFilePath());
@@ -303,19 +303,19 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
}
);
std::sort(snippets.begin(), snippets.end(), CodeView::CodeSnippetParams::sort);
std::sort(snippets.begin(), snippets.end(), CodeSnippetParams::sort);
return snippets;
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocationsInFile(
std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocationsInFile(
std::shared_ptr<TokenLocationFile> file
) const {
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
if (!file->isWholeCopy)
{
for (CodeView::CodeSnippetParams& params : fileSnippets)
for (CodeSnippetParams& params : fileSnippets)
{
params.locationFile = m_storageAccess->getTokenLocationsForLinesInFile(
file->getFilePath().str(), params.startLineNumber, params.endLineNumber);
@@ -325,7 +325,7 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
return fileSnippets;
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const
std::vector<CodeSnippetParams> CodeController::getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const
{
std::shared_ptr<TextAccess> textAccess = m_storageAccess->getFileContent(file->getFilePath());
@@ -365,10 +365,10 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForFile(std:
}
const int snippetExpandRange = ApplicationSettings::getInstance()->getCodeSnippetExpandRange();
std::vector<CodeView::CodeSnippetParams> snippets;
std::vector<CodeSnippetParams> snippets;
for (const SnippetMerger::Range& range: ranges)
{
CodeView::CodeSnippetParams params;
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.startLineNumber = std::max<int>(1, range.start.row - (range.start.strong ? 0 : snippetExpandRange));
@@ -402,6 +402,27 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForFile(std:
params.title = file->getFilePath().str();
}
TokenLocationLine* lastUsedLine = nullptr;
for (size_t i = params.endLineNumber; i >= params.startLineNumber && lastUsedLine == nullptr; i--)
{
lastUsedLine = tempFile->findTokenLocationLineByNumber(i);
}
params.footerId = 0;
if (lastUsedLine && lastUsedLine->getTokenLocations().size())
{
m_storageAccess->getTokenLocationOfParentScope(
lastUsedLine->getTokenLocations().begin()->second.get()
)->forEachStartTokenLocation( // this TokenLocationFile only contains a single StartTokenLocation.
[&](TokenLocation* location)
{
params.footer = m_storageAccess->getNameHierarchyForNodeWithId(location->getTokenId()).getFullName();
params.footerId = location->getId();
}
);
}
for (const std::string& line: textAccess->getLines(params.startLineNumber, params.endLineNumber))
{
params.code += line;
@@ -449,17 +470,17 @@ std::shared_ptr<SnippetMerger> CodeController::buildMergerHierarchy(
return currentMerger;
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForErrorLocations(
std::vector<CodeSnippetParams> CodeController::getSnippetsForErrorLocations(
std::vector<std::string>* errorMessages)
const {
TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(errorMessages);
std::vector<CodeView::CodeSnippetParams> snippets;
std::vector<CodeSnippetParams> snippets;
errorCollection.forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
{
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
}
);
@@ -56,15 +56,15 @@ private:
CodeView* getView();
void showContents(MessageBase* message);
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenLocations(
std::vector<CodeSnippetParams> getSnippetsForActiveTokenLocations(
const TokenLocationCollection* collection, Id declarationId) const;
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenLocationsInFile(
std::vector<CodeSnippetParams> getSnippetsForActiveTokenLocationsInFile(
std::shared_ptr<TokenLocationFile>) const;
std::vector<CodeView::CodeSnippetParams> getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const;
std::vector<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;
std::vector<CodeView::CodeSnippetParams> getSnippetsForErrorLocations(std::vector<std::string>* errorMessages) const;
std::vector<CodeSnippetParams> getSnippetsForErrorLocations(std::vector<std::string>* errorMessages) const;
std::vector<std::string> getProjectDescription(TokenLocationFile* locationFile) const;
-65
View File
@@ -3,71 +3,6 @@
#include "component/controller/CodeController.h"
#include "utility/file/FileSystem.h"
CodeView::CodeSnippetParams::CodeSnippetParams()
: startLineNumber(0)
, endLineNumber(0)
, titleId(0)
, locationFile()
, refCount(0)
, isActive(false)
, isDeclaration(false)
, isCollapsed(false)
{
}
bool CodeView::CodeSnippetParams::sort(const CodeSnippetParams& a, const CodeSnippetParams& b)
{
// sort active snippet first
if (a.isActive && !b.isActive)
{
return true;
}
else if (!a.isActive && b.isActive)
{
return false;
}
// sort declarations
if (a.isDeclaration && !b.isDeclaration)
{
return true;
}
else if (!a.isDeclaration && b.isDeclaration)
{
return false;
}
// sort whole files
if (a.locationFile->isWholeCopy && !b.locationFile->isWholeCopy)
{
return true;
}
else if (!a.locationFile->isWholeCopy && b.locationFile->isWholeCopy)
{
return false;
}
const FilePath& aFilePath = a.locationFile->getFilePath();
const FilePath& bFilePath = b.locationFile->getFilePath();
// different files
if (aFilePath != bFilePath)
{
// first header
if (aFilePath.withoutExtension() == bFilePath.withoutExtension())
{
return aFilePath.extension() > bFilePath.extension();
}
// alphabetical filepath without extension
else
{
return aFilePath.withoutExtension().fileName() < bFilePath.withoutExtension().fileName();
}
}
return a.startLineNumber < b.startLineNumber;
}
CodeView::CodeView(ViewLayout* viewLayout)
: View(viewLayout)
{
+5 -29
View File
@@ -3,14 +3,15 @@
#include <memory>
#include "utility/file/FilePath.h"
#include "component/view/helper/CodeSnippetParams.h"
#include "component/view/View.h"
#include "data/location/TokenLocationFile.h"
#include "utility/TimePoint.h"
#include "utility/types.h"
class CodeController;
class CodeView: public View
class CodeView
: public View
{
public:
enum FileState
@@ -20,31 +21,6 @@ public:
FILE_MAXIMIZED
};
struct CodeSnippetParams
{
CodeSnippetParams();
// comparefunction for snippetsorting
static bool sort(const CodeSnippetParams& a, const CodeSnippetParams& b);
uint startLineNumber;
uint endLineNumber;
std::string title;
std::string code;
Id titleId;
TimePoint modificationTime;
std::shared_ptr<TokenLocationFile> locationFile;
int refCount;
bool isActive;
bool isDeclaration;
bool isCollapsed;
};
CodeView(ViewLayout* viewLayout);
virtual ~CodeView();
@@ -0,0 +1,69 @@
#include "component/view/helper/CodeSnippetParams.h"
#include "data/location/TokenLocationFile.h"
CodeSnippetParams::CodeSnippetParams()
: startLineNumber(0)
, endLineNumber(0)
, titleId(0)
, footerId(0)
, locationFile()
, refCount(0)
, isActive(false)
, isDeclaration(false)
, isCollapsed(false)
{
}
bool CodeSnippetParams::sort(const CodeSnippetParams& a, const CodeSnippetParams& b)
{
// sort active snippet first
if (a.isActive && !b.isActive)
{
return true;
}
else if (!a.isActive && b.isActive)
{
return false;
}
// sort declarations
if (a.isDeclaration && !b.isDeclaration)
{
return true;
}
else if (!a.isDeclaration && b.isDeclaration)
{
return false;
}
// sort whole files
if (a.locationFile->isWholeCopy && !b.locationFile->isWholeCopy)
{
return true;
}
else if (!a.locationFile->isWholeCopy && b.locationFile->isWholeCopy)
{
return false;
}
const FilePath& aFilePath = a.locationFile->getFilePath();
const FilePath& bFilePath = b.locationFile->getFilePath();
// different files
if (aFilePath != bFilePath)
{
// first header
if (aFilePath.withoutExtension() == bFilePath.withoutExtension())
{
return aFilePath.extension() > bFilePath.extension();
}
// alphabetical filepath without extension
else
{
return aFilePath.withoutExtension().fileName() < bFilePath.withoutExtension().fileName();
}
}
return a.startLineNumber < b.startLineNumber;
}
@@ -0,0 +1,38 @@
#ifndef CODE_SNIPPET_PARAMS_H
#define CODE_SNIPPET_PARAMS_H
#include <memory>
#include "utility/TimePoint.h"
#include "utility/types.h"
class TokenLocationFile;
struct CodeSnippetParams
{
CodeSnippetParams();
// comparefunction for snippetsorting
static bool sort(const CodeSnippetParams& a, const CodeSnippetParams& b);
uint startLineNumber;
uint endLineNumber;
std::string title;
std::string footer;
std::string code;
Id titleId;
Id footerId;
TimePoint modificationTime;
std::shared_ptr<TokenLocationFile> locationFile;
int refCount;
bool isActive;
bool isDeclaration;
bool isCollapsed;
};
#endif // CODE_SNIPPET_PARAMS_H