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"