forked from qt-creator/qt-creator
Meson: Inline ArrayOptionLineEdit
Change-Id: I28da4e5edd6a74274c17ad6b5fe91d161c574388 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -3,8 +3,6 @@ add_qtc_plugin(MesonProjectManager
|
||||
DEPENDS QmlJS
|
||||
PLUGIN_DEPENDS Core ProjectExplorer TextEditor QtSupport
|
||||
SOURCES
|
||||
arrayoptionlineedit.cpp
|
||||
arrayoptionlineedit.h
|
||||
buildoptions.h
|
||||
buildoptionsmodel.cpp
|
||||
buildoptionsmodel.h
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
// Copyright (C) 2020 Alexis Jeandet.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include "arrayoptionlineedit.h"
|
||||
|
||||
namespace MesonProjectManager::Internal {
|
||||
|
||||
ArrayOptionLineEdit::ArrayOptionLineEdit(QWidget *parent)
|
||||
: QPlainTextEdit(parent)
|
||||
{
|
||||
m_highLighter = new RegexHighlighter(this);
|
||||
m_highLighter->setDocument(this->document());
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setLineWrapMode(QPlainTextEdit::NoWrap);
|
||||
QFontMetrics metrics(this->font());
|
||||
int lineHeight = metrics.lineSpacing();
|
||||
this->setFixedHeight(lineHeight * 1.5);
|
||||
}
|
||||
|
||||
QStringList ArrayOptionLineEdit::options()
|
||||
{
|
||||
return m_highLighter->options(this->toPlainText());
|
||||
}
|
||||
|
||||
void ArrayOptionLineEdit::keyPressEvent(QKeyEvent *e)
|
||||
{
|
||||
if (e->key() != Qt::Key_Return)
|
||||
return QPlainTextEdit::keyPressEvent(e);
|
||||
e->accept();
|
||||
}
|
||||
|
||||
RegexHighlighter::RegexHighlighter(QWidget *parent)
|
||||
: QSyntaxHighlighter(parent)
|
||||
{
|
||||
m_format.setUnderlineStyle(QTextCharFormat::SingleUnderline);
|
||||
m_format.setUnderlineColor(QColor(180, 180, 180));
|
||||
m_format.setBackground(QBrush(QColor(180, 180, 230, 80)));
|
||||
}
|
||||
|
||||
QStringList RegexHighlighter::options(const QString &text)
|
||||
{
|
||||
QRegularExpressionMatchIterator i = m_regex.globalMatch(text);
|
||||
QStringList op;
|
||||
while (i.hasNext()) {
|
||||
QRegularExpressionMatch match = i.next();
|
||||
for (int j = 1; j <= match.lastCapturedIndex(); j++) {
|
||||
auto str = match.captured(j);
|
||||
if (!str.isEmpty())
|
||||
op.push_back(str);
|
||||
}
|
||||
}
|
||||
return op;
|
||||
}
|
||||
|
||||
void RegexHighlighter::highlightBlock(const QString &text)
|
||||
{
|
||||
QRegularExpressionMatchIterator i = m_regex.globalMatch(text);
|
||||
while (i.hasNext()) {
|
||||
QRegularExpressionMatch match = i.next();
|
||||
for (int j = 1; j <= match.lastCapturedIndex(); j++) {
|
||||
setFormat(match.capturedStart(j), match.capturedLength(j), m_format);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace MesonProjectManager::Internal
|
||||
@@ -1,37 +0,0 @@
|
||||
// Copyright (C) 2020 Alexis Jeandet.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QColor>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QRegularExpression>
|
||||
#include <QSyntaxHighlighter>
|
||||
|
||||
namespace MesonProjectManager::Internal {
|
||||
|
||||
class RegexHighlighter : public QSyntaxHighlighter
|
||||
{
|
||||
const QRegularExpression m_regex{R"('([^']+)'+|([^', ]+)[, ]*)"};
|
||||
QTextCharFormat m_format;
|
||||
|
||||
public:
|
||||
RegexHighlighter(QWidget *parent);
|
||||
void highlightBlock(const QString &text) override;
|
||||
QStringList options(const QString &text);
|
||||
};
|
||||
|
||||
class ArrayOptionLineEdit : public QPlainTextEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
RegexHighlighter *m_highLighter;
|
||||
|
||||
public:
|
||||
ArrayOptionLineEdit(QWidget *parent = nullptr);
|
||||
QStringList options();
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *e) override;
|
||||
};
|
||||
|
||||
} // namespace MesonProjectManager::Internal
|
||||
@@ -3,18 +3,91 @@
|
||||
|
||||
#include "buildoptionsmodel.h"
|
||||
|
||||
#include "arrayoptionlineedit.h"
|
||||
#include "mesonprojectmanagertr.h"
|
||||
|
||||
#include <QColor>
|
||||
#include <QComboBox>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QMap>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTextEdit>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QRegularExpression>
|
||||
#include <QSyntaxHighlighter>
|
||||
|
||||
namespace MesonProjectManager::Internal {
|
||||
|
||||
static QRegularExpression ®Exp()
|
||||
{
|
||||
static QRegularExpression s_regexp{R"('([^']+)'+|([^', ]+)[, ]*)"};
|
||||
return s_regexp;
|
||||
}
|
||||
|
||||
class RegexHighlighter final : public QSyntaxHighlighter
|
||||
{
|
||||
public:
|
||||
RegexHighlighter(QWidget *parent) : QSyntaxHighlighter(parent)
|
||||
{
|
||||
m_format.setUnderlineStyle(QTextCharFormat::SingleUnderline);
|
||||
m_format.setUnderlineColor(QColor(180, 180, 180));
|
||||
m_format.setBackground(QBrush(QColor(180, 180, 230, 80)));
|
||||
}
|
||||
|
||||
void highlightBlock(const QString &text) final
|
||||
{
|
||||
QRegularExpressionMatchIterator i = regExp().globalMatch(text);
|
||||
while (i.hasNext()) {
|
||||
const QRegularExpressionMatch match = i.next();
|
||||
for (int j = 1; j <= match.lastCapturedIndex(); j++)
|
||||
setFormat(match.capturedStart(j), match.capturedLength(j), m_format);
|
||||
}
|
||||
}
|
||||
|
||||
QStringList options(const QString &text) const
|
||||
{
|
||||
QRegularExpressionMatchIterator i = regExp().globalMatch(text);
|
||||
QStringList op;
|
||||
while (i.hasNext()) {
|
||||
const QRegularExpressionMatch match = i.next();
|
||||
for (int j = 1; j <= match.lastCapturedIndex(); j++) {
|
||||
auto str = match.captured(j);
|
||||
if (!str.isEmpty())
|
||||
op.push_back(str);
|
||||
}
|
||||
}
|
||||
return op;
|
||||
}
|
||||
|
||||
private:
|
||||
QTextCharFormat m_format;
|
||||
};
|
||||
|
||||
class ArrayOptionLineEdit final : public QPlainTextEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ArrayOptionLineEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent)
|
||||
{
|
||||
m_highLighter = new RegexHighlighter(this);
|
||||
m_highLighter->setDocument(document());
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setLineWrapMode(QPlainTextEdit::NoWrap);
|
||||
setFixedHeight(QFontMetrics(font()).lineSpacing() * 1.5);
|
||||
}
|
||||
QStringList options() const { return m_highLighter->options(toPlainText()); }
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *e) final
|
||||
{
|
||||
if (e->key() != Qt::Key_Return)
|
||||
return QPlainTextEdit::keyPressEvent(e);
|
||||
e->accept();
|
||||
}
|
||||
|
||||
private:
|
||||
RegexHighlighter *m_highLighter = nullptr;
|
||||
};
|
||||
|
||||
// this could be relaxed once we have something able to link reliably meson build type
|
||||
// to QTC build type and update it, this must not break any features like tests/debug/profiling...
|
||||
static const QStringList lockedOptions = {"buildtype", "debug", "backend", "optimization"};
|
||||
@@ -192,3 +265,5 @@ void BuildOptionDelegate::setModelData(QWidget *editor,
|
||||
}
|
||||
|
||||
} // namespace MesonProjectManager::Internal
|
||||
|
||||
#include "buildoptionsmodel.moc"
|
||||
|
||||
@@ -30,8 +30,6 @@ Project {
|
||||
"target.h",
|
||||
"mesonpluginconstants.h",
|
||||
"mesonprojectplugin.cpp",
|
||||
"arrayoptionlineedit.cpp",
|
||||
"arrayoptionlineedit.h",
|
||||
"buildoptionsmodel.cpp",
|
||||
"buildoptionsmodel.h",
|
||||
"mesonbuildconfiguration.cpp",
|
||||
|
||||
Reference in New Issue
Block a user