Skip to content

Commit b336127

Browse files
committed
Add QuickWindow class
1 parent 9a9f8a7 commit b336127

File tree

5 files changed

+221
-0
lines changed

5 files changed

+221
-0
lines changed

src/uicomponents/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ set(MODULE_SRC
2222
menuitemmodel.h
2323
filedialog.cpp
2424
filedialog.h
25+
internal/quickwindow.cpp
26+
internal/quickwindow.h
2527
)
2628

2729
include(${PROJECT_SOURCE_DIR}/build/module.cmake)
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#include <QAccessibleWidget>
4+
5+
#include "quickwindow.h"
6+
7+
using namespace scratchcpp::uicomponents;
8+
9+
QuickWindow::QuickWindow(QWindow *parent) :
10+
QQuickWindow(parent)
11+
{
12+
m_accessibleWidget = new QAccessibleWidget(&m_widget, QAccessible::Dialog);
13+
m_accessibleWidget->setText(QAccessible::Name, title());
14+
m_widget.setAccessibleName(title());
15+
QAccessibleEvent accessibleEvent(m_accessibleWidget, QAccessible::NameChanged);
16+
QAccessible::updateAccessibility(&accessibleEvent);
17+
18+
connect(this, &QQuickWindow::windowTitleChanged, [this](const QString &title) {
19+
m_accessibleWidget->setText(QAccessible::Name, title);
20+
m_widget.setAccessibleName(title);
21+
QAccessibleEvent accessibleEvent(m_accessibleWidget, QAccessible::NameChanged);
22+
QAccessible::updateAccessibility(&accessibleEvent);
23+
});
24+
}
25+
26+
void QuickWindow::keyPressEvent(QKeyEvent *event)
27+
{
28+
if (event->key() == Qt::Key_Escape && m_autoClose && m_closable)
29+
close();
30+
31+
QQuickWindow::keyPressEvent(event);
32+
}
33+
34+
void QuickWindow::showEvent(QShowEvent *event)
35+
{
36+
QQuickWindow::showEvent(event);
37+
QAccessibleEvent accessibleEvent(m_accessibleWidget, QAccessible::Focus);
38+
QAccessible::updateAccessibility(&accessibleEvent);
39+
}
40+
41+
void QuickWindow::closeEvent(QCloseEvent *event)
42+
{
43+
if (m_closable)
44+
QQuickWindow::closeEvent(event);
45+
else
46+
event->ignore();
47+
}
48+
49+
void QuickWindow::setAutoClose(bool newAutoClose)
50+
{
51+
if (m_autoClose == newAutoClose)
52+
return;
53+
54+
m_autoClose = newAutoClose;
55+
emit autoCloseChanged();
56+
}
57+
58+
bool QuickWindow::closable() const
59+
{
60+
return m_closable;
61+
}
62+
63+
void QuickWindow::setClosable(bool newClosable)
64+
{
65+
if (m_closable == newClosable)
66+
return;
67+
68+
m_closable = newClosable;
69+
emit closableChanged();
70+
}
71+
72+
bool QuickWindow::autoClose() const
73+
{
74+
return m_autoClose;
75+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#pragma once
4+
5+
#include <QQuickWindow>
6+
#include <QWidget>
7+
8+
namespace scratchcpp::uicomponents
9+
{
10+
11+
class QuickWindow : public QQuickWindow
12+
{
13+
Q_OBJECT
14+
Q_PROPERTY(bool autoClose READ autoClose WRITE setAutoClose NOTIFY autoCloseChanged)
15+
Q_PROPERTY(bool closable READ closable WRITE setClosable NOTIFY closableChanged)
16+
17+
public:
18+
explicit QuickWindow(QWindow *parent = nullptr);
19+
20+
bool autoClose() const;
21+
void setAutoClose(bool newAutoClose);
22+
23+
bool closable() const;
24+
void setClosable(bool newClosable);
25+
26+
signals:
27+
void autoCloseChanged();
28+
void closableChanged();
29+
30+
protected:
31+
void keyPressEvent(QKeyEvent *event) override;
32+
void showEvent(QShowEvent *event) override;
33+
void closeEvent(QCloseEvent *event) override;
34+
35+
private:
36+
bool m_autoClose = true;
37+
bool m_closable = true;
38+
QWidget m_widget;
39+
QAccessibleWidget *m_accessibleWidget = nullptr;
40+
};
41+
42+
} // namespace scratchcpp::uicomponents

src/uicomponents/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ set(MODULE_TEST_SRC
33
menumodel.cpp
44
menubarmodel.cpp
55
filedialog.cpp
6+
quickwindow.cpp
67
)
78

89
include(${PROJECT_SOURCE_DIR}/build/module_test.cmake)
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include <gtest/gtest.h>
2+
#include <QSignalSpy>
3+
4+
#include "internal/quickwindow.h"
5+
6+
using namespace scratchcpp::uicomponents;
7+
8+
TEST(QuickWindowTest, Constructor)
9+
{
10+
QuickWindow window1;
11+
QWindow window2(&window1);
12+
ASSERT_EQ(window1.parent(), nullptr);
13+
ASSERT_EQ(window2.parent(), &window1);
14+
}
15+
16+
TEST(QuickWindowTest, AutoClose)
17+
{
18+
QuickWindow window;
19+
QSignalSpy spy(&window, &QuickWindow::autoCloseChanged);
20+
ASSERT_TRUE(window.autoClose());
21+
22+
window.setAutoClose(false);
23+
ASSERT_FALSE(window.autoClose());
24+
ASSERT_EQ(spy.count(), 1);
25+
26+
window.setAutoClose(false);
27+
ASSERT_FALSE(window.autoClose());
28+
ASSERT_EQ(spy.count(), 1);
29+
30+
window.setAutoClose(true);
31+
ASSERT_TRUE(window.autoClose());
32+
ASSERT_EQ(spy.count(), 2);
33+
}
34+
35+
TEST(QuickWindowTest, Closable)
36+
{
37+
QuickWindow window;
38+
QSignalSpy spy(&window, &QuickWindow::closableChanged);
39+
ASSERT_TRUE(window.closable());
40+
41+
window.setClosable(false);
42+
ASSERT_FALSE(window.closable());
43+
ASSERT_EQ(spy.count(), 1);
44+
45+
window.setClosable(false);
46+
ASSERT_FALSE(window.closable());
47+
ASSERT_EQ(spy.count(), 1);
48+
49+
window.setClosable(true);
50+
ASSERT_TRUE(window.closable());
51+
ASSERT_EQ(spy.count(), 2);
52+
}
53+
54+
TEST(QuickWindowTest, KeyPressEvent)
55+
{
56+
QuickWindow window;
57+
window.setAutoClose(true);
58+
window.setClosable(true);
59+
ASSERT_FALSE(window.isVisible());
60+
window.show();
61+
ASSERT_TRUE(window.isVisible());
62+
63+
QKeyEvent event1(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier, " ");
64+
QCoreApplication::sendEvent(&window, &event1);
65+
ASSERT_TRUE(window.isVisible());
66+
67+
QKeyEvent event2(QEvent::KeyPress, Qt::Key_Escape, Qt::NoModifier, "");
68+
QCoreApplication::sendEvent(&window, &event2);
69+
ASSERT_FALSE(window.isVisible());
70+
71+
window.show();
72+
window.setAutoClose(false);
73+
QCoreApplication::sendEvent(&window, &event2);
74+
ASSERT_TRUE(window.isVisible());
75+
76+
window.setClosable(false);
77+
QCoreApplication::sendEvent(&window, &event2);
78+
ASSERT_TRUE(window.isVisible());
79+
80+
window.setAutoClose(true);
81+
QCoreApplication::sendEvent(&window, &event2);
82+
ASSERT_TRUE(window.isVisible());
83+
}
84+
85+
TEST(QuickWindowTest, CloseEvent)
86+
{
87+
QuickWindow window;
88+
window.setClosable(true);
89+
ASSERT_FALSE(window.isVisible());
90+
window.show();
91+
ASSERT_TRUE(window.isVisible());
92+
93+
QCloseEvent event;
94+
QCoreApplication::sendEvent(&window, &event);
95+
ASSERT_FALSE(window.isVisible());
96+
97+
window.setClosable(false);
98+
window.show();
99+
QCoreApplication::sendEvent(&window, &event);
100+
ASSERT_TRUE(window.isVisible());
101+
}

0 commit comments

Comments
 (0)