newswidget.cpp 5.7 KB

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