X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Finputline.cpp;h=b74e10eccab787e6d1db352f26f4f50c66b5d5ab;hp=05f97554cc6b7fff43191b3c4810b6cab4f7cbf0;hb=b2c1179d290dc97f2c8497db9ed0c8adcc679ed7;hpb=18803d933df24b9bda564ad730ca30b32e0e9d62 diff --git a/src/uisupport/inputline.cpp b/src/uisupport/inputline.cpp index 05f97554..b74e10ec 100644 --- a/src/uisupport/inputline.cpp +++ b/src/uisupport/inputline.cpp @@ -19,71 +19,122 @@ ***************************************************************************/ #include "inputline.h" - #include "tabcompleter.h" InputLine::InputLine(QWidget *parent) : QLineEdit(parent), - idx(0) + idx(0), + tabCompleter(new TabCompleter(this)) { - connect(this, SIGNAL(returnPressed()), this, SLOT(enter())); - tabComplete = new TabCompleter(this); - -#ifdef Q_WS_MAC - bindModifier = Qt::ControlModifier | Qt::AltModifier; - jumpModifier = Qt::ControlModifier; -#else - bindModifier = Qt::ControlModifier; - jumpModifier = Qt::AltModifier; -#endif + connect(this, SIGNAL(returnPressed()), this, SLOT(on_returnPressed())); + connect(this, SIGNAL(textChanged(QString)), this, SLOT(on_textChanged(QString))); } InputLine::~InputLine() { } void InputLine::keyPressEvent(QKeyEvent * event) { - if((event->modifiers() == jumpModifier || event->modifiers() == bindModifier) && - (Qt::Key_0 <= event->key() && event->key() <= Qt::Key_9)) { - event->ignore(); - return; - } - - if(event->key() == Qt::Key_Tab) { // Tabcomplete - tabComplete->complete(); + switch(event->key()) { + case Qt::Key_Up: event->accept(); - } else { - tabComplete->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 { - QLineEdit::keyPressEvent(event); + addToHistory(text()); + resetLine(); } + + break; + + case Qt::Key_Select: // for Qtopia + emit returnPressed(); + + default: + QLineEdit::keyPressEvent(event); } } -bool InputLine::event(QEvent *e) { - if(e->type() == QEvent::KeyPress) { - keyPressEvent(static_cast(e)); +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; + } else { + history << text; + tempHistory.clear(); + } return true; + } else { + return false; + } +} + +void InputLine::on_returnPressed() { + addToHistory(text()); + emit sendText(text()); + resetLine(); +} + +void InputLine::on_textChanged(QString newText) { + QStringList lineSeperators; + lineSeperators << QString("\r\n") + << QString('\n') + << QString('\r'); + + QString lineSep; + foreach(QString seperator, lineSeperators) { + if(newText.contains(seperator)) { + lineSep = seperator; + break; + } + } + + if(lineSep.isEmpty()) + return; + + if(newText.contains(lineSep)) { + clear(); + QString line = newText.section(lineSep, 0, 0); + QString remainder = newText.section(lineSep, 1); + insert(line); + emit returnPressed(); + insert(remainder); } - return QLineEdit::event(e); } -void InputLine::enter() { - history << text(); +void InputLine::resetLine() { + // every time the InputLine is cleared we also reset history index idx = history.count(); + clear(); } -void InputLine::updateNickList(QStringList l) { - nickList = l; - emit nickListUpdated(l); +void InputLine::showHistoryEntry() { + // if the user changed the history, display the changed line + tempHistory.contains(idx) ? setText(tempHistory[idx]) : setText(history[idx]); }