TextEditor: Show info when multiple highlight definitions are available

Show an editor info bar when multiple highlight definitions can be found
for a single file or mime type. Add a combo box to the info that allows
the user to choose between them.

Change-Id: I07278d065e19d4e04fba24a6d789c8b6c9f55d60
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2019-02-07 08:50:16 +01:00
parent 0a974cb59f
commit 82466375b9
4 changed files with 39 additions and 17 deletions

View File

@@ -121,6 +121,11 @@ Highlighter::Definition Highlighter::definitionForFileName(const QString &fileNa
return highlightRepository()->definitionForFileName(fileName); return highlightRepository()->definitionForFileName(fileName);
} }
Highlighter::Definition Highlighter::definitionForName(const QString &name)
{
return highlightRepository()->definitionForName(name);
}
Highlighter::Definitions Highlighter::definitionsForDocument(const TextDocument *document) Highlighter::Definitions Highlighter::definitionsForDocument(const TextDocument *document)
{ {
const Utils::MimeType mimeType = Utils::mimeTypeForName(document->mimeType()); const Utils::MimeType mimeType = Utils::mimeTypeForName(document->mimeType());

View File

@@ -46,6 +46,7 @@ public:
static Definition definitionForDocument(const TextDocument *document); static Definition definitionForDocument(const TextDocument *document);
static Definition definitionForMimeType(const QString &mimeType); static Definition definitionForMimeType(const QString &mimeType);
static Definition definitionForFileName(const QString &fileName); static Definition definitionForFileName(const QString &fileName);
static Definition definitionForName(const QString &name);
static Definitions definitionsForDocument(const TextDocument *document); static Definitions definitionsForDocument(const TextDocument *document);
static Definitions definitionsForMimeType(const QString &mimeType); static Definitions definitionsForMimeType(const QString &mimeType);

View File

@@ -611,7 +611,7 @@ public:
void updateCodeFoldingVisible(); void updateCodeFoldingVisible();
void reconfigure(); void reconfigure();
void updateSyntaxInfoBar(bool showInfo); void updateSyntaxInfoBar(const Highlighter::Definitions &definitions, const QString &fileName);
void configureGenericHighlighter(const KSyntaxHighlighting::Definition &definition); void configureGenericHighlighter(const KSyntaxHighlighting::Definition &definition);
public: public:
@@ -3274,27 +3274,43 @@ void TextEditorWidgetPrivate::reconfigure()
q->configureGenericHighlighter(); q->configureGenericHighlighter();
} }
void TextEditorWidgetPrivate::updateSyntaxInfoBar(bool showInfo) void TextEditorWidgetPrivate::updateSyntaxInfoBar(const Highlighter::Definitions &definitions,
const QString &fileName)
{ {
Id id(Constants::INFO_SYNTAX_DEFINITION); Id missing(Constants::INFO_MISSING_SYNTAX_DEFINITION);
Id multiple(Constants::INFO_MULTIPLE_SYNTAX_DEFINITIONS);
InfoBar *infoBar = m_document->infoBar(); InfoBar *infoBar = m_document->infoBar();
if (showInfo) { if (definitions.isEmpty() && infoBar->canInfoBeAdded(missing)
InfoBarEntry info(id, && !TextEditorSettings::highlighterSettings().isIgnoredFilePattern(fileName)) {
BaseTextEditor::tr( InfoBarEntry info(missing,
"A highlight definition was not found for this file. " BaseTextEditor::tr("A highlight definition was not found for this file. "
"Would you like to update highlight definition files?"), "Would you like to update highlight definition files?"),
InfoBarEntry::GlobalSuppressionEnabled); InfoBarEntry::GlobalSuppressionEnabled);
info.setCustomButtonInfo(BaseTextEditor::tr("Update Definitions"), [&]() { info.setCustomButtonInfo(BaseTextEditor::tr("Update Definitions"), [missing, this]() {
m_document->infoBar()->removeInfo(id); m_document->infoBar()->removeInfo(missing);
Highlighter::updateDefinitions([widget = QPointer<TextEditorWidget>(q)]() { Highlighter::updateDefinitions([widget = QPointer<TextEditorWidget>(q)]() {
if (widget) if (widget)
widget->configureGenericHighlighter(); widget->configureGenericHighlighter();
}); });
}); });
infoBar->removeInfo(multiple);
infoBar->addInfo(info);
} else if (definitions.size() > 1) {
InfoBarEntry info(multiple,
BaseTextEditor::tr("More than one highlight definition was found for this file. "
"Which one should be used to highlight this file?"));
info.setComboInfo(Utils::transform(definitions, &Highlighter::Definition::name),
[this](const QString &definition) {
this->configureGenericHighlighter(Highlighter::definitionForName(definition));
});
infoBar->removeInfo(missing);
infoBar->addInfo(info); infoBar->addInfo(info);
} else { } else {
infoBar->removeInfo(id); infoBar->removeInfo(multiple);
infoBar->removeInfo(missing);
} }
} }
@@ -8514,11 +8530,10 @@ QString TextEditorWidget::textAt(int from, int to) const
void TextEditorWidget::configureGenericHighlighter() void TextEditorWidget::configureGenericHighlighter()
{ {
const Highlighter::Definition definition = Highlighter::definitionForDocument(textDocument()); const Highlighter::Definitions definitions = Highlighter::definitionsForDocument(textDocument());
d->configureGenericHighlighter(definition); d->configureGenericHighlighter(definitions.isEmpty() ? Highlighter::Definition()
d->updateSyntaxInfoBar(!definition.isValid() : definitions.first());
&& !TextEditorSettings::highlighterSettings().isIgnoredFilePattern( d->updateSyntaxInfoBar(definitions, textDocument()->filePath().fileName());
textDocument()->filePath().fileName()));
} }
int TextEditorWidget::blockNumberForVisibleRow(int row) const int TextEditorWidget::blockNumberForVisibleRow(int row) const

