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