libkdegames Library API Documentation

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., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, 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 
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 // game data
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  //TODO: connect to the KGame signals for joined/removed players!!!
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  //TODO: "show all but..." and "show nothing but..."
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 //TODO ios
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 //  kdDebug(11001) << k_funcinfo << ": checking for all game properties: found property name " << name << endl;
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 //TODO ios
00390 
00391 // Properties
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  //TODO: connect to the KGame signals for joined/removed players!!!
00433     connect(d->mGame, SIGNAL(destroyed()), this, SLOT(slotUnsetKGame()));
00434 //  connect();
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  //TODO connect to signals, like deleted/removed, ...
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 /* QListBoxItem* i = d->mHideIdList->firstItem();
00512  for (; i; i = i->next()) {
00513     if (i->selected()) {
00514         d->mHideIdList->removeItem(i->);
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"
KDE Logo
This file is part of the documentation for libkdegames Library Version 3.2.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Mar 12 22:53:41 2004 by doxygen 1.3.6-20040222 written by Dimitri van Heesch, © 1997-2003