forked from qt-creator/qt-creator
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:
committed by
Orgad Shaneh
parent
c9a851c649
commit
1cfca29696
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user