X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Finputline.cpp;h=521613fa4002d0f5a3db9cadc67fe21a50a00c8a;hp=7d863fe0423a0a807550e44ff65e010daf9ce6b5;hb=e561e02a8d2f1f009559d17c7b1c66cb6f4e2a5a;hpb=bcfd213c6c381e6d2344ceba4a82ed3f87a9fd3e diff --git a/src/uisupport/inputline.cpp b/src/uisupport/inputline.cpp index 7d863fe0..521613fa 100644 --- a/src/uisupport/inputline.cpp +++ b/src/uisupport/inputline.cpp @@ -27,66 +27,104 @@ InputLine::InputLine(QWidget *parent) idx(0), tabCompleter(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; + switch(event->key()) { + case Qt::Key_Up: + event->accept(); + + if(addToHistory(text())) { + clear(); + break; + } + + if(idx > 0) { + idx--; + setText(history[idx]); + } + + break; + + case Qt::Key_Down: + event->accept(); + + if(addToHistory(text())) { + clear(); + break; + } + + if(idx < history.count()) + idx++; + + if(idx < history.count()) + setText(history[idx]); + else + clear(); + + break; + + case Qt::Key_Select: // for Qtopia + emit returnPressed(); + + default: + QLineEdit::keyPressEvent(event); } +} + +bool InputLine::addToHistory(const QString &text) { + if(text.isEmpty()) + return false; + + Q_ASSERT(0 <= idx && idx <= history.count()); - if(event->key() == Qt::Key_Tab) { // Tabcomplete - tabCompleter->complete(); - event->accept(); + if(history.isEmpty() || text != history[idx - (int)(idx == history.count())]) { + // if we change an entry of the history the changed entry is appended to the list and we seek to the end + // we could also easily change the entry in the history... per setting maybe? + history << text; + idx = history.count(); + return true; } 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); - } else { - QLineEdit::keyPressEvent(event); - } + return false; } } void InputLine::on_returnPressed() { - history << text(); - idx = history.count(); + addToHistory(text()); emit sendText(text()); clear(); } void InputLine::on_textChanged(QString newText) { - if(newText.contains('\n')) { + 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('\n', 0, 0); - QString remainder = newText.section('\n', 1); + QString line = newText.section(lineSep, 0, 0); + QString remainder = newText.section(lineSep, 1); insert(line); emit returnPressed(); insert(remainder); } + } +