TextEditor: Do not trigger autocomplete after user aborts...

... for the same function

Task-number: QTCREATORBUG-5748
Change-Id: Iadf5be76c24f95cf057c2112a8248bea2a9e20cf
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Orgad Shaneh
2013-09-12 00:21:12 +03:00
committed by Orgad Shaneh
parent c9a851c649
commit 1cfca29696
4 changed files with 33 additions and 4 deletions

View File

@@ -40,6 +40,7 @@
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <texteditor/texteditorsettings.h> #include <texteditor/texteditorsettings.h>
#include <texteditor/completionsettings.h> #include <texteditor/completionsettings.h>
#include <coreplugin/editormanager/editormanager.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -113,6 +114,8 @@ private slots:
void finalizeProposal(); void finalizeProposal();
void automaticProposalTimeout(); void automaticProposalTimeout();
void updateCompletionSettings(const TextEditor::CompletionSettings &settings); void updateCompletionSettings(const TextEditor::CompletionSettings &settings);
void explicitlyAborted();
void clearAbortedPosition();
private: private:
CodeAssistant *m_q; CodeAssistant *m_q;
@@ -127,6 +130,7 @@ private:
bool m_receivedContentWhileWaiting; bool m_receivedContentWhileWaiting;
QTimer m_automaticProposalTimer; QTimer m_automaticProposalTimer;
CompletionSettings m_settings; CompletionSettings m_settings;
int m_abortedBasePosition;
static const QChar m_null; static const QChar m_null;
}; };
@@ -148,6 +152,7 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
, m_proposalWidget(0) , m_proposalWidget(0)
, m_receivedContentWhileWaiting(false) , m_receivedContentWhileWaiting(false)
, m_settings(TextEditorSettings::instance()->completionSettings()) , m_settings(TextEditorSettings::instance()->completionSettings())
, m_abortedBasePosition(-1)
{ {
m_automaticProposalTimer.setSingleShot(true); m_automaticProposalTimer.setSingleShot(true);
m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval); m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval);
@@ -157,6 +162,8 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)), SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)),
this, this,
SLOT(updateCompletionSettings(TextEditor::CompletionSettings))); SLOT(updateCompletionSettings(TextEditor::CompletionSettings)));
connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
this, SLOT(clearAbortedPosition()));
} }
CodeAssistantPrivate::~CodeAssistantPrivate() CodeAssistantPrivate::~CodeAssistantPrivate()
@@ -307,33 +314,41 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR
destroyContext(); destroyContext();
} }
if (m_textEditor->position() < proposalCandidate->basePosition()) int basePosition = proposalCandidate->basePosition();
if (m_textEditor->position() < basePosition)
return; return;
if (m_abortedBasePosition == basePosition && reason != ExplicitlyInvoked)
return;
clearAbortedPosition();
m_proposal.reset(proposalCandidate.take()); m_proposal.reset(proposalCandidate.take());
if (m_proposal->isCorrective()) if (m_proposal->isCorrective())
m_proposal->makeCorrection(m_textEditor); m_proposal->makeCorrection(m_textEditor);
basePosition = m_proposal->basePosition();
m_proposalWidget = m_proposal->createWidget(); m_proposalWidget = m_proposal->createWidget();
connect(m_proposalWidget, SIGNAL(destroyed()), this, SLOT(finalizeProposal())); connect(m_proposalWidget, SIGNAL(destroyed()), this, SLOT(finalizeProposal()));
connect(m_proposalWidget, SIGNAL(prefixExpanded(QString)), connect(m_proposalWidget, SIGNAL(prefixExpanded(QString)),
this, SLOT(handlePrefixExpansion(QString))); this, SLOT(handlePrefixExpansion(QString)));
connect(m_proposalWidget, SIGNAL(proposalItemActivated(IAssistProposalItem*)), connect(m_proposalWidget, SIGNAL(proposalItemActivated(IAssistProposalItem*)),
this, SLOT(processProposalItem(IAssistProposalItem*))); this, SLOT(processProposalItem(IAssistProposalItem*)));
connect(m_proposalWidget, SIGNAL(explicitlyAborted()),
this, SLOT(explicitlyAborted()));
m_proposalWidget->setAssistant(m_q); m_proposalWidget->setAssistant(m_q);
m_proposalWidget->setReason(reason); m_proposalWidget->setReason(reason);
m_proposalWidget->setKind(m_assistKind); m_proposalWidget->setKind(m_assistKind);
m_proposalWidget->setUnderlyingWidget(m_textEditor->widget()); m_proposalWidget->setUnderlyingWidget(m_textEditor->widget());
m_proposalWidget->setModel(m_proposal->model()); m_proposalWidget->setModel(m_proposal->model());
m_proposalWidget->setDisplayRect(m_textEditor->cursorRect(m_proposal->basePosition())); m_proposalWidget->setDisplayRect(m_textEditor->cursorRect(basePosition));
if (m_receivedContentWhileWaiting) if (m_receivedContentWhileWaiting)
m_proposalWidget->setIsSynchronized(false); m_proposalWidget->setIsSynchronized(false);
else else
m_proposalWidget->setIsSynchronized(true); m_proposalWidget->setIsSynchronized(true);
m_proposalWidget->showProposal(m_textEditor->textDocument()->textAt( m_proposalWidget->showProposal(m_textEditor->textDocument()->textAt(
m_proposal->basePosition(), basePosition,
m_textEditor->position() - m_proposal->basePosition())); m_textEditor->position() - basePosition));
} }
void CodeAssistantPrivate::processProposalItem(IAssistProposalItem *proposalItem) void CodeAssistantPrivate::processProposalItem(IAssistProposalItem *proposalItem)
@@ -465,6 +480,17 @@ void CodeAssistantPrivate::updateCompletionSettings(const TextEditor::Completion
m_settings = settings; m_settings = settings;
} }
void CodeAssistantPrivate::explicitlyAborted()
{
QTC_ASSERT(m_proposal, return);
m_abortedBasePosition = m_proposal->basePosition();
}
void CodeAssistantPrivate::clearAbortedPosition()
{
m_abortedBasePosition = -1;
}
bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e) bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e)
{ {
Q_UNUSED(o); Q_UNUSED(o);

View File

@@ -215,6 +215,7 @@ bool FunctionHintProposalWidget::eventFilter(QObject *obj, QEvent *e)
case QEvent::KeyRelease: case QEvent::KeyRelease:
if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && d->m_escapePressed) { if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && d->m_escapePressed) {
abort(); abort();
emit explicitlyAborted();
return false; return false;
} }
d->m_assistant->notifyChange(); d->m_assistant->notifyChange();

View File

@@ -571,6 +571,7 @@ bool GenericProposalWidget::eventFilter(QObject *o, QEvent *e)
switch (ke->key()) { switch (ke->key()) {
case Qt::Key_Escape: case Qt::Key_Escape:
abort(); abort();
emit explicitlyAborted();
e->accept(); e->accept();
return true; return true;

View File

@@ -65,6 +65,7 @@ public:
signals: signals:
void prefixExpanded(const QString &newPrefix); void prefixExpanded(const QString &newPrefix);
void proposalItemActivated(IAssistProposalItem *proposalItem); void proposalItemActivated(IAssistProposalItem *proposalItem);
void explicitlyAborted();
}; };
} // TextEditor } // TextEditor