View File

@@ -188,7 +188,8 @@ const char GOTO_NEXT_WORD_WITH_SELECTION[] = "TextEditor.GotoNextWordWithSelecti
const char GOTO_PREVIOUS_WORD_CAMEL_CASE_WITH_SELECTION[] = "TextEditor.GotoPreviousWordCamelCaseWithSelection"; const char GOTO_PREVIOUS_WORD_CAMEL_CASE_WITH_SELECTION[] = "TextEditor.GotoPreviousWordCamelCaseWithSelection";
const char GOTO_NEXT_WORD_CAMEL_CASE_WITH_SELECTION[] = "TextEditor.GotoNextWordCamelCaseWithSelection"; const char GOTO_NEXT_WORD_CAMEL_CASE_WITH_SELECTION[] = "TextEditor.GotoNextWordCamelCaseWithSelection";
const char C_TEXTEDITOR_MIMETYPE_TEXT[] = "text/plain"; const char C_TEXTEDITOR_MIMETYPE_TEXT[] = "text/plain";
const char INFO_SYNTAX_DEFINITION[] = "TextEditor.InfoSyntaxDefinition"; const char INFO_MISSING_SYNTAX_DEFINITION[] = "TextEditor.InfoSyntaxDefinition";
const char INFO_MULTIPLE_SYNTAX_DEFINITIONS[] = "TextEditor.InfoMultipleSyntaxDefinitions";
const char TASK_OPEN_FILE[] = "TextEditor.Task.OpenFile"; const char TASK_OPEN_FILE[] = "TextEditor.Task.OpenFile";
const char CIRCULAR_PASTE[] = "TextEditor.CircularPaste"; const char CIRCULAR_PASTE[] = "TextEditor.CircularPaste";
const char SWITCH_UTF8BOM[] = "TextEditor.SwitchUtf8bom"; const char SWITCH_UTF8BOM[] = "TextEditor.SwitchUtf8bom";