Texteditor: Add ability to get margin from indenter

And implement it in the clang-format plugin to use the ColumnLimit from
the style. This would be quite useful if you're working on different
projects with a different ColumnLimit. This way you get an visual
representation and do not only have to rely on clang-format.

Change-Id: Ib0258e3fba6f45f0f46ce612f806527a47868ad9
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Björn Schäpers
2021-01-24 17:11:02 +01:00
committed by Björn Schäpers
parent 069efa9483
commit d9cd74f06d
13 changed files with 73 additions and 1 deletions

View File

@@ -679,6 +679,11 @@ bool ClangFormatBaseIndenter::isElectricCharacter(const QChar &ch) const
return false;
}
std::optional<int> ClangFormat::ClangFormatBaseIndenter::margin() const
{
return styleForFile().ColumnLimit;
}
void ClangFormatBaseIndenter::autoIndent(const QTextCursor &cursor,
const TextEditor::TabSettings & /*tabSettings*/,
int cursorPositionInEditor)

View File

@@ -66,6 +66,8 @@ public:
bool isElectricCharacter(const QChar &ch) const override;
std::optional<int> margin() const override;
protected:
virtual clang::format::FormatStyle styleForFile() const;
virtual bool formatCodeInsteadOfIndent() const { return false; }

View File

@@ -372,6 +372,14 @@ void EditorConfiguration::setShowWrapColumn(bool onoff)
}
}
void EditorConfiguration::setUseIndenter(bool onoff)
{
if (d->m_marginSettings.m_useIndenter != onoff) {
d->m_marginSettings.m_useIndenter = onoff;
emit marginSettingsChanged(d->m_marginSettings);
}
}
void EditorConfiguration::setWrapColumn(int column)
{
if (d->m_marginSettings.m_marginColumn != column) {

View File

@@ -94,6 +94,7 @@ public:
void setMarginSettings(const TextEditor::MarginSettings &settings);
void setShowWrapColumn(bool onoff);
void setUseIndenter(bool onoff);
void setWrapColumn(int column);
void setTextCodec(QTextCodec *textCodec);

View File

@@ -55,6 +55,8 @@ EditorSettingsWidget::EditorSettingsWidget(Project *project) : QWidget(), m_proj
connect(m_ui.showWrapColumn, &QAbstractButton::toggled,
config, &EditorConfiguration::setShowWrapColumn);
connect(m_ui.useIndenter, &QAbstractButton::toggled,
config, &EditorConfiguration::setUseIndenter);
connect(m_ui.wrapColumn, QOverload<int>::of(&QSpinBox::valueChanged),
config, &EditorConfiguration::setWrapColumn);
@@ -73,6 +75,7 @@ EditorSettingsWidget::EditorSettingsWidget(Project *project) : QWidget(), m_proj
void EditorSettingsWidget::settingsToUi(const EditorConfiguration *config)
{
m_ui.showWrapColumn->setChecked(config->marginSettings().m_showMargin);
m_ui.useIndenter->setChecked(config->marginSettings().m_useIndenter);
m_ui.wrapColumn->setValue(config->marginSettings().m_marginColumn);
m_ui.behaviorSettingsWidget->setCodeStyle(config->codeStyle());
m_ui.globalSelector->setCurrentIndex(config->useGlobalSettings() ? 0 : 1);

View File

@@ -81,6 +81,16 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="useIndenter">
<property name="toolTip">
<string>If available, use a different margin. For example, the ColumnLimit from the clang-format plugin.</string>
</property>
<property name="text">
<string>Use context specific margin</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">

View File

@@ -89,6 +89,7 @@ void DisplaySettingsWidget::settingsFromUI(DisplaySettings &displaySettings,
displaySettings.m_displayLineNumbers = m_ui.displayLineNumbers->isChecked();
displaySettings.m_textWrapping = m_ui.enableTextWrapping->isChecked();
marginSettings.m_showMargin = m_ui.showWrapColumn->isChecked();
marginSettings.m_useIndenter = m_ui.useIndenter->isChecked();
marginSettings.m_marginColumn = m_ui.wrapColumn->value();
displaySettings.m_visualizeWhitespace = m_ui.visualizeWhitespace->isChecked();
displaySettings.m_displayFoldingMarkers = m_ui.displayFoldingMarkers->isChecked();
@@ -121,6 +122,7 @@ void DisplaySettingsWidget::settingsToUI()
m_ui.displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers);
m_ui.enableTextWrapping->setChecked(displaySettings.m_textWrapping);
m_ui.showWrapColumn->setChecked(marginSettings.m_showMargin);
m_ui.useIndenter->setChecked(marginSettings.m_useIndenter);
m_ui.wrapColumn->setValue(marginSettings.m_marginColumn);
m_ui.visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace);
m_ui.displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers);

View File

@@ -56,6 +56,16 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="useIndenter">
<property name="toolTip">
<string>If available, use a different margin. For example, the ColumnLimit from the clang-format plugin.</string>
</property>
<property name="text">
<string>Use context specific margin</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

View File

@@ -120,6 +120,8 @@ public:
int cursorPositionInEditor = -1)
= 0;
virtual std::optional<int> margin() const { return std::nullopt; }
protected:
QTextDocument *m_doc;
Utils::FilePath m_fileName;

