eventslistwidget.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "eventslistwidget.h"
  2. #include <QtConcurrent/QtConcurrent>
  3. #include <QLabel>
  4. #include <QStringList>
  5. #include <QSpacerItem>
  6. #include <widgets/newspiece.h>
  7. EventsListWidget::EventsListWidget(QWidget *parent) : QWidget(parent)
  8. {
  9. event_downloader.targetBytearray = &events_data;
  10. event_downloader.setUrl(QUrl("http://translate.lotros.ru/events/get/1"));
  11. event_layout = new QVBoxLayout(this);
  12. event_layout->setSpacing(7);
  13. event_layout->setObjectName(QStringLiteral("events_layout"));
  14. event_layout->setContentsMargins(11, 11, 11, 0);
  15. connect(&event_update_timer, &QTimer::timeout, &event_downloader, &Downloader::start);
  16. connect(&event_downloader, &Downloader::downloadFinished, this, &EventsListWidget::updateEvents);
  17. emit event_downloader.start();
  18. event_update_timer.setInterval(1000 * 60); // 60 seconds;
  19. event_update_timer.start();
  20. }
  21. EventsListWidget::~EventsListWidget()
  22. {
  23. event_update_timer.stop();
  24. }
  25. void EventsListWidget::updateEvents()
  26. {
  27. if (!qApp)
  28. return;
  29. qDebug() << "Received data: " << QString(events_data);
  30. if (events_data.size() == 0) {
  31. constructEventPiece(0, "Не могу загрузить список событий", "Загрузка списка событий не удалась. Чтобы просмотреть текущие игровые события, перейдите на <a href='http://translate.lotros.ru/'>http://translate.lotros.ru/</a>", "http://translate.lotros.ru/", "");
  32. return;
  33. }
  34. QStringList events_list = QString(events_data).split("|");
  35. events_data.clear();
  36. for (int i = 0; i < events_list.size(); i++) {
  37. QStringList event_piece = events_list[i].split(":::");
  38. qDebug() << "Processing event " << event_piece;
  39. QString title = event_piece[0];
  40. QString img_src = event_piece[1];
  41. QString desrc = event_piece[2];
  42. QString date_begin = event_piece[3];
  43. QString date_end = event_piece[4];
  44. QString date_formatted = event_piece[5];
  45. constructEventPiece(i, title, desrc, "", date_formatted);
  46. QtConcurrent::run([i, this, img_src](){
  47. Downloader img_dwnld;
  48. QByteArray img = "";
  49. img_dwnld.setUrl(QUrl(img_src));
  50. img_dwnld.targetBytearray = &img;
  51. img_dwnld.start();
  52. img_dwnld.waitForDownloaded();
  53. qDebug() << "Downloaded " << img_src;
  54. QPixmap img_pixmap;
  55. img_pixmap.loadFromData(img);
  56. QMetaObject::invokeMethod(this, "setImgToEventPiece", Qt::QueuedConnection, Q_ARG(int, i), Q_ARG(QPixmap, img_pixmap));
  57. });
  58. }
  59. }
  60. void EventsListWidget::constructEventPiece(int piece_id, QString title, QString text, QString news_src, QString news_date)
  61. {
  62. NewsPiece* old_piece = findChild<NewsPiece*>("event_piece_" + QString::number(piece_id));
  63. if (old_piece) {
  64. event_layout->removeWidget(old_piece);
  65. old_piece->deleteLater();
  66. }
  67. NewsPiece* news_piece = new NewsPiece(this);
  68. news_piece->setObjectName(QStringLiteral("event_piece_") + QString::number(piece_id));
  69. news_piece->setIcon(QPixmap(QString::fromUtf8(":/appicon.ico")).scaled(40, 40));
  70. news_piece->setTitle(title, news_src);
  71. news_piece->setContents(text);
  72. news_piece->setDate(news_date);
  73. event_layout->addWidget(news_piece, piece_id, 0);
  74. }
  75. void EventsListWidget::setImgToEventPiece(int piece_id, QPixmap img)
  76. {
  77. NewsPiece* piece = findChild<NewsPiece*>("event_piece_" + QString::number(piece_id));
  78. if (!piece)
  79. return;
  80. piece->setIcon(img);
  81. }