// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-commercial #include "appwindow.h" #include "slint_platform.h" #include #include #include namespace slint_platform = slint::experimental::platform; slint::cbindgen_private::PointerEventButton convert_button(Qt::MouseButtons b) { switch (b) { case Qt::LeftButton: return slint::cbindgen_private::PointerEventButton::Left; case Qt::RightButton: return slint::cbindgen_private::PointerEventButton::Right; case Qt::MiddleButton: return slint::cbindgen_private::PointerEventButton::Middle; default: return slint::cbindgen_private::PointerEventButton::Other; } } class MyWindow : public QWindow, public slint_platform::WindowAdapter { public: MyWindow(QWindow *parentWindow = nullptr) : QWindow(parentWindow) { } /*void keyEvent(QKeyEvent *event) override { renderer()->dispatch_key_event(slint::cbingen_private::UglyEnum {... }) }*/ void paintEvent(QPaintEvent *ev) override { slint_platform::update_timers_and_animations(); auto windowSize = slint::PhysicalSize({ uint32_t(width()), uint32_t(height()) }); renderer().render(windowSize); if (has_active_animations()) { requestUpdate(); } } bool event(QEvent *e) override { if (e->type() == QEvent::UpdateRequest) { paintEvent(static_cast(e)); return true; } else { return QWindow::event(e); } } void show() const override { auto window = const_cast(static_cast(this)); window->QWindow::show(); auto windowSize = slint::PhysicalSize({ uint32_t(width()), uint32_t(height()) }); #ifdef __APPLE__ QPlatformNativeInterface *native = qApp->platformNativeInterface(); void *nsview = native->nativeResourceForWindow(QByteArray("nsview"), window); void *nswindow = native->nativeResourceForWindow(QByteArray("nswindow"), window); renderer().show(nsview, nswindow, windowSize); #elif defined Q_OS_WIN auto wid = Qt::HANDLE(winId()); renderer().show( wid, GetModuleHandle(nullptr), slint_platform::WindowAdapter::window().size()); #else auto wid = winId(); auto visual_id = 0; // FIXME QPlatformNativeInterface *native = qApp->platformNativeInterface(); auto *connection = reinterpret_cast( native->nativeResourceForWindow(QByteArray("connection"), window)); auto screen = quintptr(native->nativeResourceForWindow(QByteArray("screen"), window)); renderer().show( wid, wid, connection, screen, slint_platform::WindowAdapter::window().size()); #endif } void hide() const override { renderer().hide(); const_cast(this)->QWindow::hide(); } void request_redraw() const override { const_cast(this)->requestUpdate(); } void resizeEvent(QResizeEvent *ev) override { auto windowSize = slint::PhysicalSize( { uint32_t(ev->size().width()), uint32_t(ev->size().height()) }); renderer().resize(windowSize); slint_platform::WindowAdapter::window().set_size(windowSize); } void mousePressEvent(QMouseEvent *event) override { slint_platform::update_timers_and_animations(); dispatch_pointer_event(slint::cbindgen_private::MouseEvent { .tag = slint::cbindgen_private::MouseEvent::Tag::Pressed, .pressed = slint::cbindgen_private::MouseEvent::Pressed_Body { .position = { float(event->pos().x()), float(event->pos().y()) }, .button = convert_button(event->button()) } }); } void mouseReleaseEvent(QMouseEvent *event) override { slint_platform::update_timers_and_animations(); dispatch_pointer_event(slint::cbindgen_private::MouseEvent { .tag = slint::cbindgen_private::MouseEvent::Tag::Released, .released = slint::cbindgen_private::MouseEvent::Released_Body { .position = { float(event->pos().x()), float(event->pos().y()) }, .button = convert_button(event->button()) } }); } void mouseMoveEvent(QMouseEvent *event) override { slint_platform::update_timers_and_animations(); dispatch_pointer_event(slint::cbindgen_private::MouseEvent { .tag = slint::cbindgen_private::MouseEvent::Tag::Moved, .moved = slint::cbindgen_private::MouseEvent::Moved_Body { .position = { float(event->pos().x()), float(event->pos().y()) }, } }); } }; struct MyPlatform : public slint_platform::Platform { std::unique_ptr parentWindow; std::unique_ptr create_window_adapter() const override { return std::make_unique(parentWindow.get()); } }; int main(int argc, char **argv) { QApplication app(argc, argv); static MyPlatform *plarform = [] { auto platform = std::make_unique(); auto p2 = platform.get(); MyPlatform::register_platform(std::move(platform)); return p2; }(); slint_platform::update_timers_and_animations(); auto my_ui = App::create(); // mu_ui->set_property(....); my_ui->show(); return app.exec(); }