weeklycodewidget.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "weeklycodewidget.h"
  2. #include <QApplication>
  3. #include <QtConcurrent/QtConcurrent>
  4. #include <QPainter>
  5. #include <QPaintEvent>
  6. #include <QClipboard>
  7. WeeklyCodeWidget::WeeklyCodeWidget(QWidget *parent) : QLabel(parent)
  8. {
  9. setAttribute(Qt::WA_Hover);
  10. setMouseTracking(true);
  11. current_bg = QPixmap(":/buttons/lotr_circle.png").scaled(130, 130);
  12. changeImageSrc(":/buttons/lotr_circle.png");
  13. setText("ЗАГРУЗКА");
  14. code_data = "";
  15. code_downloader.targetBytearray = &code_data;
  16. code_downloader.setUrl(QUrl("http://translate.lotros.ru/coupon.txt"));
  17. connect(&code_update_timer, &QTimer::timeout, &code_downloader, &Downloader::start);
  18. connect(&code_downloader, &Downloader::downloadFinished, this, &WeeklyCodeWidget::updateCode, Qt::QueuedConnection);
  19. emit code_downloader.start();
  20. code_update_timer.setInterval(1000 * 60); // 1 minute;
  21. code_update_timer.start();
  22. }
  23. void WeeklyCodeWidget::changeImageSrc(const QString &src)
  24. {
  25. if (!qApp)
  26. return;
  27. img_src = src;
  28. QPixmap *cur_bg = new QPixmap(current_bg.scaled(130, 130));
  29. QPixmap *new_bg= new QPixmap(QPixmap(src).scaled(130, 130));
  30. QtConcurrent::run([cur_bg, new_bg, src, this](){
  31. const int iterations_num = 50;
  32. const int iteration_sleep = 40;
  33. for (int i = 0; i < iterations_num && qApp; i++) {
  34. if (img_src != src)
  35. break;
  36. QPainter painter;
  37. painter.begin(cur_bg);
  38. painter.setOpacity(double(10 + i) / double(iterations_num));
  39. painter.setCompositionMode(QPainter::CompositionMode_Source);
  40. painter.drawPixmap(0,0, *new_bg);
  41. painter.end();
  42. bg_lock.lock();
  43. current_bg = *cur_bg;
  44. bg_lock.unlock();
  45. QMetaObject::invokeMethod(this, "repaint", Qt::QueuedConnection);
  46. QThread::msleep(iteration_sleep);
  47. }
  48. delete cur_bg;
  49. delete new_bg;
  50. });
  51. }
  52. void WeeklyCodeWidget::enterEvent(QEvent * event)
  53. {
  54. changeImageSrc(":/buttons/lotr_circle_hover.png");
  55. QWidget::enterEvent(event);
  56. event->ignore();
  57. emit mouseEntered("<a href='http://www.lotro-mindon.ru/content/kak-poluchit-ezhenedelnyy-podarok'>Код недели.</a>\nНажмите, чтобы скопировать в буфер обмена");
  58. }
  59. void WeeklyCodeWidget::paintEvent(QPaintEvent *event)
  60. {
  61. QPainter painter;
  62. painter.begin(this);
  63. painter.drawPixmap(0,0, current_bg);
  64. painter.end();
  65. QLabel::paintEvent(event);
  66. }
  67. void WeeklyCodeWidget::mousePressEvent(QMouseEvent *ev)
  68. {
  69. setStyleSheet("color: rgb(255, 150, 0);");
  70. ev->ignore();
  71. }
  72. void WeeklyCodeWidget::mouseReleaseEvent(QMouseEvent *ev)
  73. {
  74. setStyleSheet("color: rgb(255, 180, 0);");
  75. QApplication::clipboard()->setText(text());
  76. ev->ignore();
  77. }
  78. void WeeklyCodeWidget::updateCode()
  79. {
  80. qDebug() << "New code: " << code_data;
  81. if (code_data.isEmpty())
  82. return;
  83. setText(code_data);
  84. repaint();
  85. code_data = "";
  86. }
  87. void WeeklyCodeWidget::leaveEvent(QEvent * event)
  88. {
  89. qDebug() << Q_FUNC_INFO << this->objectName();
  90. changeImageSrc(":/buttons/lotr_circle.png");
  91. emit mouseLeaved();
  92. }