Merge pull request #870 from ctrlaltca/mentions
Reworked a bit mentions/tags support in chat view; fix #791
This commit is contained in:
commit
580927a50b
1 changed files with 71 additions and 55 deletions
|
@ -28,7 +28,7 @@ ChatView::ChatView(const TabSupervisor *_tabSupervisor, TabGame *_game, bool _sh
|
||||||
if(tabSupervisor->getUserInfo())
|
if(tabSupervisor->getUserInfo())
|
||||||
{
|
{
|
||||||
userName = QString::fromStdString(tabSupervisor->getUserInfo()->name());
|
userName = QString::fromStdString(tabSupervisor->getUserInfo()->name());
|
||||||
mention = "@" + userName.toLower();
|
mention = "@" + userName;
|
||||||
}
|
}
|
||||||
|
|
||||||
mentionFormat.setFontWeight(QFont::Bold);
|
mentionFormat.setFontWeight(QFont::Bold);
|
||||||
|
@ -163,65 +163,85 @@ void ChatView::appendMessage(QString message, QString sender, UserLevelFlags use
|
||||||
}
|
}
|
||||||
cursor.setCharFormat(messageFormat);
|
cursor.setCharFormat(messageFormat);
|
||||||
|
|
||||||
int from = 0, index = 0, bracket = 0, at = 0;
|
int index = -1, bracket = -1, at = -1;
|
||||||
bool mentionEnabled = settingsCache->getChatMention();
|
bool mentionEnabled = settingsCache->getChatMention();
|
||||||
while (((message.indexOf('[', from)) != -1) || (mentionEnabled && (message.indexOf('@', from)) != -1)) {
|
while (message.size())
|
||||||
bracket = message.indexOf('[', from);
|
{
|
||||||
if (!mentionEnabled) {
|
// search for the first [ or @
|
||||||
index = bracket;
|
bracket = message.indexOf('[');
|
||||||
} else {
|
at = mentionEnabled ? message.indexOf('@') : -1;
|
||||||
at = message.indexOf('@', from);
|
if(bracket == -1)
|
||||||
if (bracket == -1)
|
{
|
||||||
|
if(at == -1)
|
||||||
|
{
|
||||||
|
// quick way out
|
||||||
|
cursor.insertText(message);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// mention
|
||||||
index = at;
|
index = at;
|
||||||
else if (at == -1)
|
}
|
||||||
|
} else {
|
||||||
|
if(at == -1)
|
||||||
|
{
|
||||||
|
// bracket
|
||||||
index = bracket;
|
index = bracket;
|
||||||
else
|
} else {
|
||||||
|
// both, pick up the first one
|
||||||
index = std::min(bracket, at);
|
index = std::min(bracket, at);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// insert the message text up to the [ / @
|
||||||
|
if(index > 0)
|
||||||
|
{
|
||||||
|
cursor.insertText(message.left(index), defaultFormat);
|
||||||
|
message = message.mid(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(index == bracket)
|
||||||
|
{
|
||||||
|
if (message.startsWith("[card]")) {
|
||||||
|
message = message.mid(6);
|
||||||
|
int closeTagIndex = message.indexOf("[/card]");
|
||||||
|
QString cardName = message.left(closeTagIndex);
|
||||||
|
if (closeTagIndex == -1)
|
||||||
|
message.clear();
|
||||||
|
else
|
||||||
|
message = message.mid(closeTagIndex + 7);
|
||||||
|
|
||||||
cursor.insertText(message.left(index), defaultFormat);
|
appendCardTag(cursor, cardName);
|
||||||
message = message.mid(index);
|
} else if (message.startsWith("[[")) {
|
||||||
if (message.isEmpty())
|
message = message.mid(2);
|
||||||
break;
|
int closeTagIndex = message.indexOf("]]");
|
||||||
|
QString cardName = message.left(closeTagIndex);
|
||||||
|
if (closeTagIndex == -1)
|
||||||
|
message.clear();
|
||||||
|
else
|
||||||
|
message = message.mid(closeTagIndex + 2);
|
||||||
|
|
||||||
if (message.startsWith("[card]")) {
|
appendCardTag(cursor, cardName);
|
||||||
message = message.mid(6);
|
} else if (message.startsWith("[url]")) {
|
||||||
int closeTagIndex = message.indexOf("[/card]");
|
message = message.mid(5);
|
||||||
QString cardName = message.left(closeTagIndex);
|
int closeTagIndex = message.indexOf("[/url]");
|
||||||
if (closeTagIndex == -1)
|
QString url = message.left(closeTagIndex);
|
||||||
message.clear();
|
if (closeTagIndex == -1)
|
||||||
else
|
message.clear();
|
||||||
message = message.mid(closeTagIndex + 7);
|
else
|
||||||
|
message = message.mid(closeTagIndex + 6);
|
||||||
|
|
||||||
appendCardTag(cursor, cardName);
|
appendUrlTag(cursor, url);
|
||||||
} else if (message.startsWith("[[")) {
|
} else {
|
||||||
message = message.mid(2);
|
// not a recognized [tag]
|
||||||
int closeTagIndex = message.indexOf("]]");
|
cursor.insertText("[", defaultFormat);
|
||||||
QString cardName = message.left(closeTagIndex);
|
message = message.mid(1);
|
||||||
if (closeTagIndex == -1)
|
}
|
||||||
message.clear();
|
} else {
|
||||||
else
|
if (message.startsWith(mention, Qt::CaseInsensitive)) {
|
||||||
message = message.mid(closeTagIndex + 2);
|
|
||||||
|
|
||||||
appendCardTag(cursor, cardName);
|
|
||||||
} else if (message.startsWith("[url]")) {
|
|
||||||
message = message.mid(5);
|
|
||||||
int closeTagIndex = message.indexOf("[/url]");
|
|
||||||
QString url = message.left(closeTagIndex);
|
|
||||||
if (closeTagIndex == -1)
|
|
||||||
message.clear();
|
|
||||||
else
|
|
||||||
message = message.mid(closeTagIndex + 6);
|
|
||||||
|
|
||||||
appendUrlTag(cursor, url);
|
|
||||||
} else if (mentionEnabled) {
|
|
||||||
if (message.toLower().startsWith(mention)) {
|
|
||||||
// you have been mentioned
|
// you have been mentioned
|
||||||
mentionFormat.setBackground(QBrush(getCustomMentionColor()));
|
mentionFormat.setBackground(QBrush(getCustomMentionColor()));
|
||||||
mentionFormat.setForeground(settingsCache->getChatMentionForeground() ? QBrush(Qt::white):QBrush(Qt::black));
|
mentionFormat.setForeground(settingsCache->getChatMentionForeground() ? QBrush(Qt::white):QBrush(Qt::black));
|
||||||
cursor.insertText("@" + userName, mentionFormat);
|
cursor.insertText(mention, mentionFormat);
|
||||||
message = message.mid(mention.size());
|
message = message.mid(mention.size());
|
||||||
QApplication::alert(this);
|
QApplication::alert(this);
|
||||||
if (shouldShowSystemPopup()) {
|
if (shouldShowSystemPopup()) {
|
||||||
|
@ -245,13 +265,9 @@ void ChatView::appendMessage(QString message, QString sender, UserLevelFlags use
|
||||||
message = message.mid(userName.size() + 1);
|
message = message.mid(userName.size() + 1);
|
||||||
}
|
}
|
||||||
cursor.setCharFormat(defaultFormat); // reset format after each iteration
|
cursor.setCharFormat(defaultFormat); // reset format after each iteration
|
||||||
} else
|
}
|
||||||
from = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!message.isEmpty())
|
|
||||||
cursor.insertText(message);
|
|
||||||
|
|
||||||
if (atBottom)
|
if (atBottom)
|
||||||
verticalScrollBar()->setValue(verticalScrollBar()->maximum());
|
verticalScrollBar()->setValue(verticalScrollBar()->maximum());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue