serverstatuswidget.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "serverstatuswidget.h"
  2. #include <QApplication>
  3. #include <QtConcurrent/QtConcurrent>
  4. #include <QPainter>
  5. #include <QPaintEvent>
  6. ServerStatusWidget::ServerStatusWidget(QWidget *parent) : QWidget(parent)
  7. {
  8. setAttribute(Qt::WA_Hover);
  9. setMouseTracking(true);
  10. current_bg = QPixmap(":/flags/flag2.png");
  11. changeImageSrc(":/flags/flag2.png");
  12. }
  13. void ServerStatusWidget::changeImageSrc(const QString &src)
  14. {
  15. if (!qApp)
  16. return;
  17. img_src = src;
  18. QPixmap *cur_bg = new QPixmap(current_bg);
  19. QPixmap *new_bg= new QPixmap(QPixmap(src));
  20. QtConcurrent::run([cur_bg, new_bg, src, this](){
  21. const int iterations_num = 100;
  22. const int iteration_sleep = 20;
  23. for (int i = 0; i < iterations_num && qApp; i++) {
  24. if (img_src != src)
  25. break;
  26. QPainter painter;
  27. painter.begin(cur_bg);
  28. painter.setOpacity(double(10 + i) / double(iterations_num));
  29. painter.setCompositionMode(QPainter::CompositionMode_Source);
  30. painter.drawPixmap(0,0, *new_bg);
  31. painter.end();
  32. bg_lock.lock();
  33. current_bg = *cur_bg;
  34. bg_lock.unlock();
  35. QMetaObject::invokeMethod(this, "repaint", Qt::QueuedConnection);
  36. QThread::msleep(iteration_sleep);
  37. }
  38. delete cur_bg;
  39. delete new_bg;
  40. });
  41. }
  42. void ServerStatusWidget::enterEvent(QEvent * event)
  43. {
  44. qDebug() << Q_FUNC_INFO << this->objectName();
  45. changeImageSrc(":/flags/flag2_hover.png");
  46. QWidget::enterEvent(event);
  47. }
  48. void ServerStatusWidget::paintEvent(QPaintEvent *event)
  49. {
  50. Q_UNUSED(event);
  51. QPainter painter;
  52. painter.begin(this);
  53. painter.drawPixmap(0,0, current_bg);
  54. painter.end();
  55. }
  56. void ServerStatusWidget::leaveEvent(QEvent * event)
  57. {
  58. qDebug() << Q_FUNC_INFO << this->objectName();
  59. changeImageSrc(":/flags/flag2.png");
  60. QWidget::leaveEvent(event);
  61. }