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 );
123 SendScintilla( SCI_SETADDITIONALSELECTIONTYPING, 1 );
124 SendScintilla( SCI_SETMULTIPASTE, 1 );
125 SendScintilla( SCI_SETVIRTUALSPACEOPTIONS, SCVS_RECTANGULARSELECTION );
131 setAnnotationDisplay( QsciScintilla::AnnotationBoxed );
146 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
148 setWrapMode( QsciScintilla::WrapCharacter );
155 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
157 setWrapMode( QsciScintilla::WrapCharacter );
158 SendScintilla( QsciScintilla::SCI_EMPTYUNDOBUFFER );
163#if QSCINTILLA_VERSION < 0x020d03
164 installEventFilter(
this );
167 mLastEditTimer =
new QTimer(
this );
168 mLastEditTimer->setSingleShot(
true );
169 mLastEditTimer->setInterval( 1000 );
170 connect( mLastEditTimer, &QTimer::timeout,
this, &QgsCodeEditor::onLastEditTimeout );
171 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
173 SendScintilla( SCI_STYLECLEARALL );
179#if QSCINTILLA_VERSION >= 0x020800 && QSCINTILLA_VERSION < 0x020900
180 if (
event->reason() != Qt::ActiveWindowFocusReason )
194 QFocusEvent newFocusEvent( QEvent::FocusOut, Qt::ActiveWindowFocusReason );
195 QsciScintilla::focusOutEvent( &newFocusEvent );
200 QsciScintilla::focusOutEvent(
event );
210 if ( isListActive() )
212 QsciScintilla::keyPressEvent(
event );
216 if (
event->key() == Qt::Key_Escape )
219 QWidget::keyPressEvent(
event );
223 if (
event->matches( QKeySequence::StandardKey::HelpContents ) )
226 QString text = selectedText();
231 text = wordAtPoint( mapFromGlobal( QCursor::pos() ) );
235 if ( text.isEmpty() )
238 getCursorPosition( &line, &index );
239 text = wordAtLineIndex( line, index );
248 switch (
event->key() )
273 if ( !isReadOnly() && canReformat )
276 if ( !reformatCodeSequence.isEmpty() && reformatCodeSequence.matches(
event->key() |
event->modifiers() ) )
286 if ( !isReadOnly() && canToggle )
289 if ( !toggleCommentCodeSequence.isEmpty() && toggleCommentCodeSequence.matches(
event->key() |
event->modifiers() ) )
297 QsciScintilla::keyPressEvent(
event );
300 if ( !
event->isAutoRepeat() )
312 QMenu *menu = createStandardContextMenu();
313 menu->setAttribute( Qt::WA_DeleteOnClose );
317 menu->addSeparator();
322 QAction *reformatAction =
new QAction( tr(
"Reformat Code" ), menu );
325 reformatAction->setEnabled( !isReadOnly() );
327 menu->addAction( reformatAction );
332 QAction *syntaxCheckAction =
new QAction( tr(
"Check Syntax" ), menu );
335 menu->addAction( syntaxCheckAction );
340 QAction *toggleCommentAction =
new QAction( tr(
"Toggle Comment" ), menu );
343 toggleCommentAction->setEnabled( !isReadOnly() );
345 menu->addAction( toggleCommentAction );
350 menu->exec( mapToGlobal(
event->pos() ) );
356 QMenu *menu =
new QMenu(
this );
357 QMenu *historySubMenu =
new QMenu( tr(
"Command History" ), menu );
363 menu->addMenu( historySubMenu );
364 menu->addSeparator();
366 QAction *copyAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditCopy.svg" ), tr(
"Copy" ),
this, &QgsCodeEditor::copy, QKeySequence::Copy );
367 QAction *pasteAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditPaste.svg" ), tr(
"Paste" ),
this, &QgsCodeEditor::paste, QKeySequence::Paste );
368 copyAction->setEnabled( hasSelectedText() );
369 pasteAction->setEnabled( !QApplication::clipboard()->text().isEmpty() );
373 menu->exec( mapToGlobal(
event->pos() ) );
378 QsciScintilla::contextMenuEvent(
event );
385 if (
event->type() == QEvent::ShortcutOverride )
387 if ( QKeyEvent *keyEvent =
dynamic_cast<QKeyEvent *
>(
event ) )
389 if ( keyEvent->matches( QKeySequence::StandardKey::HelpContents ) )
398 return QsciScintilla::event(
event );
403#if QSCINTILLA_VERSION < 0x020d03
404 if ( watched ==
this &&
event->type() == QEvent::InputMethod )
413 return QsciScintilla::eventFilter( watched,
event );
421 if ( mUseDefaultSettings )
422 return color( role );
424 if ( !mOverrideColors )
430 const QColor
color = mCustomColors.value( role );
437 if ( mUseDefaultSettings )
440 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
443 if ( !mFontFamily.isEmpty() )
448 font.setPointSize( mFontSize );
452 font.setPointSize( QLabel().font().pointSize() );
456 font.setPointSize( mFontSize );
459 const int fontSize = settings.
value( u
"qgis/stylesheet/fontPointSize"_s, 10 ).toInt();
460 font.setPointSize( fontSize );
463 font.setBold(
false );
490 setCaretLineVisible(
false );
493 setMarginLineNumbers( 1,
true );
494 setMarginWidth( 1,
"00000" );
495 setMarginType( 1, QsciScintilla::MarginType::TextMarginRightJustified );
497 setEdgeMode( QsciScintilla::EdgeNone );
501void QgsCodeEditor::onLastEditTimeout()
503 mLastEditTimer->stop();
507void QgsCodeEditor::setSciWidget()
513 setCaretLineVisible(
true );
519 setBraceMatching( QsciScintilla::SloppyBraceMatch );
526 setFolding( QsciScintilla::NoFoldStyle );
538 setFoldMarginColors( foldColor, foldColor );
540 setAutoIndent(
true );
541 setIndentationWidth( 4 );
542 setTabIndents(
true );
543 setBackspaceUnindents(
true );
546 setAutoCompletionThreshold( 2 );
547 setAutoCompletionSource( QsciScintilla::AcsAPIs );
554 setWindowTitle( title );
574 return tr(
"Expression" );
578 return tr(
"JavaScript" );
582 return tr(
"Python" );
588 return tr(
"Batch" );
603 marginFont.setPointSize( 10 );
604 setMarginLineNumbers( 0,
true );
605 setMarginsFont( marginFont );
623 marginFont.setPointSize( 10 );
625 setMarginsFont( marginFont );
660void QgsCodeEditor::updateFolding()
667 setFolding( QsciScintilla::PlainFoldStyle );
671 setFolding( QsciScintilla::NoFoldStyle );
676bool QgsCodeEditor::readHistoryFile()
678 if ( mHistoryFilePath.isEmpty() || !QFile::exists( mHistoryFilePath ) )
681 QFile file( mHistoryFilePath );
682 if ( file.open( QIODevice::ReadOnly ) )
684 QTextStream stream( &file );
686 while ( !stream.atEnd() )
688 line = stream.readLine();
689 mHistory.append( line );
698void QgsCodeEditor::syncSoftHistory()
700 mSoftHistory = mHistory;
701 mSoftHistory.append( QString() );
702 mSoftHistoryIndex = mSoftHistory.length() - 1;
707 mSoftHistory[mSoftHistoryIndex] = text();
710void QgsCodeEditor::updateHistory(
const QStringList &commands,
bool skipSoftHistory )
712 if ( commands.size() > 1 )
714 mHistory.append( commands );
716 else if ( !commands.value( 0 ).isEmpty() )
718 const QString command = commands.value( 0 );
719 if ( mHistory.empty() || command != mHistory.constLast() )
720 mHistory.append( command );
723 if ( !skipSoftHistory )
742 QMessageBox::information(
this, title, message );
746 QMessageBox::warning(
this, title, message );
750 QMessageBox::critical(
this, title, message );
759 const QString prompt = mInterpreter->promptForState( mInterpreter->currentState() );
760 SendScintilla( QsciScintilla::SCI_MARGINSETTEXT,
static_cast<uintptr_t
>( 0 ), prompt.toUtf8().constData() );
771 mInterpreter = newInterpreter;
778 const int index = std::min( source.length(), target.length() );
784 int refDistanceMore = d0;
785 int refIndexMore = index;
786 if ( index < source.length() - 1 )
791 if ( newDistance <= refDistanceMore )
793 refDistanceMore = newDistance;
795 if ( refIndexMore == source.length() - 1 )
805 int refDistanceLess = d0;
806 int refIndexLess = index;
812 if ( newDistance <= refDistanceLess )
814 refDistanceLess = newDistance;
816 if ( refIndexLess == 0 )
826 if ( refDistanceMore < refDistanceLess )
838 const QString originalText = text();
841 if ( originalText == newText )
845 const int oldScrollValue = verticalScrollBar()->value();
850 removeSelectedText();
853 verticalScrollBar()->setValue( oldScrollValue );
873 int startLine, startPos, endLine, endPos;
874 if ( hasSelectedText() )
876 getSelection( &startLine, &startPos, &endLine, &endPos );
880 getCursorPosition( &startLine, &startPos );
886 bool allEmpty =
true;
887 bool allCommented =
true;
888 int minIndentation = -1;
889 for (
int line = startLine; line <= endLine; line++ )
891 const QString stripped = text( line ).trimmed();
892 if ( !stripped.isEmpty() )
895 if ( !stripped.startsWith( commentPrefix ) )
897 allCommented =
false;
899 if ( minIndentation == -1 || minIndentation > indentation( line ) )
901 minIndentation = indentation( line );
915 const int prefixLength =
static_cast<int>( commentPrefix.length() );
917 const bool startLineEmpty = ( text( startLine ).trimmed().isEmpty() );
918 const bool endLineEmpty = ( text( endLine ).trimmed().isEmpty() );
920 for (
int line = startLine; line <= endLine; line++ )
922 const QString stripped = text( line ).trimmed();
925 if ( stripped.isEmpty() )
932 insertAt( commentPrefix +
' ', line, minIndentation );
933 delta = -( prefixLength + 1 );
937 if ( !stripped.startsWith( commentPrefix ) )
941 if ( stripped.startsWith( commentPrefix +
' ' ) )
943 delta = prefixLength + 1;
947 delta = prefixLength;
949 setSelection( line, indentation( line ), line, indentation( line ) + delta );
950 removeSelectedText();
955 setSelection( startLine, startPos - ( startLineEmpty ? 0 : delta ), endLine, endPos - ( endLineEmpty ? 0 : delta ) );
964 int lineCount = lines();
967 for (
int line = 0; line < lineCount; line++ )
970 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
972 const long x = SendScintilla( SCI_POINTXFROMPOSITION, 0, endLine );
973 maxWidth = std::max( maxWidth, x );
977 setScrollWidth(
static_cast<int>( maxWidth ) );
982 disconnect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
983 QsciScintilla::setText( text );
984 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
991 return mLastEditTimer->interval();
996 mLastEditTimer->setInterval( timeout );
1009 updateHistory( { command } );
1015 mInterpreter->exec( command );
1034 if ( !mHistoryFilePath.isEmpty() && QFile::exists( mHistoryFilePath ) )
1036 QFile file( mHistoryFilePath );
1037 if ( !file.open( QFile::WriteOnly | QFile::Truncate ) )
1039 QgsDebugError( u
"Could not truncate %1"_s.arg( mHistoryFilePath ) );
1048 if ( mHistoryFilePath.isEmpty() )
1051 QFile f( mHistoryFilePath );
1052 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
1057 QTextStream ts( &f );
1058 for (
const QString &command : std::as_const( mHistory ) )
1060 ts << command +
'\n';
1067 if ( mSoftHistoryIndex < mSoftHistory.length() - 1 && !mSoftHistory.isEmpty() )
1069 mSoftHistoryIndex += 1;
1070 setText( mSoftHistory[mSoftHistoryIndex] );
1077 if ( mSoftHistoryIndex > 0 && !mSoftHistory.empty() )
1079 mSoftHistoryIndex -= 1;
1080 setText( mSoftHistory[mSoftHistoryIndex] );
1088 dialog->setAttribute( Qt::WA_DeleteOnClose );
1091 dialog->activateWindow();
1097 mHistory.removeAt( index );
1098 mSoftHistory.removeAt( index );
1099 if ( index < mSoftHistoryIndex )
1101 mSoftHistoryIndex -= 1;
1102 if ( mSoftHistoryIndex < 0 )
1103 mSoftHistoryIndex = mSoftHistory.length() - 1;
1110 if ( hasSelectedText() )
1112 replaceSelectedText( text );
1117 getCursorPosition( &line, &index );
1118 insertAt( text, line, index );
1119 setCursorPosition( line, index + text.length() );
1129 useDefault = !info.exists();
1132 if ( theme.isEmpty() && useDefault )
1135 const QPalette
pal = qApp->palette();
1140 return pal.color( QPalette::Highlight );
1142 return pal.color( QPalette::HighlightedText );
1147 else if ( theme.isEmpty() )
1152 static const QMap<QgsCodeEditorColorScheme::ColorRole, QString> sColorRoleToIniKey {
1196 return scheme.
color( role );
1204 const QString theme = settings.
value( u
"codeEditor/colorScheme"_s, QString(),
QgsSettings::Gui ).toString();
1209 const QString
color = settings.
value( u
"codeEditor/%1"_s.arg( sColorRoleToSettingsKey.value( role ) ), QString(),
QgsSettings::Gui ).toString();
1217 if (
color.isValid() )
1230 return font.fixedPitch();
1235 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
1238 if ( !fontFamily.isEmpty() )
1245 font.setPointSize( fontSize );
1249 font.setPointSize( QLabel().font().pointSize() );
1253 font.setPointSize( fontSize );
1257 const int fontSize = settings.
value( u
"qgis/stylesheet/fontPointSize"_s, 10 ).toInt();
1258 font.setPointSize( fontSize );
1261 font.setBold(
false );
1268 mUseDefaultSettings =
false;
1269 mOverrideColors = !customColors.isEmpty();
1270 mColorScheme = scheme;
1271 mCustomColors = customColors;
1272 mFontFamily = fontFamily;
1273 mFontSize = fontSize;
1282 markerAdd( lineNumber, MARKER_NUMBER );
1284 font.setItalic(
true );
1286 annotate( lineNumber, warning, styleAnn );
1287 mWarningLines.push_back( lineNumber );
1292 for (
const int line : mWarningLines )
1294 markerDelete( line );
1295 clearAnnotations( line );
1298 mWarningLines.clear();
1305 getCursorPosition( &line, &index );
1306 return line == lines() - 1;
1311 mHistoryFilePath = path;
1317 setCursorPosition( 0, 0 );
1318 ensureCursorVisible();
1319 ensureLineVisible( 0 );
1327 const int endLine = lines() - 1;
1328 const int endLineLength = lineLength( endLine );
1329 setCursorPosition( endLine, endLineLength );
1330 ensureCursorVisible();
1331 ensureLineVisible( endLine );
1339 return static_cast<int>( SendScintilla( SCI_GETCURRENTPOS ) );
1345 lineIndexFromPosition( linearIndex, &line, &index );
1346 setCursorPosition( line, index );
1351 int startLine, startIndex, _;
1352 getSelection( &startLine, &startIndex, &_, &_ );
1353 if ( startLine == -1 )
1357 return positionFromLineIndex( startLine, startIndex );
1362 int endLine, endIndex, _;
1363 getSelection( &_, &_, &endLine, &endIndex );
1364 if ( endLine == -1 )
1368 return positionFromLineIndex( endLine, endIndex );
1373 int startLine, startIndex, endLine, endIndex;
1374 lineIndexFromPosition( start, &startLine, &startIndex );
1375 lineIndexFromPosition( end, &endLine, &endIndex );
1376 setSelection( startLine, startIndex, endLine, endIndex );
1391 if ( wrapMode() == WrapNone )
1403 if ( SendScintilla( SCI_WRAPCOUNT, line ) <= 1 )
1409 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
1411 const long y = SendScintilla( SCI_POINTYFROMPOSITION, 0, endLine );
1413 return static_cast<int>( SendScintilla( SCI_POSITIONFROMPOINT, 0, y ) );
1420 if ( callTipsStyle() == CallTipsNone || lexer() ==
nullptr )
1425 QsciAbstractAPIs *apis = lexer()->apis();
1430 int pos, commas = 0;
1438 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1442 else if ( ch ==
')' )
1448 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1452 else if ( ch ==
'(' && --depth == 0 )
1456 else if ( ch ==
'(' )
1464 SendScintilla( SCI_CALLTIPCANCEL );
1470 int contextStart, lastWordStart;
1471 QStringList context = apiContext( pos, contextStart, lastWordStart );
1473 if ( context.isEmpty() )
1477 context << QString();
1479 QList<int> ctShifts;
1480 QStringList ctEntries = apis->callTips( context, commas, callTipsStyle(), ctShifts );
1482 int nbEntries = ctEntries.count();
1484 if ( nbEntries == 0 )
1487 const int maxNumberOfCallTips = callTipsVisible();
1490 if ( maxNumberOfCallTips > 0 && maxNumberOfCallTips < nbEntries )
1492 ctEntries = ctEntries.mid( 0, maxNumberOfCallTips );
1493 nbEntries = maxNumberOfCallTips;
1499 int nbShifts = ctShifts.count();
1501 if ( maxNumberOfCallTips < 0 && nbEntries > 1 )
1503 shift = ( nbShifts > 0 ? ctShifts.first() : 0 );
1505 ct.prepend(
'\002' );
1509 if ( nbShifts > nbEntries )
1510 nbShifts = nbEntries;
1515 for (
int i = 0; i < nbShifts; ++i )
1517 int sh = ctShifts[i];
1523 ct = ctEntries.join(
"\n" );
1526 QByteArray ctBa = ct.toLatin1();
1527 const char *cts = ctBa.data();
1531 if ( currentWrapPosition != -1 )
1533 SendScintilla( SCI_CALLTIPSHOW, currentWrapPosition, cts );
1541 int ctmin =
static_cast<int>( SendScintilla( SCI_POSITIONFROMLINE, SendScintilla( SCI_LINEFROMPOSITION, ct ) ) );
1542 if ( lastWordStart - shift < ctmin )
1543 lastWordStart = ctmin;
1547 lineIndexFromPosition( lastWordStart, &line, &index );
1548 SendScintilla( SCI_CALLTIPSHOW, positionFromLineIndex( line, index ), cts );
1552 if ( nbEntries > 1 )
1559 astart = strchr( cts,
'(' );
1561 for ( astart = strchr( cts,
',' ); astart && --commas > 0; astart = strchr( astart + 1,
',' ) )
1575 for ( aend = astart; *aend; ++aend )
1579 if ( ch ==
',' && depth == 0 )
1581 else if ( ch ==
'(' )
1583 else if ( ch ==
')' )
1592 if ( astart != aend )
1593 SendScintilla( SCI_CALLTIPSETHLT, astart - cts, aend - cts );
1600char QgsCodeEditor::getCharacter(
int &pos )
const
1605 char ch =
static_cast<char>( SendScintilla( SCI_GETCHARAT, --pos ) );
1608 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)