• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • libtdegames
 

libtdegames

  • libtdegames
kchatbase.cpp
1 /*
2  This file is part of the TDE games library
3  Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de)
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License version 2 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include "kchatbase.h"
21 
22 #include <klineedit.h>
23 #include <tdelocale.h>
24 #include <kstandarddirs.h>
25 #include <tdeconfig.h>
26 #include <tdeapplication.h>
27 #include <kdebug.h>
28 
29 #include <tqlayout.h>
30 #include <tqcombobox.h>
31 #include <tqpainter.h>
32 
33 class KChatBaseTextPrivate
34 {
35 public:
36  KChatBaseTextPrivate()
37  {
38  mNameFont = 0;
39  mMessageFont = 0;
40  }
41 
42  TQString mName;
43  TQString mMessage;
44 
45  const TQFont* mNameFont;
46  const TQFont* mMessageFont;
47 };
48 
49 
50 KChatBaseText::KChatBaseText(const TQString& name, const TQString& message) : TQListBoxText()
51 {
52  init();
53  setName(name);
54  setMessage(message);
55 }
56 
57 KChatBaseText::KChatBaseText(const TQString& message) : TQListBoxText()
58 {
59  init();
60  setMessage(message);
61 }
62 
63 KChatBaseText::~KChatBaseText()
64 {
65  delete d;
66 }
67 
68 void KChatBaseText::init()
69 {
70  d = new KChatBaseTextPrivate;
71 }
72 
73 void KChatBaseText::setName(const TQString& n)
74 {
75 // d->mName = n;
76  d->mName = TQString("%1: ").arg(n);
77  setText(TQString("%1: %2").arg(name()).arg(message())); // esp. for sorting
78 }
79 
80 void KChatBaseText::setMessage(const TQString& m)
81 {
82  d->mMessage = m;
83  setText(TQString("%1: %2").arg(name()).arg(message())); // esp. for sorting
84 }
85 
86 const TQString& KChatBaseText::name() const
87 { return d->mName; }
88 
89 const TQString& KChatBaseText::message() const
90 { return d->mMessage; }
91 
92 TQFont KChatBaseText::nameFont() const
93 {
94  if (d->mNameFont) {
95  return *d->mNameFont;
96  } else if (listBox()) {
97  return listBox()->font();
98  } else {
99  return TQFont();
100  }
101 }
102 
103 TQFont KChatBaseText::messageFont() const
104 {
105  if (d->mMessageFont) {
106  return *d->mMessageFont;
107  } else if (listBox()) {
108  return listBox()->font();
109  } else {
110  return TQFont();
111  }
112 }
113 
114 void KChatBaseText::setNameFont(const TQFont* f)
115 { d->mNameFont = f; }
116 
117 void KChatBaseText::setMessageFont(const TQFont* f)
118 { d->mMessageFont = f; }
119 
120 void KChatBaseText::paint(TQPainter* painter)
121 {
122  TQFontMetrics fm = painter->fontMetrics();
123  painter->setFont(nameFont());
124  painter->drawText(3, fm.ascent() + fm.leading()/2, name());
125  painter->setFont(messageFont());
126  painter->drawText(3 + TQFontMetrics(nameFont()).width(name()), fm.ascent() + fm.leading()/2, message());
127 }
128 
129 int KChatBaseText::width(TQListBox* lb) const
130 {
131  int w = 0;
132  if (lb) {
133  w += 6;
134  w += TQFontMetrics(nameFont()).width(name());
135  w += TQFontMetrics(messageFont()).width(message());
136  }
137 // int w = lb ? lb->fontMetrics().width( text() ) + 6 : 0; // QT orig
138  return TQMAX(w, TQApplication::globalStrut().width());
139 }
140 
141 int KChatBaseText::height(TQListBox* lb) const
142 {
143  int h = 0;
144  if (lb) {
145  h += 2;
146  // AB: is lineSpacing still correct?
147  if (TQFontMetrics(nameFont()).lineSpacing() > TQFontMetrics(messageFont()).lineSpacing()) {
148  h += TQFontMetrics(nameFont()).lineSpacing();
149  } else {
150  h += TQFontMetrics(messageFont()).lineSpacing();
151  }
152  }
153 // int h = lb ? lb->fontMetrics().lineSpacing() + 2 : 0; // QT orig
154  return TQMAX(h, TQApplication::globalStrut().height());
155 }
156 
157 
158 
159 class KChatBasePrivate
160 {
161 public:
162  KChatBasePrivate()
163  {
164  mBox = 0;
165  mEdit = 0;
166  mCombo = 0;
167 
168  mAcceptMessage = true;
169  mMaxItems = -1;
170  }
171  TQListBox* mBox;
172  KLineEdit* mEdit;
173  TQComboBox* mCombo;
174  bool mAcceptMessage;
175  int mMaxItems;
176 
177  TQValueList<int> mIndex2Id;
178 
179  TQFont mNameFont;
180  TQFont mMessageFont;
181  TQFont mSystemNameFont;
182  TQFont mSystemMessageFont;
183 };
184 
185 KChatBase::KChatBase(TQWidget* parent, bool noComboBox) : TQFrame(parent)
186 {
187  init(noComboBox);
188 }
189 
190 KChatBase::~KChatBase()
191 {
192 // kdDebug(11000) << "KChatBase: DESTRUCT (" << this << ")" << endl;
193  saveConfig();
194  delete d;
195 }
196 
197 void KChatBase::init(bool noComboBox)
198 {
199 // kdDebug(11000) << "KChatBase: INIT (" << this << ")" << endl;
200 
201  d = new KChatBasePrivate;
202 
203  setMinimumWidth(100);
204  setMinimumHeight(150);
205 
206  TQVBoxLayout* l = new TQVBoxLayout(this);
207 
208  d->mBox = new TQListBox(this);
209  connect(d->mBox, TQ_SIGNAL(rightButtonClicked(TQListBoxItem*, const TQPoint&)),
210  this, TQ_SIGNAL(rightButtonClicked(TQListBoxItem*, const TQPoint&)));
211  l->addWidget(d->mBox);
212  d->mBox->setVScrollBarMode(TQScrollView::AlwaysOn);
213  d->mBox->setHScrollBarMode(TQScrollView::AlwaysOff);
214  d->mBox->setFocusPolicy(TQWidget::NoFocus);
215 // d->mBox->setSelectionMode(TQListBox::NoSelection);
216  d->mBox->setSelectionMode(TQListBox::Single);
217 
218  l->addSpacing(5);
219 
220  TQHBoxLayout* h = new TQHBoxLayout(l);
221  d->mEdit = new KLineEdit(this);
222  d->mEdit->setHandleSignals(false);
223  d->mEdit->setTrapReturnKey(true);
224  d->mEdit->completionObject(); // add the completion object
225  d->mEdit->setCompletionMode(TDEGlobalSettings::CompletionNone);
226  connect(d->mEdit, TQ_SIGNAL(returnPressed(const TQString&)), this, TQ_SLOT(slotReturnPressed(const TQString&)));
227  h->addWidget(d->mEdit);
228 
229  if (!noComboBox) {
230  d->mCombo = new TQComboBox(this);
231  h->addWidget(d->mCombo);
232  addSendingEntry(i18n("Send to All Players"), SendToAll);//FIXME: where to put the id?
233  }
234 
235  d->mAcceptMessage = true; // by default
236  setMaxItems(-1); // unlimited
237 
238  if (kapp) {
239  // kapp might be NULL as well - in case we are in TQt designer.
240  readConfig();
241  }
242 }
243 
244 bool KChatBase::acceptMessage() const
245 { return d->mAcceptMessage; }
246 
247 void KChatBase::setAcceptMessage(bool a)
248 { d->mAcceptMessage = a; }
249 
250 bool KChatBase::addSendingEntry(const TQString& text, int id)
251 {
252 //FIXME: is ID used correctly?
253 // do we need ID at all?
254 // what the hell should be here?
255 // d->mCombo->insertItem(i18n("Send to All Players"), SendToAll);
256  return insertSendingEntry(text, id);
257 }
258 
259 bool KChatBase::insertSendingEntry(const TQString& text, int id, int index)
260 {
261  if (!d->mCombo) {
262  kdWarning(11000) << "KChatBase: Cannot add an entry to the combo box" << endl;
263  return false;
264  }
265  if (d->mIndex2Id.findIndex(id) != -1) {
266  kdError(11000) << "KChatBase: Cannot add more than one entry with the same ID! " << endl;
267  kdError(11000) << "KChatBase: Text="<<text<<endl;
268  return false;
269  }
270  d->mCombo->insertItem(text, index);
271  if (index < 0) {
272  d->mIndex2Id.append(id);
273  } else {
274  d->mIndex2Id.insert(d->mIndex2Id.at(index), id);
275  }
276  if (d->mIndex2Id.count() != (uint)d->mCombo->count()) {
277  kdError(11000) << "KChatBase: internal ERROR - local IDs do not match combo box entries!" << endl;
278  }
279  return true;
280 }
281 
282 int KChatBase::sendingEntry() const
283 {
284  if (!d->mCombo) {
285  kdWarning(11001) << "Cannot retrieve index from NULL combo box" << endl;
286  return -1;
287  }
288  int index = d->mCombo->currentItem();
289  if (d->mIndex2Id.at(index) == d->mIndex2Id.end()) {
290  kdWarning(11000) << "could not find the selected sending entry!" << endl;
291  return -1;
292  }
293  return d->mIndex2Id[index];
294 }
295 
296 void KChatBase::removeSendingEntry(int id)
297 {
298  if (!d->mCombo) {
299  kdWarning(11000) << "KChatBase: Cannot remove an entry from the combo box" << endl;
300  return;
301  }
302  d->mCombo->removeItem(findIndex(id));
303  d->mIndex2Id.remove(id);
304 }
305 
306 void KChatBase::changeSendingEntry(const TQString& text, int id)
307 {
308  if (!d->mCombo) {
309  kdWarning(11000) << "KChatBase: Cannot change an entry in the combo box" << endl;
310  return;
311  }
312  int index = findIndex(id);
313  d->mCombo->changeItem(text, index);
314 }
315 
316 void KChatBase::setSendingEntry(int id)
317 {
318  if (!d->mCombo) {
319  kdWarning(11000) << "KChatBase: Cannot set an entry in the combo box" << endl;
320  return;
321  }
322  d->mCombo->setCurrentItem(findIndex(id));
323 }
324 
325 int KChatBase::findIndex(int id) const
326 {
327  return d->mIndex2Id.findIndex(id);
328 }
329 
330 int KChatBase::nextId() const
331 {
332  int i = SendToAll + 1;
333  while (d->mIndex2Id.findIndex(i) != -1) {
334  i++;
335  }
336  return i;
337 }
338 
339 void KChatBase::addItem(const TQListBoxItem* text)
340 {
341  d->mBox->insertItem(text);
342  int index = d->mBox->count() -1;
343  d->mBox->setBottomItem(index);//FIXME: don't scroll to bottom if user scrolled down manually
344  if (maxItems() >= 0 && d->mBox->count() > (unsigned int)maxItems()) {
345  d->mBox->removeItem(0);
346  }
347 }
348 
349 void KChatBase::addMessage(const TQString& fromName, const TQString& text)
350 {
351 //maybe "%1 says: %2" or so
352  addItem(layoutMessage(fromName, text));
353 }
354 
355 void KChatBase::addSystemMessage(const TQString& fromName, const TQString& text)
356 {
357  addItem(layoutSystemMessage(fromName, text));
358 }
359 
360 TQListBoxItem* KChatBase::layoutMessage(const TQString& fromName, const TQString& text)
361 {
362  //TODO: KChatBaseConfigure? - e.g. color
363  TQListBoxItem* message;
364  if (text.startsWith("/me ")) {
365  // replace "/me" by a nice star. leave one space after the star
366  TQPixmap pix;
367  pix.load(locate("data", TQString::fromLatin1("tdegames/pics/star.png")));
368 
369  //TODO KChatBasePixmap? Should change the font here!
370 
371  message = (TQListBoxItem*)new TQListBoxPixmap(pix, i18n("%1 %2").arg(fromName).arg(text.mid(3)));
372  } else {
373  // the text is not edited in any way. just return an item
374  KChatBaseText* m = new KChatBaseText(fromName, text);
375  m->setNameFont(&d->mNameFont);
376  m->setMessageFont(&d->mMessageFont);
377  message = (TQListBoxItem*)m;
378  }
379  return message;
380 }
381 
382 TQListBoxItem* KChatBase::layoutSystemMessage(const TQString& fromName, const TQString& text)
383 {
384  //TODO: KChatBaseConfigure? - e.g. color
385 
386  // no need to check for /me etc.
387  KChatBaseText* m = new KChatBaseText(i18n("--- %1").arg(fromName), text);
388  m->setNameFont(&d->mSystemNameFont);
389  m->setMessageFont(&d->mSystemMessageFont);
390  return (TQListBoxItem*)m;
391 }
392 
393 void KChatBase::slotReturnPressed(const TQString& text)
394 {
395  if (text.length() <= 0) {
396  // no text entered - probably hit return by accident
397  return;
398  } else if (!acceptMessage()) {
399  return;
400  }
401  d->mEdit->completionObject()->addItem(text);
402 // connect(d->mEdit, TQ_SIGNAL(returnPressed(const TQString&)), comp, TQ_SLOT(addItem(const TQString&)));
403  d->mEdit->clear();
404  returnPressed(text);
405 }
406 
407 TQString KChatBase::comboBoxItem(const TQString& name) const
408 { // TODO: such a function for "send to all" and "send to my group"
409  return i18n("Send to %1").arg(name);
410 }
411 
412 void KChatBase::slotClear()
413 {
414  d->mBox->clear();
415 }
416 
417 void KChatBase::setCompletionMode(TDEGlobalSettings::Completion mode)
418 { d->mEdit->setCompletionMode(mode); }
419 
420 void KChatBase::setNameFont(const TQFont& font)
421 {
422  d->mNameFont = font;
423  d->mBox->triggerUpdate(false);
424 }
425 
426 void KChatBase::setMessageFont(const TQFont& font)
427 {
428  d->mMessageFont = font;
429  d->mBox->triggerUpdate(false);
430 }
431 
432 void KChatBase::setBothFont(const TQFont& font)
433 {
434  setNameFont(font);
435  setMessageFont(font);
436 }
437 
438 const TQFont& KChatBase::nameFont() const
439 { return d->mNameFont; }
440 
441 const TQFont& KChatBase::messageFont() const
442 { return d->mMessageFont; }
443 
444 void KChatBase::setSystemNameFont(const TQFont& font)
445 {
446  d->mSystemNameFont = font;
447  d->mBox->triggerUpdate(false);
448 }
449 
450 void KChatBase::setSystemMessageFont(const TQFont& font)
451 {
452  d->mSystemMessageFont = font;
453  d->mBox->triggerUpdate(false);
454 }
455 
456 void KChatBase::setSystemBothFont(const TQFont& font)
457 {
458  setSystemNameFont(font);
459  setSystemMessageFont(font);
460 }
461 
462 const TQFont& KChatBase::systemNameFont() const
463 { return d->mSystemNameFont; }
464 
465 const TQFont& KChatBase::systemMessageFont() const
466 { return d->mSystemMessageFont; }
467 
468 void KChatBase::saveConfig(TDEConfig* conf)
469 {
470  TQString oldGroup;
471  if (!conf) {
472  conf = kapp->config();
473  oldGroup = conf->group();
474  conf->setGroup("KChatBase");
475  }
476 
477  conf->writeEntry("NameFont", nameFont());
478  conf->writeEntry("MessageFont", messageFont());
479  conf->writeEntry("SystemNameFont", systemNameFont());
480  conf->writeEntry("SystemMessageFont", systemMessageFont());
481  conf->writeEntry("MaxMessages", maxItems());
482 
483  if (!oldGroup.isNull()) {
484  conf->setGroup(oldGroup);
485  }
486 }
487 
488 void KChatBase::readConfig(TDEConfig* conf)
489 {
490  TQString oldGroup;
491  if (!conf) {
492  conf = kapp->config();
493  oldGroup = conf->group();
494  conf->setGroup("KChatBase");
495  }
496 
497  setNameFont(conf->readFontEntry("NameFont"));
498  setMessageFont(conf->readFontEntry("MessageFont"));
499  setSystemNameFont(conf->readFontEntry("SystemNameFont"));
500  setSystemMessageFont(conf->readFontEntry("SystemMessageFont"));
501  setMaxItems(conf->readNumEntry("MaxMessages", -1));
502 
503  if (!oldGroup.isNull()) {
504  conf->setGroup(oldGroup);
505  }
506 }
507 
508 void KChatBase::clear()
509 {
510  d->mBox->clear();
511 }
512 
513 void KChatBase::setMaxItems(int maxItems)
514 {
515  d->mMaxItems = maxItems;
516  //TODO cut too many messages
517  if (maxItems == 0) {
518  clear();
519  } else if (maxItems > 0) {
520  while (d->mBox->count() > (unsigned int)maxItems) {
521  d->mBox->removeItem(0);
522  }
523  }
524 }
525 
526 int KChatBase::maxItems() const
527 { return d->mMaxItems; }
528 
529 
530 #include "kchatbase.moc"
KChatBase::maxItems
int maxItems() const
Definition: kchatbase.cpp:526
KChatBaseText
A TQListBoxText implementation for KChatBase.
Definition: kchatbase.h:49
KChatBase::systemNameFont
const TQFont & systemNameFont() const
Same as systemNameFont but applies only to system messages.
Definition: kchatbase.cpp:462
KChatBase::returnPressed
virtual void returnPressed(const TQString &text)=0
This is called whenever the user pushed return ie wants to send a message.
KChatBaseText::KChatBaseText
KChatBaseText(const TQString &player, const TQString &text)
Constructs a KChatBaseText object with the player and text part.
Definition: kchatbase.cpp:50
KChatBase::sendingEntry
int sendingEntry() const
Definition: kchatbase.cpp:282
KChatBase::removeSendingEntry
void removeSendingEntry(int id)
Removes the entry with the ID id from the combo box.
Definition: kchatbase.cpp:296
KChatBase::systemMessageFont
const TQFont & systemMessageFont() const
Same as systemMessageFont but applies only to system messages.
Definition: kchatbase.cpp:465
KChatBase::setBothFont
void setBothFont(const TQFont &font)
This sets both - nameFont and messageFont to font.
Definition: kchatbase.cpp:432
KChatBase::messageFont
const TQFont & messageFont() const
This font should be used for a message.
Definition: kchatbase.cpp:441
KChatBase::fromName
virtual const TQString & fromName() const =0
KChatBase::addItem
virtual void addItem(const TQListBoxItem *item)
This member function is mainly internally used to add a message.
Definition: kchatbase.cpp:339
KChatBase::addMessage
virtual void addMessage(const TQString &fromName, const TQString &text)
Add a text in the listbox.
Definition: kchatbase.cpp:349
KChatBaseText::messageFont
TQFont messageFont() const
You can set the font of the message independently of the sender name.
Definition: kchatbase.cpp:103
KChatBase::layoutSystemMessage
virtual TQListBoxItem * layoutSystemMessage(const TQString &fromName, const TQString &text)
Create a TQListBoxItem for this message.
Definition: kchatbase.cpp:382
KChatBase::layoutMessage
virtual TQListBoxItem * layoutMessage(const TQString &fromName, const TQString &text)
Create a TQListBoxItem for this message.
Definition: kchatbase.cpp:360
KChatBase::setSystemMessageFont
void setSystemMessageFont(const TQFont &font)
Same as setMessageFont but applies only to system messages.
Definition: kchatbase.cpp:450
KChatBase::addSystemMessage
virtual void addSystemMessage(const TQString &fromName, const TQString &text)
This works just like addMessage but adds a system message.
Definition: kchatbase.cpp:355
KChatBase::acceptMessage
virtual bool acceptMessage() const
Definition: kchatbase.cpp:244
KChatBase::saveConfig
virtual void saveConfig(TDEConfig *conf=0)
Save the configuration of the dialog to a TDEConfig object.
Definition: kchatbase.cpp:468
KChatBaseText::setName
void setName(const TQString &name)
Set the name part of a message.
Definition: kchatbase.cpp:73
KChatBaseText::~KChatBaseText
virtual ~KChatBaseText()
Destruct a KChatBaseText object.
Definition: kchatbase.cpp:63
KChatBase::slotClear
void slotClear()
This clears all messages in the view.
Definition: kchatbase.cpp:412
KChatBase::setSystemNameFont
void setSystemNameFont(const TQFont &font)
Same as setNameFont but applies only to system messages.
Definition: kchatbase.cpp:444
KChatBaseText::setMessageFont
void setMessageFont(const TQFont *font)
Set the font for the message text.
Definition: kchatbase.cpp:117
KChatBase::setCompletionMode
void setCompletionMode(TDEGlobalSettings::Completion mode)
See KLineEdit::setCompletionMode.
Definition: kchatbase.cpp:417
KChatBase::clear
void clear()
Clear all messages in the list.
Definition: kchatbase.cpp:508
KChatBase::changeSendingEntry
void changeSendingEntry(const TQString &text, int id)
This changes a combo box entry.
Definition: kchatbase.cpp:306
KChatBase::addSendingEntry
bool addSendingEntry(const TQString &text, int id)
Adds a new entry in the combo box.
Definition: kchatbase.cpp:250
KChatBase::comboBoxItem
virtual TQString comboBoxItem(const TQString &name) const
Replace to customise the combo box.
Definition: kchatbase.cpp:407
KChatBase::rightButtonClicked
void rightButtonClicked(TQListBoxItem *, const TQPoint &)
Emitted when the user right-clicks on a list item.
KChatBase::KChatBase
KChatBase(TQWidget *parent, bool noComboBox=false)
Definition: kchatbase.cpp:185
KChatBaseText::message
const TQString & message() const
Definition: kchatbase.cpp:89
KChatBase::setAcceptMessage
void setAcceptMessage(bool a)
Definition: kchatbase.cpp:247
KChatBaseText::setMessage
void setMessage(const TQString &message)
Set the text part of a message.
Definition: kchatbase.cpp:80
KChatBaseText::nameFont
TQFont nameFont() const
You can set the font of the sender name independently of the message itself.
Definition: kchatbase.cpp:92
KChatBase::setMaxItems
void setMaxItems(int maxItems)
Set the maximum number of items in the list.
Definition: kchatbase.cpp:513
KChatBase::setSendingEntry
void setSendingEntry(int id)
This selects a combo box entry.
Definition: kchatbase.cpp:316
KChatBase::setMessageFont
void setMessageFont(const TQFont &font)
Set the font that used used for the message part of a message.
Definition: kchatbase.cpp:426
KChatBase::readConfig
virtual void readConfig(TDEConfig *conf=0)
Read the configuration from a TDEConfig object.
Definition: kchatbase.cpp:488
KChatBase::~KChatBase
virtual ~KChatBase()
Destruct the KChatBase object.
Definition: kchatbase.cpp:190
KChatBase::nameFont
const TQFont & nameFont() const
This font should be used for the name (the "from: " part) of a message.
Definition: kchatbase.cpp:438
KChatBaseText::setNameFont
void setNameFont(const TQFont *font)
Set the font for the name.
Definition: kchatbase.cpp:114
KChatBase::findIndex
int findIndex(int id) const
Definition: kchatbase.cpp:325
KChatBaseText::name
const TQString & name() const
Definition: kchatbase.cpp:86
KChatBase::nextId
int nextId() const
Definition: kchatbase.cpp:330
KChatBase::setSystemBothFont
void setSystemBothFont(const TQFont &font)
Same as setBothFont but applies only to system messages.
Definition: kchatbase.cpp:456
KChatBase::insertSendingEntry
bool insertSendingEntry(const TQString &text, int id, int index=-1)
Inserts a new entry in the combo box.
Definition: kchatbase.cpp:259
KChatBase::setNameFont
void setNameFont(const TQFont &font)
Set the font that used used for the name part of a message.
Definition: kchatbase.cpp:420

libtdegames

Skip menu "libtdegames"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

libtdegames

Skip menu "libtdegames"
  • libtdegames
Generated for libtdegames by doxygen 1.8.13
This website is maintained by Timothy Pearson.