34#include <QFontDatabase>
40#include <Qsci/qscilexer.h>
41#include <Qsci/qscistyle.h>
43#include "moc_qgscodeeditor.cpp"
50QMap<QgsCodeEditorColorScheme::ColorRole, QString> QgsCodeEditor::sColorRoleToSettingsKey {
90 : QsciScintilla( parent )
91 , mWidgetTitle( title )
96 if ( !parent && mWidgetTitle.isEmpty() )
98 setWindowTitle( QStringLiteral(
"Text Editor" ) );
102 setWindowTitle( mWidgetTitle );
108 mSoftHistory.append( QString() );
111 setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded );
113 SendScintilla( SCI_SETADDITIONALSELECTIONTYPING, 1 );
114 SendScintilla( SCI_SETMULTIPASTE, 1 );
115 SendScintilla( SCI_SETVIRTUALSPACEOPTIONS, SCVS_RECTANGULARSELECTION );
120 setAnnotationDisplay( QsciScintilla::AnnotationBoxed );
135 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
137 setWrapMode( QsciScintilla::WrapCharacter );
144 SendScintilla( QsciScintilla::SCI_SETHSCROLLBAR, 0 );
146 setWrapMode( QsciScintilla::WrapCharacter );
147 SendScintilla( QsciScintilla::SCI_EMPTYUNDOBUFFER );
152#if QSCINTILLA_VERSION < 0x020d03
153 installEventFilter(
this );
156 mLastEditTimer =
new QTimer(
this );
157 mLastEditTimer->setSingleShot(
true );
158 mLastEditTimer->setInterval( 1000 );
159 connect( mLastEditTimer, &QTimer::timeout,
this, &QgsCodeEditor::onLastEditTimeout );
160 connect(
this, &QgsCodeEditor::textChanged, mLastEditTimer, qOverload<>( &QTimer::start ) );
166#if QSCINTILLA_VERSION >= 0x020800 && QSCINTILLA_VERSION < 0x020900
167 if (
event->reason() != Qt::ActiveWindowFocusReason )
181 QFocusEvent newFocusEvent( QEvent::FocusOut, Qt::ActiveWindowFocusReason );
182 QsciScintilla::focusOutEvent( &newFocusEvent );
187 QsciScintilla::focusOutEvent(
event );
197 if ( isListActive() )
199 QsciScintilla::keyPressEvent(
event );
203 if (
event->key() == Qt::Key_Escape )
206 QWidget::keyPressEvent(
event );
210 if (
event->matches( QKeySequence::StandardKey::HelpContents ) )
213 QString text = selectedText();
218 text = wordAtPoint( mapFromGlobal( QCursor::pos() ) );
222 if ( text.isEmpty() )
225 getCursorPosition( &line, &index );
226 text = wordAtLineIndex( line, index );
235 switch (
event->key() )
260 if ( !isReadOnly() && canReformat )
263 if ( !reformatCodeSequence.isEmpty() && reformatCodeSequence.matches(
event->key() |
event->modifiers() ) )
273 if ( !isReadOnly() && canToggle )
276 if ( !toggleCommentCodeSequence.isEmpty() && toggleCommentCodeSequence.matches(
event->key() |
event->modifiers() ) )
284 QsciScintilla::keyPressEvent(
event );
287 if ( !
event->isAutoRepeat() )
299 QMenu *menu = createStandardContextMenu();
300 menu->setAttribute( Qt::WA_DeleteOnClose );
304 menu->addSeparator();
309 QAction *reformatAction =
new QAction( tr(
"Reformat Code" ), menu );
312 reformatAction->setEnabled( !isReadOnly() );
314 menu->addAction( reformatAction );
319 QAction *syntaxCheckAction =
new QAction( tr(
"Check Syntax" ), menu );
322 menu->addAction( syntaxCheckAction );
327 QAction *toggleCommentAction =
new QAction( tr(
"Toggle Comment" ), menu );
329 toggleCommentAction->setIcon(
QgsApplication::getThemeIcon( QStringLiteral(
"console/iconCommentEditorConsole.svg" ), palette().
color( QPalette::ColorRole::WindowText ) ) );
330 toggleCommentAction->setEnabled( !isReadOnly() );
332 menu->addAction( toggleCommentAction );
337 menu->exec( mapToGlobal(
event->pos() ) );
343 QMenu *menu =
new QMenu(
this );
344 QMenu *historySubMenu =
new QMenu( tr(
"Command History" ), menu );
350 menu->addMenu( historySubMenu );
351 menu->addSeparator();
353 QAction *copyAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditCopy.svg" ), tr(
"Copy" ),
this, &QgsCodeEditor::copy, QKeySequence::Copy );
354 QAction *pasteAction = menu->addAction(
QgsApplication::getThemeIcon(
"mActionEditPaste.svg" ), tr(
"Paste" ),
this, &QgsCodeEditor::paste, QKeySequence::Paste );
355 copyAction->setEnabled( hasSelectedText() );
356 pasteAction->setEnabled( !QApplication::clipboard()->text().isEmpty() );
360 menu->exec( mapToGlobal(
event->pos() ) );
365 QsciScintilla::contextMenuEvent(
event );
372 if (
event->type() == QEvent::ShortcutOverride )
374 if ( QKeyEvent *keyEvent =
dynamic_cast<QKeyEvent *
>(
event ) )
376 if ( keyEvent->matches( QKeySequence::StandardKey::HelpContents ) )
385 return QsciScintilla::event(
event );
390#if QSCINTILLA_VERSION < 0x020d03
391 if ( watched ==
this &&
event->type() == QEvent::InputMethod )
400 return QsciScintilla::eventFilter( watched,
event );
409 if ( mUseDefaultSettings )
410 return color( role );
412 if ( !mOverrideColors )
418 const QColor
color = mCustomColors.value( role );
425 if ( mUseDefaultSettings )
428 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
431 if ( !mFontFamily.isEmpty() )
436 font.setPointSize( mFontSize );
440 font.setPointSize( QLabel().font().pointSize() );
444 font.setPointSize( mFontSize );
447 const int fontSize = settings.
value( QStringLiteral(
"qgis/stylesheet/fontPointSize" ), 10 ).toInt();
448 font.setPointSize( fontSize );
451 font.setBold(
false );
478 setCaretLineVisible(
false );
481 setMarginLineNumbers( 1,
true );
482 setMarginWidth( 1,
"00000" );
483 setMarginType( 1, QsciScintilla::MarginType::TextMarginRightJustified );
485 setEdgeMode( QsciScintilla::EdgeNone );
489void QgsCodeEditor::onLastEditTimeout()
491 mLastEditTimer->stop();
495void QgsCodeEditor::setSciWidget()
501 setCaretLineVisible(
true );
507 setBraceMatching( QsciScintilla::SloppyBraceMatch );
514 setFolding( QsciScintilla::NoFoldStyle );
526 setFoldMarginColors( foldColor, foldColor );
528 setAutoIndent(
true );
529 setIndentationWidth( 4 );
530 setTabIndents(
true );
531 setBackspaceUnindents(
true );
534 setAutoCompletionThreshold( 2 );
535 setAutoCompletionSource( QsciScintilla::AcsAPIs );
542 setWindowTitle( title );
562 return tr(
"Expression" );
566 return tr(
"JavaScript" );
570 return tr(
"Python" );
576 return tr(
"Batch" );
591 marginFont.setPointSize( 10 );
592 setMarginLineNumbers( 0,
true );
593 setMarginsFont( marginFont );
611 marginFont.setPointSize( 10 );
613 setMarginsFont( marginFont );
648void QgsCodeEditor::updateFolding()
655 setFolding( QsciScintilla::PlainFoldStyle );
659 setFolding( QsciScintilla::NoFoldStyle );
664bool QgsCodeEditor::readHistoryFile()
666 if ( mHistoryFilePath.isEmpty() || !QFile::exists( mHistoryFilePath ) )
669 QFile file( mHistoryFilePath );
670 if ( file.open( QIODevice::ReadOnly ) )
672 QTextStream stream( &file );
673#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
675 stream.setCodec(
"UTF-8" );
678 while ( !stream.atEnd() )
680 line = stream.readLine();
681 mHistory.append( line );
690void QgsCodeEditor::syncSoftHistory()
692 mSoftHistory = mHistory;
693 mSoftHistory.append( QString() );
694 mSoftHistoryIndex = mSoftHistory.length() - 1;
699 mSoftHistory[mSoftHistoryIndex] = text();
702void QgsCodeEditor::updateHistory(
const QStringList &commands,
bool skipSoftHistory )
704 if ( commands.size() > 1 )
706 mHistory.append( commands );
708 else if ( !commands.value( 0 ).isEmpty() )
710 const QString command = commands.value( 0 );
711 if ( mHistory.empty() || command != mHistory.constLast() )
712 mHistory.append( command );
715 if ( !skipSoftHistory )
735 QMessageBox::information(
this, title, message );
739 QMessageBox::warning(
this, title, message );
743 QMessageBox::critical(
this, title, message );
752 const QString prompt = mInterpreter->promptForState( mInterpreter->currentState() );
753 SendScintilla( QsciScintilla::SCI_MARGINSETTEXT,
static_cast<uintptr_t
>( 0 ), prompt.toUtf8().constData() );
764 mInterpreter = newInterpreter;
771 const int index = std::min( source.length(), target.length() );
777 int refDistanceMore = d0;
778 int refIndexMore = index;
779 if ( index < source.length() - 1 )
784 if ( newDistance <= refDistanceMore )
786 refDistanceMore = newDistance;
788 if ( refIndexMore == source.length() - 1 )
798 int refDistanceLess = d0;
799 int refIndexLess = index;
805 if ( newDistance <= refDistanceLess )
807 refDistanceLess = newDistance;
809 if ( refIndexLess == 0 )
819 if ( refDistanceMore < refDistanceLess )
831 const QString originalText = text();
834 if ( originalText == newText )
838 const int oldScrollValue = verticalScrollBar()->value();
843 removeSelectedText();
846 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( QStringLiteral(
"Could not truncate %1" ).arg( mHistoryFilePath ) );
1042 if ( mHistoryFilePath.isEmpty() )
1045 QFile f( mHistoryFilePath );
1046 if ( !f.open( QFile::WriteOnly | QIODevice::Truncate ) )
1051 QTextStream ts( &f );
1052#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
1053 ts.setCodec(
"UTF-8" );
1055 for (
const QString &command : std::as_const( mHistory ) )
1057 ts << command +
'\n';
1064 if ( mSoftHistoryIndex < mSoftHistory.length() - 1 && !mSoftHistory.isEmpty() )
1066 mSoftHistoryIndex += 1;
1067 setText( mSoftHistory[mSoftHistoryIndex] );
1074 if ( mSoftHistoryIndex > 0 && !mSoftHistory.empty() )
1076 mSoftHistoryIndex -= 1;
1077 setText( mSoftHistory[mSoftHistoryIndex] );
1085 dialog->setAttribute( Qt::WA_DeleteOnClose );
1088 dialog->activateWindow();
1094 mHistory.removeAt( index );
1095 mSoftHistory.removeAt( index );
1096 if ( index < mSoftHistoryIndex )
1098 mSoftHistoryIndex -= 1;
1099 if ( mSoftHistoryIndex < 0 )
1100 mSoftHistoryIndex = mSoftHistory.length() - 1;
1107 if ( hasSelectedText() )
1109 replaceSelectedText( text );
1114 getCursorPosition( &line, &index );
1115 insertAt( text, line, index );
1116 setCursorPosition( line, index + text.length() );
1125 const QPalette
pal = qApp->palette();
1130 return pal.color( QPalette::Highlight );
1132 return pal.color( QPalette::HighlightedText );
1137 else if ( theme.isEmpty() )
1142 static const QMap<QgsCodeEditorColorScheme::ColorRole, QString> sColorRoleToIniKey {
1186 return scheme.
color( role );
1192 if ( !settings.
value( QStringLiteral(
"codeEditor/overrideColors" ),
false,
QgsSettings::Gui ).toBool() )
1194 const QString theme = settings.
value( QStringLiteral(
"codeEditor/colorScheme" ), QString(),
QgsSettings::Gui ).toString();
1199 const QString
color = settings.
value( QStringLiteral(
"codeEditor/%1" ).arg( sColorRoleToSettingsKey.value( role ) ), QString(),
QgsSettings::Gui ).toString();
1207 if (
color.isValid() )
1213 settings.
remove( QStringLiteral(
"codeEditor/%1" ).arg( sColorRoleToSettingsKey.value( role ) ),
QgsSettings::Gui );
1220 return font.fixedPitch();
1225 QFont font = QFontDatabase::systemFont( QFontDatabase::FixedFont );
1228 if ( !settings.
value( QStringLiteral(
"codeEditor/fontfamily" ), QString(),
QgsSettings::Gui ).toString().isEmpty() )
1231 const int fontSize = settings.
value( QStringLiteral(
"codeEditor/fontsize" ), 0,
QgsSettings::Gui ).toInt();
1235 font.setPointSize( fontSize );
1239 font.setPointSize( QLabel().font().pointSize() );
1243 font.setPointSize( fontSize );
1246 const int fontSize = settings.
value( QStringLiteral(
"qgis/stylesheet/fontPointSize" ), 10 ).toInt();
1247 font.setPointSize( fontSize );
1250 font.setBold(
false );
1257 mUseDefaultSettings =
false;
1258 mOverrideColors = !customColors.isEmpty();
1259 mColorScheme = scheme;
1260 mCustomColors = customColors;
1261 mFontFamily = fontFamily;
1262 mFontSize = fontSize;
1271 markerAdd( lineNumber, MARKER_NUMBER );
1273 font.setItalic(
true );
1275 annotate( lineNumber, warning, styleAnn );
1276 mWarningLines.push_back( lineNumber );
1281 for (
const int line : mWarningLines )
1283 markerDelete( line );
1284 clearAnnotations( line );
1287 mWarningLines.clear();
1294 getCursorPosition( &line, &index );
1295 return line == lines() - 1;
1300 mHistoryFilePath = path;
1306 setCursorPosition( 0, 0 );
1307 ensureCursorVisible();
1308 ensureLineVisible( 0 );
1316 const int endLine = lines() - 1;
1317 const int endLineLength = lineLength( endLine );
1318 setCursorPosition( endLine, endLineLength );
1319 ensureCursorVisible();
1320 ensureLineVisible( endLine );
1328 return static_cast<int>( SendScintilla( SCI_GETCURRENTPOS ) );
1334 lineIndexFromPosition( linearIndex, &line, &index );
1335 setCursorPosition( line, index );
1340 int startLine, startIndex, _;
1341 getSelection( &startLine, &startIndex, &_, &_ );
1342 if ( startLine == -1 )
1346 return positionFromLineIndex( startLine, startIndex );
1351 int endLine, endIndex, _;
1352 getSelection( &_, &_, &endLine, &endIndex );
1353 if ( endLine == -1 )
1357 return positionFromLineIndex( endLine, endIndex );
1362 int startLine, startIndex, endLine, endIndex;
1363 lineIndexFromPosition( start, &startLine, &startIndex );
1364 lineIndexFromPosition( end, &endLine, &endIndex );
1365 setSelection( startLine, startIndex, endLine, endIndex );
1380 if ( wrapMode() == WrapNone )
1392 if ( SendScintilla( SCI_WRAPCOUNT, line ) <= 1 )
1398 const long endLine = SendScintilla( SCI_GETLINEENDPOSITION, line );
1400 const long y = SendScintilla( SCI_POINTYFROMPOSITION, 0, endLine );
1402 return static_cast<int>( SendScintilla( SCI_POSITIONFROMPOINT, 0, y ) );
1409 if ( callTipsStyle() == CallTipsNone || lexer() ==
nullptr )
1414 QsciAbstractAPIs *apis = lexer()->apis();
1419 int pos, commas = 0;
1427 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1431 else if ( ch ==
')' )
1437 while ( ( ch = getCharacter( pos ) ) !=
'\0' )
1441 else if ( ch ==
'(' && --depth == 0 )
1445 else if ( ch ==
'(' )
1453 SendScintilla( SCI_CALLTIPCANCEL );
1459 int contextStart, lastWordStart;
1460 QStringList context = apiContext( pos, contextStart, lastWordStart );
1462 if ( context.isEmpty() )
1466 context << QString();
1468 QList<int> ctShifts;
1469 QStringList ctEntries = apis->callTips( context, commas, callTipsStyle(), ctShifts );
1471 int nbEntries = ctEntries.count();
1473 if ( nbEntries == 0 )
1476 const int maxNumberOfCallTips = callTipsVisible();
1479 if ( maxNumberOfCallTips > 0 && maxNumberOfCallTips < nbEntries )
1481 ctEntries = ctEntries.mid( 0, maxNumberOfCallTips );
1482 nbEntries = maxNumberOfCallTips;
1488 int nbShifts = ctShifts.count();
1490 if ( maxNumberOfCallTips < 0 && nbEntries > 1 )
1492 shift = ( nbShifts > 0 ? ctShifts.first() : 0 );
1494 ct.prepend(
'\002' );
1498 if ( nbShifts > nbEntries )
1499 nbShifts = nbEntries;
1504 for (
int i = 0; i < nbShifts; ++i )
1506 int sh = ctShifts[i];
1512 ct = ctEntries.join(
"\n" );
1515 QByteArray ctBa = ct.toLatin1();
1516 const char *cts = ctBa.data();
1520 if ( currentWrapPosition != -1 )
1522 SendScintilla( SCI_CALLTIPSHOW, currentWrapPosition, cts );
1530 int ctmin =
static_cast<int>( SendScintilla( SCI_POSITIONFROMLINE, SendScintilla( SCI_LINEFROMPOSITION, ct ) ) );
1531 if ( lastWordStart - shift < ctmin )
1532 lastWordStart = ctmin;
1536 lineIndexFromPosition( lastWordStart, &line, &index );
1537 SendScintilla( SCI_CALLTIPSHOW, positionFromLineIndex( line, index ), cts );
1541 if ( nbEntries > 1 )
1548 astart = strchr( cts,
'(' );
1550 for ( astart = strchr( cts,
',' ); astart && --commas > 0; astart = strchr( astart + 1,
',' ) )
1564 for ( aend = astart; *aend; ++aend )
1568 if ( ch ==
',' && depth == 0 )
1570 else if ( ch ==
'(' )
1572 else if ( ch ==
')' )
1581 if ( astart != aend )
1582 SendScintilla( SCI_CALLTIPSETHLT, astart - cts, aend - cts );
1589char QgsCodeEditor::getCharacter(
int &pos )
const
1594 char ch =
static_cast<char>( SendScintilla( SCI_GETCHARAT, --pos ) );
1597 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,...
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 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.
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.
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)