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)