25 this->setAcceptRichText(
false);
31 auto *treePopup =
new QTreeView;
33 treePopup->setRootIsDecorated(
false);
34 treePopup->setMinimumWidth(300);
35 treePopup->setMinimumHeight(50);
36 treePopup->setItemsExpandable(
true);
37 treePopup->setWordWrap(
true);
40 completer->setCompletionMode(QCompleter::PopupCompletion);
41 completer->setCaseSensitivity(Qt::CaseInsensitive);
48 this->horizontalScrollBar()->setObjectName(
"exprTextEdit_horizontalBar");
49 this->verticalScrollBar()->setObjectName(
"exprTextEdit_verticalBar");
109 if (e->key() == Qt::Key_Return && e->modifiers() == Qt::ControlModifier) {
112 }
else if (e->key() == Qt::Key_F4) {
115 }
else if (e->key() == Qt::Key_Backspace && e->modifiers() == Qt::ControlModifier) {
127 case Qt::Key_Backtab:
136 bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E);
138 QTextEdit::keyPressEvent(e);
140 const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier);
141 if (!
completer || (ctrlOrShift && e->text().isEmpty()))
144 bool hasModifier = (e->modifiers() != Qt::NoModifier) && ~(e->modifiers() & Qt::KeypadModifier) && !ctrlOrShift;
147 QTextCursor tc = textCursor();
148 tc.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor);
149 QString line = tc.selectedText();
152 static QRegularExpression completion(QStringLiteral(
"^(?:.*[^A-Za-z0-9_$])?((?:\\$[A-Za-z0-9_]*)|[A-Za-z]+[A-Za-z0-9_]*)$"));
153 QRegularExpressionMatch match;
154 int index = line.indexOf(completion, 0, &match);
155 QString completionPrefix;
156 if (index != -1 && !line.contains(QLatin1Char(
'#'))) {
157 completionPrefix = match.captured(1);
162 if (!isShortcut && (hasModifier || e->text().isEmpty() || completionPrefix.length() < 1 || index == -1)) {
166 if (completionPrefix !=
completer->completionPrefix()) {
167 completer->setCompletionPrefix(completionPrefix);
172 QRect cr = cursorRect();
173 cr.setWidth(
completer->popup()->sizeHintForColumn(0) +
completer->popup()->sizeHintForColumn(1) +
completer->popup()->verticalScrollBar()->sizeHint().width());
181 static QRegularExpression inFunction(QStringLiteral(
"^(?:.*[^A-Za-z0-9_$])?([A-Za-z0-9_]+)\\([^()]*$"));
182 int index2 = line.indexOf(inFunction, 0, &match);
184 QString functionName = match.captured(1);
186 QString tip = QString(tr(
"<b>%1</b>")).arg(tips[0]);
187 for (
int i = 1; i < tips.size(); i++) {
188 tip += QString(tr(
"<br>%1")).arg(tips[i]);
200 QMenu *menu = createStandardContextMenu();
202 if (!menu->actions().empty()) {
203 QAction *f = menu->actions().first();
205 menu->insertSeparator(f);
208 menu->exec(event->globalPos());
236 QTextCursor tc = textCursor();
237 int extra = completion.length() -
completer->completionPrefix().length();
238 tc.movePosition(QTextCursor::Left);
239 tc.movePosition(QTextCursor::EndOfWord);
240 tc.insertText(completion.right(extra));
void paintEvent(QPaintEvent *e) override
void showTip(const QString &string)
void contextMenuEvent(QContextMenuEvent *event) override
void keyPressEvent(QKeyEvent *e) override
void insertCompletion(const QString &completion)
ExprCompletionModel * completionModel
void focusInEvent(QFocusEvent *e) override
QStyle * lastStyleForHighlighter
void wheelEvent(QWheelEvent *e) override
void focusOutEvent(QFocusEvent *e) override
void mouseDoubleClickEvent(QMouseEvent *event) override
QAction * _popupEnabledAction
ExprTextEdit(QWidget *parent=nullptr)
ExprHighlighter * highlighter
void mousePressEvent(QMouseEvent *event) override