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"