chat_moc.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "chat_moc.h"
  2. #include "ui_chat_moc.h"
  3. Chat::Chat(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::Chat)
  6. {
  7. ui->setupUi(this);
  8. namesCompleter.setModel(ui->listUsers->model());
  9. namesCompleter.setCompletionMode(QCompleter::InlineCompletion);
  10. ui->messageEdit->setCompleter(&namesCompleter);
  11. for([[maybe_unused]] auto i : {GLOBAL, ROOM})
  12. chatDocuments.push_back(new QTextDocument(this));
  13. setChatId(GLOBAL);
  14. }
  15. Chat::~Chat()
  16. {
  17. delete ui;
  18. }
  19. void Chat::setUsername(const QString & user)
  20. {
  21. username = user;
  22. }
  23. void Chat::setSession(const QString & s)
  24. {
  25. session = s;
  26. on_chatSwitch_clicked();
  27. }
  28. void Chat::setChannel(const QString & channel)
  29. {
  30. static const QMap<QString, ChatId> chatNames{{"global", GLOBAL}, {"room", ROOM}};
  31. setChatId(chatNames.value(channel));
  32. }
  33. void Chat::addUser(const QString & user)
  34. {
  35. ui->listUsers->addItem(new QListWidgetItem("@" + user));
  36. }
  37. void Chat::clearUsers()
  38. {
  39. ui->listUsers->clear();
  40. }
  41. void Chat::chatMessage(const QString & title, const QString & channel, QString body, bool isSystem)
  42. {
  43. const QTextCharFormat regularFormat;
  44. const QString boldHtml = "<b>%1</b>";
  45. const QString colorHtml = "<font color=\"%1\">%2</font>";
  46. bool meMentioned = false;
  47. bool isScrollBarBottom = (ui->chat->verticalScrollBar()->maximum() - ui->chat->verticalScrollBar()->value() < 24);
  48. static const QMap<QString, ChatId> chatNames{{"global", GLOBAL}, {"room", ROOM}};
  49. QTextDocument * doc = ui->chat->document();
  50. if(chatNames.contains(channel))
  51. doc = chatDocuments[chatNames.value(channel)];
  52. QTextCursor curs(doc);
  53. curs.movePosition(QTextCursor::End);
  54. QString titleColor = "Olive";
  55. if(isSystem || title == "System")
  56. titleColor = "ForestGreen";
  57. if(title == username)
  58. titleColor = "Gold";
  59. curs.insertHtml(boldHtml.arg(colorHtml.arg(titleColor, title + ": ")));
  60. QRegularExpression mentionRe("@[\\w\\d]+");
  61. auto subBody = body;
  62. int mem = 0;
  63. for(auto match = mentionRe.match(subBody); match.hasMatch(); match = mentionRe.match(subBody))
  64. {
  65. body.insert(mem + match.capturedEnd(), QChar(-1));
  66. body.insert(mem + match.capturedStart(), QChar(-1));
  67. mem += match.capturedEnd() + 2;
  68. subBody = body.right(body.size() - mem);
  69. }
  70. auto pieces = body.split(QChar(-1));
  71. for(auto & block : pieces)
  72. {
  73. if(block.startsWith("@"))
  74. {
  75. if(block == "@" + username)
  76. {
  77. meMentioned = true;
  78. curs.insertHtml(boldHtml.arg(colorHtml.arg("IndianRed", block)));
  79. }
  80. else
  81. curs.insertHtml(colorHtml.arg("DeepSkyBlue", block));
  82. }
  83. else
  84. {
  85. if(isSystem)
  86. curs.insertHtml(colorHtml.arg("ForestGreen", block));
  87. else
  88. curs.insertText(block, regularFormat);
  89. }
  90. }
  91. curs.insertText("\n", regularFormat);
  92. if(doc == ui->chat->document() && (meMentioned || isScrollBarBottom))
  93. {
  94. ui->chat->ensureCursorVisible();
  95. ui->chat->verticalScrollBar()->setValue(ui->chat->verticalScrollBar()->maximum());
  96. }
  97. }
  98. void Chat::chatMessage(const QString & title, QString body, bool isSystem)
  99. {
  100. chatMessage(title, "", body, isSystem);
  101. }
  102. void Chat::sysMessage(QString body)
  103. {
  104. chatMessage("System", body, true);
  105. }
  106. void Chat::sendMessage()
  107. {
  108. QString msg(ui->messageEdit->text());
  109. ui->messageEdit->clear();
  110. emit messageSent(msg);
  111. }
  112. void Chat::on_messageEdit_returnPressed()
  113. {
  114. sendMessage();
  115. }
  116. void Chat::on_sendButton_clicked()
  117. {
  118. sendMessage();
  119. }
  120. void Chat::on_chatSwitch_clicked()
  121. {
  122. static const QMap<ChatId, QString> chatNames{{GLOBAL, "global"}, {ROOM, "room"}};
  123. if(chatId == GLOBAL && !session.isEmpty())
  124. emit channelSwitch(chatNames[ROOM]);
  125. else
  126. emit channelSwitch(chatNames[GLOBAL]);
  127. }
  128. void Chat::setChatId(ChatId _chatId)
  129. {
  130. static const QMap<ChatId, QString> chatNames{{GLOBAL, "Global"}, {ROOM, "Room"}};
  131. chatId = _chatId;
  132. ui->chatSwitch->setText(chatNames[chatId] + " chat");
  133. ui->chat->setDocument(chatDocuments[chatId]);
  134. }