mirror of https://github.com/mgba-emu/mgba.git
Qt: Fix cursor events for aspect-ratio locked
This commit is contained in:
parent
47070562b8
commit
6215bca45b
|
@ -68,6 +68,19 @@ Display::Display(QWidget* parent)
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSize Display::viewportSize() {
|
||||||
|
QSize s = size();
|
||||||
|
QSize ds = s;
|
||||||
|
if (isAspectRatioLocked()) {
|
||||||
|
if (s.width() * m_coreHeight > s.height() * m_coreWidth) {
|
||||||
|
ds.setWidth(s.height() * m_coreWidth / m_coreHeight);
|
||||||
|
} else if (s.width() * m_coreHeight < s.height() * m_coreWidth) {
|
||||||
|
ds.setHeight(s.width() * m_coreHeight / m_coreWidth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ds;
|
||||||
|
}
|
||||||
|
|
||||||
void Display::resizeEvent(QResizeEvent*) {
|
void Display::resizeEvent(QResizeEvent*) {
|
||||||
m_messagePainter.resize(size(), m_lockAspectRatio, devicePixelRatio());
|
m_messagePainter.resize(size(), m_lockAspectRatio, devicePixelRatio());
|
||||||
}
|
}
|
||||||
|
@ -94,3 +107,8 @@ void Display::mouseMoveEvent(QMouseEvent* event) {
|
||||||
m_mouseTimer.start();
|
m_mouseTimer.start();
|
||||||
event->ignore();
|
event->ignore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Display::setSystemDimensions(int width, int height) {
|
||||||
|
m_coreWidth = width;
|
||||||
|
m_coreHeight = height;
|
||||||
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@ public:
|
||||||
virtual bool supportsShaders() const = 0;
|
virtual bool supportsShaders() const = 0;
|
||||||
virtual VideoShader* shaders() = 0;
|
virtual VideoShader* shaders() = 0;
|
||||||
|
|
||||||
|
QSize viewportSize();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void showCursor();
|
void showCursor();
|
||||||
void hideCursor();
|
void hideCursor();
|
||||||
|
@ -68,6 +70,8 @@ protected:
|
||||||
|
|
||||||
MessagePainter* messagePainter() { return &m_messagePainter; }
|
MessagePainter* messagePainter() { return &m_messagePainter; }
|
||||||
|
|
||||||
|
void setSystemDimensions(int width, int height);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Driver s_driver;
|
static Driver s_driver;
|
||||||
static const int MOUSE_DISAPPEAR_TIMER = 1000;
|
static const int MOUSE_DISAPPEAR_TIMER = 1000;
|
||||||
|
@ -76,6 +80,8 @@ private:
|
||||||
bool m_lockAspectRatio;
|
bool m_lockAspectRatio;
|
||||||
bool m_filter;
|
bool m_filter;
|
||||||
QTimer m_mouseTimer;
|
QTimer m_mouseTimer;
|
||||||
|
int m_coreWidth;
|
||||||
|
int m_coreHeight;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,10 @@ void DisplayGL::startDrawing(mCoreThread* thread) {
|
||||||
mCoreSyncSetVideoSync(&m_context->sync, false);
|
mCoreSyncSetVideoSync(&m_context->sync, false);
|
||||||
|
|
||||||
lockAspectRatio(isAspectRatioLocked());
|
lockAspectRatio(isAspectRatioLocked());
|
||||||
|
unsigned width, height;
|
||||||
|
thread->core->desiredVideoDimensions(thread->core, &width, &height);
|
||||||
|
setSystemDimensions(width, height);
|
||||||
|
|
||||||
filter(isFiltered());
|
filter(isFiltered());
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
||||||
messagePainter()->resize(size(), isAspectRatioLocked(), devicePixelRatioF());
|
messagePainter()->resize(size(), isAspectRatioLocked(), devicePixelRatioF());
|
||||||
|
|
|
@ -21,6 +21,7 @@ DisplayQt::DisplayQt(QWidget* parent)
|
||||||
|
|
||||||
void DisplayQt::startDrawing(mCoreThread* context) {
|
void DisplayQt::startDrawing(mCoreThread* context) {
|
||||||
context->core->desiredVideoDimensions(context->core, &m_width, &m_height);
|
context->core->desiredVideoDimensions(context->core, &m_width, &m_height);
|
||||||
|
setSystemDimensions(m_width, m_height);
|
||||||
m_backing = std::move(QImage());
|
m_backing = std::move(QImage());
|
||||||
m_isDrawing = true;
|
m_isDrawing = true;
|
||||||
}
|
}
|
||||||
|
@ -58,14 +59,7 @@ void DisplayQt::paintEvent(QPaintEvent*) {
|
||||||
painter.setRenderHint(QPainter::SmoothPixmapTransform);
|
painter.setRenderHint(QPainter::SmoothPixmapTransform);
|
||||||
}
|
}
|
||||||
QSize s = size();
|
QSize s = size();
|
||||||
QSize ds = s;
|
QSize ds = viewportSize();
|
||||||
if (isAspectRatioLocked()) {
|
|
||||||
if (s.width() * m_height > s.height() * m_width) {
|
|
||||||
ds.setWidth(s.height() * m_width / m_height);
|
|
||||||
} else if (s.width() * m_height < s.height() * m_width) {
|
|
||||||
ds.setHeight(s.width() * m_height / m_width);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QPoint origin = QPoint((s.width() - ds.width()) / 2, (s.height() - ds.height()) / 2);
|
QPoint origin = QPoint((s.width() - ds.width()) / 2, (s.height() - ds.height()) / 2);
|
||||||
QRect full(origin, ds);
|
QRect full(origin, ds);
|
||||||
|
|
||||||
|
|
|
@ -686,9 +686,10 @@ void Window::dropEvent(QDropEvent* event) {
|
||||||
|
|
||||||
void Window::mouseMoveEvent(QMouseEvent* event) {
|
void Window::mouseMoveEvent(QMouseEvent* event) {
|
||||||
QSize dimensions = m_controller->screenDimensions();
|
QSize dimensions = m_controller->screenDimensions();
|
||||||
|
QSize viewportDimensions = m_display->viewportSize();
|
||||||
QSize screenDimensions = m_screenWidget->size();
|
QSize screenDimensions = m_screenWidget->size();
|
||||||
int x = dimensions.width() * event->x() / screenDimensions.width();
|
int x = dimensions.width() * (event->x() - (screenDimensions.width() - viewportDimensions.width()) / 2) / viewportDimensions.width();
|
||||||
int y = dimensions.height() * event->y() / screenDimensions.height();
|
int y = dimensions.height() * (event->y() - (screenDimensions.height() - viewportDimensions.height()) / 2) / viewportDimensions.height();
|
||||||
m_controller->cursorLocation(x, y);
|
m_controller->cursorLocation(x, y);
|
||||||
event->accept();
|
event->accept();
|
||||||
}
|
}
|
||||||
|
@ -698,9 +699,10 @@ void Window::mousePressEvent(QMouseEvent* event) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QSize dimensions = m_controller->screenDimensions();
|
QSize dimensions = m_controller->screenDimensions();
|
||||||
|
QSize viewportDimensions = m_display->viewportSize();
|
||||||
QSize screenDimensions = m_screenWidget->size();
|
QSize screenDimensions = m_screenWidget->size();
|
||||||
int x = dimensions.width() * event->x() / screenDimensions.width();
|
int x = dimensions.width() * (event->x() - (screenDimensions.width() - viewportDimensions.width()) / 2) / viewportDimensions.width();
|
||||||
int y = dimensions.height() * event->y() / screenDimensions.height();
|
int y = dimensions.height() * (event->y() - (screenDimensions.height() - viewportDimensions.height()) / 2) / viewportDimensions.height();
|
||||||
m_controller->cursorLocation(x, y);
|
m_controller->cursorLocation(x, y);
|
||||||
m_controller->cursorDown(true);
|
m_controller->cursorDown(true);
|
||||||
}
|
}
|
||||||
|
@ -710,9 +712,10 @@ void Window::mouseReleaseEvent(QMouseEvent* event) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QSize dimensions = m_controller->screenDimensions();
|
QSize dimensions = m_controller->screenDimensions();
|
||||||
|
QSize viewportDimensions = m_display->viewportSize();
|
||||||
QSize screenDimensions = m_screenWidget->size();
|
QSize screenDimensions = m_screenWidget->size();
|
||||||
int x = dimensions.width() * event->x() / screenDimensions.width();
|
int x = dimensions.width() * (event->x() - (screenDimensions.width() - viewportDimensions.width()) / 2) / viewportDimensions.width();
|
||||||
int y = dimensions.height() * event->y() / screenDimensions.height();
|
int y = dimensions.height() * (event->y() - (screenDimensions.height() - viewportDimensions.height()) / 2) / viewportDimensions.height();
|
||||||
m_controller->cursorLocation(x, y);
|
m_controller->cursorLocation(x, y);
|
||||||
m_controller->cursorDown(false);
|
m_controller->cursorDown(false);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue