1 | /* |
2 | SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de> |
3 | |
4 | SPDX-License-Identifier: GPL-2.0-or-later |
5 | */ |
6 | |
7 | #include "icondialog_p.h" |
8 | |
9 | #include <QQuickItem> |
10 | #include <QQuickWindow> |
11 | |
12 | #include <KIconDialog> |
13 | #include <KIconLoader> |
14 | #include <QApplication> |
15 | |
16 | IconDialog::IconDialog(QObject *parent) |
17 | : QObject(parent) |
18 | , m_dialog(nullptr) |
19 | , m_iconSize(0) |
20 | , m_user(false) |
21 | , m_modality(Qt::WindowModal) |
22 | { |
23 | if (qobject_cast<QApplication *>(object: QCoreApplication::instance())) { |
24 | m_dialog.reset(other: new KIconDialog()); |
25 | connect(sender: m_dialog.data(), signal: &KIconDialog::newIconName, context: this, slot: [this](const QString &newIconName) { |
26 | if (m_iconName != newIconName) { |
27 | m_iconName = newIconName; |
28 | Q_EMIT iconNameChanged(iconName: newIconName); |
29 | } |
30 | }); |
31 | connect(sender: m_dialog.data(), signal: &KIconDialog::accepted, context: this, slot: &IconDialog::accepted); |
32 | connect(sender: m_dialog.data(), signal: &KIconDialog::rejected, context: this, slot: &IconDialog::rejected); |
33 | |
34 | m_dialog->installEventFilter(filterObj: this); |
35 | } |
36 | } |
37 | |
38 | IconDialog::~IconDialog() |
39 | { |
40 | if (m_dialog) { |
41 | m_dialog->close(); |
42 | } |
43 | } |
44 | |
45 | QString IconDialog::iconName() const |
46 | { |
47 | return m_iconName; |
48 | } |
49 | |
50 | int IconDialog::iconSize() const |
51 | { |
52 | return m_iconSize; |
53 | } |
54 | |
55 | void IconDialog::setIconSize(int iconSize) |
56 | { |
57 | if (m_dialog->iconSize() != iconSize) { |
58 | m_iconSize = iconSize; |
59 | Q_EMIT iconSizeChanged(iconSize); |
60 | } |
61 | } |
62 | |
63 | QString IconDialog::title() const |
64 | { |
65 | return m_dialog->windowTitle(); |
66 | } |
67 | |
68 | void IconDialog::setTitle(const QString &title) |
69 | { |
70 | if (m_dialog->windowTitle() != title) { |
71 | m_dialog->setWindowTitle(title); |
72 | Q_EMIT titleChanged(title); |
73 | } |
74 | } |
75 | |
76 | bool IconDialog::user() const |
77 | { |
78 | return m_user; |
79 | } |
80 | |
81 | void IconDialog::setUser(bool user) |
82 | { |
83 | if (m_user != user) { |
84 | m_user = user; |
85 | Q_EMIT userChanged(user); |
86 | } |
87 | } |
88 | |
89 | QString IconDialog::customLocation() const |
90 | { |
91 | return m_customLocation; |
92 | } |
93 | |
94 | void IconDialog::setCustomLocation(const QString &customLocation) |
95 | { |
96 | if (m_customLocation != customLocation) { |
97 | m_dialog->setCustomLocation(customLocation); |
98 | |
99 | m_customLocation = customLocation; |
100 | Q_EMIT customLocationChanged(customLocation); |
101 | } |
102 | } |
103 | |
104 | Qt::WindowModality IconDialog::modality() const |
105 | { |
106 | return m_modality; |
107 | } |
108 | |
109 | void IconDialog::setModality(Qt::WindowModality modality) |
110 | { |
111 | if (m_modality != modality) { |
112 | m_modality = modality; |
113 | Q_EMIT modalityChanged(modality); |
114 | } |
115 | } |
116 | |
117 | bool IconDialog::visible() const |
118 | { |
119 | return m_dialog->isVisible(); |
120 | } |
121 | |
122 | void IconDialog::setVisible(bool visible) |
123 | { |
124 | if (visible) { |
125 | open(); |
126 | } else { |
127 | close(); |
128 | } |
129 | } |
130 | |
131 | void IconDialog::open() |
132 | { |
133 | if (m_dialog->isVisible()) { |
134 | return; |
135 | } |
136 | |
137 | QQuickItem *parentItem = qobject_cast<QQuickItem *>(o: parent()); |
138 | QQuickWindow *parentWindow = (parentItem ? parentItem->window() : qobject_cast<QQuickWindow *>(object: parent())); |
139 | |
140 | if (m_modality == Qt::NonModal) { |
141 | m_dialog->setModal(false); |
142 | } else if (m_modality == Qt::WindowModal) { |
143 | m_dialog->winId(); // needed to get the windowHandle prior to showing |
144 | m_dialog->windowHandle()->setTransientParent(parentWindow); |
145 | m_dialog->setModal(false); // WindowModal does not unset the overall modality |
146 | } else if (m_modality == Qt::ApplicationModal) { |
147 | m_dialog->setModal(true); |
148 | } |
149 | |
150 | m_dialog->setWindowModality(m_modality); |
151 | |
152 | m_dialog->setup(group: KIconLoader::Desktop, context: KIconLoader::Application, strictIconSize: false, iconSize: m_iconSize, user: m_user); |
153 | |
154 | m_dialog->show(); |
155 | } |
156 | |
157 | void IconDialog::close() |
158 | { |
159 | if (!m_dialog->isVisible()) { |
160 | return; |
161 | } |
162 | |
163 | m_dialog->hide(); |
164 | } |
165 | |
166 | bool IconDialog::eventFilter(QObject *watched, QEvent *event) |
167 | { |
168 | if (watched == m_dialog.data() && (event->type() == QEvent::Show || event->type() == QEvent::Hide)) { |
169 | Q_EMIT visibleChanged(); |
170 | } |
171 | |
172 | return false; |
173 | } |
174 | |
175 | #include "moc_icondialog_p.cpp" |
176 | |