newslistwidget.cpp 3.7 KB

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