00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kgamedebugdialog.h"
00022
00023 #include "kgamemessage.h"
00024 #include "kgame.h"
00025 #include "kplayer.h"
00026 #include "kgamepropertyhandler.h"
00027
00028 #include <klistwidget.h>
00029 #include <klocale.h>
00030 #include <kdebug.h>
00031 #include <kpushbutton.h>
00032 #include <KStandardGuiItem>
00033
00034 #include <QTreeWidget>
00035 #include <QLayout>
00036
00037 #include <QLabel>
00038 #include <QDateTime>
00039 #include <QVBoxLayout>
00040 #include <QFrame>
00041 #include <QHBoxLayout>
00042 #include <QGridLayout>
00043
00044 #include <typeinfo>
00045
00046
00047 class KGameDebugDialogPrivate
00048 {
00049 public:
00050 KGameDebugDialogPrivate()
00051 {
00052 mGame = 0;
00053
00054 mGamePage = 0;
00055 mGameProperties = 0;
00056 mGameAddress = 0;
00057 mGameId = 0;
00058 mGameCookie = 0;
00059 mGameMaster = 0;
00060 mGameAdmin = 0;
00061 mGameOffering = 0;
00062 mGameStatus = 0;
00063 mGameRunning = 0;
00064 mGameMaxPlayers = 0;
00065 mGameMinPlayers = 0;
00066 mGamePlayerCount = 0;
00067
00068 mPlayerPage = 0;
00069 mPlayerList = 0;
00070 mPlayerProperties = 0;
00071 mPlayerAddress = 0;
00072 mPlayerId = 0;
00073 mPlayerName = 0;
00074 mPlayerGroup = 0;
00075 mPlayerUserId = 0;
00076 mPlayerMyTurn = 0;
00077 mPlayerAsyncInput= 0;
00078 mPlayerKGameAddress = 0;
00079 mPlayerVirtual = 0;
00080 mPlayerActive = 0;
00081 mPlayerRtti = 0;
00082 mPlayerNetworkPriority = 0;
00083
00084 mMessagePage = 0;
00085 mMessageList = 0;
00086 mHideIdList = 0;
00087 }
00088
00089 const KGame* mGame;
00090
00091 QFrame* mGamePage;
00092 QTreeWidget* mGameProperties;
00093 QTreeWidgetItem* mGameAddress;
00094 QTreeWidgetItem* mGameId;
00095 QTreeWidgetItem* mGameCookie;
00096 QTreeWidgetItem* mGameMaster;
00097 QTreeWidgetItem* mGameAdmin;
00098 QTreeWidgetItem* mGameOffering;
00099 QTreeWidgetItem* mGameStatus;
00100 QTreeWidgetItem* mGameRunning;
00101 QTreeWidgetItem* mGameMaxPlayers;
00102 QTreeWidgetItem* mGameMinPlayers;
00103 QTreeWidgetItem* mGamePlayerCount;
00104
00105 QFrame* mPlayerPage;
00106 KListWidget* mPlayerList;
00107 QTreeWidget* mPlayerProperties;
00108 QTreeWidgetItem* mPlayerAddress;
00109 QTreeWidgetItem* mPlayerId;
00110 QTreeWidgetItem* mPlayerName;
00111 QTreeWidgetItem* mPlayerGroup;
00112 QTreeWidgetItem* mPlayerUserId;
00113 QTreeWidgetItem* mPlayerMyTurn;
00114 QTreeWidgetItem* mPlayerAsyncInput;
00115 QTreeWidgetItem* mPlayerKGameAddress;
00116 QTreeWidgetItem* mPlayerVirtual;
00117 QTreeWidgetItem* mPlayerActive;
00118 QTreeWidgetItem* mPlayerRtti;
00119 QTreeWidgetItem* mPlayerNetworkPriority;
00120
00121 QFrame* mMessagePage;
00122 QTreeWidget* mMessageList;
00123 KListWidget* mHideIdList;
00124 };
00125
00126 KGameDebugDialog::KGameDebugDialog(KGame* g, QWidget* parent, bool modal)
00127 : KPageDialog(parent),
00128 d( new KGameDebugDialogPrivate )
00129 {
00130 setCaption(i18n("KGame Debug Dialog"));
00131 setButtons(Close);
00132 setDefaultButton(Close);
00133 setModal(modal);
00134 showButtonSeparator(true);
00135 setFaceType(KPageDialog::Tabbed);
00136
00137 initGamePage();
00138 initPlayerPage();
00139 initMessagePage();
00140
00141 setKGame(g);
00142 }
00143
00144 KGameDebugDialog::~KGameDebugDialog()
00145 {
00146 delete d;
00147 }
00148
00149 void KGameDebugDialog::initGamePage()
00150 {
00151 d->mGamePage = new QFrame();
00152 addPage(d->mGamePage,i18n("Debug &KGame"));
00153 QVBoxLayout* topLayout = new QVBoxLayout(d->mGamePage);
00154 topLayout->setMargin( marginHint() );
00155 topLayout->setSpacing( spacingHint() );
00156 QHBoxLayout* layout = new QHBoxLayout;
00157 topLayout->addLayout(layout);
00158
00159 QTreeWidget* v = new QTreeWidget(d->mGamePage);
00160 QTreeWidgetItem* vheader = new QTreeWidgetItem();
00161 vheader->setText(0, tr("Data"));
00162 vheader->setText(1, tr("Value"));
00163 v->setHeaderItem(vheader);
00164 layout->addWidget(v);
00165
00166 d->mGameProperties = new QTreeWidget(d->mGamePage);
00167 QTreeWidgetItem* mGamePropertiesHeader = new QTreeWidgetItem();
00168 mGamePropertiesHeader->setText(0, tr("Property"));
00169 mGamePropertiesHeader->setText(1, tr("Value"));
00170 mGamePropertiesHeader->setText(2, tr("Policy"));
00171 d->mGameProperties->setHeaderItem(mGamePropertiesHeader);
00172 layout->addWidget(d->mGameProperties);
00173
00174 QPushButton* b = new QPushButton(i18n("Update"), d->mGamePage);
00175 connect(b, SIGNAL(pressed()), this, SLOT(slotUpdateGameData()));
00176 topLayout->addWidget(b);
00177
00178
00179 d->mGameAddress = new QTreeWidgetItem(v, QStringList(i18n("KGame Pointer")));
00180 d->mGameId = new QTreeWidgetItem(v, QStringList(i18n("Game ID")));
00181 d->mGameCookie = new QTreeWidgetItem(v, QStringList(i18n("Game Cookie")));
00182 d->mGameMaster = new QTreeWidgetItem(v, QStringList(i18n("Is Master")));
00183 d->mGameAdmin = new QTreeWidgetItem(v, QStringList(i18n("Is Admin")));
00184 d->mGameOffering = new QTreeWidgetItem(v, QStringList(i18n("Is Offering Connections")));
00185 d->mGameStatus = new QTreeWidgetItem(v, QStringList(i18n("Game Status")));
00186 d->mGameRunning = new QTreeWidgetItem(v, QStringList(i18n("Game is Running")));
00187 d->mGameMaxPlayers = new QTreeWidgetItem(v, QStringList(i18n("Maximal Players")));
00188 d->mGameMinPlayers = new QTreeWidgetItem(v, QStringList(i18n("Minimal Players")));
00189 d->mGamePlayerCount = new QTreeWidgetItem(v, QStringList(i18n("Players")));
00190 }
00191
00192 void KGameDebugDialog::initPlayerPage()
00193 {
00194 d->mPlayerPage = new QFrame();
00195 addPage(d->mPlayerPage,i18n("Debug &Players"));
00196 QVBoxLayout* topLayout = new QVBoxLayout(d->mPlayerPage);
00197 topLayout->setMargin( marginHint() );
00198 topLayout->setSpacing( spacingHint() );
00199 QHBoxLayout* layout = new QHBoxLayout;
00200 topLayout->addLayout(layout);
00201
00202
00203 QVBoxLayout* listLayout = new QVBoxLayout;
00204 layout->addLayout(listLayout);
00205 QLabel* listLabel = new QLabel(i18n("Available Players"), d->mPlayerPage);
00206 listLayout->addWidget(listLabel);
00207 d->mPlayerList = new KListWidget(d->mPlayerPage);
00208 connect(d->mPlayerList, SIGNAL(executed(QListWidgetItem*)), this, SLOT(slotUpdatePlayerData(QListWidgetItem*)));
00209 listLayout->addWidget(d->mPlayerList);
00210 d->mPlayerList->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding));
00211
00212 QTreeWidget* v = new QTreeWidget(d->mPlayerPage);
00213 layout->addWidget(v);
00214 QTreeWidgetItem* vheader = new QTreeWidgetItem();
00215 vheader->setText(0, tr("Data"));
00216 vheader->setText(1, tr("Value"));
00217 v->setHeaderItem(vheader);
00218
00219 d->mPlayerProperties = new QTreeWidget(d->mPlayerPage);
00220 QTreeWidgetItem* mPlayerPropertiesHeader = new QTreeWidgetItem();
00221 mPlayerPropertiesHeader->setText(0, tr("Property"));
00222 mPlayerPropertiesHeader->setText(1, tr("Value"));
00223 mPlayerPropertiesHeader->setText(2, tr("Policy")); d->mPlayerProperties->setHeaderItem(mPlayerPropertiesHeader);
00224 layout->addWidget(d->mPlayerProperties);
00225
00226 QPushButton* b = new QPushButton(i18n("Update"), d->mPlayerPage);
00227 connect(b, SIGNAL(pressed()), this, SLOT(slotUpdatePlayerList()));
00228 topLayout->addWidget(b);
00229
00230 d->mPlayerAddress = new QTreeWidgetItem(v, QStringList(i18n("Player Pointer")));
00231 d->mPlayerId = new QTreeWidgetItem(v, QStringList(i18n("Player ID")));
00232 d->mPlayerName = new QTreeWidgetItem(v, QStringList(i18n("Player Name")));
00233 d->mPlayerGroup = new QTreeWidgetItem(v, QStringList(i18n("Player Group")));
00234 d->mPlayerUserId = new QTreeWidgetItem(v, QStringList(i18n("Player User ID")));
00235 d->mPlayerMyTurn = new QTreeWidgetItem(v, QStringList(i18n("My Turn")));
00236 d->mPlayerAsyncInput = new QTreeWidgetItem(v, QStringList(i18n("Async Input")));
00237 d->mPlayerKGameAddress = new QTreeWidgetItem(v, QStringList(i18n("KGame Address")));
00238 d->mPlayerVirtual = new QTreeWidgetItem(v, QStringList(i18n("Player is Virtual")));
00239 d->mPlayerActive = new QTreeWidgetItem(v, QStringList(i18n("Player is Active")));
00240 d->mPlayerRtti = new QTreeWidgetItem(v, QStringList(i18n("RTTI")));
00241 d->mPlayerNetworkPriority = new QTreeWidgetItem(v, QStringList(i18n("Network Priority")));
00242 }
00243
00244 void KGameDebugDialog::initMessagePage()
00245 {
00246 d->mMessagePage = new QFrame();
00247 addPage(d->mMessagePage,i18n("Debug &Messages"));
00248 QGridLayout* layout = new QGridLayout(d->mMessagePage);
00249 layout->setMargin(marginHint());
00250 layout->setSpacing(spacingHint());
00251 d->mMessageList = new QTreeWidget(d->mMessagePage);
00252 layout->addWidget(d->mMessageList, 0, 0, 10, 4);
00253
00254 QTreeWidgetItem* mMessageListHeader = new QTreeWidgetItem();
00255 mMessageListHeader->setText(0, tr("Time"));
00256 mMessageListHeader->setText(1, tr("ID"));
00257 mMessageListHeader->setText(2, tr("Receiver")); mMessageListHeader->setText(2, tr("Sender"));
00258 mMessageListHeader->setText(2, tr("ID - Text"));
00259 d->mMessageList->setHeaderItem(mMessageListHeader);
00260
00261 QPushButton* hide = new QPushButton(i18n("&>>"), d->mMessagePage);
00262 connect(hide, SIGNAL(pressed()), this, SLOT(slotHideId()));
00263 layout->addWidget(hide, 4, 4);
00264
00265 QPushButton* show = new QPushButton(i18n("&<<"), d->mMessagePage);
00266 connect(show, SIGNAL(pressed()), this, SLOT(slotShowId()));
00267 layout->addWidget(show, 6, 4);
00268
00269 QLabel* l = new QLabel(i18n("Do not show IDs:"), d->mMessagePage);
00270 layout->addWidget(l, 0, 5, 1, 2);
00271 d->mHideIdList = new KListWidget(d->mMessagePage);
00272 layout->addWidget(d->mHideIdList, 1, 5, 8, 2);
00273
00274 QPushButton* clear = new KPushButton(KStandardGuiItem::clear(), d->mMessagePage);
00275 connect(clear, SIGNAL(pressed()), this, SLOT(slotClearMessages()));
00276 layout->addWidget(clear, 10, 0, 1, 7);
00277
00278 }
00279
00280 void KGameDebugDialog::clearPlayerData()
00281 {
00282 d->mPlayerAddress->setText(1, "");
00283 d->mPlayerId->setText(1, "");
00284 d->mPlayerName->setText(1, "");
00285 d->mPlayerGroup->setText(1, "");
00286 d->mPlayerUserId->setText(1, "");
00287 d->mPlayerMyTurn->setText(1, "");
00288 d->mPlayerAsyncInput->setText(1, "");
00289 d->mPlayerKGameAddress->setText(1, "");
00290 d->mPlayerVirtual->setText(1, "");
00291 d->mPlayerActive->setText(1, "");
00292 d->mPlayerRtti->setText(1, "");
00293 d->mPlayerNetworkPriority->setText(1, "");
00294
00295 d->mPlayerProperties->clear();
00296 }
00297
00298 void KGameDebugDialog::clearGameData()
00299 {
00300 d->mGameAddress->setText(1, "");
00301 d->mGameId->setText(1, "");
00302 d->mGameCookie->setText(1, "");
00303 d->mGameMaster->setText(1, "");
00304 d->mGameAdmin->setText(1, "");
00305 d->mGameOffering->setText(1, "");
00306 d->mGameStatus->setText(1, "");
00307 d->mGameRunning->setText(1, "");
00308 d->mGameMaxPlayers->setText(1, "");
00309 d->mGameMinPlayers->setText(1, "");
00310
00311 d->mGameProperties->clear();
00312 }
00313
00314 void KGameDebugDialog::slotUpdatePlayerData()
00315 {
00316 if (!d->mGame || d->mPlayerList->currentRow() == -1) {
00317 return;
00318 }
00319 slotUpdatePlayerData(d->mPlayerList->item(d->mPlayerList->currentRow()));
00320 }
00321
00322 void KGameDebugDialog::slotUpdatePlayerList()
00323 {
00324 QListWidgetItem* i = d->mPlayerList->item(0);
00325 for (; d->mPlayerList->count() > 0; i = d->mPlayerList->item(0)) {
00326 removePlayer(i);
00327 }
00328
00329 for ( QList<KPlayer*>::const_iterator it = d->mGame->playerList()->begin(); it!=d->mGame->playerList()->end();it++ )
00330 {
00331 addPlayer(*it);
00332 }
00333 }
00334
00335 void KGameDebugDialog::slotUpdateGameData()
00336 {
00337 if (!d->mGame) {
00338 d->mGameAddress->setText(1, i18n("NULL pointer"));
00339 return;
00340 }
00341
00342 clearGameData();
00343
00344 QString buf;
00345 buf.sprintf("%p", (void*)d->mGame);
00346 d->mGameAddress->setText(1, buf);
00347 d->mGameId->setText(1, QString::number(d->mGame->gameId()));
00348 d->mGameCookie->setText(1, QString::number(d->mGame->cookie()));
00349 d->mGameMaster->setText(1, d->mGame->isMaster() ? i18n("True") : i18n("False"));
00350 d->mGameAdmin->setText(1, d->mGame->isAdmin() ? i18n("True") : i18n("False"));
00351 d->mGameOffering->setText(1, d->mGame->isOfferingConnections() ? i18n("True") : i18n("False"));
00352 d->mGameStatus->setText(1, QString::number(d->mGame->gameStatus()));
00353 d->mGameRunning->setText(1, d->mGame->isRunning() ? i18n("True") : i18n("False"));
00354 d->mGameMaxPlayers->setText(1, QString::number(d->mGame->maxPlayers()));
00355 d->mGameMinPlayers->setText(1, QString::number(d->mGame->minPlayers()));
00356 d->mGamePlayerCount->setText(1, QString::number(d->mGame->playerCount()));
00357
00358
00359
00360 KGamePropertyHandler* handler = d->mGame->dataHandler();
00361 QHashIterator<int, KGamePropertyBase*> it(handler->dict());
00362 while (it.hasNext()) {
00363 it.next();
00364 QString policy;
00365 switch (it.value()->policy()) {
00366 case KGamePropertyBase::PolicyClean:
00367 policy = i18n("Clean");
00368 break;
00369 case KGamePropertyBase::PolicyDirty:
00370 policy = i18n("Dirty");
00371 break;
00372 case KGamePropertyBase::PolicyLocal:
00373 policy = i18n("Local");
00374 break;
00375 case KGamePropertyBase::PolicyUndefined:
00376 default:
00377 policy = i18n("Undefined");
00378 break;
00379 }
00380 QStringList items;
00381 items << handler->propertyName(it.value()->id()) << handler->propertyValue(it.value()) << policy;
00382 new QTreeWidgetItem(d->mGameProperties,items);
00383
00384 }
00385 }
00386
00387 void KGameDebugDialog::slotUpdatePlayerData(QListWidgetItem* item)
00388 {
00389 if (!item || !d->mGame) {
00390 return;
00391 }
00392
00393 KPlayer* p = d->mGame->findPlayer(item->text().toInt());
00394
00395 if (!p) {
00396 kError(11001) << ": cannot find player";
00397 return;
00398 }
00399
00400 clearPlayerData();
00401
00402 QString buf;
00403 buf.sprintf("%p", (void*)p);
00404 d->mPlayerAddress->setText(1, buf);
00405 d->mPlayerId->setText(1, QString::number(p->id()));
00406 d->mPlayerName->setText(1, p->name());
00407 d->mPlayerGroup->setText(1, p->group());
00408 d->mPlayerUserId->setText(1, QString::number(p->userId()));
00409 d->mPlayerMyTurn->setText(1, p->myTurn() ? i18n("True") : i18n("False"));
00410 d->mPlayerAsyncInput->setText(1, p->asyncInput() ? i18n("True") : i18n("False"));
00411 buf.sprintf("%p", (void*)p->game());
00412 d->mPlayerKGameAddress->setText(1, buf);
00413 d->mPlayerVirtual->setText(1, p->isVirtual() ? i18n("True") : i18n("False"));
00414 d->mPlayerActive->setText(1, p->isActive() ? i18n("True") : i18n("False"));
00415 d->mPlayerRtti->setText(1, QString::number(p->rtti()));
00416 d->mPlayerNetworkPriority->setText(1, QString::number(p->networkPriority()));
00417
00418
00419
00420
00421 KGamePropertyHandler * handler = p->dataHandler();
00422 QHashIterator<int, KGamePropertyBase*> it((handler->dict()));
00423 while (it.hasNext()) {
00424 it.next();
00425 QString policy;
00426 switch (it.value()->policy()) {
00427 case KGamePropertyBase::PolicyClean:
00428 policy = i18n("Clean");
00429 break;
00430 case KGamePropertyBase::PolicyDirty:
00431 policy = i18n("Dirty");
00432 break;
00433 case KGamePropertyBase::PolicyLocal:
00434 policy = i18n("Local");
00435 break;
00436 case KGamePropertyBase::PolicyUndefined:
00437 default:
00438 policy = i18n("Undefined");
00439 break;
00440 }
00441 QStringList items;
00442 items << handler->propertyName(it.value()->id()) << handler->propertyValue(it.value()) << policy;
00443 new QTreeWidgetItem(d->mPlayerProperties,items);
00444 }
00445 }
00446
00447 void KGameDebugDialog::clearPages()
00448 {
00449 clearPlayerData();
00450 clearGameData();
00451 d->mPlayerList->clear();
00452 slotClearMessages();
00453 }
00454
00455 void KGameDebugDialog::setKGame(const KGame* g)
00456 {
00457 slotUnsetKGame();
00458 d->mGame = g;
00459 if (g) {
00460
00461 connect(d->mGame, SIGNAL(destroyed()), this, SLOT(slotUnsetKGame()));
00462
00463
00464 for ( QList<KPlayer*>::const_iterator it = d->mGame->playerList()->begin(); it!=d->mGame->playerList()->end();it++ )
00465 {
00466 addPlayer(*it);
00467 }
00468
00469 slotUpdateGameData();
00470
00471 connect(d->mGame, SIGNAL(signalMessageUpdate(int, quint32, quint32)), this, SLOT(slotMessageUpdate(int, quint32, quint32)));
00472 }
00473 }
00474
00475 void KGameDebugDialog::slotUnsetKGame()
00476 {
00477 if (d->mGame) {
00478 disconnect(d->mGame, 0, this, 0);
00479 }
00480 d->mGame = 0;
00481 clearPages();
00482 }
00483
00484 void KGameDebugDialog::addPlayer(KPlayer* p)
00485 {
00486 if (!p) {
00487 kError(11001) << "trying to add NULL player";
00488 return;
00489 }
00490
00491 (void) new QListWidgetItem(QString::number(p->id()), d->mPlayerList);
00492
00493 }
00494
00495 void KGameDebugDialog::removePlayer(QListWidgetItem* i)
00496 {
00497 if (!i || !d->mGame) {
00498 return;
00499 }
00500 KPlayer* p = d->mGame->findPlayer(i->text().toInt());
00501 if (!p) {
00502 return;
00503 }
00504 disconnect(p, 0, this, 0);
00505 if (i->isSelected()) {
00506 clearPlayerData();
00507 }
00508 delete i;
00509 }
00510
00511 void KGameDebugDialog::slotMessageUpdate(int msgid, quint32 receiver, quint32 sender)
00512 {
00513 if (!showId(msgid)) {
00514 return;
00515 }
00516 QString msgidText = KGameMessage::messageId2Text(msgid);
00517 if (msgidText.isNull()) {
00518 if (msgid > KGameMessage::IdUser) {
00519 emit signalRequestIdName(msgid-KGameMessage::IdUser, true, msgidText);
00520 } else {
00521 emit signalRequestIdName(msgid, false, msgidText);
00522 }
00523 if (msgidText.isNull()) {
00524 msgidText = i18n("Unknown");
00525 }
00526 }
00527 QStringList items;
00528 items << QTime::currentTime().toString() <<
00529 QString::number(msgid) << QString::number(receiver) <<
00530 QString::number(sender) << msgidText;
00531 new QTreeWidgetItem( d->mMessageList, items);
00532 }
00533
00534 void KGameDebugDialog::slotClearMessages()
00535 {
00536 d->mMessageList->clear();
00537 }
00538
00539 void KGameDebugDialog::slotShowId()
00540 {
00541
00542
00543
00544
00545
00546
00547 if (!d->mHideIdList->currentItem()) {
00548 return;
00549 }
00550 d->mHideIdList->takeItem(d->mHideIdList->currentRow());
00551 }
00552
00553 void KGameDebugDialog::slotHideId()
00554 {
00555 if (!d->mMessageList->currentItem()) {
00556 return;
00557 }
00558 int msgid = d->mMessageList->currentItem()->text(1).toInt();
00559 if (!showId(msgid)) {
00560 return;
00561 }
00562 (void)new QListWidgetItem(QString::number(msgid), d->mHideIdList);
00563 }
00564
00565 bool KGameDebugDialog::showId(int msgid)
00566 {
00567 for (int j = 0; j < d->mHideIdList->count(); ++j) {
00568 QListWidgetItem* i = d->mHideIdList->item(j);
00569 if (i->text().toInt() == msgid) {
00570 return false;
00571 }
00572 }
00573 return true;
00574 }
00575
00576
00577 #include "kgamedebugdialog.moc"