added first and simple version of Tabcompletion (Nicks only atm)
[quassel.git] / gui / channelwidgetinput.cpp
index 893623d..f3276c2 100644 (file)
  ***************************************************************************/
 
 #include "channelwidgetinput.h"
+#include <QCompleter>
 
 ChannelWidgetInput::ChannelWidgetInput(QWidget *parent) : QLineEdit(parent) {
   idx = 0;
+  tabMode = false;
   connect(this, SIGNAL(returnPressed()), this, SLOT(enter()));
 }
 
 void ChannelWidgetInput::keyPressEvent(QKeyEvent * event) {
-  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_Tab) {
+  if(event->key() == Qt::Key_Tab) {
     // Tabcomplete
-      if(cursorPosition() == text().length()) {
-      
-
+    if(text().length() > 0) {
+      if (not tabMode) {
+        QString tabAbbrev = text().left(cursorPosition()).section(' ',-1,-1);
+        tabCompleteList.clear();
+        foreach(QString nick, nickList) {
+          if(nick.toLower().startsWith(tabAbbrev.toLower())) {
+            tabCompleteList << nick;
+          }
+        }
+        
+        tabCompleteList.sort();
+        lastCompletionLength = tabAbbrev.length();
+        tabMode = true;
+        nextCompletion = tabCompleteList.begin();
+      }
+      if (nextCompletion != tabCompleteList.end()) {
+        for (int i = 0; i < lastCompletionLength; i++) {
+          backspace();
+        }
+        insert(*nextCompletion);
+        lastCompletionLength = nextCompletion->length();
+        nextCompletion++;
+      } else if (tabCompleteList.end() != tabCompleteList.begin()) {
+        nextCompletion = tabCompleteList.begin();
+      }
     }
     event->accept();
+    
   } else {
-    QLineEdit::keyPressEvent(event);
+    tabMode = false;
+    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 {
+      QLineEdit::keyPressEvent(event);
+    }
   }
 }