IRWidget.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2018 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "DolphinQt/TAS/IRWidget.h"
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <QMouseEvent>
  7. #include <QPainter>
  8. #include "Common/CommonTypes.h"
  9. constexpr int PADDING = 1;
  10. IRWidget::IRWidget(QWidget* parent) : QWidget(parent)
  11. {
  12. setMouseTracking(false);
  13. setToolTip(tr("Left click to set the IR value.\n"
  14. "Right click to re-center it."));
  15. // If the widget gets too small, it will get deformed.
  16. setMinimumSize(QSize(64, 48));
  17. }
  18. void IRWidget::SetX(u16 x)
  19. {
  20. m_x = std::min(IR_MAX_X, x);
  21. update();
  22. }
  23. void IRWidget::SetY(u16 y)
  24. {
  25. m_y = std::min(IR_MAX_Y, y);
  26. update();
  27. }
  28. void IRWidget::paintEvent(QPaintEvent* event)
  29. {
  30. QPainter painter(this);
  31. painter.setRenderHint(QPainter::Antialiasing, true);
  32. painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
  33. const int w = width() - PADDING * 2;
  34. const int h = height() - PADDING * 2;
  35. painter.setBrush(Qt::white);
  36. painter.drawRect(PADDING, PADDING, w, h);
  37. painter.drawLine(PADDING, PADDING + h / 2, PADDING + w, PADDING + h / 2);
  38. painter.drawLine(PADDING + w / 2, PADDING, PADDING + w / 2, PADDING + h);
  39. // convert from value space to widget space
  40. u16 x = PADDING + ((m_x * w) / IR_MAX_X);
  41. u16 y = PADDING + (h - (m_y * h) / IR_MAX_Y);
  42. painter.drawLine(PADDING + w / 2, PADDING + h / 2, x, y);
  43. painter.setBrush(Qt::blue);
  44. int wh_avg = (w + h) / 2;
  45. int radius = wh_avg / 30;
  46. painter.drawEllipse(x - radius, y - radius, radius * 2, radius * 2);
  47. }
  48. void IRWidget::mousePressEvent(QMouseEvent* event)
  49. {
  50. handleMouseEvent(event);
  51. m_ignore_movement = event->button() == Qt::RightButton;
  52. }
  53. void IRWidget::mouseMoveEvent(QMouseEvent* event)
  54. {
  55. if (!m_ignore_movement)
  56. handleMouseEvent(event);
  57. }
  58. void IRWidget::handleMouseEvent(QMouseEvent* event)
  59. {
  60. u16 prev_x = m_x;
  61. u16 prev_y = m_y;
  62. if (event->button() == Qt::RightButton)
  63. {
  64. m_x = std::round(IR_MAX_X / 2.);
  65. m_y = std::round(IR_MAX_Y / 2.);
  66. }
  67. else
  68. {
  69. // convert from widget space to value space
  70. int new_x = (event->pos().x() * IR_MAX_X) / width();
  71. int new_y = IR_MAX_Y - (event->pos().y() * IR_MAX_Y) / height();
  72. m_x = std::max(0, std::min(static_cast<int>(IR_MAX_X), new_x));
  73. m_y = std::max(0, std::min(static_cast<int>(IR_MAX_Y), new_y));
  74. }
  75. bool changed = false;
  76. if (prev_x != m_x)
  77. {
  78. emit ChangedX(m_x);
  79. changed = true;
  80. }
  81. if (prev_y != m_y)
  82. {
  83. emit ChangedY(m_y);
  84. changed = true;
  85. }
  86. if (changed)
  87. update();
  88. }