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 <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 // game data
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  //TODO: connect to the KGame signals for joined/removed players!!!
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  //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  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 //TODO ios
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 //  kdDebug(11001) << k_funcinfo << ": checking for all game properties: found property name " << name << endl;
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 //TODO ios
00391 
00392 // Properties
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  //TODO: connect to the KGame signals for joined/removed players!!!
00434     connect(d->mGame, SIGNAL(destroyed()), this, SLOT(slotUnsetKGame()));
00435 //  connect();
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  //TODO connect to signals, like deleted/removed, ...
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 /* QListBoxItem* 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 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"
KDE Home | KDE Accessibility Home | Description of Access Keys