Improve performance of eventFilter in chat lobbies

- Only check the anchors if the visible content has actually changed
  by saving lastUpdateCursorPos and End
- Check notify first, before doing any work
- Simplify regexp as the anchors have a fixed format
- Remove unnecessary conversion to utf8 and back
This commit is contained in:
AsamK 2015-08-31 02:09:55 +02:00
parent 5f81d8efc8
commit bd6bb8996b
2 changed files with 15 additions and 16 deletions

View File

@ -448,7 +448,7 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
} }
} }
if (chatType() == CHATTYPE_LOBBY) { if (notify && chatType() == CHATTYPE_LOBBY) {
if ((event->type() == QEvent::KeyPress) if ((event->type() == QEvent::KeyPress)
|| (event->type() == QEvent::MouseMove) || (event->type() == QEvent::MouseMove)
|| (event->type() == QEvent::Enter) || (event->type() == QEvent::Enter)
@ -460,9 +460,11 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
QPoint bottom_right(ui->textBrowser->viewport()->width() - 1, ui->textBrowser->viewport()->height() - 1); QPoint bottom_right(ui->textBrowser->viewport()->width() - 1, ui->textBrowser->viewport()->height() - 1);
int end_pos = ui->textBrowser->cursorForPosition(bottom_right).position(); int end_pos = ui->textBrowser->cursorForPosition(bottom_right).position();
cursor.setPosition(end_pos, QTextCursor::KeepAnchor); cursor.setPosition(end_pos, QTextCursor::KeepAnchor);
if ((cursor.position() != lastUpdateCursorPos || cursor.selectionEnd() != lastUpdateCursorEnd) &&
if (!cursor.selectedText().isEmpty()){ !cursor.selectedText().isEmpty()) {
QRegExp rx("<a\\s+name\\s*=\\s*\"(.*)\"",Qt::CaseInsensitive, QRegExp::RegExp2); lastUpdateCursorPos = cursor.position();
lastUpdateCursorEnd = cursor.selectionEnd();
QRegExp rx("<a name=\"(.*)\"",Qt::CaseSensitive, QRegExp::RegExp2);
rx.setMinimal(true); rx.setMinimal(true);
QString sel=cursor.selection().toHtml(); QString sel=cursor.selection().toHtml();
QStringList anchors; QStringList anchors;
@ -473,13 +475,9 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
} }
if (!anchors.isEmpty()){ if (!anchors.isEmpty()){
for (QStringList::iterator it=anchors.begin();it!=anchors.end();++it) { for (QStringList::iterator it=anchors.begin();it!=anchors.end();++it) {
QByteArray bytArray=it->toUtf8(); notify->chatLobbyCleared(chatId.toLobbyId(), *it);
std::string stdString=std::string(bytArray.begin(),bytArray.end());
if (notify) notify->chatLobbyCleared(chatId.toLobbyId()
,QString::fromUtf8(stdString.c_str())
,obj != ui->textBrowser && obj != ui->textBrowser->viewport());//, true);
} }
} }
} }
} }
} }
@ -490,11 +488,11 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent) { if (keyEvent) {
if (keyEvent->key() == Qt::Key_Delete ) { if (notify && keyEvent->key() == Qt::Key_Delete) {
// Delete key pressed // Delete key pressed
if (ui->textBrowser->textCursor().selectedText().length() > 0) { if (ui->textBrowser->textCursor().selectedText().length() > 0) {
if (chatType() == CHATTYPE_LOBBY) { if (chatType() == CHATTYPE_LOBBY) {
QRegExp rx("<a\\s+name\\s*=\\s*\"(.*)\"",Qt::CaseInsensitive, QRegExp::RegExp2); QRegExp rx("<a name=\"(.*)\"",Qt::CaseSensitive, QRegExp::RegExp2);
rx.setMinimal(true); rx.setMinimal(true);
QString sel=ui->textBrowser->textCursor().selection().toHtml(); QString sel=ui->textBrowser->textCursor().selection().toHtml();
QStringList anchors; QStringList anchors;
@ -505,9 +503,7 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
} }
for (QStringList::iterator it=anchors.begin();it!=anchors.end();++it) { for (QStringList::iterator it=anchors.begin();it!=anchors.end();++it) {
QByteArray bytArray=it->toUtf8(); notify->chatLobbyCleared(chatId.toLobbyId(), *it);
std::string stdString=std::string(bytArray.begin(),bytArray.end());
if (notify) notify->chatLobbyCleared(chatId.toLobbyId(), QString::fromUtf8(stdString.c_str()));
} }
} }
@ -529,7 +525,7 @@ bool ChatWidget::eventFilter(QObject *obj, QEvent *event)
cursor.select(QTextCursor::WordUnderCursor); cursor.select(QTextCursor::WordUnderCursor);
QString toolTipText = ""; QString toolTipText = "";
if (!cursor.selectedText().isEmpty()){ if (!cursor.selectedText().isEmpty()){
QRegExp rx("<a\\s+name\\s*=\\s*\"(.*)\"",Qt::CaseInsensitive, QRegExp::RegExp2); QRegExp rx("<a name=\"(.*)\"",Qt::CaseSensitive, QRegExp::RegExp2);
rx.setMinimal(true); rx.setMinimal(true);
QString sel=cursor.selection().toHtml(); QString sel=cursor.selection().toHtml();
QStringList anchors; QStringList anchors;

View File

@ -238,6 +238,9 @@ private:
QTextCursor qtcMark; QTextCursor qtcMark;
int lastUpdateCursorPos;
int lastUpdateCursorEnd;
TransferRequestFlags mDefaultExtraFileFlags ; // flags for extra files shared in this chat. Will be 0 by default, but might be ANONYMOUS for chat lobbies. TransferRequestFlags mDefaultExtraFileFlags ; // flags for extra files shared in this chat. Will be 0 by default, but might be ANONYMOUS for chat lobbies.
QDate lastMsgDate ; QDate lastMsgDate ;