10 #include <QPushButton>
21 :
QTextEdit(parent), mStandardPrompt(
">>> "), mCompoundPrompt(
"... "), mInputPrompt(
"==> "),
22 mPromptBlockNumber(0), mPromptLength(0), mPromptEndPosition(0), mCompoundPromptEndPosition(0),
23 mPromptType(Standard), mInCompletion(false), mCurrentCompoundInput(
""), mCurrentInput(
""), mCurrentHistoryIndex(-1), mCurrentCompleterIndex(0),
26 this->
document()->setMaximumBlockCount(1000);
44 void PythonConsole::handleStyleChanged(
int istyle)
50 void PythonConsole::keyPressEventInputMode(
QKeyEvent *e)
52 mCurrentHistoryIndex = -1;
67 if (
textCursor().selectionStart() < mPromptEndPosition)
71 mInCompletion =
false;
99 keyPressEventInputMode(e);
109 mCurrentHistoryIndex = -1;
115 if (
textCursor().selectionStart() >= mPromptEndPosition)
126 if (
textCursor().selectionStart() > mPromptEndPosition)
147 cursor.setPosition(mPromptEndPosition);
153 if (
textCursor().selectionStart() >= mPromptEndPosition)
164 if (
textCursor().selectionStart() > mPromptEndPosition)
174 cursor.setPosition(mPromptEndPosition);
195 if (
textCursor().selectionStart() < mPromptEndPosition)
199 mInCompletion =
false;
200 mCurrentHistoryIndex = -1;
262 cursor.setCharFormat(format);
266 cursor.insertText(mCompoundPrompt);
267 if (mCompoundPromptEndPosition < 0)
269 mCompoundPromptEndPosition = mPromptEndPosition;
273 cursor.insertText(mStandardPrompt);
274 mCompoundPromptEndPosition = -1;
277 cursor.insertText(mInputPrompt);
278 mCompoundPromptEndPosition = -1;
285 mPromptLength = mStandardPrompt.
length();
291 mAbortThreadWidget->
stop();
300 if (!
input.isEmpty())
303 mHistory->addHistory(
input.toStdString());
307 mCurrentCompoundInput +=
input;
317 mCurrentCompoundInput =
"";
318 mAbortThreadWidget->
start();
322 mCurrentCompoundInput +=
input +
"\n";
326 mHistory->updateFromFile();
333 cursor.setPosition(mPromptEndPosition);
344 cursor.setPosition(mPromptEndPosition);
346 cursor.insertText(new_command);
353 cursor.insertText(appendix);
365 auto lastIndex = mHistory->size() - 1;
372 if (mCurrentHistoryIndex == -1)
375 mCurrentHistoryIndex = lastIndex;
380 if (mCurrentHistoryIndex == 0)
385 mCurrentHistoryIndex--;
392 auto lastIndex = mHistory->size() - 1;
394 if (mCurrentHistoryIndex == -1)
399 if (mCurrentHistoryIndex == lastIndex)
401 mCurrentHistoryIndex = -1;
406 mCurrentHistoryIndex++;
422 mCurrentInput +=
"\t";
440 else if (r.size() > 1)
442 mInCompletion =
true;
449 candidates += candidate +
" ";
450 for (
int i = 0; i < matching_prefix.
size() && i < completion.size(); ++i)
452 if (matching_prefix[i] != completion[i])
454 matching_prefix = matching_prefix.
mid(0, i);
468 return mAbortThreadWidget;
473 :
QFrame(parent), mCount(0)
479 mLabel =
new QLabel(
this);
486 mTimer =
new QTimer(
this);
490 void PythonConsoleAbortThread::handleAbortButton()
493 log_info(
"gui",
"Python console command execution aborted by user");
497 void PythonConsoleAbortThread::handleTimeout()
505 mLabel->
setText(
QString(
"Python interpreter running for %1 seconds").arg(mCount));
static SettingsItemDropdown * sSettingStyle
PythonConsoleAbortThread(QWidget *parent=nullptr)
Stores the history of python commands.
void handleThreadFinished()
void mousePressEvent(QMouseEvent *event) override
PythonConsole(QWidget *parent=nullptr)
void keyPressEvent(QKeyEvent *e) override
void handleUpKeyPressed()
void setInputMode(bool state)
void handleTabKeyPressed()
void inputReceived(QString input)
virtual void clear() override
virtual void handleStdout(const QString &output) override
PythonConsoleAbortThread * abortThreadWidget()
void handleDownKeyPressed()
QString getCurrentCommand()
void replaceCurrentCommand(const QString &new_command)
void insertAtEnd(const QString &text, QColor textColor)
virtual void handleError(const QString &output) override
void appendToCurrentCommand(const QString &new_command)
static PythonConsoleQssAdapter * instance()
std::vector< std::tuple< std::string, std::string > > complete(const QString &text, bool use_console_context)
int checkCompleteStatement(const QString &text)
bool isThreadRunning() const
void interpretBackground(QObject *caller, const QString &input, bool multiple_expressions=false)
void setConsole(PythonConsole *console)
void interpretForeground(const QString &input)
void intChanged(int value)
#define log_info(channel,...)
void setMarginWidth(QLayout *layout, int marginWidth)
PythonContext * gPythonContext
void setFrameStyle(int style)
bool matches(QKeySequence::StandardKey key) const const
Qt::KeyboardModifiers modifiers() const const
void setText(const QString &)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const const
QString fromStdString(const std::string &str)
bool isEmpty() const const
QString mid(int position, int n) const const
std::string toStdString() const const
int position() const const
void ensureCursorVisible()
void setHtml(const QString &text)
void insertPlainText(const QString &text)
virtual void keyPressEvent(QKeyEvent *e) override
virtual void mousePressEvent(QMouseEvent *e) override
void moveCursor(QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode)
void setTextColor(const QColor &c)
void setTextCursor(const QTextCursor &cursor)
QColor textColor() const const
QTextCursor textCursor() const const
void setUndoRedoEnabled(bool enable)
void setForeground(const QBrush &brush)