19#include "moc_qgscodeeditor.cpp"
32#include <QFontDatabase>
35#include <Qsci/qscistyle.h>
40#include "Qsci/qscilexer.h"
47QMap<QgsCodeEditorColorScheme::ColorRole, QString> QgsCodeEditor::sColorRoleToSettingsKey {
87 : QsciScintilla( parent )
88 , mWidgetTitle( title )
93 if ( !parent && mWidgetTitle.isEmpty() )
95 setWindowTitle( QStringLiteral(
"Text Editor" ) );
99 setWindowTitle( mWidgetTitle );
105 mSoftHistory.append( QString() );
108 setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
110 SendScintilla( SCI_SETADDITIONALSELECTIONTYPING, 1 );
111 SendScintilla( SCI_SETMULTIPASTE, 1 );
112 SendScintilla( SCI_SETVIRTUALSPACEOPTIONS, SCVS_RECTANGULARSELECTION );
117 setAnnotationDisplay( QsciScintilla::AnnotationBoxed );
132 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
134 setWrapMode( QsciScintilla::WrapCharacter );
141 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
143 setWrapMode( QsciScintilla::WrapCharacter );
144 SendScintilla( QsciScintilla::SCI_EMPTYUNDOBUFFER );
149#if QSCINTILLA_VERSION < 0x020d03
150 installEventFilter(
this );
153 mLastEditTimer =
new QTimer(
this );
154 mLastEditTimer->setSingleShot(
true );
155 mLastEditTimer->setInterval( 1000 );
156 connect( mLastEditTimer, &QTimer::timeout,
this, &QgsCodeEditor::onLastEditTimeout );
157 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
163#if QSCINTILLA_VERSION >= 0x020800 && QSCINTILLA_VERSION < 0x020900
164 if (
event->reason() != Qt::ActiveWindowFocusReason )
178 QFocusEvent newFocusEvent( QEvent::FocusOut, Qt::ActiveWindowFocusReason );
179 QsciScintilla::focusOutEvent( &newFocusEvent );
184 QsciScintilla::focusOutEvent(
event );
194 if ( isListActive() )
196 QsciScintilla::keyPressEvent(
event );
200 if (
event->key() == Qt::Key_Escape )
203 QWidget::keyPressEvent(
event );
207 if (
event->matches( QKeySequence::StandardKey::HelpContents ) )
210 QString text = selectedText();
215 text = wordAtPoint( mapFromGlobal( QCursor::pos() ) );
219 if ( text.isEmpty() )
222 getCursorPosition( &line, &index );
223 text = wordAtLineIndex( line, index );
232 switch (
event->key() )
255 const bool ctrlModifier =
event->modifiers() & Qt::ControlModifier;
256 const bool altModifier =
event->modifiers() & Qt::AltModifier;
260 if ( !isReadOnly() && canReformat && ctrlModifier && altModifier &&
event->key() == Qt::Key_F )
269 if ( !isReadOnly() && canToggle && ctrlModifier &&
event->key() == Qt::Key_Colon )
276 QsciScintilla::keyPressEvent(
event );
279 if ( !
event->isAutoRepeat() )
291 QMenu *menu = createStandardContextMenu();
292 menu->setAttribute( Qt::WA_DeleteOnClose );
296 menu->addSeparator();
301 QAction *reformatAction =
new QAction( tr(
"Reformat Code" ), menu );
302 reformatAction->setShortcut( QStringLiteral(
"Ctrl+Alt+F" ) );
304 reformatAction->setEnabled( !isReadOnly() );
306 menu->addAction( reformatAction );
311 QAction *syntaxCheckAction =
new QAction( tr(
"Check Syntax" ), menu );
314 menu->addAction( syntaxCheckAction );
319 QAction *toggleCommentAction =
new QAction( tr(
"Toggle Comment" ), menu );
320 toggleCommentAction->setShortcut( QStringLiteral(
"Ctrl+:" ) );
321 toggleCommentAction->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"console/iconCommentEditorConsole.svg" ), palette().
color( QPalette::ColorRole::WindowText ) ) );
322 toggleCommentAction->setEnabled( !isReadOnly() );
324 menu->addAction( toggleCommentAction );
329 menu->exec( mapToGlobal(
event->pos() ) );
335 QMenu *menu =
new QMenu(
this );
336 QMenu *historySubMenu =
new QMenu( tr(
"Command History" ), menu );
342 menu->addMenu( historySubMenu );
343 menu->addSeparator();
345 QAction *copyAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditCopy.svg" ), tr(
"Copy" ),
this, &QgsCodeEditor::copy, QKeySequence::Copy );
346 QAction *pasteAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditPaste.svg" ), tr(
"Paste" ),
this, &QgsCodeEditor::paste, QKeySequence::Paste );
347 copyAction->setEnabled( hasSelectedText() );
348 pasteAction->setEnabled( !QApplication::clipboard()->text().isEmpty() );
352 menu->exec( mapToGlobal(
event->pos() ) );
357 QsciScintilla::contextMenuEvent(
event );
364 if (
event->type() == QEvent::ShortcutOverride )
366 if ( QKeyEvent *keyEvent =
dynamic_cast<QKeyEvent *
>(
event ) )
368 if ( keyEvent->matches( QKeySequence::StandardKey::HelpContents ) )
377 return QsciScintilla::event(
event );
382#if QSCINTILLA_VERSION < 0x020d03
383 if ( watched ==
this &&
event->type() == QEvent::InputMethod )
392 return QsciScintilla::eventFilter( watched,
event );
401 if ( mUseDefaultSettings )
402 return color( role );
404 if ( !mOverrideColors )
410 const QColor
color = mCustomColors.value( role );
417 if ( mUseDefaultSettings )
420 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
423 if ( !mFontFamily.isEmpty() )
428 font.setPointSize( mFontSize );
432 font.setPointSize( QLabel().font().pointSize() );
436 font.setPointSize( mFontSize );
439 const int fontSize = settings.
value( QStringLiteral(
"qgis/stylesheet/fontPointSize" ), 10 ).toInt();
440 font.setPointSize( fontSize );
443 font.setBold(
false );
470 setCaretLineVisible(
false );
473 setMarginLineNumbers( 1,
true );
474 setMarginWidth( 1,
"00000" );
475 setMarginType( 1, QsciScintilla::MarginType::TextMarginRightJustified );
477 setEdgeMode( QsciScintilla::EdgeNone );
481void QgsCodeEditor::onLastEditTimeout()
483 mLastEditTimer->stop();
487void QgsCodeEditor::setSciWidget()
493 setCaretLineVisible(
true );
499 setBraceMatching( QsciScintilla::SloppyBraceMatch );
506 setFolding( QsciScintilla::NoFoldStyle );
518 setFoldMarginColors( foldColor, foldColor );
520 setAutoIndent(
true );
521 setIndentationWidth( 4 );
522 setTabIndents(
true );
523 setBackspaceUnindents(
true );
526 setAutoCompletionThreshold( 2 );
527 setAutoCompletionSource( QsciScintilla::AcsAPIs );
534 setWindowTitle( title );
554 return tr(
"Expression" );
558 return tr(
"JavaScript" );
562 return tr(
"Python" );
568 return tr(
"Batch" );
583 marginFont.setPointSize( 10 );
584 setMarginLineNumbers( 0,
true );
585 setMarginsFont( marginFont );
603 marginFont.setPointSize( 10 );
605 setMarginsFont( marginFont );
640void QgsCodeEditor::updateFolding()
647 setFolding( QsciScintilla::PlainFoldStyle );
651 setFolding( QsciScintilla::NoFoldStyle );
656bool QgsCodeEditor::readHistoryFile()
658 if ( mHistoryFilePath.isEmpty() || !QFile::exists( mHistoryFilePath ) )
661 QFile file( mHistoryFilePath );
662 if ( file.open( QIODevice::ReadOnly ) )
664 QTextStream stream( &file );
665#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
667 stream.setCodec(
"UTF-8" );
670 while ( !stream.atEnd() )
672 line = stream.readLine();
673 mHistory.append( line );
682void QgsCodeEditor::syncSoftHistory()
684 mSoftHistory = mHistory;
685 mSoftHistory.append( QString() );
686 mSoftHistoryIndex = mSoftHistory.length() - 1;
691 mSoftHistory[mSoftHistoryIndex] = text();
694void QgsCodeEditor::updateHistory(
const QStringList &commands,
bool skipSoftHistory )
696 if ( commands.size() > 1 )
698 mHistory.append( commands );
700 else if ( !commands.value( 0 ).isEmpty() )
702 const QString command = commands.value( 0 );
703 if ( mHistory.empty() || command != mHistory.constLast() )
704 mHistory.append( command );
707 if ( !skipSoftHistory )
727 QMessageBox::information(
this, title, message );
731 QMessageBox::warning(
this, title, message );
735 QMessageBox::critical(
this, title, message );
745 SendScintilla( QsciScintilla::SCI_MARGINSETTEXT,
static_cast<uintptr_t
>( 0 ), prompt.toUtf8().constData() );
756 mInterpreter = newInterpreter;
763 const int index = std::min( source.length(), target.length() );
769 int refDistanceMore = d0;
770 int refIndexMore = index;
771 if ( index < source.length() - 1 )
776 if ( newDistance <= refDistanceMore )
778 refDistanceMore = newDistance;
780 if ( refIndexMore == source.length() - 1 )
790 int refDistanceLess = d0;
791 int refIndexLess = index;
797 if ( newDistance <= refDistanceLess )
799 refDistanceLess = newDistance;
801 if ( refIndexLess == 0 )
811 if ( refDistanceMore < refDistanceLess )
823 const QString originalText = text();
826 if ( originalText == newText )
830 const int oldScrollValue = verticalScrollBar()->value();
835 removeSelectedText();
838 verticalScrollBar()->setValue( oldScrollValue );
859 int startLine, startPos, endLine, endPos;
860 if ( hasSelectedText() )
862 getSelection( &startLine, &startPos, &endLine, &endPos );
866 getCursorPosition( &startLine, &startPos );
872 bool allEmpty =
true;
873 bool allCommented =
true;
874 int minIndentation = -1;
875 for (
int line = startLine; line <= endLine; line++ )
877 const QString stripped = text( line ).trimmed();
878 if ( !stripped.isEmpty() )
881 if ( !stripped.startsWith( commentPrefix ) )
883 allCommented =
false;
885 if ( minIndentation == -1 || minIndentation > indentation( line ) )
887 minIndentation = indentation( line );
901 const int prefixLength =
static_cast<int>( commentPrefix.length() );
903 const bool startLineEmpty = ( text( startLine ).trimmed().isEmpty() );
904 const bool endLineEmpty = ( text( endLine ).trimmed().isEmpty() );
906 for (
int line = startLine; line <= endLine; line++ )
908 const QString stripped = text( line ).trimmed();
911 if ( stripped.isEmpty() )
918 insertAt( commentPrefix +
' ', line, minIndentation );
919 delta = -( prefixLength + 1 );
923 if ( !stripped.startsWith( commentPrefix ) )
927 if ( stripped.startsWith( commentPrefix +
' ' ) )
929 delta = prefixLength + 1;
933 delta = prefixLength;
935 setSelection( line, indentation( line ), line, indentation( line ) + delta );
936 removeSelectedText();
941 setSelection( startLine, startPos - ( startLineEmpty ? 0 : delta ), endLine, endPos - ( endLineEmpty ? 0 : delta ) );
950 int lineCount = lines();
953 for (
int line = 0; line < lineCount; line++ )
956 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
958 const long x = SendScintilla( SCI_POINTXFROMPOSITION, 0, endLine );
959 maxWidth = std::max( maxWidth, x );
963 setScrollWidth(
static_cast<int>( maxWidth ) );
968 disconnect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
969 QsciScintilla::setText( text );
970 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
977 return mLastEditTimer->interval();
982 mLastEditTimer->setInterval( timeout );
995 updateHistory( { command } );
1001 mInterpreter->
exec( command );
1020 if ( !mHistoryFilePath.isEmpty() && QFile::exists( mHistoryFilePath ) )
1022 QFile file( mHistoryFilePath );
1023 file.open( QFile::WriteOnly | QFile::Truncate );
1031 if ( mHistoryFilePath.isEmpty() )
1034 QFile f( mHistoryFilePath );
1035 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
1040 QTextStream ts( &f );
1041#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
1042 ts.setCodec(
"UTF-8" );
1044 for (
const QString &command : std::as_const( mHistory ) )
1046 ts << command +
'\n';
1053 if ( mSoftHistoryIndex < mSoftHistory.length() - 1 && !mSoftHistory.isEmpty() )
1055 mSoftHistoryIndex += 1;
1056 setText( mSoftHistory[mSoftHistoryIndex] );
1063 if ( mSoftHistoryIndex > 0 && !mSoftHistory.empty() )
1065 mSoftHistoryIndex -= 1;
1066 setText( mSoftHistory[mSoftHistoryIndex] );
1074 dialog->setAttribute( Qt::WA_DeleteOnClose );
1077 dialog->activateWindow();
1083 mHistory.removeAt( index );
1084 mSoftHistory.removeAt( index );
1085 if ( index < mSoftHistoryIndex )
1087 mSoftHistoryIndex -= 1;
1088 if ( mSoftHistoryIndex < 0 )
1089 mSoftHistoryIndex = mSoftHistory.length() - 1;
1096 if ( hasSelectedText() )
1098 replaceSelectedText( text );
1103 getCursorPosition( &line, &index );
1104 insertAt( text, line, index );
1105 setCursorPosition( line, index + text.length() );
1114 const QPalette
pal = qApp->palette();
1119 return pal.color( QPalette::Highlight );
1121 return pal.color( QPalette::HighlightedText );
1126 else if ( theme.isEmpty() )
1131 static const QMap<QgsCodeEditorColorScheme::ColorRole, QString> sColorRoleToIniKey {
1175 return scheme.
color( role );
1181 if ( !settings.
value( QStringLiteral(
"codeEditor/overrideColors" ),
false,
QgsSettings::Gui ).toBool() )
1183 const QString theme = settings.
value( QStringLiteral(
"codeEditor/colorScheme" ), QString(),
QgsSettings::Gui ).toString();
1188 const QString
color = settings.
value( QStringLiteral(
"codeEditor/%1" ).arg( sColorRoleToSettingsKey.value( role ) ), QString(),
QgsSettings::Gui ).toString();
1196 if (
color.isValid() )
1202 settings.
remove( QStringLiteral(
"codeEditor/%1" ).arg( sColorRoleToSettingsKey.value( role ) ),
QgsSettings::Gui );
1209 return font.fixedPitch();
1214 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
1217 if ( !settings.
value( QStringLiteral(
"codeEditor/fontfamily" ), QString(),
QgsSettings::Gui ).toString().isEmpty() )
1220 const int fontSize = settings.
value( QStringLiteral(
"codeEditor/fontsize" ), 0,
QgsSettings::Gui ).toInt();
1224 font.setPointSize( fontSize );
1228 font.setPointSize( QLabel().font().pointSize() );
1232 font.setPointSize( fontSize );
1235 const int fontSize = settings.
value( QStringLiteral(
"qgis/stylesheet/fontPointSize" ), 10 ).toInt();
1236 font.setPointSize( fontSize );
1239 font.setBold(
false );
1246 mUseDefaultSettings =
false;
1247 mOverrideColors = !customColors.isEmpty();
1248 mColorScheme = scheme;
1249 mCustomColors = customColors;
1250 mFontFamily = fontFamily;
1251 mFontSize = fontSize;
1260 markerAdd( lineNumber, MARKER_NUMBER );
1262 font.setItalic(
true );
1264 annotate( lineNumber, warning, styleAnn );
1265 mWarningLines.push_back( lineNumber );
1270 for (
const int line : mWarningLines )
1272 markerDelete( line );
1273 clearAnnotations( line );
1276 mWarningLines.clear();
1283 getCursorPosition( &line, &index );
1284 return line == lines() - 1;
1289 mHistoryFilePath = path;
1295 setCursorPosition( 0, 0 );
1296 ensureCursorVisible();
1297 ensureLineVisible( 0 );
1305 const int endLine = lines() - 1;
1306 const int endLineLength = lineLength( endLine );
1307 setCursorPosition( endLine, endLineLength );
1308 ensureCursorVisible();
1309 ensureLineVisible( endLine );
1317 return static_cast<int>( SendScintilla( SCI_GETCURRENTPOS ) );
1323 lineIndexFromPosition( linearIndex, &line, &index );
1324 setCursorPosition( line, index );
1329 int startLine, startIndex, _;
1330 getSelection( &startLine, &startIndex, &_, &_ );
1331 if ( startLine == -1 )
1335 return positionFromLineIndex( startLine, startIndex );
1340 int endLine, endIndex, _;
1341 getSelection( &_, &_, &endLine, &endIndex );
1342 if ( endLine == -1 )
1346 return positionFromLineIndex( endLine, endIndex );
1351 int startLine, startIndex, endLine, endIndex;
1352 lineIndexFromPosition( start, &startLine, &startIndex );
1353 lineIndexFromPosition( end, &endLine, &endIndex );
1354 setSelection( startLine, startIndex, endLine, endIndex );
1369 if ( wrapMode() == WrapNone )
1381 if ( SendScintilla( SCI_WRAPCOUNT, line ) <= 1 )
1387 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
1389 const long y = SendScintilla( SCI_POINTYFROMPOSITION, 0, endLine );
1391 return static_cast<int>( SendScintilla( SCI_POSITIONFROMPOINT, 0, y ) );
1398 if ( callTipsStyle() == CallTipsNone || lexer() ==
nullptr )
1403 QsciAbstractAPIs *apis = lexer()->apis();
1408 int pos, commas = 0;
1416 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1420 else if ( ch ==
')' )
1426 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1430 else if ( ch ==
'(' && --depth == 0 )
1434 else if ( ch ==
'(' )
1442 SendScintilla( SCI_CALLTIPCANCEL );
1448 int contextStart, lastWordStart;
1449 QStringList context = apiContext( pos, contextStart, lastWordStart );
1451 if ( context.isEmpty() )
1455 context << QString();
1457 QList<int> ctShifts;
1458 QStringList ctEntries = apis->callTips( context, commas, callTipsStyle(), ctShifts );
1460 int nbEntries = ctEntries.count();
1462 if ( nbEntries == 0 )
1465 const int maxNumberOfCallTips = callTipsVisible();
1468 if ( maxNumberOfCallTips > 0 && maxNumberOfCallTips < nbEntries )
1470 ctEntries = ctEntries.mid( 0, maxNumberOfCallTips );
1471 nbEntries = maxNumberOfCallTips;
1477 int nbShifts = ctShifts.count();
1479 if ( maxNumberOfCallTips < 0 && nbEntries > 1 )
1481 shift = ( nbShifts > 0 ? ctShifts.first() : 0 );
1483 ct.prepend(
'\002' );
1487 if ( nbShifts > nbEntries )
1488 nbShifts = nbEntries;
1493 for (
int i = 0; i < nbShifts; ++i )
1495 int sh = ctShifts[i];
1501 ct = ctEntries.join(
"\n" );
1504 QByteArray ctBa = ct.toLatin1();
1505 const char *cts = ctBa.data();
1509 if ( currentWrapPosition != -1 )
1511 SendScintilla( SCI_CALLTIPSHOW, currentWrapPosition, cts );
1519 int ctmin =
static_cast<int>( SendScintilla( SCI_POSITIONFROMLINE, SendScintilla( SCI_LINEFROMPOSITION, ct ) ) );
1520 if ( lastWordStart - shift < ctmin )
1521 lastWordStart = ctmin;
1525 lineIndexFromPosition( lastWordStart, &line, &index );
1526 SendScintilla( SCI_CALLTIPSHOW, positionFromLineIndex( line, index ), cts );
1530 if ( nbEntries > 1 )
1537 astart = strchr( cts,
'(' );
1539 for ( astart = strchr( cts,
',' ); astart && --commas > 0; astart = strchr( astart + 1,
',' ) )
1553 for ( aend = astart; *aend; ++aend )
1557 if ( ch ==
',' && depth == 0 )
1559 else if ( ch ==
'(' )
1561 else if ( ch ==
')' )
1570 if ( astart != aend )
1571 SendScintilla( SCI_CALLTIPSETHLT, astart - cts, aend - cts );
1578char QgsCodeEditor::getCharacter(
int &pos )
const
1583 char ch =
static_cast<char>( SendScintilla( SCI_GETCHARAT, --pos ) );
1586 if ( ch ==
'\n' || ch ==
'\r' )
MessageLevel
Level for messages This will be used both for message log and message bar in application.
@ Warning
Warning message.
@ Critical
Critical/error message.
@ Info
Information message.
@ Success
Used for reporting a successful operation.
@ CheckSyntax
Language supports syntax checking.
@ Reformat
Language supports automatic code reformatting.
@ ToggleComment
Language supports comment toggling.
ScriptLanguage
Scripting languages.
@ QgisExpression
QGIS expressions.
@ Batch
Windows batch files.
@ Unknown
Unknown/other language.
QFlags< ScriptLanguageCapability > ScriptLanguageCapabilities
Script language capabilities.
static QPixmap getThemePixmap(const QString &name, const QColor &foreColor=QColor(), const QColor &backColor=QColor(), int size=16)
Helper to get a theme icon as a pixmap.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QHash< QString, QString > uiThemes()
All themes found in ~/.qgis3/themes folder.
static QString themeName()
Set the active theme to the specified theme.
QgsCodeEditorColorScheme scheme(const QString &id) const
Returns the color scheme with matching id.
Defines a color scheme for use in QgsCodeEditor widgets.
@ TripleSingleQuote
Triple single quote color.
@ CommentBlock
Comment block color.
@ QuotedOperator
Quoted operator color.
@ Decoration
Decoration color.
@ Identifier
Identifier color.
@ DoubleQuote
Double quote color.
@ QuotedIdentifier
Quoted identifier color.
@ SelectionForeground
Selection foreground color.
@ CommentLine
Line comment color.
@ FoldIconForeground
Fold icon foreground color.
@ MarginForeground
Margin foreground color.
@ ErrorBackground
Error background color.
@ MatchedBraceBackground
Matched brace background color.
@ Default
Default text color.
@ SearchMatchBackground
Background color for search matches.
@ CaretLine
Caret line color.
@ IndentationGuide
Indentation guide line.
@ Background
Background color.
@ SingleQuote
Single quote color.
@ MarginBackground
Margin background color.
@ SelectionBackground
Selection background color.
@ MatchedBraceForeground
Matched brace foreground color.
@ Operator
Operator color.
@ TripleDoubleQuote
Triple double quote color.
@ FoldIconHalo
Fold icon halo color.
QColor color(ColorRole role) const
Returns the color to use in the editor for the specified role.
A dialog for displaying and managing command history for a QgsCodeEditor widget.
bool eventFilter(QObject *watched, QEvent *event) override
void sessionHistoryCleared()
Emitted when the history of commands run in the current session is cleared.
static const QgsSettingsEntryBool * settingContextHelpHover
void showHistory()
Shows the command history dialog.
int wrapPosition(int line=-1)
Returns the linear position of the start of the last wrapped part for the specified line,...
void setCustomAppearance(const QString &scheme=QString(), const QMap< QgsCodeEditorColorScheme::ColorRole, QColor > &customColors=QMap< QgsCodeEditorColorScheme::ColorRole, QColor >(), const QString &fontFamily=QString(), int fontSize=0)
Sets a custom appearance for the widget, disconnecting it from using the standard appearance taken fr...
int editingTimeoutInterval() const
Returns the timeout (in milliseconds) threshold for the editingTimeout() signal to be emitted after a...
@ OutputDisplay
Read only mode for display of command outputs.
@ ScriptEditor
Standard mode, allows for display and edit of entire scripts.
@ CommandInput
Command input mode.
void reformatCode()
Applies code reformatting to the editor.
virtual void toggleComment()
Toggle comment for the selected text.
void contextMenuEvent(QContextMenuEvent *event) override
void clearPersistentHistory()
Clears the entire persistent history of commands run in the editor.
void removeHistoryCommand(int index)
Removes the command at the specified index from the history of the code editor.
static void setColor(QgsCodeEditorColorScheme::ColorRole role, const QColor &color)
Sets the color to use in the editor for the specified role.
void setHistoryFilePath(const QString &path)
Sets the file path to use for recording and retrieving previously executed commands.
void setLinearSelection(int start, int end)
Convenience function to set the selection using linear indexes.
QStringList history() const
Returns the list of commands previously executed in the editor.
static constexpr int SEARCH_RESULT_INDICATOR
Indicator index for search results.
void keyPressEvent(QKeyEvent *event) override
virtual void moveCursorToStart()
Moves the cursor to the start of the document and scrolls to ensure it is visible.
virtual void populateContextMenu(QMenu *menu)
Called when the context menu for the widget is about to be shown, after it has been fully populated w...
QFlags< Flag > Flags
Flags controlling behavior of code editor.
void persistentHistoryCleared()
Emitted when the persistent history of commands run in the editor is cleared.
virtual void callTip() override
void runCommand(const QString &command, bool skipHistory=false)
Runs a command in the editor.
void setText(const QString &text) override
void setFoldingVisible(bool folding)
Set whether the folding controls are visible in the editor.
virtual Qgis::ScriptLanguageCapabilities languageCapabilities() const
Returns the associated scripting language capabilities.
void setEditingTimeoutInterval(int timeout)
Sets the timeout (in milliseconds) threshold for the editingTimeout() signal to be emitted after an e...
void setInterpreter(QgsCodeInterpreter *newInterpreter)
Sets an attached code interpreter for executing commands when the editor is in the QgsCodeEditor::Mod...
@ FoldingControls
Folding controls.
@ ErrorIndicators
Error indicators.
@ LineNumbers
Line numbers.
void runPostLexerConfigurationTasks()
Performs tasks which must be run after a lexer has been set for the widget.
bool event(QEvent *event) override
virtual void showMessage(const QString &title, const QString &message, Qgis::MessageLevel level)
Shows a user facing message (eg a warning message).
int selectionEnd() const
Convenience function to return the end of the selection as a linear index Contrary to the getSelectio...
virtual void initializeLexer()
Called when the dialect specific code lexer needs to be initialized (or reinitialized).
int linearPosition() const
Convenience function to return the cursor position as a linear index.
void setTitle(const QString &title)
Set the widget title.
void setLinearPosition(int position)
Convenience function to set the cursor position as a linear index.
QgsCodeEditor(QWidget *parent=nullptr, const QString &title=QString(), bool folding=false, bool margin=false, QgsCodeEditor::Flags flags=QgsCodeEditor::Flags(), QgsCodeEditor::Mode mode=QgsCodeEditor::Mode::ScriptEditor)
Construct a new code editor.
void clearWarnings()
Clears all warning messages from the editor.
static QFont getMonospaceFont()
Returns the monospaced font to use for code editors.
void showNextCommand()
Shows the next command from the session in the editor.
void focusOutEvent(QFocusEvent *event) override
@ CodeFolding
Indicates that code folding should be enabled for the editor.
@ ImmediatelyUpdateHistory
Indicates that the history file should be immediately updated whenever a command is executed,...
void helpRequested(const QString &word)
Emitted when documentation was requested for the specified word.
bool isCursorOnLastLine() const
Returns true if the cursor is on the last line of the document.
static bool isFixedPitch(const QFont &font)
Returns true if a font is a fixed pitch font.
void updateSoftHistory()
Updates the soft history by storing the current editor text in the history.
void clearSessionHistory()
Clears the history of commands run in the current session.
void insertText(const QString &text)
Insert text at cursor position, or replace any selected text if user has made a selection.
bool writeHistoryFile()
Stores the commands executed in the editor to the persistent history file.
virtual void moveCursorToEnd()
Moves the cursor to the end of the document and scrolls to ensure it is visible.
static QString languageToString(Qgis::ScriptLanguage language)
Returns a user-friendly, translated name of the specified script language.
void setLineNumbersVisible(bool visible)
Sets whether line numbers should be visible in the editor.
void adjustScrollWidth()
Adjust the width of the scroll bar to fit the content.
virtual Qgis::ScriptLanguage language() const
Returns the associated scripting language.
QFont lexerFont() const
Returns the font to use in the lexer.
void toggleLineComments(const QString &commentPrefix)
Toggles comment for selected lines with the given comment prefix.
virtual QString reformatCodeString(const QString &string)
Applies code reformatting to a string and returns the result.
QgsCodeInterpreter * interpreter() const
Returns the attached code interpreter, or nullptr if not set.
bool lineNumbersVisible() const
Returns whether line numbers are visible in the editor.
QColor lexerColor(QgsCodeEditorColorScheme::ColorRole role) const
Returns the color to use in the lexer for the specified role.
bool foldingVisible()
Returns true if the folding controls are visible in the editor.
void showPreviousCommand()
Shows the previous command from the session in the editor.
Q_DECL_DEPRECATED void setMarginVisible(bool margin)
Set margin visible state.
void updatePrompt()
Triggers an update of the interactive prompt part of the editor.
void editingTimeout()
Emitted when either:
static QColor defaultColor(QgsCodeEditorColorScheme::ColorRole role, const QString &theme=QString())
Returns the default color for the specified role.
int selectionStart() const
Convenience function to return the start of the selection as a linear index Contrary to the getSelect...
void addWarning(int lineNumber, const QString &warning)
Adds a warning message and indicator to the specified a lineNumber.
virtual bool checkSyntax()
Applies syntax checking to the editor.
static QColor color(QgsCodeEditorColorScheme::ColorRole role)
Returns the color to use in the editor for the specified role.
An interface for code interpreters.
virtual int execCommandImpl(const QString &command)=0
Pure virtual method for executing commands in the interpreter.
virtual int currentState() const
Returns the current interpreter state.
virtual QString promptForState(int state) const =0
Returns the interactive prompt string to use for the interpreter, given a state.
int exec(const QString &command)
Executes a command in the interpreter.
virtual ~QgsCodeInterpreter()
static void setFontFamily(QFont &font, const QString &family)
Sets the family for a font object.
void optionsChanged()
This signal is emitted whenever the application options have been changed.
static QgsGui * instance()
Returns a pointer to the singleton instance.
static QgsCodeEditorColorSchemeRegistry * codeEditorColorSchemeRegistry()
Returns the global code editor color scheme registry, used for registering the color schemes for QgsC...
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
A boolean settings entry.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void remove(const QString &key, QgsSettings::Section section=QgsSettings::NoSection)
Removes the setting key and any sub-settings of key in a section.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
static int levenshteinDistance(const QString &string1, const QString &string2, bool caseSensitive=false)
Returns the Levenshtein edit distance between two strings.
static QColor decodeColor(const QString &str)
#define BUILTIN_UNREACHABLE
int findMinimalDistanceIndex(const QString &source, const QString &target)