statusflagwidget.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "statusflagwidget.h"
  2. #include <QApplication>
  3. #include <QtConcurrent/QtConcurrent>
  4. #include <QPainter>
  5. #include <QPaintEvent>
  6. #include <QToolTip>
  7. StatusFlagWidget::StatusFlagWidget(QWidget *parent) : QWidget(parent)
  8. {
  9. setAttribute(Qt::WA_Hover);
  10. setMouseTracking(true);
  11. changeFlagId(3);
  12. changeImageSrcInstantly(current_flag_src);
  13. }
  14. void StatusFlagWidget::changeImageSrcAnimated(const QString &src)
  15. {
  16. if (!qApp)
  17. return;
  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 (!(is_hovered && current_flag_hover_src == src) && !(!is_hovered && current_flag_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 StatusFlagWidget::changeImageSrcInstantly(const QString &src)
  43. {
  44. current_bg = QPixmap(src);
  45. repaint();
  46. }
  47. void StatusFlagWidget::changeFlagId(int new_flag_id)
  48. {
  49. if (new_flag_id == flag_id)
  50. return;
  51. flag_id = new_flag_id;
  52. current_flag_src = ":/flags/flag" + QString::number(flag_id) + ".png";
  53. current_flag_hover_src = ":/flags/flag" + QString::number(flag_id) + "_hover.png";
  54. emit flagIdChanged(flag_id);
  55. }
  56. void StatusFlagWidget::enterEvent(QEvent * event)
  57. {
  58. is_hovered = true;
  59. changeImageSrcAnimated(current_flag_hover_src);
  60. QWidget::enterEvent(event);
  61. event->ignore();
  62. emit mouseEntered("Нажмите, чтобы переключиться между новостями/текущими событиями и статусом серверов.");
  63. }
  64. void StatusFlagWidget::paintEvent(QPaintEvent *event)
  65. {
  66. Q_UNUSED(event);
  67. QPainter painter;
  68. painter.begin(this);
  69. painter.drawPixmap(0,0, current_bg);
  70. painter.end();
  71. }
  72. void StatusFlagWidget::leaveEvent(QEvent * event)
  73. {
  74. is_hovered = false;
  75. changeImageSrcAnimated(current_flag_src);
  76. QWidget::leaveEvent(event);
  77. event->ignore();
  78. emit mouseLeaved();
  79. }
  80. void StatusFlagWidget::mousePressEvent(QMouseEvent *ev)
  81. {
  82. if (flag_id == 2) {
  83. changeFlagId(3);
  84. changeImageSrcInstantly(current_flag_hover_src);
  85. } else {
  86. changeFlagId(2);
  87. changeImageSrcInstantly(current_flag_hover_src);
  88. }
  89. QWidget::mousePressEvent(ev);
  90. }