kgamedebugdialog.cpp
00001 /* 00002 This file is part of the KDE games library 00003 Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de) 00004 Copyright (C) 2001 Martin Heni (martin@heni-online.de) 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License version 2 as published by the Free Software Foundation. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public License 00016 along with this library; see the file COPYING.LIB. If not, write to 00017 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00018 Boston, MA 02110-1301, USA. 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 <tqlayout.h> 00036 #include <tqstring.h> 00037 #include <tqintdict.h> 00038 #include <tqlabel.h> 00039 #include <tqdatetime.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 TQFrame* mGamePage; 00089 KListView* mGameProperties; 00090 TQListViewItem* mGameAddress; 00091 TQListViewItem* mGameId; 00092 TQListViewItem* mGameCookie; 00093 TQListViewItem* mGameMaster; 00094 TQListViewItem* mGameAdmin; 00095 TQListViewItem* mGameOffering; 00096 TQListViewItem* mGameStatus; 00097 TQListViewItem* mGameRunning; 00098 TQListViewItem* mGameMaxPlayers; 00099 TQListViewItem* mGameMinPlayers; 00100 TQListViewItem* mGamePlayerCount; 00101 00102 TQFrame* mPlayerPage; 00103 KListBox* mPlayerList; 00104 KListView* mPlayerProperties; 00105 TQListViewItem* mPlayerAddress; 00106 TQListViewItem* mPlayerId; 00107 TQListViewItem* mPlayerName; 00108 TQListViewItem* mPlayerGroup; 00109 TQListViewItem* mPlayerUserId; 00110 TQListViewItem* mPlayerMyTurn; 00111 TQListViewItem* mPlayerAsyncInput; 00112 TQListViewItem* mPlayerKGameAddress; 00113 TQListViewItem* mPlayerVirtual; 00114 TQListViewItem* mPlayerActive; 00115 TQListViewItem* mPlayerRtti; 00116 TQListViewItem* mPlayerNetworkPriority; 00117 00118 TQFrame* mMessagePage; 00119 KListView* mMessageList; 00120 KListBox* mHideIdList; 00121 }; 00122 00123 KGameDebugDialog::KGameDebugDialog(KGame* g, TQWidget* 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 TQVBoxLayout* topLayout = new TQVBoxLayout(d->mGamePage, marginHint(), spacingHint()); 00145 TQHBoxLayout* layout = new TQHBoxLayout(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 TQPushButton* b = new TQPushButton(i18n("Update"), d->mGamePage); 00159 connect(b, TQT_SIGNAL(pressed()), this, TQT_SLOT(slotUpdateGameData())); 00160 topLayout->addWidget(b); 00161 00162 // game data 00163 d->mGameAddress = new TQListViewItem(v, i18n("KGame Pointer")); 00164 d->mGameId = new TQListViewItem(v, i18n("Game ID")); 00165 d->mGameCookie = new TQListViewItem(v, i18n("Game Cookie")); 00166 d->mGameMaster = new TQListViewItem(v, i18n("Is Master")); 00167 d->mGameAdmin = new TQListViewItem(v, i18n("Is Admin")); 00168 d->mGameOffering = new TQListViewItem(v, i18n("Is Offering Connections")); 00169 d->mGameStatus = new TQListViewItem(v, i18n("Game Status")); 00170 d->mGameRunning = new TQListViewItem(v, i18n("Game is Running")); 00171 d->mGameMaxPlayers = new TQListViewItem(v, i18n("Maximal Players")); 00172 d->mGameMinPlayers = new TQListViewItem(v, i18n("Minimal Players")); 00173 d->mGamePlayerCount = new TQListViewItem(v, i18n("Players")); 00174 } 00175 00176 void KGameDebugDialog::initPlayerPage() 00177 { 00178 d->mPlayerPage = addPage(i18n("Debug &Players")); 00179 TQVBoxLayout* topLayout = new TQVBoxLayout(d->mPlayerPage, marginHint(), spacingHint()); 00180 TQHBoxLayout* layout = new TQHBoxLayout(topLayout); 00181 00182 //TODO: connect to the KGame signals for joined/removed players!!! 00183 TQVBoxLayout* listLayout = new TQVBoxLayout(layout); 00184 TQLabel* listLabel = new TQLabel(i18n("Available Players"), d->mPlayerPage); 00185 listLayout->addWidget(listLabel); 00186 d->mPlayerList = new KListBox(d->mPlayerPage); 00187 connect(d->mPlayerList, TQT_SIGNAL(executed(TQListBoxItem*)), this, TQT_SLOT(slotUpdatePlayerData(TQListBoxItem*))); 00188 listLayout->addWidget(d->mPlayerList); 00189 d->mPlayerList->setSizePolicy(TQSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::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 TQPushButton* b = new TQPushButton(i18n("Update"), d->mPlayerPage); 00203 connect(b, TQT_SIGNAL(pressed()), this, TQT_SLOT(slotUpdatePlayerList())); 00204 topLayout->addWidget(b); 00205 00206 d->mPlayerAddress = new TQListViewItem(v, i18n("Player Pointer")); 00207 d->mPlayerId = new TQListViewItem(v, i18n("Player ID")); 00208 d->mPlayerName = new TQListViewItem(v, i18n("Player Name")); 00209 d->mPlayerGroup = new TQListViewItem(v, i18n("Player Group")); 00210 d->mPlayerUserId = new TQListViewItem(v, i18n("Player User ID")); 00211 d->mPlayerMyTurn = new TQListViewItem(v, i18n("My Turn")); 00212 d->mPlayerAsyncInput = new TQListViewItem(v, i18n("Async Input")); 00213 d->mPlayerKGameAddress = new TQListViewItem(v, i18n("KGame Address")); 00214 d->mPlayerVirtual = new TQListViewItem(v, i18n("Player is Virtual")); 00215 d->mPlayerActive = new TQListViewItem(v, i18n("Player is Active")); 00216 d->mPlayerRtti = new TQListViewItem(v, i18n("RTTI")); 00217 d->mPlayerNetworkPriority = new TQListViewItem(v, i18n("Network Priority")); 00218 } 00219 00220 void KGameDebugDialog::initMessagePage() 00221 { 00222 d->mMessagePage = addPage(i18n("Debug &Messages")); 00223 TQGridLayout* layout = new TQGridLayout(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 TQPushButton* hide = new TQPushButton(i18n("&>>"), d->mMessagePage); 00233 connect(hide, TQT_SIGNAL(pressed()), this, TQT_SLOT(slotHideId())); 00234 layout->addWidget(hide, 4, 4); 00235 00236 TQPushButton* show = new TQPushButton(i18n("&<<"), d->mMessagePage); 00237 connect(show, TQT_SIGNAL(pressed()), this, TQT_SLOT(slotShowId())); 00238 layout->addWidget(show, 6, 4); 00239 00240 TQLabel* l = new TQLabel(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 TQPushButton* clear = new KPushButton(KStdGuiItem::clear(), d->mMessagePage); 00246 connect(clear, TQT_SIGNAL(pressed()), this, TQT_SLOT(slotClearMessages())); 00247 layout->addMultiCellWidget(clear, 10, 10, 0, 6); 00248 //TODO: "show all but..." and "show nothing but..." 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 TQListBoxItem* i = d->mPlayerList->firstItem(); 00296 for (; i; i = d->mPlayerList->firstItem()) { 00297 removePlayer(i); 00298 } 00299 00300 TQPtrList<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 TQString buf; 00316 buf.sprintf("%p", d->mGame); 00317 d->mGameAddress->setText(1, buf); 00318 d->mGameId->setText(1, TQString::number(d->mGame->gameId())); 00319 d->mGameCookie->setText(1, TQString::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, TQString::number(d->mGame->gameStatus())); 00324 d->mGameRunning->setText(1, d->mGame->isRunning() ? i18n("True") : i18n("False")); 00325 d->mGameMaxPlayers->setText(1, TQString::number(d->mGame->maxPlayers())); 00326 d->mGameMinPlayers->setText(1, TQString::number(d->mGame->minPlayers())); 00327 d->mGamePlayerCount->setText(1, TQString::number(d->mGame->playerCount())); 00328 00329 //TODO ios 00330 00331 KGamePropertyHandler* handler = d->mGame->dataHandler(); 00332 TQIntDictIterator<KGamePropertyBase> it(handler->dict()); 00333 while (it.current()) { 00334 TQString 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 TQListViewItem(d->mGameProperties, 00351 handler->propertyName(it.current()->id()), 00352 handler->propertyValue(it.current()), 00353 policy); 00354 // kdDebug(11001) << k_funcinfo << ": checking for all game properties: found property name " << name << endl; 00355 ++it; 00356 } 00357 } 00358 00359 void KGameDebugDialog::slotUpdatePlayerData(TQListBoxItem* 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 TQString buf; 00375 buf.sprintf("%p", p); 00376 d->mPlayerAddress->setText(1, buf); 00377 d->mPlayerId->setText(1, TQString::number(p->id())); 00378 d->mPlayerName->setText(1, p->name()); 00379 d->mPlayerGroup->setText(1, p->group()); 00380 d->mPlayerUserId->setText(1, TQString::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, TQString::number(p->rtti())); 00388 d->mPlayerNetworkPriority->setText(1, TQString::number(p->networkPriority())); 00389 00390 //TODO ios 00391 00392 // Properties 00393 KGamePropertyHandler * handler = p->dataHandler(); 00394 TQIntDictIterator<KGamePropertyBase> it((handler->dict())); 00395 while (it.current()) { 00396 TQString 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 TQListViewItem(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 //TODO: connect to the KGame signals for joined/removed players!!! 00434 connect(d->mGame, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotUnsetKGame())); 00435 // connect(); 00436 00437 TQPtrList<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, TQT_SIGNAL(signalMessageUpdate(int, TQ_UINT32, TQ_UINT32)), this, TQT_SLOT(slotMessageUpdate(int, TQ_UINT32, TQ_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 TQListBoxText(d->mPlayerList, TQString::number(p->id())); 00465 //TODO connect to signals, like deleted/removed, ... 00466 } 00467 00468 void KGameDebugDialog::removePlayer(TQListBoxItem* 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, TQ_UINT32 receiver, TQ_UINT32 sender) 00485 { 00486 if (!showId(msgid)) { 00487 return; 00488 } 00489 TQString 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 TQListViewItem( d->mMessageList, TQTime::currentTime().toString(), 00501 TQString::number(msgid), TQString::number(receiver), 00502 TQString::number(sender), msgidText); 00503 } 00504 00505 void KGameDebugDialog::slotClearMessages() 00506 { 00507 d->mMessageList->clear(); 00508 } 00509 00510 void KGameDebugDialog::slotShowId() 00511 { 00512 /* TQListBoxItem* i = d->mHideIdList->firstItem(); 00513 for (; i; i = i->next()) { 00514 if (i->selected()) { 00515 d->mHideIdList->removeItem(i->); 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 TQListBoxText(d->mHideIdList, TQString::number(msgid)); 00534 } 00535 00536 bool KGameDebugDialog::showId(int msgid) 00537 { 00538 TQListBoxItem* 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"