diff --git a/tests/manual/wasm/CMakeLists.txt b/tests/manual/wasm/CMakeLists.txt index b13f6781b86..f2997937d7b 100644 --- a/tests/manual/wasm/CMakeLists.txt +++ b/tests/manual/wasm/CMakeLists.txt @@ -10,4 +10,5 @@ add_subdirectory(localfiles) add_subdirectory(localfonts) add_subdirectory(qstdweb) add_subdirectory(clipboard) +add_subdirectory(windowmanagement) endif() diff --git a/tests/manual/wasm/windowmanagement/CMakeLists.txt b/tests/manual/wasm/windowmanagement/CMakeLists.txt new file mode 100644 index 00000000000..76b7832a17e --- /dev/null +++ b/tests/manual/wasm/windowmanagement/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_manual_test(windowmanagement + GUI + SOURCES + main.cpp + LIBRARIES + Qt::Core + Qt::Gui + Qt::Widgets +) diff --git a/tests/manual/wasm/windowmanagement/main.cpp b/tests/manual/wasm/windowmanagement/main.cpp new file mode 100644 index 00000000000..f5bb8a018bd --- /dev/null +++ b/tests/manual/wasm/windowmanagement/main.cpp @@ -0,0 +1,181 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include + +class WindowManagedWindow: public QWidget +{ + Q_OBJECT +public: + WindowManagedWindow(QWidget *parent = nullptr) + :QWidget(parent) + { + QVBoxLayout *layout = new QVBoxLayout(); + + // UI for controlling window show state + QHBoxLayout *showWindowLayout = new QHBoxLayout(); + layout->addLayout(showWindowLayout); + QPushButton *showNormal = new QPushButton("Show Normal"); + QPushButton *showFullscreen = new QPushButton("Show FullScreen"); + QPushButton *showMaximized = new QPushButton("Show Maximized"); + QPushButton *close = new QPushButton("Close"); + + showWindowLayout->addWidget(showNormal); + showWindowLayout->addWidget(showFullscreen); + showWindowLayout->addWidget(showMaximized); + showWindowLayout->addWidget(close); + + connect(showNormal, &QPushButton::clicked, [=]() { + this->showNormal(); + }); + connect(showFullscreen, &QPushButton::clicked, [=]() { + this->showFullScreen(); + }); + connect(showMaximized, &QPushButton::clicked, [=]() { + this->showMaximized(); + }); + connect(close, &QPushButton::clicked, [=]() { + this->close(); + }); + + // UI for adding a child window + QHBoxLayout *childWindowLayout = new QHBoxLayout(); + layout->addLayout(childWindowLayout); + QPushButton *showChild = new QPushButton("Add Child Window"); + childWindowLayout->addWidget(showChild); + connect(showChild, &QPushButton::clicked, [=]() { + WindowManagedWindow *childWindow = new WindowManagedWindow(this); + childWindow->winId(); // ensure it has a QWindow + childWindow->setBackgroundColor("AliceBlue"); + childWindowLayout->insertWidget(1, childWindow); + childWindow->show(); + }); + childWindowLayout->addStretch(); + + // UI for showing a transient child window + QHBoxLayout *transientChildWindowLayout = new QHBoxLayout(); + layout->addLayout(transientChildWindowLayout); + QPushButton *showTransientChild = new QPushButton("Add Transient Child Window"); + transientChildWindowLayout->addWidget(showTransientChild); + QRadioButton *modal = new QRadioButton("Modal Dialog"); + transientChildWindowLayout->addWidget(modal); + QRadioButton *popup = new QRadioButton("Popup"); + transientChildWindowLayout->addWidget(popup); + QButtonGroup *radioGroup = new QButtonGroup(); + radioGroup->addButton(modal); + radioGroup->addButton(popup); + modal->setChecked(true); + + connect(showTransientChild, &QPushButton::clicked, [this, modal]() { + WindowManagedWindow *transientChildWindow = new WindowManagedWindow(); + transientChildWindow->winId(); + + if (modal->isChecked()) { + transientChildWindow->setWindowFlag(Qt::Dialog); + transientChildWindow->setWindowModality(Qt::WindowModal); + transientChildWindow->setBackgroundColor("MistyRose"); + } else { + transientChildWindow->setWindowFlag(Qt::Popup); + transientChildWindow->setBackgroundColor("LavenderBlush"); + } + + transientChildWindow->windowHandle()->setTransientParent(this->windowHandle()); + transientChildWindow->show(); + + }); + transientChildWindowLayout->addStretch(); + + // UI for adding a new top-level window + if (!parentWidget()) { + QHBoxLayout *addWindowLayout = new QHBoxLayout(); + layout->addLayout(addWindowLayout); + QPushButton *addWindow = new QPushButton("Add Top-level Window"); + QRadioButton *addNormal = new QRadioButton("Normal"); + QRadioButton *addFullScreen = new QRadioButton("FullScreen"); + QRadioButton *addMaximized = new QRadioButton("Maximized"); + + QButtonGroup *radioGroup = new QButtonGroup(); + radioGroup->addButton(addNormal); + radioGroup->addButton(addFullScreen); + radioGroup->addButton(addMaximized); + addNormal->setChecked(true); + + addWindowLayout->addWidget(addWindow); + addWindowLayout->addWidget(addNormal); + addWindowLayout->addWidget(addFullScreen); + addWindowLayout->addWidget(addMaximized); + + connect(addWindow, &QPushButton::clicked, [=]() { + QWidget *newWindow = new WindowManagedWindow(); + if (addNormal->isChecked()) { + newWindow->showNormal(); + } else if (addFullScreen->isChecked()) { + newWindow->showFullScreen(); + } else if (addMaximized->isChecked()) { + newWindow->showMaximized(); + } + }); + } + + // Test label + QHBoxLayout *labelLayout = new QHBoxLayout(); + layout->addLayout(labelLayout); + labelLayout->addWidget(new QLabel("Test Text Input:")); + labelLayout->addWidget(new QLineEdit()); + labelLayout->addSpacerItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding)); + + setLayout(layout); + + updateWindowFocusState(); + } + + void paintEvent(QPaintEvent *event) override + { + updateWindowFocusState(); // hacky update + QWidget::paintEvent(event); + } + + void updateWindowFocusState() + { + QString title = QString("isActive: %1 Modal: %2") + .arg(isActiveWindow() ? "yes" : "no") + .arg(isModal() ? "yes" : "no"); + setWindowTitle(title); + } + + void setBackgroundColor(const QString &colorName) + { + QColor color(colorName); + if (!color.isValid()) { + qWarning("Invalid color name provided: %s", qPrintable(colorName)); + return; + } + QPalette palette = this->palette(); + palette.setColor(QPalette::Window, color); + this->setAutoFillBackground(true); + this->setPalette(palette); + } +}; + +int main(int argc, char **argv) +{ + // Limit native widgets to the WindowManagedWindow instances + QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); + + QApplication app(argc, argv); + + QObject::connect(qApp, &QApplication::focusChanged, [](QWidget *oldWidget, QWidget *newWidget) { + if (oldWidget) + if (WindowManagedWindow *window = qobject_cast(oldWidget->window())) + window->updateWindowFocusState(); + if (newWidget) + if (WindowManagedWindow *window = qobject_cast(newWidget->window())) + window->updateWindowFocusState(); + }); + + WindowManagedWindow window; + window.showNormal(); + + return app.exec(); +} + +#include "main.moc"