}
void TabCompleter::buildCompletionList() {
- completionList.clear();
- nextCompletion = completionList.begin();
+ // ensure a safe state in case we return early.
+ completionMap.clear();
+ nextCompletion = completionMap.begin();
+
// this is the first time tab is pressed -> build up the completion list and it's iterator
QModelIndex currentIndex = Client::bufferModel()->currentIndex();
if(!currentIndex.data(NetworkModel::BufferIdRole).isValid())
return;
NetworkId networkId = currentIndex.data(NetworkModel::NetworkIdRole).value<NetworkId>();
- QString channelName = currentIndex.sibling(currentIndex.row(), 0).data().toString();
+ QString bufferName = currentIndex.sibling(currentIndex.row(), 0).data().toString();
const Network *network = Client::network(networkId);
if(!network)
return;
- IrcChannel *channel = network->ircChannel(channelName);
- if(!channel)
- return;
-
- // FIXME commented for debugging
- /*
- disconnect(this, SLOT(ircUserJoinedOrParted(IrcUser *)));
- connect(channel, SIGNAL(ircUserJoined(IrcUser *)),
- this, SLOT(ircUserJoinedOrParted(IrcUser *)));
- connect(channel, SIGNAL(ircUserParted(IrcUser *)),
- this, SLOT(ircUserJoinedOrParted(IrcUser *)));
- */
- completionList.clear();
QString tabAbbrev = inputLine->text().left(inputLine->cursorPosition()).section(' ',-1,-1);
- completionList.clear();
- QRegExp regex(QString("^[^a-zA-Z]*").append(tabAbbrev), Qt::CaseInsensitive);
- QMap<QString, QString> sortMap;
-
- foreach(IrcUser *ircUser, channel->ircUsers()) {
- if(regex.indexIn(ircUser->nick()) > -1) {
- sortMap[ircUser->nick().toLower()] = ircUser->nick();
+ QRegExp regex(QString("^[^a-zA-Z]*").append(QRegExp::escape(tabAbbrev)), Qt::CaseInsensitive);
+
+ switch(static_cast<BufferInfo::Type>(currentIndex.data(NetworkModel::BufferTypeRole).toInt())) {
+ case BufferInfo::ChannelBuffer:
+ { // scope is needed for local var declaration
+ IrcChannel *channel = network->ircChannel(bufferName);
+ if(!channel)
+ return;
+ foreach(IrcUser *ircUser, channel->ircUsers()) {
+ if(regex.indexIn(ircUser->nick()) > -1)
+ completionMap[ircUser->nick().toLower()] = ircUser->nick();
+ }
}
+ break;
+ case BufferInfo::QueryBuffer:
+ if(regex.indexIn(bufferName) > -1)
+ completionMap[bufferName.toLower()] = bufferName;
+ case BufferInfo::StatusBuffer:
+ if(!network->myNick().isEmpty() && regex.indexIn(network->myNick()) > -1)
+ completionMap[network->myNick().toLower()] = network->myNick();
+ break;
+ default:
+ return;
}
- foreach (QString str, sortMap)
- completionList << str;
-
- nextCompletion = completionList.begin();
+
+ nextCompletion = completionMap.begin();
lastCompletionLength = tabAbbrev.length();
}
enabled = true;
}
- if (nextCompletion != completionList.end()) {
+ if (nextCompletion != completionMap.end()) {
// clear previous completion
for (int i = 0; i < lastCompletionLength; i++) {
inputLine->backspace();
nextCompletion++;
// we're completing the first word of the line
- if(inputLine->text().length() == lastCompletionLength) {
+ if(inputLine->cursorPosition() == lastCompletionLength) {
inputLine->insert(nickSuffix);
lastCompletionLength += nickSuffix.length();
}
// we're at the end of the list -> start over again
} else {
- nextCompletion = completionList.begin();
+ if(!completionMap.isEmpty()) {
+ nextCompletion = completionMap.begin();
+ complete();
+ }
}
}