• 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
33class KChatBaseTextPrivate
34{
35public:
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
50KChatBaseText::KChatBaseText(const TQString& name, const TQString& message) : TQListBoxText()
51{
52 init();
53 setName(name);
54 setMessage(message);
55}
56
57KChatBaseText::KChatBaseText(const TQString& message) : TQListBoxText()
58{
59 init();
60 setMessage(message);
61}
62
63KChatBaseText::~KChatBaseText()
64{
65 delete d;
66}
67
68void KChatBaseText::init()
69{
70 d = new KChatBaseTextPrivate;
71}
72
73void 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
80void KChatBaseText::setMessage(const TQString& m)
81{
82 d->mMessage = m;
83 setText(TQString("%1: %2").arg(name()).arg(message())); // esp. for sorting
84}
85
86const TQString& KChatBaseText::name() const
87{ return d->mName; }
88
89const TQString& KChatBaseText::message() const
90{ return d->mMessage; }
91
92TQFont 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
103TQFont 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
114void KChatBaseText::setNameFont(const TQFont* f)
115{ d->mNameFont = f; }
116
117void KChatBaseText::setMessageFont(const TQFont* f)
118{ d->mMessageFont = f; }
119
120void 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
129int 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
141int 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
159class KChatBasePrivate
160{
161public:
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
185KChatBase::KChatBase(TQWidget* parent, bool noComboBox) : TQFrame(parent)
186{
187 init(noComboBox);
188}
189
190KChatBase::~KChatBase()
191{
192// kdDebug(11000) << "KChatBase: DESTRUCT (" << this << ")" << endl;
193 saveConfig();
194 delete d;
195}
196
197void 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
244bool KChatBase::acceptMessage() const
245{ return d->mAcceptMessage; }
246
247void KChatBase::setAcceptMessage(bool a)
248{ d->mAcceptMessage = a; }
249
250bool 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
259bool 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
282int 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
296void 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
306void 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
316void 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
325int KChatBase::findIndex(int id) const
326{
327 return d->mIndex2Id.findIndex(id);
328}
329
330int KChatBase::nextId() const
331{
332 int i = SendToAll + 1;
333 while (d->mIndex2Id.findIndex(i) != -1) {
334 i++;
335 }
336 return i;
337}
338
339void 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
349void KChatBase::addMessage(const TQString& fromName, const TQString& text)
350{
351//maybe "%1 says: %2" or so
352 addItem(layoutMessage(fromName, text));
353}
354
355void KChatBase::addSystemMessage(const TQString& fromName, const TQString& text)
356{
357 addItem(layoutSystemMessage(fromName, text));
358}
359
360TQListBoxItem* 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
382TQListBoxItem* 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
393void 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
407TQString 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
412void KChatBase::slotClear()
413{
414 d->mBox->clear();
415}
416
417void KChatBase::setCompletionMode(TDEGlobalSettings::Completion mode)
418{ d->mEdit->setCompletionMode(mode); }
419
420void KChatBase::setNameFont(const TQFont& font)
421{
422 d->mNameFont = font;
423 d->mBox->triggerUpdate(false);
424}
425
426void KChatBase::setMessageFont(const TQFont& font)
427{
428 d->mMessageFont = font;
429 d->mBox->triggerUpdate(false);
430}
431
432void KChatBase::setBothFont(const TQFont& font)
433{
434 setNameFont(font);
435 setMessageFont(font);
436}
437
438const TQFont& KChatBase::nameFont() const
439{ return d->mNameFont; }
440
441const TQFont& KChatBase::messageFont() const
442{ return d->mMessageFont; }
443
444void KChatBase::setSystemNameFont(const TQFont& font)
445{
446 d->mSystemNameFont = font;
447 d->mBox->triggerUpdate(false);
448}
449
450void KChatBase::setSystemMessageFont(const TQFont& font)
451{
452 d->mSystemMessageFont = font;
453 d->mBox->triggerUpdate(false);
454}
455
456void KChatBase::setSystemBothFont(const TQFont& font)
457{
458 setSystemNameFont(font);
459 setSystemMessageFont(font);
460}
461
462const TQFont& KChatBase::systemNameFont() const
463{ return d->mSystemNameFont; }
464
465const TQFont& KChatBase::systemMessageFont() const
466{ return d->mSystemMessageFont; }
467
468void 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
488void 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
508void KChatBase::clear()
509{
510 d->mBox->clear();
511}
512
513void 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
526int KChatBase::maxItems() const
527{ return d->mMaxItems; }
528
529
530#include "kchatbase.moc"
KChatBaseText
A TQListBoxText implementation for KChatBase.
Definition: kchatbase.h:50
KChatBaseText::KChatBaseText
KChatBaseText(const TQString &player, const TQString &text)
Constructs a KChatBaseText object with the player and text part.
Definition: kchatbase.cpp:50
KChatBaseText::~KChatBaseText
virtual ~KChatBaseText()
Destruct a KChatBaseText object.
Definition: kchatbase.cpp:63
KChatBaseText::message
const TQString & message() const
Definition: kchatbase.cpp:89
KChatBaseText::setMessage
void setMessage(const TQString &message)
Set the text part of a message.
Definition: kchatbase.cpp:80
KChatBaseText::name
const TQString & name() const
Definition: kchatbase.cpp:86
KChatBaseText::nameFont
TQFont nameFont() const
You can set the font of the sender name independently of the message itself.
Definition: kchatbase.cpp:92
KChatBaseText::messageFont
TQFont messageFont() const
You can set the font of the message independently of the sender name.
Definition: kchatbase.cpp:103
KChatBaseText::setMessageFont
void setMessageFont(const TQFont *font)
Set the font for the message text.
Definition: kchatbase.cpp:117
KChatBaseText::setName
void setName(const TQString &name)
Set the name part of a message.
Definition: kchatbase.cpp:73
KChatBaseText::setNameFont
void setNameFont(const TQFont *font)
Set the font for the name.
Definition: kchatbase.cpp:114
KChatBase::slotClear
void slotClear()
This clears all messages in the view.
Definition: kchatbase.cpp:412
KChatBase::maxItems
int maxItems() const
Definition: kchatbase.cpp:526
KChatBase::setSystemNameFont
void setSystemNameFont(const TQFont &font)
Same as setNameFont but applies only to system messages.
Definition: kchatbase.cpp:444
KChatBase::setSendingEntry
void setSendingEntry(int id)
This selects a combo box entry.
Definition: kchatbase.cpp:316
KChatBase::~KChatBase
virtual ~KChatBase()
Destruct the KChatBase object.
Definition: kchatbase.cpp:190
KChatBase::messageFont
const TQFont & messageFont() const
This font should be used for a message.
Definition: kchatbase.cpp:441
KChatBase::layoutSystemMessage
virtual TQListBoxItem * layoutSystemMessage(const TQString &fromName, const TQString &text)
Create a TQListBoxItem for this message.
Definition: kchatbase.cpp:382
KChatBase::fromName
virtual const TQString & fromName() const =0
KChatBase::rightButtonClicked
void rightButtonClicked(TQListBoxItem *, const TQPoint &)
Emitted when the user right-clicks on a list item.
KChatBase::setCompletionMode
void setCompletionMode(TDEGlobalSettings::Completion mode)
See KLineEdit::setCompletionMode.
Definition: kchatbase.cpp:417
KChatBase::setAcceptMessage
void setAcceptMessage(bool a)
Definition: kchatbase.cpp:247
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::changeSendingEntry
void changeSendingEntry(const TQString &text, int id)
This changes a combo box entry.
Definition: kchatbase.cpp:306
KChatBase::setSystemMessageFont
void setSystemMessageFont(const TQFont &font)
Same as setMessageFont but applies only to system messages.
Definition: kchatbase.cpp:450
KChatBase::saveConfig
virtual void saveConfig(TDEConfig *conf=0)
Save the configuration of the dialog to a TDEConfig object.
Definition: kchatbase.cpp:468
KChatBase::nextId
int nextId() const
Definition: kchatbase.cpp:330
KChatBase::systemNameFont
const TQFont & systemNameFont() const
Same as systemNameFont but applies only to system messages.
Definition: kchatbase.cpp:462
KChatBase::sendingEntry
int sendingEntry() const
Definition: kchatbase.cpp:282
KChatBase::setNameFont
void setNameFont(const TQFont &font)
Set the font that used used for the name part of a message.
Definition: kchatbase.cpp:420
KChatBase::readConfig
virtual void readConfig(TDEConfig *conf=0)
Read the configuration from a TDEConfig object.
Definition: kchatbase.cpp:488
KChatBase::layoutMessage
virtual TQListBoxItem * layoutMessage(const TQString &fromName, const TQString &text)
Create a TQListBoxItem for this message.
Definition: kchatbase.cpp:360
KChatBase::comboBoxItem
virtual TQString comboBoxItem(const TQString &name) const
Replace to customise the combo box.
Definition: kchatbase.cpp:407
KChatBase::setSystemBothFont
void setSystemBothFont(const TQFont &font)
Same as setBothFont but applies only to system messages.
Definition: kchatbase.cpp:456
KChatBase::addMessage
virtual void addMessage(const TQString &fromName, const TQString &text)
Add a text in the listbox.
Definition: kchatbase.cpp:349
KChatBase::acceptMessage
virtual bool acceptMessage() const
Definition: kchatbase.cpp:244
KChatBase::addSendingEntry
bool addSendingEntry(const TQString &text, int id)
Adds a new entry in the combo box.
Definition: kchatbase.cpp:250
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::nameFont
const TQFont & nameFont() const
This font should be used for the name (the "from: " part) of a message.
Definition: kchatbase.cpp:438
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::clear
void clear()
Clear all messages in the list.
Definition: kchatbase.cpp:508
KChatBase::findIndex
int findIndex(int id) const
Definition: kchatbase.cpp:325
KChatBase::returnPressed
virtual void returnPressed(const TQString &text)=0
This is called whenever the user pushed return ie wants to send a message.
KChatBase::addItem
virtual void addItem(const TQListBoxItem *item)
This member function is mainly internally used to add a message.
Definition: kchatbase.cpp:339
KChatBase::systemMessageFont
const TQFont & systemMessageFont() const
Same as systemMessageFont but applies only to system messages.
Definition: kchatbase.cpp:465
KChatBase::KChatBase
KChatBase(TQWidget *parent, bool noComboBox=false)
Definition: kchatbase.cpp:185
KChatBase::removeSendingEntry
void removeSendingEntry(int id)
Removes the entry with the ID id from the combo box.
Definition: kchatbase.cpp:296
KChatBase::setBothFont
void setBothFont(const TQFont &font)
This sets both - nameFont and messageFont to font.
Definition: kchatbase.cpp:432
KChatBase::setMaxItems
void setMaxItems(int maxItems)
Set the maximum number of items in the list.
Definition: kchatbase.cpp:513

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.9.4
This website is maintained by Timothy Pearson.