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"