EditorManager: Show file's relative path in window title

Task-number: QTCREATORBUG-17234
Change-Id: I35e04014f9ca5b72e1c5290977b477514872bc7f
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Hugo Holgersson
2016-11-05 10:30:30 +01:00
parent 680ad97b12
commit 2ab5561b9a
4 changed files with 66 additions and 22 deletions

View File

@@ -1748,30 +1748,41 @@ void EditorManagerPrivate::updateWindowTitleForDocument(IDocument *document, QWi
QString windowTitle;
const QString dashSep(" - ");
const QString documentName = document ? document->displayName() : QString();
if (!documentName.isEmpty())
windowTitle.append(documentName);
QString filePath = document ? document->filePath().toFileInfo().absoluteFilePath()
: QString();
const QString windowTitleAddition = d->m_titleAdditionHandler
? d->m_titleAdditionHandler(filePath)
: QString();
QString windowTitleVcsTopic;
if (d->m_titleVcsTopicHandler)
windowTitleVcsTopic = d->m_titleVcsTopicHandler(filePath);
if (!windowTitleVcsTopic.isEmpty())
windowTitleVcsTopic = QStringLiteral(" [") + windowTitleVcsTopic + QStringLiteral("]");
const QString documentName = document ? document->displayName() : QString();
if (!documentName.isEmpty())
windowTitle.append(documentName + windowTitleVcsTopic + dashSep);
if (!windowTitleAddition.isEmpty()) {
if (!windowTitle.isEmpty())
windowTitle.append(" ");
windowTitle.append(windowTitleAddition);
if (documentName.isEmpty()) // vcs topic not already added
windowTitle.append(windowTitleVcsTopic);
windowTitle.append(dashSep);
}
const QString windowTitleVcsTopic = d->m_titleVcsTopicHandler
? d->m_titleVcsTopicHandler(filePath)
: QString();
if (!windowTitleVcsTopic.isEmpty()) {
if (!windowTitle.isEmpty())
windowTitle.append(" ");
windowTitle.append(QStringLiteral("[") + windowTitleVcsTopic + QStringLiteral("]"));
}
const QString sessionTitle = d->m_sessionTitleHandler
? d->m_sessionTitleHandler(filePath)
: QString();
if (!sessionTitle.isEmpty()) {
if (!windowTitle.isEmpty())
windowTitle.append(dashSep);
windowTitle.append(sessionTitle);
}
if (!windowTitle.isEmpty())
windowTitle.append(dashSep);
windowTitle.append(tr("Qt Creator"));
window->window()->setWindowTitle(windowTitle);
window->window()->setWindowFilePath(filePath);
@@ -3064,6 +3075,11 @@ void EditorManager::setWindowTitleAdditionHandler(WindowTitleHandler handler)
d->m_titleAdditionHandler = handler;
}
void EditorManager::setSessionTitleHandler(WindowTitleHandler handler)
{
d->m_sessionTitleHandler = handler;
}
void EditorManager::updateWindowTitles()
{
foreach (EditorArea *area, d->m_editorAreas)

View File

@@ -167,6 +167,7 @@ public:
static qint64 maxTextFileSize();
static void setWindowTitleAdditionHandler(WindowTitleHandler handler);
static void setSessionTitleHandler(WindowTitleHandler handler);
static void setWindowTitleVcsTopicHandler(WindowTitleHandler handler);
static void addSaveAndCloseEditorActions(QMenu *contextMenu, DocumentModel::Entry *entry,

View File

@@ -256,6 +256,7 @@ private:
IDocument::ReloadSetting m_reloadSetting = IDocument::AlwaysAsk;
EditorManager::WindowTitleHandler m_titleAdditionHandler;
EditorManager::WindowTitleHandler m_sessionTitleHandler;
EditorManager::WindowTitleHandler m_titleVcsTopicHandler;
bool m_autoSaveEnabled = true;

View File

@@ -91,6 +91,7 @@ public:
public:
static QString windowTitleAddition(const QString &filePath);
static QString sessionTitle(const QString &filePath);
std::unique_ptr<SessionNode> m_sessionNode;
QString m_sessionName = QLatin1String("default");
@@ -110,6 +111,9 @@ public:
QMap<QString, QVariant> m_values;
QFutureInterface<void> m_future;
PersistentSettingsWriter *m_writer = nullptr;
private:
static QString locationInProject(const QString &filePath);
};
static SessionManager *m_instance = nullptr;
@@ -139,6 +143,7 @@ SessionManager::SessionManager(QObject *parent) : QObject(parent)
[this] { markSessionFileDirty(); });
EditorManager::setWindowTitleAdditionHandler(&SessionManagerPrivate::windowTitleAddition);
EditorManager::setSessionTitleHandler(&SessionManagerPrivate::sessionTitle);
}
SessionManager::~SessionManager()
@@ -517,7 +522,7 @@ void SessionManagerPrivate::dependencies(const QString &proName, QStringList &re
result.append(proName);
}
QString SessionManagerPrivate::windowTitleAddition(const QString &filePath)
QString SessionManagerPrivate::sessionTitle(const QString &filePath)
{
if (SessionManager::isDefaultSession(d->m_sessionName)) {
if (filePath.isEmpty()) {
@@ -525,12 +530,6 @@ QString SessionManagerPrivate::windowTitleAddition(const QString &filePath)
const QList<Project *> projects = SessionManager::projects();
if (projects.size() == 1)
return projects.first()->displayName();
return QString();
} else if (Project *project = SessionManager::projectForFile(
Utils::FileName::fromString(filePath))) {
return project->displayName();
} else {
return QString();
}
} else {
QString sessionName = d->m_sessionName;
@@ -538,6 +537,33 @@ QString SessionManagerPrivate::windowTitleAddition(const QString &filePath)
sessionName = SessionManager::tr("Untitled");
return sessionName;
}
return QString();
}
QString SessionManagerPrivate::locationInProject(const QString &filePath) {
Project *project = SessionManager::projectForFile(Utils::FileName::fromString(filePath));
if (!project)
return QString();
Utils::FileName file = Utils::FileName::fromString(filePath);
Utils::FileName parentDir = file.parentDir();
if (parentDir == project->projectDirectory())
return "@ " + project->displayName();
if (file.isChildOf(project->projectDirectory())) {
Utils::FileName dirInProject = parentDir.relativeChildPath(project->projectDirectory());
return "(" + dirInProject.toUserOutput() + " @ " + project->displayName() + ")";
}
// For a file that is "outside" the project it belongs to, we display its
// dir's full path because it is easier to read than a series of "../../.".
// Example: /home/hugo/GenericProject/App.files lists /home/hugo/lib/Bar.cpp
return "(" + parentDir.toUserOutput() + " @ " + project->displayName() + ")";
}
QString SessionManagerPrivate::windowTitleAddition(const QString &filePath)
{
return locationInProject(filePath);
}
QStringList SessionManagerPrivate::dependenciesOrder() const