diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 4925a692bec3cd92c46437cbcee17c7f97e51bef..8c5e79426dacc66dd823936437339c47b9cc30bf 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1992,6 +1992,19 @@ void EditorManager::addNativeDirAndOpenWithActions(QMenu *contextMenu, DocumentM DocumentManager::populateOpenWithMenu(openWith, entry->fileName()); } +void EditorManager::setPlaceholderText(const QString &text) +{ + if (d->m_placeholderText == text) + return; + d->m_placeholderText = text; + emit m_instance->placeholderTextChanged(d->m_placeholderText); +} + +QString EditorManager::placeholderText() +{ + return d->m_placeholderText; +} + void EditorManager::saveDocument() { EditorManagerPrivate::saveDocument(currentDocument()); diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 62181052e88d5b0cdd5e99672a998e6e333e726e..f5f8d115475f4bc6e2d12bda74f2d7c5a39754a7 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -173,6 +173,9 @@ public: IEditor *editor = 0); static void addNativeDirAndOpenWithActions(QMenu *contextMenu, DocumentModel::Entry *entry); + static void setPlaceholderText(const QString &text); + static QString placeholderText(); + signals: void currentEditorChanged(Core::IEditor *editor); void currentDocumentStateChanged(); @@ -181,6 +184,7 @@ signals: void editorAboutToClose(Core::IEditor *editor); void editorsClosed(QList<Core::IEditor *> editors); void findOnFileSystemRequest(const QString &path); + void placeholderTextChanged(const QString &text); public slots: static void saveDocument(); diff --git a/src/plugins/coreplugin/editormanager/editormanager_p.h b/src/plugins/coreplugin/editormanager/editormanager_p.h index 2d0da3e6cf2a8f500b495b0518b28d0ea35b7463..7af674c1d082f388bfe93efd2cd0c356b9e417bc 100644 --- a/src/plugins/coreplugin/editormanager/editormanager_p.h +++ b/src/plugins/coreplugin/editormanager/editormanager_p.h @@ -242,6 +242,8 @@ private: bool m_autoSaveEnabled; int m_autoSaveInterval; + + QString m_placeholderText; }; } // Internal diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index fc0a312460a1544538dfe384bd9eca3ebaa2776f..e7f59ecbae6a90364a1fef278367e6f4d96ef351 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -34,10 +34,12 @@ #include "editormanager_p.h" #include "documentmodel.h" +#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/editortoolbar.h> #include <coreplugin/coreconstants.h> #include <coreplugin/icore.h> #include <coreplugin/infobar.h> +#include <coreplugin/locator/locatorconstants.h> #include <coreplugin/minisplitter.h> #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/findplaceholder.h> @@ -119,7 +121,15 @@ EditorView::EditorView(SplitterOrView *parentSplitterOrView, QWidget *parent) : } // for the case of no document selected - QWidget *empty = new QWidget; + auto empty = new QWidget; + empty->hide(); + auto emptyLayout = new QGridLayout(empty); + empty->setLayout(emptyLayout); + m_emptyViewLabel = new QLabel; + connect(EditorManager::instance(), &EditorManager::placeholderTextChanged, + m_emptyViewLabel, &QLabel::setText); + m_emptyViewLabel->setText(EditorManager::placeholderText()); + emptyLayout->addWidget(m_emptyViewLabel); m_container->addWidget(empty); m_widgetEditorMap.insert(empty, 0); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 541ceff9557ff6592af3d7b712a62ddf4b4729bb..e90bbb04615554c60f31d51e7cdfbe0ef6390f95 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -145,6 +145,7 @@ private: QToolButton *m_statusWidgetButton; QList<IEditor *> m_editors; QMap<QWidget *, IEditor *> m_widgetEditorMap; + QLabel *m_emptyViewLabel; QList<EditLocation> m_navigationHistory; QList<EditLocation> m_editorHistory; diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 54e75abca7218ce9f4e317d41385c5dbf4073487..3baa60b7c93fef81e9f50dde0744a84920012a6e 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -44,6 +44,7 @@ #include <coreplugin/icore.h> #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actioncontainer.h> +#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/progressmanager/futureprogress.h> #include <extensionsystem/pluginmanager.h> @@ -96,7 +97,7 @@ void Locator::initialize(CorePlugin *corePlugin, const QStringList &, QString *) m_corePlugin->addAutoReleasedObject(view); QAction *action = new QAction(m_locatorWidget->windowIcon(), m_locatorWidget->windowTitle(), this); - Command *cmd = ActionManager::registerAction(action, "QtCreator.Locate", + Command *cmd = ActionManager::registerAction(action, Constants::LOCATE, Context(Constants::C_GLOBAL)); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+K"))); connect(action, SIGNAL(triggered()), this, SLOT(openLocator())); @@ -148,6 +149,14 @@ void Locator::extensionsInitialized() return first->id().alphabeticallyBefore(second->id()); }); setFilters(m_filters); + + Command *openCommand = ActionManager::command(Constants::OPEN); + Command *locateCommand = ActionManager::command(Constants::LOCATE); + connect(openCommand, &Command::keySequenceChanged, + this, &Locator::updateEditorManagerPlaceholderText); + connect(locateCommand, &Command::keySequenceChanged, + this, &Locator::updateEditorManagerPlaceholderText); + updateEditorManagerPlaceholderText(); } bool Locator::delayedInitialize() @@ -177,6 +186,50 @@ void Locator::loadSettings() m_settingsInitialized = true; } +void Locator::updateEditorManagerPlaceholderText() +{ + Command *openCommand = ActionManager::command(Constants::OPEN); + Command *locateCommand = ActionManager::command(Constants::LOCATE); + const QString placeholderText = tr("<html><body style=\"color:#909090; font-size:14pt\">" + "<div align='center'>" + "<div style=\"font-size:20pt\">Open a document</div>" + "<table><tr><td>" + "<hr/>" + "<div style=\"margin-top: 5px\">• File > Open File or Project (%1)</div>" + "<div style=\"margin-top: 5px\">• File > Recent Files</div>" + "<div style=\"margin-top: 5px\">• Tools > Locator (%2) and</div>" + "<div style=\"margin-left: 1em\">- type to open file from any open project</div>" + "%4" + "%5" + "<div style=\"margin-left: 1em\">- type <code>%3<space><filename></code> to open file from file system</div>" + "<div style=\"margin-left: 1em\">- select one of the other filters for jumping to a location</div>" + "<div style=\"margin-top: 5px\">• Drag and drop files here</div>" + "</td></tr></table>" + "</div>" + "</body></html>") + .arg(openCommand->keySequence().toString(QKeySequence::NativeText)) + .arg(locateCommand->keySequence().toString(QKeySequence::NativeText)) + .arg(m_fileSystemFilter->shortcutString()); + + QString classes; + ILocatorFilter *classesFilter = Utils::findOrDefault(m_filters, [](const ILocatorFilter *filter) { + return filter->id() == Id("Classes"); // not nice, but anyhow + }); + if (classesFilter) + classes = tr("<div style=\"margin-left: 1em\">- type <code>%1<space><pattern></code>" + " to jump to a class definition</div>").arg(classesFilter->shortcutString()); + + QString methods; + ILocatorFilter *methodsFilter = Utils::findOrDefault(m_filters, [](const ILocatorFilter *filter) { + return filter->id() == Id("Methods"); // not nice, but anyhow + }); + if (methodsFilter) + methods = tr("<div style=\"margin-left: 1em\">- type <code>%1<space><pattern></code>" + " to jump to a function definition</div>").arg(methodsFilter->shortcutString()); + + EditorManager::setPlaceholderText(placeholderText.arg(classes, methods)); +} + void Locator::saveSettings() { if (m_settingsInitialized) { @@ -222,6 +275,7 @@ QList<ILocatorFilter *> Locator::customFilters() void Locator::setFilters(QList<ILocatorFilter *> f) { m_filters = f; + updateEditorManagerPlaceholderText(); // possibly some shortcut changed m_locatorWidget->updateFilterList(); } diff --git a/src/plugins/coreplugin/locator/locator.h b/src/plugins/coreplugin/locator/locator.h index a720316a89e0a3dcabc2bc711c54b521221247f7..901d72e9b7c600ebcb30e3de37ef327d0e4122f4 100644 --- a/src/plugins/coreplugin/locator/locator.h +++ b/src/plugins/coreplugin/locator/locator.h @@ -80,6 +80,7 @@ private slots: private: void loadSettings(); + void updateEditorManagerPlaceholderText(); template <typename S> void loadSettingsHelper(S *settings); diff --git a/src/plugins/coreplugin/locator/locatorconstants.h b/src/plugins/coreplugin/locator/locatorconstants.h index aeb9e1379ff77554738b13bcd6617f42a1dbfa59..66f2f87fd364ad1277e2231f76a59948659437f8 100644 --- a/src/plugins/coreplugin/locator/locatorconstants.h +++ b/src/plugins/coreplugin/locator/locatorconstants.h @@ -36,6 +36,7 @@ namespace Core { namespace Constants { +const char LOCATE[] = "QtCreator.Locate"; const char FILTER_OPTIONS_PAGE[] = QT_TRANSLATE_NOOP("Locator", "Locator"); const char CUSTOM_FILTER_BASEID[] = "Locator.CustomFilter"; const char TASK_INDEX[] = "Locator.Task.Index";