File indexing completed on 2024-07-21 03:46:59

0001 /*
0002     This file is part of the KDE games library
0003     SPDX-FileCopyrightText: 2001 Andreas Beckermann (b_mann@gmx.de)
0004     SPDX-FileCopyrightText: 2001 Martin Heni (kde at heni-online.de)
0005 
0006     SPDX-License-Identifier: LGPL-2.0-only
0007 */
0008 
0009 #include "kgamedebugdialog.h"
0010 
0011 // own
0012 #include "kfourinline_debug.h"
0013 // KDEGames
0014 #define USE_UNSTABLE_LIBKDEGAMESPRIVATE_API
0015 #include <libkdegamesprivate/kgame/kgame.h>
0016 #include <libkdegamesprivate/kgame/kgamemessage.h>
0017 #include <libkdegamesprivate/kgame/kgamepropertyhandler.h>
0018 #include <libkdegamesprivate/kgame/kplayer.h>
0019 // KF
0020 #include <KLocalizedString>
0021 #include <KStandardGuiItem>
0022 // Qt
0023 #include <QFrame>
0024 #include <QGridLayout>
0025 #include <QHBoxLayout>
0026 #include <QLabel>
0027 #include <QListWidget>
0028 #include <QPushButton>
0029 #include <QTime>
0030 #include <QTreeWidget>
0031 #include <QVBoxLayout>
0032 // Std
0033 #include <typeinfo>
0034 
0035 class KGameDebugDialogPrivate
0036 {
0037 public:
0038     KGameDebugDialogPrivate()
0039     {
0040         mGame = nullptr;
0041 
0042         mGamePage = nullptr;
0043         mGameProperties = nullptr;
0044         mGameAddress = nullptr;
0045         mGameId = nullptr;
0046         mGameCookie = nullptr;
0047         mGameMaster = nullptr;
0048         mGameAdmin = nullptr;
0049         mGameOffering = nullptr;
0050         mGameStatus = nullptr;
0051         mGameRunning = nullptr;
0052         mGameMaxPlayers = nullptr;
0053         mGameMinPlayers = nullptr;
0054         mGamePlayerCount = nullptr;
0055 
0056         mPlayerPage = nullptr;
0057         mPlayerList = nullptr;
0058         mPlayerProperties = nullptr;
0059         mPlayerAddress = nullptr;
0060         mPlayerId = nullptr;
0061         mPlayerName = nullptr;
0062         mPlayerGroup = nullptr;
0063         mPlayerUserId = nullptr;
0064         mPlayerMyTurn = nullptr;
0065         mPlayerAsyncInput = nullptr;
0066         mPlayerKGameAddress = nullptr;
0067         mPlayerVirtual = nullptr;
0068         mPlayerActive = nullptr;
0069         mPlayerRtti = nullptr;
0070         mPlayerNetworkPriority = nullptr;
0071 
0072         mMessagePage = nullptr;
0073         mMessageList = nullptr;
0074         mHideIdList = nullptr;
0075     }
0076 
0077     const KGame *mGame;
0078 
0079     QFrame *mGamePage;
0080     QTreeWidget *mGameProperties;
0081     QTreeWidgetItem *mGameAddress;
0082     QTreeWidgetItem *mGameId;
0083     QTreeWidgetItem *mGameCookie;
0084     QTreeWidgetItem *mGameMaster;
0085     QTreeWidgetItem *mGameAdmin;
0086     QTreeWidgetItem *mGameOffering;
0087     QTreeWidgetItem *mGameStatus;
0088     QTreeWidgetItem *mGameRunning;
0089     QTreeWidgetItem *mGameMaxPlayers;
0090     QTreeWidgetItem *mGameMinPlayers;
0091     QTreeWidgetItem *mGamePlayerCount;
0092 
0093     QFrame *mPlayerPage;
0094     QListWidget *mPlayerList;
0095     QTreeWidget *mPlayerProperties;
0096     QTreeWidgetItem *mPlayerAddress;
0097     QTreeWidgetItem *mPlayerId;
0098     QTreeWidgetItem *mPlayerName;
0099     QTreeWidgetItem *mPlayerGroup;
0100     QTreeWidgetItem *mPlayerUserId;
0101     QTreeWidgetItem *mPlayerMyTurn;
0102     QTreeWidgetItem *mPlayerAsyncInput;
0103     QTreeWidgetItem *mPlayerKGameAddress;
0104     QTreeWidgetItem *mPlayerVirtual;
0105     QTreeWidgetItem *mPlayerActive;
0106     QTreeWidgetItem *mPlayerRtti;
0107     QTreeWidgetItem *mPlayerNetworkPriority;
0108 
0109     QFrame *mMessagePage;
0110     QTreeWidget *mMessageList;
0111     QListWidget *mHideIdList;
0112 };
0113 
0114 KGameDebugDialog::KGameDebugDialog(KGame *g, QWidget *parent, bool modal)
0115     : KPageDialog(parent)
0116     , d(new KGameDebugDialogPrivate)
0117 {
0118     setWindowTitle(i18nc("@title:window", "KGame Debug Dialog"));
0119     // QT5 setButtons(Close);
0120     // QT5 setDefaultButton(Close);
0121     setModal(modal);
0122     // QT5 showButtonSeparator(true);
0123     setFaceType(KPageDialog::Tabbed);
0124 
0125     initGamePage();
0126     initPlayerPage();
0127     initMessagePage();
0128 
0129     setKGame(g);
0130 }
0131 
0132 KGameDebugDialog::~KGameDebugDialog()
0133 {
0134     delete d;
0135 }
0136 
0137 void KGameDebugDialog::initGamePage()
0138 {
0139     d->mGamePage = new QFrame();
0140     addPage(d->mGamePage, i18n("Debug &KGame"));
0141     QVBoxLayout *topLayout = new QVBoxLayout(d->mGamePage);
0142     // QT5 topLayout->setMargin( marginHint() );
0143     // QT5 topLayout->setSpacing( spacingHint() );
0144     QHBoxLayout *layout = new QHBoxLayout;
0145     topLayout->addLayout(layout);
0146 
0147     QTreeWidget *v = new QTreeWidget(d->mGamePage);
0148     QTreeWidgetItem *vheader = new QTreeWidgetItem();
0149     vheader->setText(0, tr("Data"));
0150     vheader->setText(1, tr("Value"));
0151     v->setHeaderItem(vheader);
0152     layout->addWidget(v);
0153 
0154     d->mGameProperties = new QTreeWidget(d->mGamePage);
0155     QTreeWidgetItem *mGamePropertiesHeader = new QTreeWidgetItem();
0156     mGamePropertiesHeader->setText(0, tr("Property"));
0157     mGamePropertiesHeader->setText(1, tr("Value"));
0158     mGamePropertiesHeader->setText(2, tr("Policy"));
0159     d->mGameProperties->setHeaderItem(mGamePropertiesHeader);
0160     layout->addWidget(d->mGameProperties);
0161 
0162     QPushButton *b = new QPushButton(i18n("Update"), d->mGamePage);
0163     connect(b, &QPushButton::pressed, this, &KGameDebugDialog::slotUpdateGameData);
0164     topLayout->addWidget(b);
0165 
0166     // game data
0167     d->mGameAddress = new QTreeWidgetItem(v, QStringList(i18n("KGame Pointer")));
0168     d->mGameId = new QTreeWidgetItem(v, QStringList(i18n("Game ID")));
0169     d->mGameCookie = new QTreeWidgetItem(v, QStringList(i18n("Game Cookie")));
0170     d->mGameMaster = new QTreeWidgetItem(v, QStringList(i18n("Is Master")));
0171     d->mGameAdmin = new QTreeWidgetItem(v, QStringList(i18n("Is Admin")));
0172     d->mGameOffering = new QTreeWidgetItem(v, QStringList(i18n("Is Offering Connections")));
0173     d->mGameStatus = new QTreeWidgetItem(v, QStringList(i18n("Game Status")));
0174     d->mGameRunning = new QTreeWidgetItem(v, QStringList(i18n("Game is Running")));
0175     d->mGameMaxPlayers = new QTreeWidgetItem(v, QStringList(i18n("Maximal Players")));
0176     d->mGameMinPlayers = new QTreeWidgetItem(v, QStringList(i18n("Minimal Players")));
0177     d->mGamePlayerCount = new QTreeWidgetItem(v, QStringList(i18n("Players")));
0178 }
0179 
0180 void KGameDebugDialog::initPlayerPage()
0181 {
0182     d->mPlayerPage = new QFrame();
0183     addPage(d->mPlayerPage, i18n("Debug &Players"));
0184     QVBoxLayout *topLayout = new QVBoxLayout(d->mPlayerPage);
0185     // QT5 topLayout->setMargin( marginHint() );
0186     // QT5 topLayout->setSpacing( spacingHint() );
0187     QHBoxLayout *layout = new QHBoxLayout;
0188     topLayout->addLayout(layout);
0189 
0190     // TODO: connect to the KGame signals for joined/removed players!!!
0191     QVBoxLayout *listLayout = new QVBoxLayout;
0192     layout->addLayout(listLayout);
0193     QLabel *listLabel = new QLabel(i18n("Available Players"), d->mPlayerPage);
0194     listLayout->addWidget(listLabel);
0195     d->mPlayerList = new QListWidget(d->mPlayerPage);
0196     connect(d->mPlayerList, &QListWidget::itemActivated, this, qOverload<QListWidgetItem *>(&KGameDebugDialog::slotUpdatePlayerData));
0197     listLayout->addWidget(d->mPlayerList);
0198     d->mPlayerList->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding));
0199 
0200     QTreeWidget *v = new QTreeWidget(d->mPlayerPage);
0201     layout->addWidget(v);
0202     QTreeWidgetItem *vheader = new QTreeWidgetItem();
0203     vheader->setText(0, tr("Data"));
0204     vheader->setText(1, tr("Value"));
0205     v->setHeaderItem(vheader);
0206 
0207     d->mPlayerProperties = new QTreeWidget(d->mPlayerPage);
0208     QTreeWidgetItem *mPlayerPropertiesHeader = new QTreeWidgetItem();
0209     mPlayerPropertiesHeader->setText(0, tr("Property"));
0210     mPlayerPropertiesHeader->setText(1, tr("Value"));
0211     mPlayerPropertiesHeader->setText(2, tr("Policy"));
0212     d->mPlayerProperties->setHeaderItem(mPlayerPropertiesHeader);
0213     layout->addWidget(d->mPlayerProperties);
0214 
0215     QPushButton *b = new QPushButton(i18n("Update"), d->mPlayerPage);
0216     connect(b, &QPushButton::pressed, this, &KGameDebugDialog::slotUpdatePlayerList);
0217     topLayout->addWidget(b);
0218 
0219     d->mPlayerAddress = new QTreeWidgetItem(v, QStringList(i18n("Player Pointer")));
0220     d->mPlayerId = new QTreeWidgetItem(v, QStringList(i18n("Player ID")));
0221     d->mPlayerName = new QTreeWidgetItem(v, QStringList(i18n("Player Name")));
0222     d->mPlayerGroup = new QTreeWidgetItem(v, QStringList(i18n("Player Group")));
0223     d->mPlayerUserId = new QTreeWidgetItem(v, QStringList(i18n("Player User ID")));
0224     d->mPlayerMyTurn = new QTreeWidgetItem(v, QStringList(i18n("My Turn")));
0225     d->mPlayerAsyncInput = new QTreeWidgetItem(v, QStringList(i18n("Async Input")));
0226     d->mPlayerKGameAddress = new QTreeWidgetItem(v, QStringList(i18n("KGame Address")));
0227     d->mPlayerVirtual = new QTreeWidgetItem(v, QStringList(i18n("Player is Virtual")));
0228     d->mPlayerActive = new QTreeWidgetItem(v, QStringList(i18n("Player is Active")));
0229     d->mPlayerRtti = new QTreeWidgetItem(v, QStringList(i18n("RTTI")));
0230     d->mPlayerNetworkPriority = new QTreeWidgetItem(v, QStringList(i18n("Network Priority")));
0231 }
0232 
0233 void KGameDebugDialog::initMessagePage()
0234 {
0235     d->mMessagePage = new QFrame();
0236     addPage(d->mMessagePage, i18n("Debug &Messages"));
0237     QGridLayout *layout = new QGridLayout(d->mMessagePage);
0238     // QT5 layout->setMargin(marginHint());
0239     // QT5 layout->setSpacing(spacingHint());
0240     d->mMessageList = new QTreeWidget(d->mMessagePage);
0241     layout->addWidget(d->mMessageList, 0, 0, 10, 4);
0242 
0243     QTreeWidgetItem *mMessageListHeader = new QTreeWidgetItem();
0244     mMessageListHeader->setText(0, tr("Time"));
0245     mMessageListHeader->setText(1, tr("ID"));
0246     mMessageListHeader->setText(2, tr("Receiver"));
0247     mMessageListHeader->setText(2, tr("Sender"));
0248     mMessageListHeader->setText(2, tr("ID - Text"));
0249     d->mMessageList->setHeaderItem(mMessageListHeader);
0250 
0251     QPushButton *hide = new QPushButton(i18n("&>>"), d->mMessagePage);
0252     connect(hide, &QPushButton::pressed, this, &KGameDebugDialog::slotHideId);
0253     layout->addWidget(hide, 4, 4);
0254 
0255     QPushButton *show = new QPushButton(i18n("&<<"), d->mMessagePage);
0256     connect(show, &QPushButton::pressed, this, &KGameDebugDialog::slotShowId);
0257     layout->addWidget(show, 6, 4);
0258 
0259     QLabel *l = new QLabel(i18n("Do not show IDs:"), d->mMessagePage);
0260     layout->addWidget(l, 0, 5, 1, 2);
0261     d->mHideIdList = new QListWidget(d->mMessagePage);
0262     layout->addWidget(d->mHideIdList, 1, 5, 8, 2);
0263 
0264     QPushButton *clear = new QPushButton(d->mMessagePage);
0265     KGuiItem::assign(clear, KStandardGuiItem::clear());
0266     connect(clear, &QPushButton::pressed, this, &KGameDebugDialog::slotClearMessages);
0267     layout->addWidget(clear, 10, 0, 1, 7);
0268     // TODO: "show all but..." and "show nothing but..."
0269 }
0270 
0271 void KGameDebugDialog::clearPlayerData()
0272 {
0273     d->mPlayerAddress->setText(1, QLatin1String(""));
0274     d->mPlayerId->setText(1, QLatin1String(""));
0275     d->mPlayerName->setText(1, QLatin1String(""));
0276     d->mPlayerGroup->setText(1, QLatin1String(""));
0277     d->mPlayerUserId->setText(1, QLatin1String(""));
0278     d->mPlayerMyTurn->setText(1, QLatin1String(""));
0279     d->mPlayerAsyncInput->setText(1, QLatin1String(""));
0280     d->mPlayerKGameAddress->setText(1, QLatin1String(""));
0281     d->mPlayerVirtual->setText(1, QLatin1String(""));
0282     d->mPlayerActive->setText(1, QLatin1String(""));
0283     d->mPlayerRtti->setText(1, QLatin1String(""));
0284     d->mPlayerNetworkPriority->setText(1, QLatin1String(""));
0285 
0286     d->mPlayerProperties->clear();
0287 }
0288 
0289 void KGameDebugDialog::clearGameData()
0290 {
0291     d->mGameAddress->setText(1, QLatin1String(""));
0292     d->mGameId->setText(1, QLatin1String(""));
0293     d->mGameCookie->setText(1, QLatin1String(""));
0294     d->mGameMaster->setText(1, QLatin1String(""));
0295     d->mGameAdmin->setText(1, QLatin1String(""));
0296     d->mGameOffering->setText(1, QLatin1String(""));
0297     d->mGameStatus->setText(1, QLatin1String(""));
0298     d->mGameRunning->setText(1, QLatin1String(""));
0299     d->mGameMaxPlayers->setText(1, QLatin1String(""));
0300     d->mGameMinPlayers->setText(1, QLatin1String(""));
0301 
0302     d->mGameProperties->clear();
0303 }
0304 
0305 void KGameDebugDialog::slotUpdatePlayerData()
0306 {
0307     if (!d->mGame || d->mPlayerList->currentRow() == -1) {
0308         return;
0309     }
0310     slotUpdatePlayerData(d->mPlayerList->item(d->mPlayerList->currentRow()));
0311 }
0312 
0313 void KGameDebugDialog::slotUpdatePlayerList()
0314 {
0315     QListWidgetItem *i = d->mPlayerList->item(0);
0316     for (; d->mPlayerList->count() > 0; i = d->mPlayerList->item(0)) {
0317         removePlayer(i);
0318     }
0319 
0320     for (QList<KPlayer *>::const_iterator it = d->mGame->playerList()->begin(); it != d->mGame->playerList()->end(); ++it) {
0321         addPlayer(*it);
0322     }
0323 }
0324 
0325 void KGameDebugDialog::slotUpdateGameData()
0326 {
0327     if (!d->mGame) {
0328         d->mGameAddress->setText(1, i18n("NULL pointer"));
0329         return;
0330     }
0331 
0332     clearGameData();
0333 
0334     QString buf = QString::asprintf("%p", (void *)d->mGame);
0335     d->mGameAddress->setText(1, buf);
0336     d->mGameId->setText(1, QString::number(d->mGame->gameId()));
0337     d->mGameCookie->setText(1, QString::number(d->mGame->cookie()));
0338     d->mGameMaster->setText(1, d->mGame->isMaster() ? i18n("True") : i18n("False"));
0339     d->mGameAdmin->setText(1, d->mGame->isAdmin() ? i18n("True") : i18n("False"));
0340     d->mGameOffering->setText(1, d->mGame->isOfferingConnections() ? i18n("True") : i18n("False"));
0341     d->mGameStatus->setText(1, QString::number(d->mGame->gameStatus()));
0342     d->mGameRunning->setText(1, d->mGame->isRunning() ? i18n("True") : i18n("False"));
0343     d->mGameMaxPlayers->setText(1, QString::number(d->mGame->maxPlayers()));
0344     d->mGameMinPlayers->setText(1, QString::number(d->mGame->minPlayers()));
0345     d->mGamePlayerCount->setText(1, QString::number(d->mGame->playerCount()));
0346 
0347     // TODO ios
0348 
0349     KGamePropertyHandler *handler = d->mGame->dataHandler();
0350     for (KGamePropertyBase *property : std::as_const(handler->dict())) {
0351         QString policy;
0352         switch (property->policy()) {
0353         case KGamePropertyBase::PolicyClean:
0354             policy = i18n("Clean");
0355             break;
0356         case KGamePropertyBase::PolicyDirty:
0357             policy = i18n("Dirty");
0358             break;
0359         case KGamePropertyBase::PolicyLocal:
0360             policy = i18n("Local");
0361             break;
0362         case KGamePropertyBase::PolicyUndefined:
0363         default:
0364             policy = i18n("Undefined");
0365             break;
0366         }
0367         QStringList items;
0368         items << handler->propertyName(property->id()) << handler->propertyValue(property) << policy;
0369         new QTreeWidgetItem(d->mGameProperties, items);
0370         //  qCDebug(KFOURINLINE_LOG) << ": checking for all game properties: found property name" << name;
0371     }
0372 }
0373 
0374 void KGameDebugDialog::slotUpdatePlayerData(QListWidgetItem *item)
0375 {
0376     if (!item || !d->mGame) {
0377         return;
0378     }
0379 
0380     KPlayer *p = d->mGame->findPlayer(item->text().toInt());
0381 
0382     if (!p) {
0383         qCCritical(KFOURINLINE_LOG) << ": cannot find player";
0384         return;
0385     }
0386 
0387     clearPlayerData();
0388 
0389     QString buf = QString::asprintf("%p", (void *)p);
0390     d->mPlayerAddress->setText(1, buf);
0391     d->mPlayerId->setText(1, QString::number(p->id()));
0392     d->mPlayerName->setText(1, p->name());
0393     d->mPlayerGroup->setText(1, p->group());
0394     d->mPlayerUserId->setText(1, QString::number(p->userId()));
0395     d->mPlayerMyTurn->setText(1, p->myTurn() ? i18n("True") : i18n("False"));
0396     d->mPlayerAsyncInput->setText(1, p->asyncInput() ? i18n("True") : i18n("False"));
0397     buf = QString::asprintf("%p", (void *)p->game());
0398     d->mPlayerKGameAddress->setText(1, buf);
0399     d->mPlayerVirtual->setText(1, p->isVirtual() ? i18n("True") : i18n("False"));
0400     d->mPlayerActive->setText(1, p->isActive() ? i18n("True") : i18n("False"));
0401     d->mPlayerRtti->setText(1, QString::number(p->rtti()));
0402     d->mPlayerNetworkPriority->setText(1, QString::number(p->networkPriority()));
0403 
0404     // TODO ios
0405 
0406     // Properties
0407     KGamePropertyHandler *handler = p->dataHandler();
0408     for (KGamePropertyBase *property : std::as_const(handler->dict())) {
0409         QString policy;
0410         switch (property->policy()) {
0411         case KGamePropertyBase::PolicyClean:
0412             policy = i18n("Clean");
0413             break;
0414         case KGamePropertyBase::PolicyDirty:
0415             policy = i18n("Dirty");
0416             break;
0417         case KGamePropertyBase::PolicyLocal:
0418             policy = i18n("Local");
0419             break;
0420         case KGamePropertyBase::PolicyUndefined:
0421         default:
0422             policy = i18n("Undefined");
0423             break;
0424         }
0425         QStringList items;
0426         items << handler->propertyName(property->id()) << handler->propertyValue(property) << policy;
0427         new QTreeWidgetItem(d->mPlayerProperties, items);
0428     }
0429 }
0430 
0431 void KGameDebugDialog::clearPages()
0432 {
0433     clearPlayerData();
0434     clearGameData();
0435     d->mPlayerList->clear();
0436     slotClearMessages();
0437 }
0438 
0439 void KGameDebugDialog::setKGame(const KGame *g)
0440 {
0441     slotUnsetKGame();
0442     d->mGame = g;
0443     if (g) {
0444         // TODO: connect to the KGame signals for joined/removed players!!!
0445         connect(d->mGame, &QObject::destroyed, this, &KGameDebugDialog::slotUnsetKGame);
0446         //  connect();
0447 
0448         for (QList<KPlayer *>::const_iterator it = d->mGame->playerList()->begin(); it != d->mGame->playerList()->end(); ++it) {
0449             addPlayer(*it);
0450         }
0451 
0452         slotUpdateGameData();
0453 
0454         connect(d->mGame, &KGame::signalMessageUpdate, this, &KGameDebugDialog::slotMessageUpdate);
0455     }
0456 }
0457 
0458 void KGameDebugDialog::slotUnsetKGame()
0459 {
0460     if (d->mGame) {
0461         disconnect(d->mGame, nullptr, this, nullptr);
0462     }
0463     d->mGame = nullptr;
0464     clearPages();
0465 }
0466 
0467 void KGameDebugDialog::addPlayer(KPlayer *p)
0468 {
0469     if (!p) {
0470         qCCritical(KFOURINLINE_LOG) << "trying to add NULL player";
0471         return;
0472     }
0473 
0474     (void)new QListWidgetItem(QString::number(p->id()), d->mPlayerList);
0475     // TODO connect to signals, like deleted/removed, ...
0476 }
0477 
0478 void KGameDebugDialog::removePlayer(QListWidgetItem *i)
0479 {
0480     if (!i || !d->mGame) {
0481         return;
0482     }
0483     KPlayer *p = d->mGame->findPlayer(i->text().toInt());
0484     if (!p) {
0485         return;
0486     }
0487     disconnect(p, nullptr, this, nullptr);
0488     if (i->isSelected()) {
0489         clearPlayerData();
0490     }
0491     delete i;
0492 }
0493 
0494 void KGameDebugDialog::slotMessageUpdate(int msgid, quint32 receiver, quint32 sender)
0495 {
0496     if (!showId(msgid)) {
0497         return;
0498     }
0499     QString msgidText = KGameMessage::messageId2Text(msgid);
0500     if (msgidText.isNull()) {
0501         if (msgid > KGameMessage::IdUser) {
0502             Q_EMIT signalRequestIdName(msgid - KGameMessage::IdUser, true, msgidText);
0503         } else {
0504             Q_EMIT signalRequestIdName(msgid, false, msgidText);
0505         }
0506         if (msgidText.isNull()) {
0507             msgidText = i18n("Unknown");
0508         }
0509     }
0510     const QStringList items {
0511         QTime::currentTime().toString(),
0512         QString::number(msgid),
0513         QString::number(receiver),
0514         QString::number(sender),
0515         msgidText,
0516     };
0517     new QTreeWidgetItem(d->mMessageList, items);
0518 }
0519 
0520 void KGameDebugDialog::slotClearMessages()
0521 {
0522     d->mMessageList->clear();
0523 }
0524 
0525 void KGameDebugDialog::slotShowId()
0526 {
0527     /* QListBoxItem* i = d->mHideIdList->firstItem();
0528      for (; i; i = i->next()) {
0529         if (i->selected()) {
0530             d->mHideIdList->removeItem(i->);
0531         }
0532      }*/
0533     if (!d->mHideIdList->currentItem()) {
0534         return;
0535     }
0536     d->mHideIdList->takeItem(d->mHideIdList->currentRow());
0537 }
0538 
0539 void KGameDebugDialog::slotHideId()
0540 {
0541     if (!d->mMessageList->currentItem()) {
0542         return;
0543     }
0544     int msgid = d->mMessageList->currentItem()->text(1).toInt();
0545     if (!showId(msgid)) {
0546         return;
0547     }
0548     (void)new QListWidgetItem(QString::number(msgid), d->mHideIdList);
0549 }
0550 
0551 bool KGameDebugDialog::showId(int msgid)
0552 {
0553     for (int j = 0; j < d->mHideIdList->count(); ++j) {
0554         QListWidgetItem *i = d->mHideIdList->item(j);
0555         if (i->text().toInt() == msgid) {
0556             return false;
0557         }
0558     }
0559     return true;
0560 }
0561 
0562 #include "moc_kgamedebugdialog.cpp"