void LiteEditorWidget::codeCompleter() { QTextCursor cursor = this->textCursor(); bool isInImport = false; if (m_textLexer->isInStringOrComment(cursor)) { isInImport = m_textLexer->isInImport(cursor); if (!isInImport) { return; } } if (isInImport) { QString completionPrefix = importUnderCursor(textCursor()); m_completer->setCompletionContext(LiteApi::CompleterImportContext); m_completer->setCompletionPrefix(""); m_completer->startCompleter(completionPrefix); } else { QString completionPrefix = textUnderCursor(textCursor()); if (completionPrefix.startsWith(".")) { completionPrefix.insert(0,'@'); } m_completer->setCompletionContext(LiteApi::CompleterCodeContext); m_completer->setCompletionPrefix(""); emit completionPrefixChanged(completionPrefix,true); m_completer->startCompleter(completionPrefix); } }
void LiteEditor::setCompleter(LiteApi::ICompleter *complter) { if (m_completer) { QObject::disconnect(m_completer, 0, m_editorWidget, 0); delete m_completer; m_completer = 0; } m_completer = complter; if (!m_completer) { return; } m_completer->setEditor(m_editorWidget); m_editorWidget->setCompleter(m_completer->completer()); m_extension->addObject("LiteApi.ICompleter",complter); connect(m_editorWidget,SIGNAL(completionPrefixChanged(QString)),m_completer,SLOT(completionPrefixChanged(QString))); connect(m_completer,SIGNAL(wordCompleted(QString,QString)),this,SLOT(updateTip(QString,QString))); }
void LiteEditorWidget::keyPressEvent(QKeyEvent *e) { if (m_completer && m_completer->popup()->isVisible()) { // The following keys are forwarded by the completer to the widget switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: e->ignore(); return; // let the completer do default behavior default: break; } } LiteEditorWidgetBase::keyPressEvent(e); const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); if (!m_completer || (ctrlOrShift && e->text().isEmpty())) return; if (e->modifiers() & Qt::ControlModifier) { m_completer->popup()->hide(); return; } if (e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) { return; } //static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word static QString eow("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); // end of word bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; QString completionPrefix = textUnderCursor(textCursor()); if (completionPrefix.startsWith(".")) { completionPrefix.insert(0,'@'); } if (hasModifier || e->text().isEmpty()|| ( completionPrefix.length() < m_completionPrefixMin && completionPrefix.right(1) != ".") || eow.contains(e->text().right(1))) { m_completer->popup()->hide(); return; } emit completionPrefixChanged(completionPrefix); if (completionPrefix != m_completer->completionPrefix()) { m_completer->setCompletionPrefix(completionPrefix); m_completer->popup()->setCurrentIndex(m_completer->completionModel()->index(0, 0)); } if (m_completer->currentCompletion() == completionPrefix) { m_completer->popup()->hide(); return; } QRect cr = cursorRect(); cr.setWidth(m_completer->popup()->sizeHintForColumn(0) + m_completer->popup()->verticalScrollBar()->sizeHint().width()); m_completer->complete(cr); // popup it up! }
void LiteEditorWidget::keyPressEvent(QKeyEvent *e) { if (!m_completer) { LiteEditorWidgetBase::keyPressEvent(e); return; } if (m_completer->popup()->isVisible()) { // The following keys are forwarded by the completer to the widget switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: case Qt::Key_Shift: e->ignore(); return; // let the completer do default behavior case Qt::Key_N: case Qt::Key_P: if (e->modifiers() == Qt::ControlModifier) { e->ignore(); return; } default: break; } } LiteEditorWidgetBase::keyPressEvent(e); bool isInImport = false; if (m_textLexer->isInStringOrComment(this->textCursor())) { isInImport = m_textLexer->isInImport(this->textCursor()); if (!isInImport) { m_completer->hidePopup(); return; } } const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); //always break if ctrl is pressed and there's a key // if (((e->modifiers() & Qt::ControlModifier) && !e->text().isEmpty())) { // return; // } if (e->modifiers() & Qt::ControlModifier) { if (!e->text().isEmpty()) { m_completer->hidePopup(); } return; } if (e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) { return; } if (e->text().isEmpty()) { if (e->key() != Qt::Key_Backspace) { m_completer->hidePopup(); return; } } //import line if (isInImport) { QString completionPrefix = importUnderCursor(textCursor()); m_completer->setCompletionContext(LiteApi::CompleterImportContext); m_completer->setCompletionPrefix(""); m_completer->startCompleter(completionPrefix); return; } //static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word static QString eow("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); // end of word bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; QString completionPrefix = textUnderCursor(textCursor()); if (completionPrefix.startsWith(".")) { completionPrefix.insert(0,'@'); } if (hasModifier || e->text().isEmpty()|| ( completionPrefix.length() < m_completionPrefixMin && completionPrefix.right(1) != ".") || eow.contains(e->text().right(1))) { if (m_completer->popup()->isVisible()) { m_completer->popup()->hide(); //fmt.Print( -> Print if (e->text() == "(") { QTextCursor cur = textCursor(); cur.movePosition(QTextCursor::Left); QString lastPrefix = textUnderCursor(cur); if (lastPrefix.startsWith(".")) { lastPrefix.insert(0,"@"); } if (!lastPrefix.isEmpty() && lastPrefix == m_completer->completionPrefix() ) { if (lastPrefix == m_completer->currentCompletion() || lastPrefix.endsWith("."+m_completer->currentCompletion())) { m_completer->updateCompleteInfo(m_completer->currentIndex()); } } } } return; } m_completer->setCompletionContext(LiteApi::CompleterCodeContext); emit completionPrefixChanged(completionPrefix,false); m_completer->startCompleter(completionPrefix); }
void LiteEditorWidget::keyPressEvent(QKeyEvent *e) { if (m_completer && m_completer->popup()->isVisible()) { // The following keys are forwarded by the completer to the widget switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: e->ignore(); return; // let the completer do default behavior default: break; } } bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E bool hasControl = e->modifiers() & Qt::ControlModifier; if (!m_completer || !isShortcut) {// do not process the shortcut when we have a completer if (!hasControl) { LiteEditorWidgetBase::keyPressEvent(e); } else { QKeyEvent *evt = new QKeyEvent(e->type(), e->key(), e->modifiers(), ""); QPlainTextEdit::keyPressEvent(evt); delete evt; } } const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); if (!m_completer || (ctrlOrShift && e->text().isEmpty())) return; if (hasControl) { m_completer->popup()->hide(); return; } if (e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) { return; } //static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word static QString eow("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); // end of word bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; QString completionPrefix = textUnderCursor(textCursor()); if (completionPrefix.startsWith(".")) { completionPrefix.insert(0,'@'); } if (!isShortcut && (hasModifier || e->text().isEmpty()|| ( completionPrefix.length() < m_completionPrefixMin && completionPrefix.right(1) != ".") || eow.contains(e->text().right(1)))) { m_completer->popup()->hide(); return; } // Do not pass data to the completer when we're in a spell-checked region if (m_bSpellCheckZoneDontComplete && isSpellCheckingAt(textCursor())) { return; } emit completionPrefixChanged(completionPrefix); if (completionPrefix != m_completer->completionPrefix()) { m_completer->setCompletionPrefix(completionPrefix); m_completer->popup()->setCurrentIndex(m_completer->completionModel()->index(0, 0)); } if (m_completer->currentCompletion() == completionPrefix) { m_completer->popup()->hide(); return; } QRect cr = cursorRect(); cr.setWidth(m_completer->popup()->sizeHintForColumn(0) + m_completer->popup()->verticalScrollBar()->sizeHint().width()); m_completer->complete(cr); // popup it up! }