View File

@@ -32,11 +32,13 @@
static const char showWrapColumnKey[] = "ShowMargin";
static const char wrapColumnKey[] = "MarginColumn";
static const char groupPostfix[] = "MarginSettings";
static const char useIndenterColumnKey[] = "UseIndenter";
using namespace TextEditor;
MarginSettings::MarginSettings()
: m_showMargin(false)
, m_useIndenter(false)
, m_marginColumn(80)
{
}
@@ -48,6 +50,7 @@ void MarginSettings::toSettings(const QString &category, QSettings *s) const
group.insert(0, category);
s->beginGroup(group);
s->setValue(QLatin1String(showWrapColumnKey), m_showMargin);
s->setValue(QLatin1String(useIndenterColumnKey), m_useIndenter);
s->setValue(QLatin1String(wrapColumnKey), m_marginColumn);
s->endGroup();
}
@@ -62,24 +65,28 @@ void MarginSettings::fromSettings(const QString &category, const QSettings *s)
*this = MarginSettings(); // Assign defaults
m_showMargin = s->value(group + QLatin1String(showWrapColumnKey), m_showMargin).toBool();
m_useIndenter = s->value(group + QLatin1String(useIndenterColumnKey), m_useIndenter).toBool();
m_marginColumn = s->value(group + QLatin1String(wrapColumnKey), m_marginColumn).toInt();
}
void MarginSettings::toMap(const QString &prefix, QVariantMap *map) const
{
map->insert(prefix + QLatin1String(showWrapColumnKey), m_showMargin);
map->insert(prefix + QLatin1String(useIndenterColumnKey), m_useIndenter);
map->insert(prefix + QLatin1String(wrapColumnKey), m_marginColumn);
}
void MarginSettings::fromMap(const QString &prefix, const QVariantMap &map)
{
m_showMargin = map.value(prefix + QLatin1String(showWrapColumnKey), m_showMargin).toBool();
m_useIndenter = map.value(prefix + QLatin1String(useIndenterColumnKey), m_useIndenter).toBool();
m_marginColumn = map.value(prefix + QLatin1String(wrapColumnKey), m_marginColumn).toInt();
}
bool MarginSettings::equals(const MarginSettings &other) const
{
return m_showMargin == other.m_showMargin
&& m_useIndenter == other.m_useIndenter
&& m_marginColumn == other.m_marginColumn
;
}

View File

@@ -49,6 +49,7 @@ public:
bool equals(const MarginSettings &other) const;
bool m_showMargin;
bool m_useIndenter;
int m_marginColumn;
};

View File

@@ -1478,6 +1478,7 @@ void TextEditorWidget::openFinishedSuccessfully()
moveCursor(QTextCursor::Start);
d->updateCannotDecodeInfo();
updateTextCodecLabel();
updateVisualWrapColumn();
}
TextDocumentPtr TextEditorWidget::textDocumentPtr() const
@@ -7438,8 +7439,8 @@ void TextEditorWidget::setDisplaySettings(const DisplaySettings &ds)
void TextEditorWidget::setMarginSettings(const MarginSettings &ms)
{
setVisibleWrapColumn(ms.m_showMargin ? ms.m_marginColumn : 0);
d->m_marginSettings = ms;
updateVisualWrapColumn();
viewport()->update();
extraArea()->update();
@@ -8261,6 +8262,24 @@ bool TextEditorWidget::inFindScope(int selectionStart, int selectionEnd)
return true;
}
void TextEditorWidget::updateVisualWrapColumn()
{
auto calcMargin = [this]() {
const auto &ms = d->m_marginSettings;
if (!ms.m_showMargin) {
return 0;
}
if (ms.m_useIndenter) {
if (auto margin = d->m_document->indenter()->margin()) {
return *margin;
}
}
return ms.m_marginColumn;
};
setVisibleWrapColumn(calcMargin());
}
void TextEditorWidget::setBlockSelection(bool on)
{
if (d->m_inBlockSelectionMode == on)

View File

@@ -621,6 +621,8 @@ private:
friend class Internal::TextEditorWidgetPrivate;
friend class Internal::TextEditorOverlay;
friend class RefactorOverlay;
void updateVisualWrapColumn();
};
class TEXTEDITOR_EXPORT TextEditorLinkLabel : public Utils::ElidingLabel