23 #include "ircnicknamecompleter.h"
25 #include "gui/irc/ircuserlistmodel.h"
28 #include <QRegularExpression>
30 class IRCNicknameCompleterState
36 IRCNicknameCompleterState()
41 QString extractNicknamePrefix()
const
43 const QString NICKNAME_MATCH = R
"(\[\]\{\}\-\^\`\|\\A-Za-z0-9_)";
44 QRegularExpression regex(QString("(?:.*)[^%1]?([%1]*)").arg(NICKNAME_MATCH), QRegularExpression::CaseInsensitiveOption);
45 return regex.match(leftText()).captured(1);
50 return cursorPos >= 0;
53 QString leftText()
const
55 return textLine.left(cursorPos);
58 QString leftTextMinusNicknamePrefix()
const
60 return textLine.left(cursorPos - extractNicknamePrefix().length());
63 QString rightText()
const
65 return textLine.mid(cursorPos);
69 DClass<IRCNicknameCompleter>
73 IRCNicknameCompleterState state;
78 if (!completer.currentCompletion().isEmpty())
80 result.textLine = leftTextWithCompletedNickname() + state.rightText();
81 result.cursorPos = leftTextWithCompletedNickname().length();
86 QString leftTextWithCompletedNickname()
const
88 return state.leftTextMinusNicknamePrefix() + completer.currentCompletion();
96 d->completer.setCaseSensitivity(Qt::CaseInsensitive);
97 d->completer.setCompletionRole(IRCUserListModel::RoleCleanNickname);
100 IRCNicknameCompleter::~IRCNicknameCompleter()
107 d->state = IRCNicknameCompleterState();
108 d->state.cursorPos = cursorPosition;
109 d->state.textLine = textLine;
111 QString nickPrefix = d->state.extractNicknamePrefix();
112 d->completer.setCompletionPrefix(nickPrefix);
113 return d->complete();
118 if (d->completer.completionCount() == 0)
120 if (d->completer.currentRow() + 1 >= d->completer.completionCount())
121 d->completer.setCurrentRow(0);
123 d->completer.setCurrentRow(d->completer.currentRow() + 1);
124 return d->complete();
127 bool IRCNicknameCompleter::isReset()
const
129 return !d->state.isValid();
132 void IRCNicknameCompleter::reset()
134 d->state = IRCNicknameCompleterState();
137 void IRCNicknameCompleter::setModel(QAbstractItemModel *model)
139 d->completer.setModel(model);