forked from qt-creator/qt-creator
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:
@@ -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());
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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";
|
||||||
|
Reference in New Issue
Block a user