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