newslistwidget.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "newslistwidget.h"
  2. #include <QtConcurrent/QtConcurrent>
  3. #include <QLabel>
  4. #include <QStringList>
  5. #include <QSpacerItem>
  6. #include <widgets/newspiece.h>
  7. #include "models/settings.h"
  8. NewsListWidget::NewsListWidget(QWidget *parent) : QWidget(parent)
  9. {
  10. news_downloader.targetBytearray = &news_data;
  11. news_downloader.setUrl(Settings::getValue("Network/news_list_url").toUrl());
  12. news_layout = new QVBoxLayout(this);
  13. news_layout->setSpacing(10);
  14. news_layout->setObjectName(QStringLiteral("news_layout"));
  15. news_layout->setContentsMargins(2, 2, 10, 2);
  16. news_layout->setSizeConstraint(QLayout::SetNoConstraint);
  17. connect(&news_update_timer, &QTimer::timeout, &news_downloader, &Downloader::start);
  18. connect(&news_downloader, &Downloader::downloadFinished, this, &NewsListWidget::updateNews);
  19. news_downloader.start();
  20. news_update_timer.setInterval(1000 * 60 * 5); // 5 minutes;
  21. news_update_timer.start();
  22. setMouseTracking(true);
  23. }
  24. NewsListWidget::~NewsListWidget()
  25. {
  26. news_update_timer.stop();
  27. }
  28. void NewsListWidget::leaveEvent(QEvent *event)
  29. {
  30. emit showNoToolTip();
  31. }
  32. void NewsListWidget::enterEvent(QEvent *event)
  33. {
  34. emit showHelpToolTip();
  35. }
  36. void NewsListWidget::updateNewsWidget()
  37. {
  38. news_downloader.start();
  39. }
  40. void NewsListWidget::updateNews()
  41. {
  42. if (!qApp)
  43. return;
  44. if (news_data.size() == 0) {
  45. constructNewsPiece(0, "Не могу загрузить новости", "Загрузка новостей не удалась. Чтобы просмотреть новости, перейдите на <a href='http://translate.lotros.ru/news'>http://translate.lotros.ru/news</a>", "http://translate.lotros.ru/news", "");
  46. return;
  47. }
  48. QStringList news_list = QString(news_data).split(":::");
  49. news_data.clear();
  50. for (int i = 0; i < news_list.size(); i++) {
  51. QStringList news_piece = news_list[i].split("|");
  52. if (news_piece.size() != 5) {
  53. qDebug() << "Incorrect news piece: " << news_piece << "\nNews data:" << news_list;
  54. return;
  55. }
  56. QString img_src = news_piece[0];
  57. QString news_title = news_piece[1];
  58. QString news_desrc = news_piece[2];
  59. QString news_src = news_piece[3];
  60. QString news_date = news_piece[4];
  61. constructNewsPiece(i, news_title, news_desrc, news_src, news_date);
  62. }
  63. QSpacerItem* verticalSpacer = new QSpacerItem(20, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
  64. news_layout->addItem(verticalSpacer);
  65. }
  66. void NewsListWidget::constructNewsPiece(int piece_id, QString title, QString text, QString news_src, QString news_date)
  67. {
  68. NewsPiece* old_piece = findChild<NewsPiece*>("news_piece_" + QString::number(piece_id));
  69. if (old_piece) {
  70. news_layout->removeWidget(old_piece);
  71. old_piece->deleteLater();
  72. }
  73. NewsPiece* news_piece = new NewsPiece(this);
  74. news_piece->setObjectName(QStringLiteral("news_piece_") + QString::number(piece_id));
  75. news_piece->setTitle(title, news_src);
  76. news_piece->setDate(news_date);
  77. news_layout->addWidget(news_piece, piece_id, 0);
  78. }