TextEditor: Make automatic completion timeout configurable

Allow to configure the timeout in the range from 0 to 500ms.

Task-number: QTCREATORBUG-13393
Change-Id: I3e421109db919ab0dd5d63b8cbb9339fce132dbb
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2014-12-05 09:59:15 +01:00
parent 949a86f035
commit ec6c13d02c
8 changed files with 126 additions and 80 deletions

View File

@@ -64,6 +64,10 @@ QWidget *CompletionSettingsPage::widget()
m_page = new Ui::CompletionSettingsPage; m_page = new Ui::CompletionSettingsPage;
m_page->setupUi(m_widget); m_page->setupUi(m_widget);
connect(m_page->completionTrigger,
static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &CompletionSettingsPage::onCompletionTriggerChanged);
const TextEditor::CompletionSettings &settings = const TextEditor::CompletionSettings &settings =
TextEditor::TextEditorSettings::completionSettings(); TextEditor::TextEditorSettings::completionSettings();
@@ -95,6 +99,7 @@ QWidget *CompletionSettingsPage::widget()
m_page->caseSensitivity->setCurrentIndex(caseSensitivityIndex); m_page->caseSensitivity->setCurrentIndex(caseSensitivityIndex);
m_page->completionTrigger->setCurrentIndex(completionTriggerIndex); m_page->completionTrigger->setCurrentIndex(completionTriggerIndex);
m_page->automaticProposalTimeoutSpinBox->setValue(settings.m_automaticProposalTimeoutInMs);
m_page->autoInsertBrackets->setChecked(settings.m_autoInsertBrackets); m_page->autoInsertBrackets->setChecked(settings.m_autoInsertBrackets);
m_page->surroundSelectedText->setChecked(settings.m_surroundingAutoBrackets); m_page->surroundSelectedText->setChecked(settings.m_surroundingAutoBrackets);
m_page->partiallyComplete->setChecked(settings.m_partiallyComplete); m_page->partiallyComplete->setChecked(settings.m_partiallyComplete);
@@ -115,6 +120,7 @@ void CompletionSettingsPage::apply()
TextEditor::CompletionSettings settings; TextEditor::CompletionSettings settings;
settings.m_caseSensitivity = caseSensitivity(); settings.m_caseSensitivity = caseSensitivity();
settings.m_completionTrigger = completionTrigger(); settings.m_completionTrigger = completionTrigger();
settings.m_automaticProposalTimeoutInMs = m_page->automaticProposalTimeoutSpinBox->value();
settings.m_autoInsertBrackets = m_page->autoInsertBrackets->isChecked(); settings.m_autoInsertBrackets = m_page->autoInsertBrackets->isChecked();
settings.m_surroundingAutoBrackets = m_page->surroundSelectedText->isChecked(); settings.m_surroundingAutoBrackets = m_page->surroundSelectedText->isChecked();
settings.m_partiallyComplete = m_page->partiallyComplete->isChecked(); settings.m_partiallyComplete = m_page->partiallyComplete->isChecked();
@@ -158,6 +164,13 @@ TextEditor::CompletionTrigger CompletionSettingsPage::completionTrigger() const
} }
} }
void CompletionSettingsPage::onCompletionTriggerChanged()
{
const bool enableTimeoutWidgets = completionTrigger() == TextEditor::AutomaticCompletion;
m_page->automaticProposalTimeoutLabel->setEnabled(enableTimeoutWidgets);
m_page->automaticProposalTimeoutSpinBox->setEnabled(enableTimeoutWidgets);
}
void CompletionSettingsPage::finish() void CompletionSettingsPage::finish()
{ {
delete m_widget; delete m_widget;

View File

@@ -66,6 +66,8 @@ private:
TextEditor::CaseSensitivity caseSensitivity() const; TextEditor::CaseSensitivity caseSensitivity() const;
TextEditor::CompletionTrigger completionTrigger() const; TextEditor::CompletionTrigger completionTrigger() const;
void onCompletionTriggerChanged();
bool requireCommentsSettingsUpdate() const; bool requireCommentsSettingsUpdate() const;
Ui::CompletionSettingsPage *m_page; Ui::CompletionSettingsPage *m_page;

View File

@@ -17,10 +17,10 @@
<string>Behavior</string> <string>Behavior</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="4" column="0"> <item row="5" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
@@ -36,53 +36,17 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="surroundSelectedText"> <widget class="QCheckBox" name="spaceAfterFunctionName">
<property name="toolTip"> <property name="enabled">
<string>When typing a matching character and there is a text selection, instead of removing the selection, surrounds it with the corresponding characters.</string> <bool>true</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Surround &amp;text selections</string> <string>Insert &amp;space after function name</string>
</property>
<property name="checked">
<bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="2" colspan="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>70</width>
<height>24</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="completionTriggerLabel">
<property name="text">
<string>Activate completion:</string>
</property>
</widget>
</item>
<item row="1" column="3">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>24</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="caseSensitivityLabel"> <widget class="QLabel" name="caseSensitivityLabel">
<property name="text"> <property name="text">
@@ -118,6 +82,39 @@
</item> </item>
</widget> </widget>
</item> </item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>30</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="surroundSelectedText">
<property name="toolTip">
<string>When typing a matching character and there is a text selection, instead of removing the selection, surrounds it with the corresponding characters.</string>
</property>
<property name="text">
<string>Surround &amp;text selections</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0"> <item row="6" column="0">
<widget class="QCheckBox" name="autoSplitStrings"> <widget class="QCheckBox" name="autoSplitStrings">
<property name="toolTip"> <property name="toolTip">
@@ -130,6 +127,32 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="5">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>24</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2" colspan="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>70</width>
<height>24</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1" colspan="2"> <item row="1" column="1" colspan="2">
<widget class="QComboBox" name="completionTrigger"> <widget class="QComboBox" name="completionTrigger">
<item> <item>
@@ -149,6 +172,13 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
</item> </item>
</widget> </widget>
</item> </item>
<item row="1" column="3">
<widget class="QLabel" name="automaticProposalTimeoutLabel">
<property name="text">
<string>Timeout in ms:</string>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QCheckBox" name="partiallyComplete"> <widget class="QCheckBox" name="partiallyComplete">
<property name="toolTip"> <property name="toolTip">
@@ -162,6 +192,13 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QLabel" name="completionTriggerLabel">
<property name="text">
<string>Activate completion:</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2"> <item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="autoInsertBrackets"> <widget class="QCheckBox" name="autoInsertBrackets">
<property name="toolTip"> <property name="toolTip">
@@ -175,37 +212,20 @@ In addition, Shift+Enter inserts an escape character at the cursor position and
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="1" column="4">
<layout class="QHBoxLayout" name="horizontalLayout_2"> <widget class="QSpinBox" name="automaticProposalTimeoutSpinBox">
<item> <property name="maximum">
<spacer name="horizontalSpacer_4"> <number>500</number>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeType"> <property name="singleStep">
<enum>QSizePolicy::Fixed</enum> <number>50</number>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="value">
<size> <number>400</number>
<width>30</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="spaceAfterFunctionName">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Insert &amp;space after function name</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item>

View File

@@ -82,7 +82,7 @@ public:
void startAutomaticProposalTimer(); void startAutomaticProposalTimer();
void automaticProposalTimeout(); void automaticProposalTimeout();
void clearAbortedPosition(); void clearAbortedPosition();
void updateCompletionSettings(const TextEditor::CompletionSettings &settings); void updateFromCompletionSettings(const TextEditor::CompletionSettings &settings);
virtual bool eventFilter(QObject *o, QEvent *e); virtual bool eventFilter(QObject *o, QEvent *e);
@@ -115,8 +115,6 @@ private:
// -------------------- // --------------------
const QChar CodeAssistantPrivate::m_null; const QChar CodeAssistantPrivate::m_null;
static const int AutomaticProposalTimerInterval = 400;
CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant) CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
: q(assistant) : q(assistant)
, m_editorWidget(0) , m_editorWidget(0)
@@ -125,17 +123,14 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
, m_assistKind(TextEditor::Completion) , m_assistKind(TextEditor::Completion)
, m_proposalWidget(0) , m_proposalWidget(0)
, m_receivedContentWhileWaiting(false) , m_receivedContentWhileWaiting(false)
, m_settings(TextEditorSettings::completionSettings())
, m_abortedBasePosition(-1) , m_abortedBasePosition(-1)
{ {
m_automaticProposalTimer.setSingleShot(true); m_automaticProposalTimer.setSingleShot(true);
m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval);
connect(&m_automaticProposalTimer, &QTimer::timeout, connect(&m_automaticProposalTimer, &QTimer::timeout,
this, &CodeAssistantPrivate::automaticProposalTimeout); this, &CodeAssistantPrivate::automaticProposalTimeout);
connect(TextEditorSettings::instance(), &TextEditorSettings::completionSettingsChanged, connect(TextEditorSettings::instance(), &TextEditorSettings::completionSettingsChanged,
this, &CodeAssistantPrivate::updateCompletionSettings); this, &CodeAssistantPrivate::updateFromCompletionSettings);
connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged,
this, &CodeAssistantPrivate::clearAbortedPosition); this, &CodeAssistantPrivate::clearAbortedPosition);
@@ -456,9 +451,11 @@ void CodeAssistantPrivate::stopAutomaticProposalTimer()
m_automaticProposalTimer.stop(); m_automaticProposalTimer.stop();
} }
void CodeAssistantPrivate::updateCompletionSettings(const TextEditor::CompletionSettings &settings) void CodeAssistantPrivate::updateFromCompletionSettings(
const TextEditor::CompletionSettings &settings)
{ {
m_settings = settings; m_settings = settings;
m_automaticProposalTimer.setInterval(m_settings.m_automaticProposalTimeoutInMs);
} }
void CodeAssistantPrivate::explicitlyAborted() void CodeAssistantPrivate::explicitlyAborted()
@@ -520,6 +517,11 @@ void CodeAssistant::configure(TextEditorWidget *editorWidget)
d->configure(editorWidget); d->configure(editorWidget);
} }
void CodeAssistant::updateFromCompletionSettings(const CompletionSettings &settings)
{
d->updateFromCompletionSettings(settings);
}
void CodeAssistant::process() void CodeAssistant::process()
{ {
d->process(); d->process();

View File

@@ -40,6 +40,7 @@
namespace TextEditor { namespace TextEditor {
class CodeAssistantPrivate; class CodeAssistantPrivate;
class CompletionSettings;
class IAssistProvider; class IAssistProvider;
class TextEditorWidget; class TextEditorWidget;
@@ -52,6 +53,7 @@ public:
~CodeAssistant(); ~CodeAssistant();
void configure(TextEditorWidget *editorWidget); void configure(TextEditorWidget *editorWidget);
void updateFromCompletionSettings(const TextEditor::CompletionSettings &settings);
void process(); void process();
void notifyChange(); void notifyChange();

View File

@@ -35,6 +35,7 @@
static const char groupPostfix[] = "Completion"; static const char groupPostfix[] = "Completion";
static const char caseSensitivityKey[] = "CaseSensitivity"; static const char caseSensitivityKey[] = "CaseSensitivity";
static const char completionTriggerKey[] = "CompletionTrigger"; static const char completionTriggerKey[] = "CompletionTrigger";
static const char automaticProposalTimeoutKey[] = "AutomaticProposalTimeout";
static const char autoInsertBracesKey[] = "AutoInsertBraces"; static const char autoInsertBracesKey[] = "AutoInsertBraces";
static const char surroundingAutoBracketsKey[] = "SurroundingAutoBrackets"; static const char surroundingAutoBracketsKey[] = "SurroundingAutoBrackets";
static const char partiallyCompleteKey[] = "PartiallyComplete"; static const char partiallyCompleteKey[] = "PartiallyComplete";
@@ -46,6 +47,7 @@ using namespace TextEditor;
CompletionSettings::CompletionSettings() CompletionSettings::CompletionSettings()
: m_caseSensitivity(CaseInsensitive) : m_caseSensitivity(CaseInsensitive)
, m_completionTrigger(AutomaticCompletion) , m_completionTrigger(AutomaticCompletion)
, m_automaticProposalTimeoutInMs(400)
, m_autoInsertBrackets(true) , m_autoInsertBrackets(true)
, m_surroundingAutoBrackets(true) , m_surroundingAutoBrackets(true)
, m_partiallyComplete(true) , m_partiallyComplete(true)
@@ -63,6 +65,7 @@ void CompletionSettings::toSettings(const QString &category, QSettings *s) const
s->beginGroup(group); s->beginGroup(group);
s->setValue(QLatin1String(caseSensitivityKey), (int) m_caseSensitivity); s->setValue(QLatin1String(caseSensitivityKey), (int) m_caseSensitivity);
s->setValue(QLatin1String(completionTriggerKey), (int) m_completionTrigger); s->setValue(QLatin1String(completionTriggerKey), (int) m_completionTrigger);
s->setValue(QLatin1String(automaticProposalTimeoutKey), m_automaticProposalTimeoutInMs);
s->setValue(QLatin1String(autoInsertBracesKey), m_autoInsertBrackets); s->setValue(QLatin1String(autoInsertBracesKey), m_autoInsertBrackets);
s->setValue(QLatin1String(surroundingAutoBracketsKey), m_surroundingAutoBrackets); s->setValue(QLatin1String(surroundingAutoBracketsKey), m_surroundingAutoBrackets);
s->setValue(QLatin1String(partiallyCompleteKey), m_partiallyComplete); s->setValue(QLatin1String(partiallyCompleteKey), m_partiallyComplete);
@@ -82,6 +85,7 @@ void CompletionSettings::fromSettings(const QString &category, const QSettings *
m_caseSensitivity = (CaseSensitivity) s->value(group + QLatin1String(caseSensitivityKey), m_caseSensitivity).toInt(); m_caseSensitivity = (CaseSensitivity) s->value(group + QLatin1String(caseSensitivityKey), m_caseSensitivity).toInt();
m_completionTrigger = (CompletionTrigger) s->value(group + QLatin1String(completionTriggerKey), m_completionTrigger).toInt(); m_completionTrigger = (CompletionTrigger) s->value(group + QLatin1String(completionTriggerKey), m_completionTrigger).toInt();
m_automaticProposalTimeoutInMs = s->value(group + QLatin1String(automaticProposalTimeoutKey), m_automaticProposalTimeoutInMs).toInt();
m_autoInsertBrackets = s->value(group + QLatin1String(autoInsertBracesKey), m_autoInsertBrackets).toBool(); m_autoInsertBrackets = s->value(group + QLatin1String(autoInsertBracesKey), m_autoInsertBrackets).toBool();
m_surroundingAutoBrackets = s->value(group + QLatin1String(surroundingAutoBracketsKey), m_surroundingAutoBrackets).toBool(); m_surroundingAutoBrackets = s->value(group + QLatin1String(surroundingAutoBracketsKey), m_surroundingAutoBrackets).toBool();
m_partiallyComplete = s->value(group + QLatin1String(partiallyCompleteKey), m_partiallyComplete).toBool(); m_partiallyComplete = s->value(group + QLatin1String(partiallyCompleteKey), m_partiallyComplete).toBool();
@@ -93,6 +97,7 @@ bool CompletionSettings::equals(const CompletionSettings &cs) const
{ {
return m_caseSensitivity == cs.m_caseSensitivity return m_caseSensitivity == cs.m_caseSensitivity
&& m_completionTrigger == cs.m_completionTrigger && m_completionTrigger == cs.m_completionTrigger
&& m_automaticProposalTimeoutInMs == cs.m_automaticProposalTimeoutInMs
&& m_autoInsertBrackets == cs.m_autoInsertBrackets && m_autoInsertBrackets == cs.m_autoInsertBrackets
&& m_surroundingAutoBrackets == cs.m_surroundingAutoBrackets && m_surroundingAutoBrackets == cs.m_surroundingAutoBrackets
&& m_partiallyComplete == cs.m_partiallyComplete && m_partiallyComplete == cs.m_partiallyComplete

View File

@@ -66,6 +66,7 @@ public:
CaseSensitivity m_caseSensitivity; CaseSensitivity m_caseSensitivity;
CompletionTrigger m_completionTrigger; CompletionTrigger m_completionTrigger;
int m_automaticProposalTimeoutInMs;
bool m_autoInsertBrackets; bool m_autoInsertBrackets;
bool m_surroundingAutoBrackets; bool m_surroundingAutoBrackets;
bool m_partiallyComplete; bool m_partiallyComplete;

View File

@@ -6210,6 +6210,7 @@ void TextEditorWidget::setCompletionSettings(const CompletionSettings &completio
d->m_autoCompleter->setAutoParenthesesEnabled(completionSettings.m_autoInsertBrackets); d->m_autoCompleter->setAutoParenthesesEnabled(completionSettings.m_autoInsertBrackets);
d->m_autoCompleter->setSurroundWithEnabled(completionSettings.m_autoInsertBrackets d->m_autoCompleter->setSurroundWithEnabled(completionSettings.m_autoInsertBrackets
&& completionSettings.m_surroundingAutoBrackets); && completionSettings.m_surroundingAutoBrackets);
d->m_codeAssistant.updateFromCompletionSettings(completionSettings);
} }
void TextEditorWidget::setExtraEncodingSettings(const ExtraEncodingSettings &extraEncodingSettings) void TextEditorWidget::setExtraEncodingSettings(const ExtraEncodingSettings &extraEncodingSettings)