File indexing completed on 2024-05-19 05:55:45
0001 /* 0002 SPDX-FileCopyrightText: 2003-2005 George Staikos <staikos@kde.org> 0003 SPDX-FileCopyrightText: 2005 Isaac Clerencia <isaac@warp.es> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "allyourbase.h" 0009 #include "kwalletmanager_debug.h" 0010 0011 #include <KJobWidgets> 0012 #include <KLocalizedString> 0013 #include <KIO/StoredTransferJob> 0014 #include <KMessageBox> 0015 #include <QUrl> 0016 0017 #include <QApplication> 0018 #include <QDebug> 0019 #include <QDrag> 0020 #include <QIcon> 0021 #include <QMimeData> 0022 #include <kwidgetsaddons_version.h> 0023 0024 /**************** 0025 * KWalletFolderItem - ListView items to represent kwallet folders 0026 */ 0027 KWalletFolderItem::KWalletFolderItem(KWallet::Wallet *w, QTreeWidget *parent, const QString &name, int entries) 0028 : QTreeWidgetItem(parent, KWalletFolderItemClass), _wallet(w), _name(name), _entries(entries), m_services(KService::allServices()) 0029 { 0030 setText(0, QStringLiteral("%1 (%2)").arg(_name).arg(_entries)); 0031 setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled); 0032 setIcon(0, getFolderIcon()); 0033 } 0034 0035 QIcon KWalletFolderItem::getFolderIcon() const 0036 { 0037 for (auto service : m_services) { 0038 if (service->name().compare(_name, Qt::CaseSensitivity::CaseInsensitive) == 0 && !service->icon().isEmpty()) { 0039 return QIcon::fromTheme(service->icon()); 0040 } 0041 } 0042 0043 return QIcon::fromTheme(_name, QIcon::fromTheme(QStringLiteral("folder"))); 0044 } 0045 0046 void KWalletFolderItem::refresh() 0047 { 0048 const QString saveFolder = _wallet->currentFolder(); 0049 _wallet->setFolder(_name); 0050 setText(0, QStringLiteral("%1 (%2)").arg(_name).arg(_wallet->entryList().count())); 0051 _wallet->setFolder(saveFolder); 0052 } 0053 0054 void KWalletFolderItem::refreshItemsCount() 0055 { 0056 int visibleLeafCount = 0; 0057 for (int i = 0; i < childCount(); i++) { 0058 QTreeWidgetItem *wi = child(i); 0059 if (wi->childCount()) { 0060 for (int l = 0; l < wi->childCount(); l++) { 0061 QTreeWidgetItem *li = wi->child(l); 0062 if (!li->isHidden()) { 0063 visibleLeafCount++; 0064 } 0065 } 0066 } 0067 } 0068 setText(0, QStringLiteral("%1 (%2)").arg(_name).arg(visibleLeafCount)); 0069 } 0070 0071 KWalletContainerItem *KWalletFolderItem::getContainer(KWallet::Wallet::EntryType type) 0072 { 0073 for (int i = 0; i < childCount(); ++i) { 0074 auto ci = dynamic_cast<KWalletContainerItem *>(child(i)); 0075 if (!ci) { 0076 continue; 0077 } 0078 if (ci->entryType() == type) { 0079 return ci; 0080 } 0081 } 0082 return nullptr; 0083 } 0084 0085 bool KWalletFolderItem::contains(const QString &key) const 0086 { 0087 return (getItem(key) != nullptr); 0088 } 0089 0090 QTreeWidgetItem *KWalletFolderItem::getItem(const QString &key) const 0091 { 0092 for (int i = 0; i < childCount(); ++i) { 0093 auto ci = dynamic_cast<KWalletContainerItem *>(child(i)); 0094 if (!ci) { 0095 continue; 0096 } 0097 QTreeWidgetItem *tmp = ci->getItem(key); 0098 if (tmp) { 0099 return tmp; 0100 } 0101 } 0102 return nullptr; 0103 } 0104 0105 bool KWalletFolderItem::acceptDrop(const QMimeData *mime) const 0106 { 0107 return mime->hasFormat(QStringLiteral("application/x-kwallet-entry")) || 0108 mime->hasFormat(QStringLiteral("text/uri-list")); 0109 } 0110 0111 QString KWalletFolderItem::name() const 0112 { 0113 return _name; 0114 } 0115 0116 KWalletFolderItem::~KWalletFolderItem() = default; 0117 0118 /**************** 0119 * KWalletContainerItem - ListView items to represent kwallet containers, i.e. 0120 * passwords, maps, ... 0121 */ 0122 KWalletContainerItem::KWalletContainerItem(QTreeWidgetItem *parent, const QString &name, KWallet::Wallet::EntryType entryType) 0123 : QTreeWidgetItem(parent, QStringList() << name, KWalletContainerItemClass), _type(entryType) 0124 { 0125 setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); 0126 } 0127 0128 KWalletContainerItem::~KWalletContainerItem() = default; 0129 0130 KWallet::Wallet::EntryType KWalletContainerItem::entryType() 0131 { 0132 return _type; 0133 } 0134 0135 bool KWalletContainerItem::contains(const QString &key) const 0136 { 0137 return getItem(key) != nullptr; 0138 } 0139 0140 QTreeWidgetItem *KWalletContainerItem::getItem(const QString &key) const 0141 { 0142 for (int i = 0; i < childCount(); ++i) { 0143 auto entryItem = dynamic_cast<KWalletEntryItem *>(child(i)); 0144 if (entryItem && entryItem->name() == key) { 0145 return entryItem; 0146 } 0147 } 0148 return nullptr; 0149 } 0150 0151 /**************** 0152 * KWalletEntryItem - ListView items to represent kwallet entries 0153 */ 0154 KWalletEntryItem::KWalletEntryItem(KWallet::Wallet *w, QTreeWidgetItem *parent, const QString &ename) 0155 : QTreeWidgetItem(parent, QStringList() << ename, KWalletEntryItemClass), _wallet(w), m_name(ename) 0156 { 0157 setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); 0158 } 0159 0160 KWalletEntryItem::~KWalletEntryItem() = default; 0161 0162 void KWalletEntryItem::setName(const QString &n) 0163 { 0164 m_name = n; 0165 QTreeWidgetItem::setText(0, n); 0166 } 0167 0168 void KWalletEntryItem::restoreName() 0169 { 0170 QTreeWidgetItem::setText(0, m_name); 0171 } 0172 0173 /**************** 0174 * KWalletItem - IconView items to represent wallets 0175 */ 0176 KWalletItem::KWalletItem(QListWidget *parent, const QString &walletName) 0177 : QListWidgetItem(QIcon::fromTheme(QStringLiteral("wallet-closed")), walletName, parent), _open(false) 0178 { 0179 setFlags(flags() | Qt::ItemIsDropEnabled); 0180 } 0181 0182 KWalletItem::~KWalletItem() = default; 0183 0184 void KWalletItem::setOpen(bool state) 0185 { 0186 if (_open != state) { 0187 _open = state; 0188 if (_open) { 0189 setIcon(QIcon::fromTheme(QStringLiteral("wallet-open"))); 0190 } else { 0191 setIcon(QIcon::fromTheme(QStringLiteral("wallet-closed"))); 0192 } 0193 } 0194 } 0195 0196 static bool decodeEntry(KWallet::Wallet *_wallet, QDataStream &ds) 0197 { 0198 quint32 magic; 0199 ds >> magic; 0200 if (magic != KWALLETENTRYMAGIC) { 0201 qCDebug(KWALLETMANAGER_LOG) << "bad magic" ; 0202 return false; 0203 } 0204 QString name; 0205 QByteArray value; 0206 KWallet::Wallet::EntryType et; 0207 ds >> name; 0208 if (_wallet->hasEntry(name)) { 0209 int rc = KMessageBox::warningContinueCancel(nullptr, i18n("An entry by the name '%1' already exists. Would you like to continue?", name)); 0210 if (rc == KMessageBox::Cancel) { 0211 return false; 0212 } 0213 } 0214 qint32 l; 0215 ds >> l; 0216 et = KWallet::Wallet::EntryType(l); 0217 ds >> value; 0218 _wallet->writeEntry(name, value, et); 0219 return true; 0220 } 0221 0222 static bool decodeFolder(KWallet::Wallet *_wallet, QDataStream &ds) 0223 { 0224 quint32 magic; 0225 ds >> magic; 0226 if (magic != KWALLETFOLDERMAGIC) { 0227 qCDebug(KWALLETMANAGER_LOG) << "bad magic" ; 0228 return false; 0229 } 0230 QString folder; 0231 ds >> folder; 0232 if (_wallet->hasFolder(folder)) { 0233 int rc = KMessageBox::warningTwoActionsCancel(nullptr, 0234 i18n("A folder by the name '%1' already exists. What would you like to do?", folder), 0235 QString(), 0236 KStandardGuiItem::cont(), 0237 KGuiItem(i18n("Replace"))); 0238 if (rc == KMessageBox::Cancel) { 0239 return false; 0240 } 0241 if (rc == KMessageBox::ButtonCode::SecondaryAction) { 0242 _wallet->removeFolder(folder); 0243 _wallet->createFolder(folder); 0244 } 0245 } else { 0246 _wallet->createFolder(folder); 0247 } 0248 0249 _wallet->setFolder(folder); 0250 while (!ds.atEnd()) { 0251 QString name; 0252 QByteArray value; 0253 KWallet::Wallet::EntryType et; 0254 ds >> name; 0255 qint32 l; 0256 ds >> l; 0257 et = KWallet::Wallet::EntryType(l); 0258 ds >> value; 0259 _wallet->writeEntry(name, value, et); 0260 } 0261 return true; 0262 } 0263 0264 void KWalletItem::processDropEvent(QDropEvent *e) 0265 { 0266 // We fetch this here at the beginning because we run an event loop further 0267 // down which might lead to the event data getting deleted 0268 KWalletEntryList *el = nullptr; 0269 Qt::DropAction proposedAction = e->proposedAction(); 0270 if (e->source() && e->source()->parent() && 0271 !strcmp(e->source()->parent()->metaObject()->className(), "KWalletEntryList") && 0272 (proposedAction != Qt::CopyAction)) { 0273 0274 el = dynamic_cast<KWalletEntryList *>(e->source()->parent()); 0275 } 0276 0277 if (e->mimeData()->hasFormat(QStringLiteral("application/x-kwallet-folder")) || 0278 e->mimeData()->hasFormat(QStringLiteral("text/uri-list"))) { 0279 // FIXME: don't allow the drop if the wallet name is the same 0280 KWallet::Wallet *_wallet = KWallet::Wallet::openWallet(text(), listWidget()->topLevelWidget()->winId()); 0281 if (!_wallet) { 0282 e->ignore(); 0283 return; 0284 } 0285 0286 const QString saveFolder = _wallet->currentFolder(); 0287 0288 QByteArray data; 0289 0290 if (e->mimeData()->hasFormat(QStringLiteral("application/x-kwallet-folder"))) { 0291 data = e->mimeData()->data(QStringLiteral("application/x-kwallet-folder")); 0292 e->accept(); 0293 } else { // text/uri-list 0294 const QList<QUrl> urls = e->mimeData()->urls(); 0295 if (urls.isEmpty()) { 0296 e->ignore(); 0297 return; 0298 } 0299 0300 QUrl u(urls.first()); 0301 if (u.fileName().isEmpty()) { 0302 e->ignore(); 0303 return; 0304 } 0305 KIO::StoredTransferJob *job = KIO::storedGet(u); 0306 KJobWidgets::setWindow(job, listWidget()); 0307 0308 e->accept(); 0309 if (job->exec()) { 0310 data = job->data(); 0311 } else { 0312 KMessageBox::error(listWidget(), job->errorString()); 0313 } 0314 } 0315 0316 if (!data.isEmpty()) { 0317 QDataStream ds(data); 0318 decodeFolder(_wallet, ds); 0319 } 0320 0321 _wallet->setFolder(saveFolder); 0322 delete _wallet; 0323 0324 //delete the folder from the source if we were moving 0325 if (el) { 0326 auto fi = 0327 dynamic_cast<KWalletFolderItem *>(el->currentItem()); 0328 if (fi) { 0329 el->_wallet->removeFolder(fi->name()); 0330 } 0331 } 0332 } else { 0333 e->ignore(); 0334 return; 0335 } 0336 } 0337 0338 /**************** 0339 * KWalletEntryList - A listview to store wallet entries 0340 */ 0341 KWalletEntryList::KWalletEntryList(QWidget *parent, const QString &name) 0342 : QTreeWidget(parent), 0343 _wallet(nullptr) 0344 { 0345 setObjectName(name); 0346 setColumnCount(1); 0347 setHeaderLabel(i18n("Folders")); 0348 setRootIsDecorated(true); 0349 setDragEnabled(true); 0350 setAcceptDrops(true); 0351 setDragDropMode(DragDrop); 0352 setSelectionMode(SingleSelection); 0353 } 0354 0355 KWalletEntryList::~KWalletEntryList() = default; 0356 0357 //returns true if the item has been dropped successfully 0358 void KWalletEntryList::itemDropped(QDropEvent *e, QTreeWidgetItem *item) 0359 { 0360 bool ok = true; 0361 bool isEntry; 0362 QByteArray data; 0363 0364 KWalletEntryList *el = nullptr; 0365 QTreeWidgetItem *sel = nullptr; 0366 0367 // We fetch this here because we run an event loop further down which might invalidate this 0368 Qt::DropAction proposedAction = e->proposedAction(); 0369 0370 if (!item) { 0371 e->ignore(); 0372 return; 0373 } 0374 0375 //detect if we are dragging from kwallet itself 0376 qCDebug(KWALLETMANAGER_LOG) << e->source() << e->source()->metaObject()->className(); 0377 if (e->source() && !strcmp(e->source()->metaObject()->className(), "KWalletEntryList")) { 0378 0379 el = dynamic_cast<KWalletEntryList *>(e->source()); 0380 if (!el) { 0381 KMessageBox::error(this, i18n("An unexpected error occurred trying to drop the item")); 0382 } else { 0383 sel = el->currentItem(); 0384 } 0385 } 0386 0387 if (e->mimeData()->hasFormat(QStringLiteral("application/x-kwallet-entry"))) { 0388 //do nothing if we are in the same folder 0389 if (sel && sel->parent()->parent() == 0390 KWalletEntryList::getItemFolder(item)) { 0391 e->ignore(); 0392 return; 0393 } 0394 isEntry = true; 0395 data = e->mimeData()->data(QStringLiteral("application/x-kwallet-entry")); 0396 if (data.isEmpty()) { 0397 e->ignore(); 0398 return; 0399 } 0400 e->accept(); 0401 } else if (e->mimeData()->hasFormat(QStringLiteral("application/x-kwallet-folder"))) { 0402 //do nothing if we are in the same wallet 0403 if (this == el) { 0404 e->ignore(); 0405 return; 0406 } 0407 isEntry = false; 0408 data = e->mimeData()->data(QStringLiteral("application/x-kwallet-folder")); 0409 if (data.isEmpty()) { 0410 e->ignore(); 0411 return; 0412 } 0413 e->accept(); 0414 } else if (e->mimeData()->hasFormat(QStringLiteral("text/uri-list"))) { 0415 const QList<QUrl> urls = e->mimeData()->urls(); 0416 if (urls.isEmpty()) { 0417 e->ignore(); 0418 return; 0419 } 0420 QUrl u(urls.first()); 0421 if (u.fileName().isEmpty()) { 0422 e->ignore(); 0423 return; 0424 } 0425 0426 e->accept(); 0427 0428 KIO::StoredTransferJob *job = KIO::storedGet(u); 0429 KJobWidgets::setWindow(job, this); 0430 if (!job->exec()) { 0431 KMessageBox::error(this, job->errorString()); 0432 return; 0433 } 0434 data = job->data(); 0435 0436 QByteArray entryMagic(QByteArray::number(KWALLETENTRYMAGIC)); 0437 QByteArray folderMagic(QByteArray::number(KWALLETFOLDERMAGIC)); 0438 0439 if (data.startsWith(entryMagic)) { 0440 isEntry = true; 0441 } else if (data.startsWith(folderMagic)) { 0442 isEntry = false; 0443 } else { 0444 qCDebug(KWALLETMANAGER_LOG) << "bad magic" ; 0445 return; 0446 } 0447 } else { 0448 e->ignore(); 0449 return; 0450 } 0451 0452 QDataStream ds(data); 0453 0454 if (isEntry) { 0455 KWalletFolderItem *fi = KWalletEntryList::getItemFolder(item); 0456 if (!fi) { 0457 KMessageBox::error(this, i18n("An unexpected error occurred trying to drop the entry")); 0458 return; 0459 } 0460 QString saveFolder = _wallet->currentFolder(); 0461 _wallet->setFolder(fi->name()); 0462 ok = decodeEntry(_wallet, ds); 0463 _wallet->setFolder(saveFolder); 0464 fi->refresh(); 0465 //delete source if we were moving, i.e., we are dragging 0466 //from kwalletmanager and Control is not pressed 0467 if (ok && el && proposedAction != Qt::CopyAction && sel) { 0468 el->_wallet->removeEntry(sel->text(0)); 0469 delete sel; 0470 } 0471 } else { 0472 ok = decodeFolder(_wallet, ds); 0473 //delete source if we were moving, i.e., we are dragging 0474 //from kwalletmanager and Control is not pressed 0475 if (ok && el && proposedAction != Qt::CopyAction && sel) { 0476 auto fi = dynamic_cast<KWalletFolderItem *>(sel); 0477 if (fi) { 0478 el->_wallet->removeFolder(fi->name()); 0479 delete sel; 0480 } else { 0481 KMessageBox::error(this, i18n("An unexpected error occurred trying to delete the original folder, but the folder has been copied successfully")); 0482 } 0483 } 0484 } 0485 } 0486 0487 void KWalletEntryList::setWallet(KWallet::Wallet *w) 0488 { 0489 _wallet = w; 0490 } 0491 0492 bool KWalletEntryList::existsFolder(const QString &name) 0493 { 0494 for (int i = 0; i < topLevelItemCount(); ++i) { 0495 auto fi = dynamic_cast<KWalletFolderItem *>(topLevelItem(i)); 0496 if (!fi) { 0497 continue; 0498 } 0499 if (name == fi->name()) { 0500 return true; 0501 } 0502 } 0503 return false; 0504 } 0505 0506 QMimeData *KWalletEntryList::itemMimeData(const QTreeWidgetItem *i) const 0507 { 0508 QMimeData *sd = nullptr; 0509 if (i->type() == KWalletEntryItemClass) { 0510 const auto ei = dynamic_cast<const KWalletEntryItem *>(i); 0511 if (!ei) { 0512 return nullptr; 0513 } 0514 auto ci = dynamic_cast<KWalletContainerItem *>(ei->parent()); 0515 if (!ci) { 0516 return nullptr; 0517 } 0518 sd = new QMimeData(); 0519 QByteArray a; 0520 QDataStream ds(&a, QIODevice::WriteOnly); 0521 0522 ds.setVersion(QDataStream::Qt_3_1); 0523 ds << KWALLETENTRYMAGIC; 0524 ds << ei->text(0); 0525 ds << ci->entryType(); 0526 QByteArray value; 0527 ei->_wallet->readEntry(i->text(0), value); 0528 ds << value; 0529 sd->setData(QStringLiteral("application/x-kwallet-entry"), a); 0530 } else if (i->type() == KWalletFolderItemClass) { 0531 const auto fi = dynamic_cast<const KWalletFolderItem *>(i); 0532 if (!fi) { 0533 return nullptr; 0534 } 0535 sd = new QMimeData(); 0536 QByteArray a; 0537 QDataStream ds(&a, QIODevice::WriteOnly); 0538 0539 ds.setVersion(QDataStream::Qt_3_1); 0540 0541 ds << KWALLETFOLDERMAGIC; 0542 ds << *fi; 0543 sd->setData(QStringLiteral("application/x-kwallet-folder"), a); 0544 } 0545 return sd; 0546 } 0547 0548 void KWalletEntryList::mousePressEvent(QMouseEvent *e) 0549 { 0550 if (e->button() == Qt::LeftButton) { 0551 _mousePos = e->pos(); 0552 } 0553 QTreeWidget::mousePressEvent(e); 0554 } 0555 0556 void KWalletEntryList::mouseMoveEvent(QMouseEvent *e) 0557 { 0558 if (!(e->buttons() & Qt::LeftButton)) { 0559 return; 0560 } 0561 if ((e->pos() - _mousePos).manhattanLength() < QApplication::startDragDistance()) { 0562 return; 0563 } 0564 0565 const QTreeWidgetItem *item = itemAt(_mousePos); 0566 if (!item || !item->isSelected()) { 0567 return; 0568 } 0569 0570 QMimeData *mimeData = itemMimeData(item); 0571 if (mimeData) { 0572 auto drag = new QDrag(this); 0573 drag->setMimeData(mimeData); 0574 drag->setHotSpot(QPoint(0, 0)); 0575 drag->exec(); 0576 } 0577 } 0578 0579 void KWalletEntryList::dropEvent(QDropEvent *e) 0580 { 0581 QTreeWidgetItem *i = itemAt(e->position().toPoint()); 0582 itemDropped(e, i); 0583 } 0584 0585 void KWalletEntryList::dragEnterEvent(QDragEnterEvent *e) 0586 { 0587 e->accept(); 0588 } 0589 0590 void KWalletEntryList::dragMoveEvent(QDragMoveEvent *e) 0591 { 0592 QTreeWidgetItem *i = itemAt(e->position().toPoint()); 0593 e->ignore(); 0594 if (i) { 0595 if (e->mimeData()->hasFormat(QStringLiteral("application/x-kwallet-entry")) || 0596 e->mimeData()->hasFormat(QStringLiteral("text/uri-list"))) { 0597 e->accept(); 0598 } 0599 } 0600 if ((e->mimeData()->hasFormat(QStringLiteral("application/x-kwallet-folder")) && 0601 e->source() != viewport()) || 0602 e->mimeData()->hasFormat(QStringLiteral("text/uri-list"))) { 0603 e->accept(); 0604 } 0605 } 0606 0607 KWalletFolderItem *KWalletEntryList::getFolder(const QString &name) const 0608 { 0609 for (int i = 0; i < topLevelItemCount(); ++i) { 0610 auto fi = dynamic_cast<KWalletFolderItem *>(topLevelItem(i)); 0611 if (!fi) { 0612 continue; 0613 } 0614 if (name == fi->name()) { 0615 return fi; 0616 } 0617 } 0618 return nullptr; 0619 } 0620 0621 KWalletFolderItem *KWalletEntryList::getItemFolder(QTreeWidgetItem *item) 0622 { 0623 switch (item->type()) { 0624 case KWalletFolderItemClass: 0625 return dynamic_cast<KWalletFolderItem *>(item); 0626 case KWalletContainerItemClass: 0627 return dynamic_cast<KWalletFolderItem *>(item->parent()); 0628 case KWalletEntryItemClass: 0629 return dynamic_cast<KWalletFolderItem *>(item->parent()->parent()); 0630 } 0631 return nullptr; 0632 } 0633 0634 void KWalletEntryList::selectFirstVisible() 0635 { 0636 QTreeWidgetItemIterator it(this); 0637 while (*it) { 0638 QTreeWidgetItem *item = *it++; 0639 if (!item->isHidden()) { 0640 // if it's a leaf, then select it and quit 0641 if (item->childCount() == 0) { 0642 // qCDebug(KWALLETMANAGER_LOG) << "selecting " << item->text(0); 0643 setCurrentItem(item); 0644 break; 0645 } 0646 } 0647 } 0648 } 0649 0650 void KWalletEntryList::refreshItemsCount() 0651 { 0652 QTreeWidgetItemIterator it(this); 0653 while (*it) { 0654 QTreeWidgetItem *item = *it++; 0655 auto fi = dynamic_cast< KWalletFolderItem * >(item); 0656 if (fi) { 0657 fi->refreshItemsCount(); 0658 } 0659 } 0660 } 0661 0662 class ReturnPressedFilter : public QObject 0663 { 0664 public: 0665 ReturnPressedFilter(QListWidget *parent) : QObject(parent) 0666 { 0667 parent->installEventFilter(this); 0668 } 0669 0670 bool eventFilter(QObject * /*watched*/, QEvent *event) override 0671 { 0672 if (event->type() == QEvent::KeyPress) { 0673 auto ke = static_cast<QKeyEvent *>(event); 0674 if (ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return) { 0675 auto p = static_cast<QListWidget *>(parent()); 0676 QMetaObject::invokeMethod(p, "executed", Q_ARG(QListWidgetItem *, p->currentItem())); 0677 return true; 0678 } 0679 } 0680 return false; 0681 } 0682 }; 0683 0684 #include "moc_allyourbase.cpp"