chatview.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "chatview.h"
  2. #include "ui_chatview.h"
  3. #include <QTime>
  4. #include <QScrollBar>
  5. ChatView::ChatView(QWidget *parent) :
  6. QWidget(parent),
  7. ui(new Ui::ChatView)
  8. {
  9. ui->setupUi(this);
  10. apiTimer = new QTimer(this);
  11. apiTimer->setInterval(1000);
  12. // bind signals
  13. connect(ui->pushButtonLogout, SIGNAL(clicked()), this, SLOT(logoutUser()));
  14. connect(ui->pushButtonSend, SIGNAL(clicked()), this, SLOT(sendMessage()));
  15. connect(ui->lineEditChatBox, SIGNAL(returnPressed()), this, SLOT(sendMessage()));
  16. connect(apiTimer, SIGNAL(timeout()), this, SLOT(timerEvent()));
  17. }
  18. void ChatView::init(NetworkApi *netApi)
  19. {
  20. networkApi = netApi;
  21. connect(networkApi, SIGNAL(messagesReceived(QString*)), this, SLOT(loadMessages(QString*)));
  22. connect(networkApi, SIGNAL(usersReceived(QString*)), this, SLOT(loadUsers(QString*)));
  23. connect(networkApi, SIGNAL(messagePosted(QString*)), this, SLOT(loadMessages(QString*)));
  24. }
  25. // beats every sec
  26. void ChatView::timerEvent()
  27. {
  28. int sec = QTime::currentTime().second();
  29. // poll messages every 5 secs
  30. if(sec % 5 == 0)
  31. {
  32. // if(lastTime.isEmpty())
  33. // lastTime = "";
  34. networkApi->getMessages(&lastTime);
  35. }
  36. if(sec % 10 == 0)
  37. {
  38. networkApi->getUsers();
  39. }
  40. }
  41. // set user's nick
  42. void ChatView::setNick(QString *nick)
  43. {
  44. Nick = *nick;
  45. ui->labelTitle->setText(*nick);
  46. }
  47. void ChatView::sendMessage()
  48. {
  49. if(ui->lineEditChatBox->text().trimmed().length() > 0)
  50. {
  51. // stop until response arives
  52. apiTimer->stop();
  53. networkApi->postMessage(&Nick, &ui->lineEditChatBox->text());
  54. ui->lineEditChatBox->clear();
  55. ui->lineEditChatBox->setFocus();
  56. }
  57. }
  58. void ChatView::loadMessages(QString *xmlData)
  59. {
  60. qDebug(QTime::currentTime().toString().append(" | loadMessages called").toUtf8());
  61. if(!apiTimer->isActive())
  62. {
  63. // resume timer
  64. apiTimer->start();
  65. }
  66. if(xmlData->isNull())
  67. {
  68. qDebug("loadMessages: no data");
  69. networkApi->getMessages(&lastTime);
  70. return;
  71. }
  72. // process XML
  73. QDomDocument xml("ChatMX_Response");
  74. xml.setContent(*xmlData);
  75. QDomElement rootNode = xml.documentElement();
  76. if(rootNode.tagName() == "Messages")
  77. {
  78. if(rootNode.firstChild().childNodes().count() == 0)
  79. return;
  80. QDomNode node = rootNode.firstChild().firstChild();
  81. QString strMessages;
  82. while(!node.isNull())
  83. {
  84. strMessages.append(node.attributes().namedItem("nick").nodeValue()).append(": ");
  85. strMessages.append(node.attributes().namedItem("message").nodeValue()).append("\n");
  86. lastTime = node.attributes().namedItem("date_time").nodeValue();
  87. node = node.nextSibling();
  88. }
  89. ui->textEditMessages->append(strMessages.left(strMessages.length() - 1));
  90. QScrollBar *sb = ui->textEditMessages->verticalScrollBar();
  91. sb->setValue(sb->maximum());
  92. }
  93. }
  94. void ChatView::loadUsers(QString *xmlData)
  95. {
  96. // process XML
  97. QDomDocument xml("ChatMX_Response");
  98. xml.setContent(*xmlData);
  99. QDomElement rootNode = xml.documentElement();
  100. if(rootNode.tagName() == "Users")
  101. {
  102. QDomNode node = rootNode.firstChild().firstChild();
  103. QString strUsers;
  104. while(!node.isNull())
  105. {
  106. //qDebug(QString("node: ").append(node.nodeName()).toAscii());
  107. strUsers.append("::").append(node.attributes().namedItem("nick").nodeValue()).append("\n");
  108. node = node.nextSibling();
  109. }
  110. ui->textEditUsers->setText(strUsers);
  111. }
  112. }
  113. void ChatView::logoutUser()
  114. {
  115. networkApi->logoutUser(&Nick);
  116. emit logoutEvent(&Nick);
  117. apiTimer->stop();
  118. }
  119. void ChatView::resetUI()
  120. {
  121. lastTime = "";
  122. ui->textEditMessages->clear();
  123. ui->textEditUsers->clear();
  124. ui->lineEditChatBox->clear();
  125. ui->labelTitle->clear();
  126. }
  127. void ChatView::showEvent(QShowEvent *)
  128. {
  129. apiTimer->start();
  130. ui->lineEditChatBox->setFocus();
  131. }
  132. ChatView::~ChatView()
  133. {
  134. delete ui;
  135. }