* shader editor: lines numbering
This commit is contained in:
parent
66f80987a8
commit
4d870a381f
|
|
@ -488,7 +488,7 @@ no completion on undo, paste? //atm on adding undo, not on removing
|
||||||
QStringLiteral optimization
|
QStringLiteral optimization
|
||||||
QCompleter inactive entry in list // because is wrapAround()
|
QCompleter inactive entry in list // because is wrapAround()
|
||||||
check %p %t lengths in hl
|
check %p %t lengths in hl
|
||||||
display line numbers, exremely useful for error messages handling
|
display line numbers, exremely useful for error messages handling
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
@ -1548,10 +1548,38 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class LineNumberArea : public QWidget
|
||||||
|
{
|
||||||
|
QPlainTextEdit *m_textEdit;
|
||||||
|
const Callback1<QPaintEvent*> m_paintCallback;
|
||||||
|
public:
|
||||||
|
LineNumberArea( QPlainTextEdit *textEdit, const decltype( m_paintCallback )& paintCallback ) :
|
||||||
|
QWidget( textEdit ), m_textEdit( textEdit ), m_paintCallback( paintCallback ){}
|
||||||
|
|
||||||
|
QSize sizeHint() const override {
|
||||||
|
return QSize( lineNumberAreaWidth(), 0 );
|
||||||
|
}
|
||||||
|
int lineNumberAreaWidth() const {
|
||||||
|
const int digits = 1 + std::log10( std::max( 1, m_textEdit->blockCount() ) );
|
||||||
|
return 3 + 10 + m_textEdit->fontMetrics().horizontalAdvance( QLatin1Char('9') ) * digits;
|
||||||
|
}
|
||||||
|
void updateLineNumberArea( const QRect &rect, int dy ){
|
||||||
|
if( dy )
|
||||||
|
scroll( 0, dy );
|
||||||
|
else
|
||||||
|
update( 0, rect.y(), width(), rect.height() );
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
void paintEvent( QPaintEvent *event ) override {
|
||||||
|
m_paintCallback( event );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class QPlainTextEdit_Shader : public QPlainTextEdit
|
class QPlainTextEdit_Shader : public QPlainTextEdit
|
||||||
{
|
{
|
||||||
QCompleter *m_completer;
|
QCompleter *m_completer;
|
||||||
TexTree m_texTree;
|
TexTree m_texTree;
|
||||||
|
LineNumberArea *m_lineNumberArea;
|
||||||
public:
|
public:
|
||||||
QPlainTextEdit_Shader(){
|
QPlainTextEdit_Shader(){
|
||||||
m_completer = new QCompleter( this );
|
m_completer = new QCompleter( this );
|
||||||
|
|
@ -1563,12 +1591,43 @@ public:
|
||||||
setLineWrapMode( QPlainTextEdit::LineWrapMode::NoWrap );
|
setLineWrapMode( QPlainTextEdit::LineWrapMode::NoWrap );
|
||||||
new ShaderHighlighter( document() );
|
new ShaderHighlighter( document() );
|
||||||
|
|
||||||
|
m_lineNumberArea = new LineNumberArea( this, MemberCaller1<QPlainTextEdit_Shader, QPaintEvent *, &QPlainTextEdit_Shader::lineNumberAreaPaintEvent>( *this ) );
|
||||||
|
QObject::connect( this, &QPlainTextEdit::blockCountChanged, [this]( int newBlockCount ){ updateLineNumberAreaWidth(); } );
|
||||||
|
QObject::connect( this, &QPlainTextEdit::updateRequest, [this]( const QRect &rect, int dy ){
|
||||||
|
m_lineNumberArea->updateLineNumberArea( rect, dy );
|
||||||
|
if( rect.contains( viewport()->rect() ) )
|
||||||
|
updateLineNumberAreaWidth();
|
||||||
|
} );
|
||||||
|
updateLineNumberAreaWidth();
|
||||||
|
|
||||||
// force back/foreground colors to not be ruined by global theme
|
// force back/foreground colors to not be ruined by global theme
|
||||||
QPalette pal = palette();
|
QPalette pal = palette();
|
||||||
pal.setColor( QPalette::Base, c_colorBackground );
|
pal.setColor( QPalette::Base, c_colorBackground );
|
||||||
pal.setColor( QPalette::Text, c_colorForeground );
|
pal.setColor( QPalette::Text, c_colorForeground );
|
||||||
setPalette( pal );
|
setPalette( pal );
|
||||||
}
|
}
|
||||||
|
void lineNumberAreaPaintEvent( QPaintEvent *event ){
|
||||||
|
QPainter painter( m_lineNumberArea );
|
||||||
|
painter.setFont( font() );
|
||||||
|
painter.setPen( Qt::darkGray );
|
||||||
|
painter.fillRect( event->rect(), c_colorBackground.lighter( 128 ) );
|
||||||
|
|
||||||
|
QTextBlock block = firstVisibleBlock();
|
||||||
|
int blockNumber = block.blockNumber();
|
||||||
|
int top = qRound( blockBoundingGeometry( block ).translated( contentOffset() ).top() );
|
||||||
|
int bottom = top + qRound( blockBoundingRect( block ).height() );
|
||||||
|
|
||||||
|
while( block.isValid() && top <= event->rect().bottom() ){
|
||||||
|
if( block.isVisible() && bottom >= event->rect().top() ){
|
||||||
|
painter.drawText( 0, top, m_lineNumberArea->width() - 10, fontMetrics().height(), Qt::AlignRight, QString::number( blockNumber + 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
block = block.next();
|
||||||
|
top = bottom;
|
||||||
|
bottom = top + qRound( blockBoundingRect( block ).height() );
|
||||||
|
++blockNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
protected:
|
protected:
|
||||||
bool event( QEvent *event ) override {
|
bool event( QEvent *event ) override {
|
||||||
if( event->type() == QEvent::ShortcutOverride ){
|
if( event->type() == QEvent::ShortcutOverride ){
|
||||||
|
|
@ -1763,6 +1822,15 @@ protected:
|
||||||
}
|
}
|
||||||
QPlainTextEdit::paintEvent( pEvent );
|
QPlainTextEdit::paintEvent( pEvent );
|
||||||
}
|
}
|
||||||
|
void resizeEvent( QResizeEvent *e ) override {
|
||||||
|
QPlainTextEdit::resizeEvent( e );
|
||||||
|
|
||||||
|
const QRect cr = contentsRect();
|
||||||
|
m_lineNumberArea->setGeometry( QRect( cr.left(), cr.top(), m_lineNumberArea->lineNumberAreaWidth(), cr.height() ) );
|
||||||
|
}
|
||||||
|
void updateLineNumberAreaWidth(){
|
||||||
|
setViewportMargins( m_lineNumberArea->lineNumberAreaWidth(), 0, 0, 0 );
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
void texTree_construct(){
|
void texTree_construct(){
|
||||||
class LoadTexturesByTypeVisitor : public ImageModules::Visitor
|
class LoadTexturesByTypeVisitor : public ImageModules::Visitor
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user