From b70377c872a14be8a53f41cd8b96df1b88edd5bd Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Jul 2014 15:04:52 +0200 Subject: [PATCH] HistoryCompleter: Fix current text() handling Can be seen in the Debugger's "Command:" input: Selecting a history entry with "Return" properly executes the selected item, but put something else into the line edit. Change-Id: I2efa05374d9c31e8a80219794f2dbaaf50a01f9b Reviewed-by: Christian Stenger --- src/libs/utils/fancylineedit.cpp | 14 ++++++++++++- src/libs/utils/fancylineedit.h | 1 + src/libs/utils/historycompleter.cpp | 32 ++++++++++++----------------- src/libs/utils/historycompleter.h | 5 ++--- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/libs/utils/fancylineedit.cpp b/src/libs/utils/fancylineedit.cpp index 7dfb82bda7c..51415c903b5 100644 --- a/src/libs/utils/fancylineedit.cpp +++ b/src/libs/utils/fancylineedit.cpp @@ -299,8 +299,20 @@ bool FancyLineEdit::hasAutoHideButton(Side side) const void FancyLineEdit::setHistoryCompleter(const QString &historyKey) { QTC_ASSERT(!d->m_historyCompleter, return); - d->m_historyCompleter = new HistoryCompleter(this, historyKey, this); + d->m_historyCompleter = new HistoryCompleter(historyKey, this); QLineEdit::setCompleter(d->m_historyCompleter); + + // Hitting in the popup first causes editingFinished() + // being emitted and more updates finally calling setText() (again). + // To make sure we report the "final" content delay the addEntry() + // "a bit". + connect(this, SIGNAL(editingFinished()), + this, SLOT(onEditingFinished()), Qt::QueuedConnection); +} + +void FancyLineEdit::onEditingFinished() +{ + d->m_historyCompleter->addEntry(text()); } void FancyLineEdit::setSpecialCompleter(QCompleter *completer) diff --git a/src/libs/utils/fancylineedit.h b/src/libs/utils/fancylineedit.h index 2b533c2575e..27be6898319 100644 --- a/src/libs/utils/fancylineedit.h +++ b/src/libs/utils/fancylineedit.h @@ -162,6 +162,7 @@ signals: private slots: void iconClicked(); void onTextChanged(const QString &); + void onEditingFinished(); protected: void resizeEvent(QResizeEvent *e); diff --git a/src/libs/utils/historycompleter.cpp b/src/libs/utils/historycompleter.cpp index 687a2b5b07e..f51855b2a73 100644 --- a/src/libs/utils/historycompleter.cpp +++ b/src/libs/utils/historycompleter.cpp @@ -47,19 +47,18 @@ static QSettings *theSettings = 0; class HistoryCompleterPrivate : public QAbstractListModel { public: - HistoryCompleterPrivate() : maxLines(30), lineEdit(0) {} + HistoryCompleterPrivate() : maxLines(30) {} int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); void clearHistory(); - void saveEntry(const QString &str); + void addEntry(const QString &str); QStringList list; QString historyKey; int maxLines; - FancyLineEdit *lineEdit; }; class HistoryLineDelegate : public QItemDelegate @@ -146,38 +145,33 @@ void HistoryCompleterPrivate::clearHistory() endResetModel(); } -void HistoryCompleterPrivate::saveEntry(const QString &str) +void HistoryCompleterPrivate::addEntry(const QString &str) { - QTC_ASSERT(theSettings, return); - const QString &entry = str.trimmed(); + const QString entry = str.trimmed(); + if (entry.isEmpty()) + return; int removeIndex = list.indexOf(entry); + beginResetModel(); if (removeIndex != -1) - removeRow(removeIndex); - beginInsertRows (QModelIndex(), list.count(), list.count()); + list.removeAt(removeIndex); list.prepend(entry); - list = list.mid(0, maxLines); - endInsertRows(); + list = list.mid(0, maxLines - 1); + endResetModel(); theSettings->setValue(historyKey, list); } -HistoryCompleter::HistoryCompleter(FancyLineEdit *lineEdit, const QString &historyKey, QObject *parent) +HistoryCompleter::HistoryCompleter(const QString &historyKey, QObject *parent) : QCompleter(parent), d(new HistoryCompleterPrivate) { - QTC_ASSERT(lineEdit, return); QTC_ASSERT(!historyKey.isEmpty(), return); QTC_ASSERT(theSettings, return); d->historyKey = QLatin1String("CompleterHistory/") + historyKey; d->list = theSettings->value(d->historyKey).toStringList(); - d->lineEdit = lineEdit; - if (d->list.count() && lineEdit->text().isEmpty()) - lineEdit->setText(d->list.at(0)); setModel(d); setPopup(new HistoryLineView(d)); - - connect(lineEdit, SIGNAL(editingFinished()), this, SLOT(saveHistory())); } bool HistoryCompleter::removeHistoryItem(int index) @@ -210,9 +204,9 @@ void HistoryCompleter::clearHistory() d->clearHistory(); } -void HistoryCompleter::saveHistory() +void HistoryCompleter::addEntry(const QString &str) { - d->saveEntry(d->lineEdit->text()); + d->addEntry(str); } void HistoryCompleter::setSettings(QSettings *settings) diff --git a/src/libs/utils/historycompleter.h b/src/libs/utils/historycompleter.h index 41cb01cb3f6..cb55806eb10 100644 --- a/src/libs/utils/historycompleter.h +++ b/src/libs/utils/historycompleter.h @@ -40,7 +40,6 @@ QT_END_NAMESPACE namespace Utils { -class FancyLineEdit; namespace Internal { class HistoryCompleterPrivate; } class QTCREATOR_UTILS_EXPORT HistoryCompleter : public QCompleter @@ -49,7 +48,7 @@ class QTCREATOR_UTILS_EXPORT HistoryCompleter : public QCompleter public: static void setSettings(QSettings *settings); - HistoryCompleter(FancyLineEdit *lineEdit, const QString &historyKey, QObject *parent = 0); + HistoryCompleter(const QString &historyKey, QObject *parent = 0); bool removeHistoryItem(int index); private: @@ -60,7 +59,7 @@ private: public Q_SLOTS: void clearHistory(); - void saveHistory(); + void addEntry(const QString &str); private: Internal::HistoryCompleterPrivate *d;