newswidget.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "gui\newswidget.h"
  2. #include "ui_newswidget.h"
  3. #include "networkdownloader.h"
  4. #include "legacyapp.h"
  5. #include <QtConcurrent/QtConcurrent>
  6. #include <QLabel>
  7. NewsWidget::NewsWidget(LegacyApp *_app, QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::NewsWidget),
  10. app(_app), news_downloader(this)
  11. {
  12. ui->setupUi(this);
  13. news_downloader.targetBytearray = &news_data;
  14. news_downloader.setUrl(QUrl("http://translate.lotros.ru/groupware/launcher_news"));
  15. connect(&news_update_timer, &QTimer::timeout, &news_downloader, &NetworkDownloader::start);
  16. connect(&news_downloader, &NetworkDownloader::downloadFinished, this, &NewsWidget::updateNews);
  17. emit news_downloader.start();
  18. news_update_timer.setInterval(1000 * 60); // 10 minutes;
  19. news_update_timer.start();
  20. }
  21. NewsWidget::~NewsWidget()
  22. {
  23. news_update_timer.stop();
  24. delete ui;
  25. }
  26. void NewsWidget::updateNews()
  27. {
  28. QStringList news_list = QString(news_data).split(":::");
  29. news_data.clear();
  30. for (int i = 0; i < news_list.size(); i++) {
  31. QStringList news_piece = news_list[i].split("|");
  32. QString img_src = news_piece[0];
  33. QString news_title = news_piece[1];
  34. QString news_desrc = news_piece[2];
  35. QString news_src = news_piece[3];
  36. constructNewsPiece(i, news_title, news_desrc, news_src);
  37. QtConcurrent::run([i, this, img_src](){
  38. NetworkDownloader img_dwnld;
  39. QByteArray img;
  40. img_dwnld.setUrl(QUrl(img_src));
  41. img_dwnld.targetBytearray = &img;
  42. img_dwnld.start();
  43. img_dwnld.waitForDownloaded();
  44. QPixmap img_pixmap;
  45. img_pixmap.loadFromData(img);
  46. setImgToNewsPiece(i, img_pixmap);
  47. });
  48. }
  49. }
  50. void NewsWidget::constructNewsPiece(int piece_id, QString title, QString text, QString news_src)
  51. {
  52. QWidget* old_piece = findChild<QWidget*>("news_piece_" + QString::number(piece_id));
  53. if (old_piece) {
  54. ui->news_layout->removeWidget(old_piece);
  55. old_piece->deleteLater();
  56. }
  57. QWidget* news_piece = new QWidget(this);
  58. news_piece->setObjectName(QStringLiteral("news_piece_") + QString::number(piece_id));
  59. QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
  60. sizePolicy.setHorizontalStretch(0);
  61. sizePolicy.setVerticalStretch(0);
  62. sizePolicy.setHeightForWidth(news_piece->sizePolicy().hasHeightForWidth());
  63. news_piece->setSizePolicy(sizePolicy);
  64. news_piece->setStyleSheet(QLatin1String("QWidget{\n"
  65. "border-radius: 20px;\n"
  66. "background-color: rgba(30, 0, 0, 100);\n"
  67. "color: white;\n"
  68. "}\n"
  69. "\n"
  70. "QLabel{\n"
  71. "border-radius: 2px;\n"
  72. "background-color:rgba(0,0,0,0);\n"
  73. "}"));
  74. QGridLayout* news_piece_layout = new QGridLayout(news_piece);
  75. news_piece_layout->setObjectName(QStringLiteral("news_piece_layout"));
  76. QLabel* iconLabel = new QLabel(news_piece);
  77. iconLabel->setObjectName(QStringLiteral("news_icon_") + QString::number(piece_id));
  78. QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);
  79. sizePolicy1.setHorizontalStretch(0);
  80. sizePolicy1.setVerticalStretch(0);
  81. sizePolicy1.setHeightForWidth(iconLabel->sizePolicy().hasHeightForWidth());
  82. iconLabel->setSizePolicy(sizePolicy1);
  83. iconLabel->setMinimumSize(QSize(60, 60));
  84. iconLabel->setMaximumSize(QSize(60, 60));
  85. iconLabel->setPixmap(QPixmap(QString::fromUtf8(":/assets/appicon.ico")).scaled(60, 60));
  86. news_piece_layout->addWidget(iconLabel, 0, 0, 2, 1);
  87. QLabel* titleLabel = new QLabel(news_piece);
  88. titleLabel->setObjectName(QStringLiteral("titleLabel_title"));
  89. sizePolicy.setHeightForWidth(titleLabel->sizePolicy().hasHeightForWidth());
  90. titleLabel->setSizePolicy(sizePolicy);
  91. QFont font;
  92. font.setFamily(QStringLiteral("Trebuchet MS"));
  93. font.setPointSize(11);
  94. font.setBold(true);
  95. titleLabel->setFont(font);
  96. titleLabel->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter);
  97. titleLabel->setWordWrap(true);
  98. titleLabel->setText("<a style=\"color: white; text-decoration:none;\" href = '" + news_src + "'>" + title + "</a>");
  99. titleLabel->setOpenExternalLinks(true);
  100. news_piece_layout->addWidget(titleLabel, 0, 1, 1, 1);
  101. QLabel* contentLabel = new QLabel(news_piece);
  102. contentLabel->setObjectName(QStringLiteral("contentLabel_common"));
  103. contentLabel->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);
  104. contentLabel->setWordWrap(true);
  105. contentLabel->setText(text);
  106. news_piece_layout->addWidget(contentLabel, 1, 1, 1, 1);
  107. app->window.changeFontSizeRecursive(app->properties.value("settings/ui_scale", 100).toInt(), news_piece);
  108. ui->news_layout->addWidget(news_piece);
  109. }
  110. void NewsWidget::setImgToNewsPiece(int piece_id, QPixmap img)
  111. {
  112. QLabel* old_piece = findChild<QLabel*>("news_icon_" + QString::number(piece_id));
  113. if (!old_piece)
  114. return;
  115. old_piece->setPixmap(img.scaled(60, 60));
  116. }