wasm: add window management manual test
Add manual test for normal/maximized/fullscreen window types, child windows, modal dialogs, popups, focus and activation handling. Task-number: QTBUG-128732 Change-Id: Ieb9bd4f8847017aeb9698cacd90a243f8ed4eb52 Reviewed-by: Piotr Wierciński <piotr.wiercinski@qt.io>
This commit is contained in:
parent
1a6ab689d5
commit
b2a433c332
@ -10,4 +10,5 @@ add_subdirectory(localfiles)
|
|||||||
add_subdirectory(localfonts)
|
add_subdirectory(localfonts)
|
||||||
add_subdirectory(qstdweb)
|
add_subdirectory(qstdweb)
|
||||||
add_subdirectory(clipboard)
|
add_subdirectory(clipboard)
|
||||||
|
add_subdirectory(windowmanagement)
|
||||||
endif()
|
endif()
|
||||||
|
12
tests/manual/wasm/windowmanagement/CMakeLists.txt
Normal file
12
tests/manual/wasm/windowmanagement/CMakeLists.txt
Normal file
@ -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
|
||||||
|
)
|
181
tests/manual/wasm/windowmanagement/main.cpp
Normal file
181
tests/manual/wasm/windowmanagement/main.cpp
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
||||||
|
#include <QtWidgets>
|
||||||
|
|
||||||
|
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<WindowManagedWindow *>(oldWidget->window()))
|
||||||
|
window->updateWindowFocusState();
|
||||||
|
if (newWidget)
|
||||||
|
if (WindowManagedWindow *window = qobject_cast<WindowManagedWindow *>(newWidget->window()))
|
||||||
|
window->updateWindowFocusState();
|
||||||
|
});
|
||||||
|
|
||||||
|
WindowManagedWindow window;
|
||||||
|
window.showNormal();
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "main.moc"
|
Loading…
x
Reference in New Issue
Block a user