36#include <QFontDatabase>
43#include <Qsci/qscilexer.h>
44#include <Qsci/qscistyle.h>
46#include "moc_qgscodeeditor.cpp"
48using namespace Qt::StringLiterals;
57QMap<QgsCodeEditorColorScheme::ColorRole, QString> QgsCodeEditor::sColorRoleToSettingsKey {
97 : QsciScintilla( parent )
98 , mWidgetTitle( title )
103 if ( !parent && mWidgetTitle.isEmpty() )
105 setWindowTitle( u
"Text Editor"_s );
109 setWindowTitle( mWidgetTitle );
115 mSoftHistory.append( QString() );
118 setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
120 SendScintilla( SCI_SETADDITIONALSELECTIONTYPING, 1 );
121 SendScintilla( SCI_SETMULTIPASTE, 1 );
122 SendScintilla( SCI_SETVIRTUALSPACEOPTIONS, SCVS_RECTANGULARSELECTION );
127 setAnnotationDisplay( QsciScintilla::AnnotationBoxed );
142 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
144 setWrapMode( QsciScintilla::WrapCharacter );
151 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
153 setWrapMode( QsciScintilla::WrapCharacter );
154 SendScintilla( QsciScintilla::SCI_EMPTYUNDOBUFFER );
159#if QSCINTILLA_VERSION < 0x020d03
160 installEventFilter(
this );
163 mLastEditTimer =
new QTimer(
this );
164 mLastEditTimer->setSingleShot(
true );
165 mLastEditTimer->setInterval( 1000 );
166 connect( mLastEditTimer, &QTimer::timeout,
this, &QgsCodeEditor::onLastEditTimeout );
167 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
173#if QSCINTILLA_VERSION >= 0x020800 && QSCINTILLA_VERSION < 0x020900
174 if (
event->reason() != Qt::ActiveWindowFocusReason )
188 QFocusEvent newFocusEvent( QEvent::FocusOut, Qt::ActiveWindowFocusReason );
189 QsciScintilla::focusOutEvent( &newFocusEvent );
194 QsciScintilla::focusOutEvent(
event );
204 if ( isListActive() )
206 QsciScintilla::keyPressEvent(
event );
210 if (
event->key() == Qt::Key_Escape )
213 QWidget::keyPressEvent(
event );
217 if (
event->matches( QKeySequence::StandardKey::HelpContents ) )
220 QString text = selectedText();
225 text = wordAtPoint( mapFromGlobal( QCursor::pos() ) );
229 if ( text.isEmpty() )
232 getCursorPosition( &line, &index );
233 text = wordAtLineIndex( line, index );
242 switch (
event->key() )
267 if ( !isReadOnly() && canReformat )
270 if ( !reformatCodeSequence.isEmpty() && reformatCodeSequence.matches(
event->key() |
event->modifiers() ) )
280 if ( !isReadOnly() && canToggle )
283 if ( !toggleCommentCodeSequence.isEmpty() && toggleCommentCodeSequence.matches(
event->key() |
event->modifiers() ) )
291 QsciScintilla::keyPressEvent(
event );
294 if ( !
event->isAutoRepeat() )
306 QMenu *menu = createStandardContextMenu();
307 menu->setAttribute( Qt::WA_DeleteOnClose );
311 menu->addSeparator();
316 QAction *reformatAction =
new QAction( tr(
"Reformat Code" ), menu );
319 reformatAction->setEnabled( !isReadOnly() );
321 menu->addAction( reformatAction );
326 QAction *syntaxCheckAction =
new QAction( tr(
"Check Syntax" ), menu );
329 menu->addAction( syntaxCheckAction );
334 QAction *toggleCommentAction =
new QAction( tr(
"Toggle Comment" ), menu );
337 toggleCommentAction->setEnabled( !isReadOnly() );
339 menu->addAction( toggleCommentAction );
344 menu->exec( mapToGlobal(
event->pos() ) );
350 QMenu *menu =
new QMenu(
this );
351 QMenu *historySubMenu =
new QMenu( tr(
"Command History" ), menu );
357 menu->addMenu( historySubMenu );
358 menu->addSeparator();
360 QAction *copyAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditCopy.svg" ), tr(
"Copy" ),
this, &QgsCodeEditor::copy, QKeySequence::Copy );
361 QAction *pasteAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditPaste.svg" ), tr(
"Paste" ),
this, &QgsCodeEditor::paste, QKeySequence::Paste );
362 copyAction->setEnabled( hasSelectedText() );
363 pasteAction->setEnabled( !QApplication::clipboard()->text().isEmpty() );
367 menu->exec( mapToGlobal(
event->pos() ) );
372 QsciScintilla::contextMenuEvent(
event );
379 if (
event->type() == QEvent::ShortcutOverride )
381 if ( QKeyEvent *keyEvent =
dynamic_cast<QKeyEvent *
>(
event ) )
383 if ( keyEvent->matches( QKeySequence::StandardKey::HelpContents ) )
392 return QsciScintilla::event(
event );
397#if QSCINTILLA_VERSION < 0x020d03
398 if ( watched ==
this &&
event->type() == QEvent::InputMethod )
407 return QsciScintilla::eventFilter( watched,
event );
415 if ( mUseDefaultSettings )
416 return color( role );
418 if ( !mOverrideColors )
424 const QColor
color = mCustomColors.value( role );
431 if ( mUseDefaultSettings )
434 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
437 if ( !mFontFamily.isEmpty() )
442 font.setPointSize( mFontSize );
446 font.setPointSize( QLabel().font().pointSize() );
450 font.setPointSize( mFontSize );
453 const int fontSize = settings.
value( u
"qgis/stylesheet/fontPointSize"_s, 10 ).toInt();
454 font.setPointSize( fontSize );
457 font.setBold(
false );
484 setCaretLineVisible(
false );
487 setMarginLineNumbers( 1,
true );
488 setMarginWidth( 1,
"00000" );
489 setMarginType( 1, QsciScintilla::MarginType::TextMarginRightJustified );
491 setEdgeMode( QsciScintilla::EdgeNone );
495void QgsCodeEditor::onLastEditTimeout()
497 mLastEditTimer->stop();
501void QgsCodeEditor::setSciWidget()
507 setCaretLineVisible(
true );
513 setBraceMatching( QsciScintilla::SloppyBraceMatch );
520 setFolding( QsciScintilla::NoFoldStyle );
532 setFoldMarginColors( foldColor, foldColor );
534 setAutoIndent(
true );
535 setIndentationWidth( 4 );
536 setTabIndents(
true );
537 setBackspaceUnindents(
true );
540 setAutoCompletionThreshold( 2 );
541 setAutoCompletionSource( QsciScintilla::AcsAPIs );
548 setWindowTitle( title );
568 return tr(
"Expression" );
572 return tr(
"JavaScript" );
576 return tr(
"Python" );
582 return tr(
"Batch" );
597 marginFont.setPointSize( 10 );
598 setMarginLineNumbers( 0,
true );
599 setMarginsFont( marginFont );
617 marginFont.setPointSize( 10 );
619 setMarginsFont( marginFont );
654void QgsCodeEditor::updateFolding()
661 setFolding( QsciScintilla::PlainFoldStyle );
665 setFolding( QsciScintilla::NoFoldStyle );
670bool QgsCodeEditor::readHistoryFile()
672 if ( mHistoryFilePath.isEmpty() || !QFile::exists( mHistoryFilePath ) )
675 QFile file( mHistoryFilePath );
676 if ( file.open( QIODevice::ReadOnly ) )
678 QTextStream stream( &file );
680 while ( !stream.atEnd() )
682 line = stream.readLine();
683 mHistory.append( line );
692void QgsCodeEditor::syncSoftHistory()
694 mSoftHistory = mHistory;
695 mSoftHistory.append( QString() );
696 mSoftHistoryIndex = mSoftHistory.length() - 1;
701 mSoftHistory[mSoftHistoryIndex] = text();
704void QgsCodeEditor::updateHistory(
const QStringList &commands,
bool skipSoftHistory )
706 if ( commands.size() > 1 )
708 mHistory.append( commands );
710 else if ( !commands.value( 0 ).isEmpty() )
712 const QString command = commands.value( 0 );
713 if ( mHistory.empty() || command != mHistory.constLast() )
714 mHistory.append( command );
717 if ( !skipSoftHistory )
736 QMessageBox::information(
this, title, message );
740 QMessageBox::warning(
this, title, message );
744 QMessageBox::critical(
this, title, message );
753 const QString prompt = mInterpreter->promptForState( mInterpreter->currentState() );
754 SendScintilla( QsciScintilla::SCI_MARGINSETTEXT,
static_cast<uintptr_t
>( 0 ), prompt.toUtf8().constData() );
765 mInterpreter = newInterpreter;
772 const int index = std::min( source.length(), target.length() );
778 int refDistanceMore = d0;
779 int refIndexMore = index;
780 if ( index < source.length() - 1 )
785 if ( newDistance <= refDistanceMore )
787 refDistanceMore = newDistance;
789 if ( refIndexMore == source.length() - 1 )
799 int refDistanceLess = d0;
800 int refIndexLess = index;
806 if ( newDistance <= refDistanceLess )
808 refDistanceLess = newDistance;
810 if ( refIndexLess == 0 )
820 if ( refDistanceMore < refDistanceLess )
832 const QString originalText = text();
835 if ( originalText == newText )
839 const int oldScrollValue = verticalScrollBar()->value();
844 removeSelectedText();
847 verticalScrollBar()->setValue( oldScrollValue );
867 int startLine, startPos, endLine, endPos;
868 if ( hasSelectedText() )
870 getSelection( &startLine, &startPos, &endLine, &endPos );
874 getCursorPosition( &startLine, &startPos );
880 bool allEmpty =
true;
881 bool allCommented =
true;
882 int minIndentation = -1;
883 for (
int line = startLine; line <= endLine; line++ )
885 const QString stripped = text( line ).trimmed();
886 if ( !stripped.isEmpty() )
889 if ( !stripped.startsWith( commentPrefix ) )
891 allCommented =
false;
893 if ( minIndentation == -1 || minIndentation > indentation( line ) )
895 minIndentation = indentation( line );
909 const int prefixLength =
static_cast<int>( commentPrefix.length() );
911 const bool startLineEmpty = ( text( startLine ).trimmed().isEmpty() );
912 const bool endLineEmpty = ( text( endLine ).trimmed().isEmpty() );
914 for (
int line = startLine; line <= endLine; line++ )
916 const QString stripped = text( line ).trimmed();
919 if ( stripped.isEmpty() )
926 insertAt( commentPrefix +
' ', line, minIndentation );
927 delta = -( prefixLength + 1 );
931 if ( !stripped.startsWith( commentPrefix ) )
935 if ( stripped.startsWith( commentPrefix +
' ' ) )
937 delta = prefixLength + 1;
941 delta = prefixLength;
943 setSelection( line, indentation( line ), line, indentation( line ) + delta );
944 removeSelectedText();
949 setSelection( startLine, startPos - ( startLineEmpty ? 0 : delta ), endLine, endPos - ( endLineEmpty ? 0 : delta ) );
958 int lineCount = lines();
961 for (
int line = 0; line < lineCount; line++ )
964 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
966 const long x = SendScintilla( SCI_POINTXFROMPOSITION, 0, endLine );
967 maxWidth = std::max( maxWidth, x );
971 setScrollWidth(
static_cast<int>( maxWidth ) );
976 disconnect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
977 QsciScintilla::setText( text );
978 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
985 return mLastEditTimer->interval();
990 mLastEditTimer->setInterval( timeout );
1003 updateHistory( { command } );
1009 mInterpreter->exec( command );
1028 if ( !mHistoryFilePath.isEmpty() && QFile::exists( mHistoryFilePath ) )
1030 QFile file( mHistoryFilePath );
1031 if ( !file.open( QFile::WriteOnly | QFile::Truncate ) )
1033 QgsDebugError( u
"Could not truncate %1"_s.arg( mHistoryFilePath ) );
1042 if ( mHistoryFilePath.isEmpty() )
1045 QFile f( mHistoryFilePath );
1046 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
1051 QTextStream ts( &f );
1052 for (
const QString &command : std::as_const( mHistory ) )
1054 ts << command +
'\n';
1061 if ( mSoftHistoryIndex < mSoftHistory.length() - 1 && !mSoftHistory.isEmpty() )
1063 mSoftHistoryIndex += 1;
1064 setText( mSoftHistory[mSoftHistoryIndex] );
1071 if ( mSoftHistoryIndex > 0 && !mSoftHistory.empty() )
1073 mSoftHistoryIndex -= 1;
1074 setText( mSoftHistory[mSoftHistoryIndex] );
1082 dialog->setAttribute( Qt::WA_DeleteOnClose );
1085 dialog->activateWindow();
1091 mHistory.removeAt( index );
1092 mSoftHistory.removeAt( index );
1093 if ( index < mSoftHistoryIndex )
1095 mSoftHistoryIndex -= 1;
1096 if ( mSoftHistoryIndex < 0 )
1097 mSoftHistoryIndex = mSoftHistory.length() - 1;
1104 if ( hasSelectedText() )
1106 replaceSelectedText( text );
1111 getCursorPosition( &line, &index );
1112 insertAt( text, line, index );
1113 setCursorPosition( line, index + text.length() );
1123 useDefault = !info.exists();
1126 if ( theme.isEmpty() && useDefault )
1129 const QPalette
pal = qApp->palette();
1134 return pal.color( QPalette::Highlight );
1136 return pal.color( QPalette::HighlightedText );
1141 else if ( theme.isEmpty() )
1146 static const QMap<QgsCodeEditorColorScheme::ColorRole, QString> sColorRoleToIniKey {
1190 return scheme.
color( role );
1198 const QString theme = settings.
value( u
"codeEditor/colorScheme"_s, QString(),
QgsSettings::Gui ).toString();
1203 const QString
color = settings.
value( u
"codeEditor/%1"_s.arg( sColorRoleToSettingsKey.value( role ) ), QString(),
QgsSettings::Gui ).toString();
1211 if (
color.isValid() )
1224 return font.fixedPitch();
1229 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
1232 if ( !fontFamily.isEmpty() )
1239 font.setPointSize( fontSize );
1243 font.setPointSize( QLabel().font().pointSize() );
1247 font.setPointSize( fontSize );
1251 const int fontSize = settings.
value( u
"qgis/stylesheet/fontPointSize"_s, 10 ).toInt();
1252 font.setPointSize( fontSize );
1255 font.setBold(
false );
1262 mUseDefaultSettings =
false;
1263 mOverrideColors = !customColors.isEmpty();
1264 mColorScheme = scheme;
1265 mCustomColors = customColors;
1266 mFontFamily = fontFamily;
1267 mFontSize = fontSize;
1276 markerAdd( lineNumber, MARKER_NUMBER );
1278 font.setItalic(
true );
1280 annotate( lineNumber, warning, styleAnn );
1281 mWarningLines.push_back( lineNumber );
1286 for (
const int line : mWarningLines )
1288 markerDelete( line );
1289 clearAnnotations( line );
1292 mWarningLines.clear();
1299 getCursorPosition( &line, &index );
1300 return line == lines() - 1;
1305 mHistoryFilePath = path;
1311 setCursorPosition( 0, 0 );
1312 ensureCursorVisible();
1313 ensureLineVisible( 0 );
1321 const int endLine = lines() - 1;
1322 const int endLineLength = lineLength( endLine );
1323 setCursorPosition( endLine, endLineLength );
1324 ensureCursorVisible();
1325 ensureLineVisible( endLine );
1333 return static_cast<int>( SendScintilla( SCI_GETCURRENTPOS ) );
1339 lineIndexFromPosition( linearIndex, &line, &index );
1340 setCursorPosition( line, index );
1345 int startLine, startIndex, _;
1346 getSelection( &startLine, &startIndex, &_, &_ );
1347 if ( startLine == -1 )
1351 return positionFromLineIndex( startLine, startIndex );
1356 int endLine, endIndex, _;
1357 getSelection( &_, &_, &endLine, &endIndex );
1358 if ( endLine == -1 )
1362 return positionFromLineIndex( endLine, endIndex );
1367 int startLine, startIndex, endLine, endIndex;
1368 lineIndexFromPosition( start, &startLine, &startIndex );
1369 lineIndexFromPosition( end, &endLine, &endIndex );
1370 setSelection( startLine, startIndex, endLine, endIndex );
1385 if ( wrapMode() == WrapNone )
1397 if ( SendScintilla( SCI_WRAPCOUNT, line ) <= 1 )
1403 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
1405 const long y = SendScintilla( SCI_POINTYFROMPOSITION, 0, endLine );
1407 return static_cast<int>( SendScintilla( SCI_POSITIONFROMPOINT, 0, y ) );
1414 if ( callTipsStyle() == CallTipsNone || lexer() ==
nullptr )
1419 QsciAbstractAPIs *apis = lexer()->apis();
1424 int pos, commas = 0;
1432 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1436 else if ( ch ==
')' )
1442 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1446 else if ( ch ==
'(' && --depth == 0 )
1450 else if ( ch ==
'(' )
1458 SendScintilla( SCI_CALLTIPCANCEL );
1464 int contextStart, lastWordStart;
1465 QStringList context = apiContext( pos, contextStart, lastWordStart );
1467 if ( context.isEmpty() )
1471 context << QString();
1473 QList<int> ctShifts;
1474 QStringList ctEntries = apis->callTips( context, commas, callTipsStyle(), ctShifts );
1476 int nbEntries = ctEntries.count();
1478 if ( nbEntries == 0 )
1481 const int maxNumberOfCallTips = callTipsVisible();
1484 if ( maxNumberOfCallTips > 0 && maxNumberOfCallTips < nbEntries )
1486 ctEntries = ctEntries.mid( 0, maxNumberOfCallTips );
1487 nbEntries = maxNumberOfCallTips;
1493 int nbShifts = ctShifts.count();
1495 if ( maxNumberOfCallTips < 0 && nbEntries > 1 )
1497 shift = ( nbShifts > 0 ? ctShifts.first() : 0 );
1499 ct.prepend(
'\002' );
1503 if ( nbShifts > nbEntries )
1504 nbShifts = nbEntries;
1509 for (
int i = 0; i < nbShifts; ++i )
1511 int sh = ctShifts[i];
1517 ct = ctEntries.join(
"\n" );
1520 QByteArray ctBa = ct.toLatin1();
1521 const char *cts = ctBa.data();
1525 if ( currentWrapPosition != -1 )
1527 SendScintilla( SCI_CALLTIPSHOW, currentWrapPosition, cts );
1535 int ctmin =
static_cast<int>( SendScintilla( SCI_POSITIONFROMLINE, SendScintilla( SCI_LINEFROMPOSITION, ct ) ) );
1536 if ( lastWordStart - shift < ctmin )
1537 lastWordStart = ctmin;
1541 lineIndexFromPosition( lastWordStart, &line, &index );
1542 SendScintilla( SCI_CALLTIPSHOW, positionFromLineIndex( line, index ), cts );
1546 if ( nbEntries > 1 )
1553 astart = strchr( cts,
'(' );
1555 for ( astart = strchr( cts,
',' ); astart && --commas > 0; astart = strchr( astart + 1,
',' ) )
1569 for ( aend = astart; *aend; ++aend )
1573 if ( ch ==
',' && depth == 0 )
1575 else if ( ch ==
'(' )
1577 else if ( ch ==
')' )
1586 if ( astart != aend )
1587 SendScintilla( SCI_CALLTIPSETHLT, astart - cts, aend - cts );
1594char QgsCodeEditor::getCharacter(
int &pos )
const
1599 char ch =
static_cast<char>( SendScintilla( SCI_GETCHARAT, --pos ) );
1602 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 QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
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,...
QgsCodeEditor::Mode mode() const
Returns the code editor mode.
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 const QgsSettingsEntryString * settingFontFamily
Settings entry for code editor font family override.
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.
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.
static const QgsSettingsEntryInteger * settingFontSize
Settings entry for code editor font size override.
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.
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.
static QgsShortcutsManager * shortcutsManager()
Returns the global shortcuts manager, used for managing a QAction and QShortcut sequences.
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...
A boolean settings entry.
An integer 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.
@ CodeReformat
Reformat code.
@ CodeToggleComment
Toggle code comments.
QKeySequence sequenceForCommonAction(CommonAction action) const
Returns the key sequence which is associated with a common action, or an empty sequence if no shortcu...
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)
#define QgsDebugError(str)