File indexing completed on 2024-05-12 03:55:45
0001 /* 0002 SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "icondialog_p.h" 0008 0009 #include <QQuickItem> 0010 #include <QQuickWindow> 0011 0012 #include <KIconDialog> 0013 #include <KIconLoader> 0014 #include <QApplication> 0015 0016 IconDialog::IconDialog(QObject *parent) 0017 : QObject(parent) 0018 , m_dialog(nullptr) 0019 , m_iconSize(0) 0020 , m_user(false) 0021 , m_modality(Qt::WindowModal) 0022 , m_visible(false) 0023 { 0024 if (qobject_cast<QApplication *>(QCoreApplication::instance())) { 0025 m_dialog.reset(new KIconDialog()); 0026 connect(m_dialog.data(), &KIconDialog::newIconName, this, [this](const QString &newIconName) { 0027 if (m_iconName != newIconName) { 0028 m_iconName = newIconName; 0029 Q_EMIT iconNameChanged(newIconName); 0030 } 0031 }); 0032 0033 m_dialog->installEventFilter(this); 0034 } 0035 } 0036 0037 IconDialog::~IconDialog() 0038 { 0039 if (m_dialog) { 0040 m_dialog->close(); 0041 } 0042 } 0043 0044 QString IconDialog::iconName() const 0045 { 0046 return m_iconName; 0047 } 0048 0049 int IconDialog::iconSize() const 0050 { 0051 return m_iconSize; 0052 } 0053 0054 void IconDialog::setIconSize(int iconSize) 0055 { 0056 if (m_dialog->iconSize() != iconSize) { 0057 m_iconSize = iconSize; 0058 Q_EMIT iconSizeChanged(iconSize); 0059 } 0060 } 0061 0062 QString IconDialog::title() const 0063 { 0064 return m_dialog->windowTitle(); 0065 } 0066 0067 void IconDialog::setTitle(const QString &title) 0068 { 0069 if (m_dialog->windowTitle() != title) { 0070 m_dialog->setWindowTitle(title); 0071 Q_EMIT titleChanged(title); 0072 } 0073 } 0074 0075 bool IconDialog::user() const 0076 { 0077 return m_user; 0078 } 0079 0080 void IconDialog::setUser(bool user) 0081 { 0082 if (m_user != user) { 0083 m_user = user; 0084 Q_EMIT userChanged(user); 0085 } 0086 } 0087 0088 QString IconDialog::customLocation() const 0089 { 0090 return m_customLocation; 0091 } 0092 0093 void IconDialog::setCustomLocation(const QString &customLocation) 0094 { 0095 if (m_customLocation != customLocation) { 0096 m_dialog->setCustomLocation(customLocation); 0097 0098 m_customLocation = customLocation; 0099 Q_EMIT customLocationChanged(customLocation); 0100 } 0101 } 0102 0103 Qt::WindowModality IconDialog::modality() const 0104 { 0105 return m_modality; 0106 } 0107 0108 void IconDialog::setModality(Qt::WindowModality modality) 0109 { 0110 if (m_modality != modality) { 0111 m_modality = modality; 0112 Q_EMIT modalityChanged(modality); 0113 } 0114 } 0115 0116 bool IconDialog::visible() const 0117 { 0118 return m_dialog->isVisible(); 0119 } 0120 0121 void IconDialog::setVisible(bool visible) 0122 { 0123 if (visible) { 0124 open(); 0125 } else { 0126 close(); 0127 } 0128 } 0129 0130 void IconDialog::open() 0131 { 0132 if (m_dialog->isVisible()) { 0133 return; 0134 } 0135 0136 QQuickItem *parentItem = qobject_cast<QQuickItem *>(parent()); 0137 QQuickWindow *parentWindow = (parentItem ? parentItem->window() : qobject_cast<QQuickWindow *>(parent())); 0138 0139 if (m_modality == Qt::NonModal) { 0140 m_dialog->setModal(false); 0141 } else if (m_modality == Qt::WindowModal) { 0142 m_dialog->winId(); // needed to get the windowHandle prior to showing 0143 m_dialog->windowHandle()->setTransientParent(parentWindow); 0144 m_dialog->setModal(false); // WindowModal does not unset the overall modality 0145 } else if (m_modality == Qt::ApplicationModal) { 0146 m_dialog->setModal(true); 0147 } 0148 0149 m_dialog->setWindowModality(m_modality); 0150 0151 m_dialog->setup(KIconLoader::Desktop, KIconLoader::Application, false, m_iconSize, m_user); 0152 0153 m_dialog->show(); 0154 } 0155 0156 void IconDialog::close() 0157 { 0158 if (!m_dialog->isVisible()) { 0159 return; 0160 } 0161 0162 m_dialog->hide(); 0163 } 0164 0165 bool IconDialog::eventFilter(QObject *watched, QEvent *event) 0166 { 0167 if (watched == m_dialog.data() && (event->type() == QEvent::Show || event->type() == QEvent::Hide)) { 0168 Q_EMIT visibleChanged(); 0169 } 0170 0171 return false; 0172 } 0173 0174 #include "moc_icondialog_p.cpp"