mirror of
https://github.com/lubosz/overte.git
synced 2025-04-28 02:35:24 +02:00
- Highlighting Fixes ( Single line comments in quoted text don't occur anymore. / Better number recognition)
- Line numbers in ScriptEditor
This commit is contained in:
parent
7125b6ab8e
commit
cf1baaf6ea
8 changed files with 240 additions and 8 deletions
|
@ -22,6 +22,7 @@ ScriptHighlighting::ScriptHighlighting(QTextDocument* parent) :
|
||||||
_numberRegex = QRegExp("[0-9]+(\\.[0-9]+){0,1}");
|
_numberRegex = QRegExp("[0-9]+(\\.[0-9]+){0,1}");
|
||||||
_singleLineComment = QRegExp("//[^\n]*");
|
_singleLineComment = QRegExp("//[^\n]*");
|
||||||
_truefalseRegex = QRegExp("\\b(true|false)\\b");
|
_truefalseRegex = QRegExp("\\b(true|false)\\b");
|
||||||
|
_alphacharRegex = QRegExp("[A-Za-z]");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptHighlighting::highlightBlock(const QString& text) {
|
void ScriptHighlighting::highlightBlock(const QString& text) {
|
||||||
|
@ -60,7 +61,19 @@ void ScriptHighlighting::formatComments(const QString& text) {
|
||||||
int index = _singleLineComment.indexIn(text);
|
int index = _singleLineComment.indexIn(text);
|
||||||
while (index >= 0) {
|
while (index >= 0) {
|
||||||
int length = _singleLineComment.matchedLength();
|
int length = _singleLineComment.matchedLength();
|
||||||
setFormat(index, length, Qt::lightGray);
|
int quoted_index = _qoutedTextRegex.indexIn(text);
|
||||||
|
bool valid = true;
|
||||||
|
while (quoted_index >= 0 && valid) {
|
||||||
|
int quoted_length = _qoutedTextRegex.matchedLength();
|
||||||
|
if (quoted_index <= index && index <= (quoted_index + quoted_length)) {
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
quoted_index = _qoutedTextRegex.indexIn(text, quoted_index + quoted_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valid) {
|
||||||
|
setFormat(index, length, Qt::lightGray);
|
||||||
|
}
|
||||||
index = _singleLineComment.indexIn(text, index + length);
|
index = _singleLineComment.indexIn(text, index + length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,7 +91,9 @@ void ScriptHighlighting::formatNumbers(const QString& text){
|
||||||
int index = _numberRegex.indexIn(text);
|
int index = _numberRegex.indexIn(text);
|
||||||
while (index >= 0) {
|
while (index >= 0) {
|
||||||
int length = _numberRegex.matchedLength();
|
int length = _numberRegex.matchedLength();
|
||||||
setFormat(index, length, Qt::green);
|
if (index == 0 || _alphacharRegex.indexIn(text, index - 1) != (index - 1)) {
|
||||||
|
setFormat(index, length, Qt::green);
|
||||||
|
}
|
||||||
index = _numberRegex.indexIn(text, index + length);
|
index = _numberRegex.indexIn(text, index + length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ protected:
|
||||||
void formatTrueFalse(const QString& text);
|
void formatTrueFalse(const QString& text);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QRegExp _alphacharRegex;
|
||||||
QRegExp _keywordRegex;
|
QRegExp _keywordRegex;
|
||||||
QRegExp _qoutedTextRegex;
|
QRegExp _qoutedTextRegex;
|
||||||
QRegExp _multiLineCommentBegin;
|
QRegExp _multiLineCommentBegin;
|
||||||
|
|
107
interface/src/ui/ScriptEditBox.cpp
Normal file
107
interface/src/ui/ScriptEditBox.cpp
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
//
|
||||||
|
// ScriptEditBox.cpp
|
||||||
|
// interface/src/ui
|
||||||
|
//
|
||||||
|
// Created by Thijs Wenker on 4/30/14.
|
||||||
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "ScriptEditBox.h"
|
||||||
|
#include "ScriptLineNumberArea.h"
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
ScriptEditBox::ScriptEditBox(QWidget* parent) :
|
||||||
|
QPlainTextEdit(parent)
|
||||||
|
{
|
||||||
|
_scriptLineNumberArea = new ScriptLineNumberArea(this);
|
||||||
|
|
||||||
|
connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
|
||||||
|
connect(this, SIGNAL(updateRequest(QRect, int)), this, SLOT(updateLineNumberArea(QRect, int)));
|
||||||
|
connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine()));
|
||||||
|
|
||||||
|
updateLineNumberAreaWidth(0);
|
||||||
|
highlightCurrentLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ScriptEditBox::lineNumberAreaWidth() {
|
||||||
|
int digits = 1;
|
||||||
|
const int SPACER_PIXELS = 3;
|
||||||
|
const int BASE_TEN = 10;
|
||||||
|
int max = qMax(1, blockCount());
|
||||||
|
while (max >= BASE_TEN) {
|
||||||
|
max /= BASE_TEN;
|
||||||
|
++digits;
|
||||||
|
}
|
||||||
|
return SPACER_PIXELS + fontMetrics().width(QLatin1Char('H')) * digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEditBox::updateLineNumberAreaWidth(int) {
|
||||||
|
setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEditBox::updateLineNumberArea(const QRect& rect, int dy) {
|
||||||
|
if (dy) {
|
||||||
|
_scriptLineNumberArea->scroll(0, dy);
|
||||||
|
} else {
|
||||||
|
_scriptLineNumberArea->update(0, rect.y(), _scriptLineNumberArea->width(), rect.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rect.contains(viewport()->rect())) {
|
||||||
|
updateLineNumberAreaWidth(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEditBox::resizeEvent(QResizeEvent* e) {
|
||||||
|
QPlainTextEdit::resizeEvent(e);
|
||||||
|
|
||||||
|
QRect cr = contentsRect();
|
||||||
|
_scriptLineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEditBox::highlightCurrentLine() {
|
||||||
|
QList<QTextEdit::ExtraSelection> extraSelections;
|
||||||
|
|
||||||
|
if (!isReadOnly()) {
|
||||||
|
QTextEdit::ExtraSelection selection;
|
||||||
|
|
||||||
|
QColor lineColor = QColor(Qt::gray).lighter();
|
||||||
|
|
||||||
|
selection.format.setBackground(lineColor);
|
||||||
|
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
|
||||||
|
selection.cursor = textCursor();
|
||||||
|
selection.cursor.clearSelection();
|
||||||
|
extraSelections.append(selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
setExtraSelections(extraSelections);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptEditBox::lineNumberAreaPaintEvent(QPaintEvent* event)
|
||||||
|
{
|
||||||
|
QPainter painter(_scriptLineNumberArea);
|
||||||
|
painter.fillRect(event->rect(), Qt::lightGray);
|
||||||
|
QTextBlock block = firstVisibleBlock();
|
||||||
|
int blockNumber = block.blockNumber();
|
||||||
|
int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
|
||||||
|
int bottom = top + (int) blockBoundingRect(block).height();
|
||||||
|
|
||||||
|
while (block.isValid() && top <= event->rect().bottom()) {
|
||||||
|
if (block.isVisible() && bottom >= event->rect().top()) {
|
||||||
|
QFont font = painter.font();
|
||||||
|
font.setBold(this->textCursor().blockNumber() == block.blockNumber());
|
||||||
|
painter.setFont(font);
|
||||||
|
QString number = QString::number(blockNumber + 1);
|
||||||
|
painter.setPen(Qt::black);
|
||||||
|
painter.drawText(0, top, _scriptLineNumberArea->width(), fontMetrics().height(),
|
||||||
|
Qt::AlignRight, number);
|
||||||
|
}
|
||||||
|
|
||||||
|
block = block.next();
|
||||||
|
top = bottom;
|
||||||
|
bottom = top + (int) blockBoundingRect(block).height();
|
||||||
|
++blockNumber;
|
||||||
|
}
|
||||||
|
}
|
38
interface/src/ui/ScriptEditBox.h
Normal file
38
interface/src/ui/ScriptEditBox.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
//
|
||||||
|
// ScriptEditBox.h
|
||||||
|
// interface/src/ui
|
||||||
|
//
|
||||||
|
// Created by Thijs Wenker on 4/30/14.
|
||||||
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef hifi_ScriptEditBox_h
|
||||||
|
#define hifi_ScriptEditBox_h
|
||||||
|
|
||||||
|
#include <QPlainTextEdit>
|
||||||
|
|
||||||
|
class ScriptEditBox : public QPlainTextEdit {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScriptEditBox(QWidget* parent = NULL);
|
||||||
|
|
||||||
|
void lineNumberAreaPaintEvent(QPaintEvent* event);
|
||||||
|
int lineNumberAreaWidth();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void resizeEvent(QResizeEvent* event);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void updateLineNumberAreaWidth(int);
|
||||||
|
void highlightCurrentLine();
|
||||||
|
void updateLineNumberArea(const QRect&, int);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QWidget* _scriptLineNumberArea;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_ScriptEditBox_h
|
|
@ -13,7 +13,6 @@
|
||||||
#define hifi_ScriptEditorWidget_h
|
#define hifi_ScriptEditorWidget_h
|
||||||
|
|
||||||
#include <QDockWidget>
|
#include <QDockWidget>
|
||||||
#include "ScriptEditorWidget.h"
|
|
||||||
#include "ScriptEngine.h"
|
#include "ScriptEngine.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
|
|
28
interface/src/ui/ScriptLineNumberArea.cpp
Normal file
28
interface/src/ui/ScriptLineNumberArea.cpp
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
//
|
||||||
|
// ScriptLineNumberArea.cpp
|
||||||
|
// interface/src/ui
|
||||||
|
//
|
||||||
|
// Created by Thijs Wenker on 4/30/14.
|
||||||
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "ScriptLineNumberArea.h"
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
ScriptLineNumberArea::ScriptLineNumberArea(ScriptEditBox* scriptEditBox) :
|
||||||
|
QWidget(scriptEditBox)
|
||||||
|
{
|
||||||
|
_scriptEditBox = scriptEditBox;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize ScriptLineNumberArea::sizeHint() {
|
||||||
|
return QSize(_scriptEditBox->lineNumberAreaWidth(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptLineNumberArea::paintEvent(QPaintEvent* event) {
|
||||||
|
_scriptEditBox->lineNumberAreaPaintEvent(event);
|
||||||
|
}
|
31
interface/src/ui/ScriptLineNumberArea.h
Normal file
31
interface/src/ui/ScriptLineNumberArea.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//
|
||||||
|
// ScriptLineNumberArea.h
|
||||||
|
// interface/src/ui
|
||||||
|
//
|
||||||
|
// Created by Thijs Wenker on 4/30/14.
|
||||||
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef hifi_ScriptLineNumberArea_h
|
||||||
|
#define hifi_ScriptLineNumberArea_h
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include "ScriptEditBox.h"
|
||||||
|
|
||||||
|
class ScriptLineNumberArea : public QWidget {
|
||||||
|
|
||||||
|
public:
|
||||||
|
ScriptLineNumberArea(ScriptEditBox* scriptEditBox);
|
||||||
|
QSize sizeHint();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent* event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ScriptEditBox* _scriptEditBox;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_ScriptLineNumberArea_h
|
|
@ -39,11 +39,20 @@
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextEdit" name="scriptEdit">
|
<widget class="ScriptEditBox" name="scriptEdit">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<family>Courier</family>
|
<family>Courier</family>
|
||||||
|
@ -56,9 +65,6 @@
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">font: 16px "Courier";</string>
|
<string notr="true">font: 16px "Courier";</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptRichText">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -144,6 +150,13 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>ScriptEditBox</class>
|
||||||
|
<extends>QTextEdit</extends>
|
||||||
|
<header>ui/ScriptEditBox.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
|
|
Loading…
Reference in a new issue