Qt: Hook up mouse wheel to ImGui

This commit is contained in:
Connor McLaughlin 2021-02-26 02:42:20 +10:00
parent 9425f34ceb
commit 52c842e3b3
4 changed files with 47 additions and 9 deletions

View File

@ -177,6 +177,13 @@ bool QtDisplayWidget::event(QEvent* event)
return true;
}
case QEvent::Wheel:
{
const QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
emit windowMouseWheelEvent(wheel_event->angleDelta());
return true;
}
case QEvent::Resize:
{
QWidget::event(event);

View File

@ -30,6 +30,7 @@ Q_SIGNALS:
void windowKeyEvent(int key_code, bool pressed);
void windowMouseMoveEvent(int x, int y);
void windowMouseButtonEvent(int button, bool pressed);
void windowMouseWheelEvent(const QPoint& angle_delta);
protected:
bool event(QEvent* event) override;

View File

@ -413,7 +413,35 @@ void QtHostInterface::onDisplayWindowMouseButtonEvent(int button, bool pressed)
HandleHostMouseEvent(button, pressed);
}
void QtHostInterface::onHostDisplayWindowResized(int width, int height)
void QtHostInterface::onDisplayWindowMouseWheelEvent(const QPoint& delta_angle)
{
DebugAssert(isOnWorkerThread());
if (ImGui::GetCurrentContext())
{
ImGuiIO& io = ImGui::GetIO();
if (delta_angle.x() > 0)
io.MouseWheelH += 1.0f;
else if (delta_angle.x() < 0)
io.MouseWheelH -= 1.0f;
if (delta_angle.y() > 0)
io.MouseWheel += 1.0f;
else if (delta_angle.y() < 0)
io.MouseWheel -= 1.0f;
if (io.WantCaptureMouse)
{
// don't consume input events if it's hitting the UI instead
return;
}
}
// HandleHostMouseWheelEvent(delta_angle.x(), delta_angle.y());
}
void QtHostInterface::onDisplayWindowResized(int width, int height)
{
Log_WarningPrintf("resize %dx%d", width, height);
// this can be null if it was destroyed and the main thread is late catching up
@ -441,7 +469,7 @@ void QtHostInterface::onHostDisplayWindowResized(int width, int height)
}
}
void QtHostInterface::onHostDisplayWindowFocused()
void QtHostInterface::onDisplayWindowFocused()
{
if (!m_display || !m_lost_exclusive_fullscreen)
return;
@ -539,14 +567,15 @@ void QtHostInterface::connectDisplaySignals(QtDisplayWidget* widget)
{
widget->disconnect(this);
connect(widget, &QtDisplayWidget::windowFocusEvent, this, &QtHostInterface::onHostDisplayWindowFocused);
connect(widget, &QtDisplayWidget::windowResizedEvent, this, &QtHostInterface::onHostDisplayWindowResized);
connect(widget, &QtDisplayWidget::windowFocusEvent, this, &QtHostInterface::onDisplayWindowFocused);
connect(widget, &QtDisplayWidget::windowResizedEvent, this, &QtHostInterface::onDisplayWindowResized);
connect(widget, &QtDisplayWidget::windowRestoredEvent, this, &QtHostInterface::redrawDisplayWindow);
connect(widget, &QtDisplayWidget::windowClosedEvent, this, &QtHostInterface::powerOffSystem,
Qt::BlockingQueuedConnection);
connect(widget, &QtDisplayWidget::windowKeyEvent, this, &QtHostInterface::onDisplayWindowKeyEvent);
connect(widget, &QtDisplayWidget::windowMouseMoveEvent, this, &QtHostInterface::onDisplayWindowMouseMoveEvent);
connect(widget, &QtDisplayWidget::windowMouseButtonEvent, this, &QtHostInterface::onDisplayWindowMouseButtonEvent);
connect(widget, &QtDisplayWidget::windowMouseWheelEvent, this, &QtHostInterface::onDisplayWindowMouseWheelEvent);
}
void QtHostInterface::updateDisplayState()

View File

@ -143,9 +143,6 @@ public Q_SLOTS:
void applySettings(bool display_osd_messages = false);
void updateInputMap();
void applyInputProfile(const QString& profile_path);
void onDisplayWindowKeyEvent(int key, bool pressed);
void onDisplayWindowMouseMoveEvent(int x, int y);
void onDisplayWindowMouseButtonEvent(int button, bool pressed);
void bootSystem(std::shared_ptr<const SystemBootParameters> params);
void resumeSystemFromState(const QString& filename, bool boot_on_failure);
void resumeSystemFromMostRecentState();
@ -179,8 +176,12 @@ public Q_SLOTS:
private Q_SLOTS:
void doStopThread();
void onHostDisplayWindowResized(int width, int height);
void onHostDisplayWindowFocused();
void onDisplayWindowMouseMoveEvent(int x, int y);
void onDisplayWindowMouseButtonEvent(int button, bool pressed);
void onDisplayWindowMouseWheelEvent(const QPoint& delta_angle);
void onDisplayWindowResized(int width, int height);
void onDisplayWindowFocused();
void onDisplayWindowKeyEvent(int key, bool pressed);
void doBackgroundControllerPoll();
void doSaveSettings();