File indexing completed on 2024-05-19 03:59:07
0001 /* 0002 This file is part of the KDE project 0003 SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org> 0004 SPDX-FileCopyrightText: 1999-2005 David Faure <faure@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "part.h" 0010 #include "part_p.h" 0011 0012 #include "kparts_logging.h" 0013 #include "partmanager.h" 0014 0015 // The events have randomly generated numbers using `shuf -i1000-65535 -n 1` 0016 #include "guiactivateevent.h" 0017 #include "partactivateevent.h" 0018 0019 #include <KXMLGUIFactory> 0020 0021 using namespace KParts; 0022 0023 Part::Part(QObject *parent, const KPluginMetaData &data) 0024 : Part(*new PartPrivate(this, data), parent) 0025 { 0026 } 0027 0028 Part::Part(PartPrivate &dd, QObject *parent) 0029 : QObject(parent) 0030 , PartBase(dd) 0031 { 0032 Q_D(Part); 0033 0034 PartBase::setPartObject(this); 0035 if (d->m_metaData.isValid()) { 0036 KXMLGUIClient::setComponentName(d->m_metaData.pluginId(), d->m_metaData.name()); 0037 } 0038 } 0039 0040 Part::~Part() 0041 { 0042 Q_D(Part); 0043 0044 // qCDebug(KPARTSLOG) << this; 0045 0046 if (d->m_widget) { 0047 // We need to disconnect first, to avoid calling it ! 0048 disconnect(d->m_widget.data(), &QWidget::destroyed, this, &Part::slotWidgetDestroyed); 0049 } 0050 0051 if (d->m_manager) { 0052 d->m_manager->removePart(this); 0053 } 0054 0055 if (d->m_widget && d->m_autoDeleteWidget) { 0056 // qCDebug(KPARTSLOG) << "deleting widget" << d->m_widget << d->m_widget->objectName(); 0057 delete static_cast<QWidget *>(d->m_widget); 0058 } 0059 } 0060 0061 QWidget *Part::widget() 0062 { 0063 Q_D(Part); 0064 0065 return d->m_widget; 0066 } 0067 0068 void Part::setAutoDeleteWidget(bool autoDeleteWidget) 0069 { 0070 Q_D(Part); 0071 d->m_autoDeleteWidget = autoDeleteWidget; 0072 } 0073 0074 void Part::setAutoDeletePart(bool autoDeletePart) 0075 { 0076 Q_D(Part); 0077 d->m_autoDeletePart = autoDeletePart; 0078 } 0079 0080 KPluginMetaData Part::metaData() const 0081 { 0082 Q_D(const Part); 0083 0084 return d->m_metaData; 0085 } 0086 0087 void Part::setManager(PartManager *manager) 0088 { 0089 Q_D(Part); 0090 0091 d->m_manager = manager; 0092 } 0093 0094 PartManager *Part::manager() const 0095 { 0096 Q_D(const Part); 0097 0098 return d->m_manager; 0099 } 0100 0101 Part *Part::hitTest(QWidget *widget, const QPoint &) 0102 { 0103 Q_D(Part); 0104 0105 if ((QWidget *)d->m_widget != widget) { 0106 return nullptr; 0107 } 0108 0109 return this; 0110 } 0111 0112 void Part::setWidget(QWidget *widget) 0113 { 0114 Q_D(Part); 0115 d->m_widget = widget; 0116 connect(d->m_widget.data(), &QWidget::destroyed, this, &Part::slotWidgetDestroyed, Qt::UniqueConnection); 0117 } 0118 0119 void Part::customEvent(QEvent *ev) 0120 { 0121 if (PartActivateEvent::test(ev)) { 0122 partActivateEvent(static_cast<PartActivateEvent *>(ev)); 0123 return; 0124 } 0125 0126 if (GUIActivateEvent::test(ev)) { 0127 guiActivateEvent(static_cast<GUIActivateEvent *>(ev)); 0128 return; 0129 } 0130 0131 QObject::customEvent(ev); 0132 } 0133 0134 void Part::partActivateEvent(PartActivateEvent *) 0135 { 0136 } 0137 0138 void Part::guiActivateEvent(GUIActivateEvent *) 0139 { 0140 } 0141 0142 QWidget *Part::hostContainer(const QString &containerName) 0143 { 0144 if (!factory()) { 0145 return nullptr; 0146 } 0147 0148 return factory()->container(containerName, this); 0149 } 0150 0151 void Part::slotWidgetDestroyed() 0152 { 0153 Q_D(Part); 0154 0155 d->m_widget = nullptr; 0156 if (d->m_autoDeletePart) { 0157 // qCDebug(KPARTSLOG) << "deleting part" << objectName(); 0158 this->deleteLater(); 0159 } 0160 } 0161 0162 #include "moc_part.cpp"