- } else {
- tabCompleter->reset();
- if(event->key() == Qt::Key_Up) {
- if(idx > 0) { idx--; setText(history[idx]); }
- event->accept();
- } else if(event->key() == Qt::Key_Down) {
- if(idx < history.count()) idx++;
- if(idx < history.count()) setText(history[idx]);
- else setText("");
- event->accept();
- } else if(event->key() == Qt::Key_Select) { // for Qtopia
- emit returnPressed();
- QLineEdit::keyPressEvent(event);
+
+ addToHistory(text(), true);
+
+ if(idx > 0) {
+ idx--;
+ showHistoryEntry();
+ }
+
+ break;
+
+ case Qt::Key_Down:
+ event->accept();
+
+ addToHistory(text(), true);
+
+ if(idx < history.count()) {
+ idx++;
+ if(idx < history.count() || tempHistory.contains(idx)) // tempHistory might have an entry for idx == history.count() + 1
+ showHistoryEntry();
+ else
+ resetLine(); // equals clear() in this case
+ } else {
+ addToHistory(text());
+ resetLine();
+ }
+
+ break;
+
+ case Qt::Key_Select: // for Qtopia
+ emit returnPressed();
+
+ default:
+ QLineEdit::keyPressEvent(event);
+ }
+}
+
+bool InputLine::addToHistory(const QString &text, bool temporary) {
+ if(text.isEmpty())
+ return false;
+
+ Q_ASSERT(0 <= idx && idx <= history.count());
+
+ if(history.isEmpty() || text != history[idx - (int)(idx == history.count())]) {
+ // if an entry of the history is changed, we remember it and show it again at this
+ // position until a line was actually sent
+ // sent lines get appended to the history
+ if(temporary) {
+ tempHistory[idx] = text;