diff options
Diffstat (limited to 'libkdegames/kchatbase.h')
-rw-r--r-- | libkdegames/kchatbase.h | 510 |
1 files changed, 510 insertions, 0 deletions
diff --git a/libkdegames/kchatbase.h b/libkdegames/kchatbase.h new file mode 100644 index 00000000..07f786f9 --- /dev/null +++ b/libkdegames/kchatbase.h @@ -0,0 +1,510 @@ +/* + This file is part of the KDE games library + Copyright (C) 2001 Andreas Beckermann ([email protected]) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#ifndef __KCHATBASE_H__ +#define __KCHATBASE_H__ + +#include <qframe.h> +#include <qstring.h> +#include <qlistbox.h> + +#include <kglobalsettings.h> +#include <kdemacros.h> +class QListBoxItem; + +class KConfig; + + +class KChatBaseTextPrivate; + +/** + * A QListBoxText implementation for KChatBase. + * + * It supports different colors, text fonts, ... + * + * A KChatBaseText consists of two text items: first the player part then the + * text part. This honors KChatBase::addMessage which also uses both. + * You can leave the player part out if you don't need it - there won't be any + * difference. + * + * You can set different colors and fonts for both parts. In the future there + * will probably some kind of KChatBaseDialog which offers the user the ability + * to configure things like color and font on the fly. + **/ +class KChatBaseText : public QListBoxText +{ +public: + + /** + * Constructs a KChatBaseText object with the player and text part + **/ + KChatBaseText(const QString& player, const QString& text); + + /** + * Constructs a KChatBaseText object without player part + **/ + KChatBaseText(const QString& text); + + /** + * Destruct a KChatBaseText object. + **/ + virtual ~KChatBaseText(); + + /** + * Set the name part of a message. A message is usually shown like + * "name: text" and you can change both parts independently. + * + * @see setMessage + * @param name The name of the sender (e.g. the player) + **/ + void setName(const QString& name); + + /** + * Set the text part of a message. A message is usually shown like + * "name: message" and you can change both parts independently. + * + * See also setName + * @param message The message that has been sent + **/ + void setMessage(const QString& message); + + /** + * @return The name part of a message. + * @see setName + **/ + const QString& name() const; + + /** + * @return The message text. + * @see setMessage + **/ + const QString& message() const; + + /** + * You can set the font of the sender name independently of the message + * itself. This font is used as the "name: " part of the message. + * @return The font that is used for the name + **/ + QFont nameFont() const; + + /** + * You can set the font of the message independently of the sender name. + * This font is used as the text part of the message. + * @return The font thaz is used for message text + **/ + QFont messageFont() const; + + /** + * Set the font for the name. + * @see nameFont + * @param font A pointer to the name font. Only the pointer is stored so + * don't delete the object. This way there is only one object for a lot + * of messages in memory. + **/ + void setNameFont(const QFont* font); + + /** + * Set the font for the message text. + * @see messageFont + * @param font A pointer to the message font. Only the pointer is stored so + * don't delete the object! This way there is only one object for a lot + * of messages in memory. + **/ + void setMessageFont(const QFont* font); + + /** + **/ + virtual int width(QListBox* ) const; + + /** + **/ + virtual int height(QListBox* ) const; + +protected: + /** + **/ + virtual void paint(QPainter*); + +private: + void init(); + +private: + KChatBaseTextPrivate* d; +}; + + +class KChatBasePrivate; + +/** + * @short The base class for chat widgets + * + * This is the base class for both KChat and KGameChat. KGameChat is the class + * you want to use if you write a KGame based game as it will do most things for + * you. KChat is more or less the same but not KGame dependant + * + * KChatBase provides a complete chat widget, featuring different sending means + * (e.g. "send to all", "send to player1", "send to group2" and so on - see + * addSendingEntry). It also provides full auto-completion capabilities (see + * KCompletion and KLineEdit) which defaults to disabled. The user can + * change this by right-clicking on the KLineEdit widget and selecting the + * desired behaviour. You can also change this manually by calling + * setCompletionMode. + * + * To make KChatBase useful you have to overwrite at least returnPressed. + * Here you should send the message to all of your clients (or just some of + * them, depending on sendingEntry). + * + * To add a message just call addMessage with the nickname of the player + * who sent the message and the message itself. If you don't want to use + * layoutMessage by any reason you can also call addItem directly. But you + * should better replace layoutMessage instead. + * + * You probably don't want to use the abstract class KChatBase directly but use + * one of the derived classess KChat or KGameChat. The latter is the + * widget of choice if you develop a KGame application as you don't have to + * do anything but providing a KGame object. + * + * @author Andreas Beckermann <[email protected]> + **/ +class KDE_EXPORT KChatBase : public QFrame +{ + Q_OBJECT +public: + /** + * @param parent The parent widget for this widget. + * @param noComboBox If true then the combo box where the player can + * choose where to send messages to (either globally or just to some + * players) will not be added. + **/ + KChatBase(QWidget* parent, bool noComboBox = false); + + /** + * Destruct the KChatBase object + * + * Also calls saveConfig + **/ + virtual ~KChatBase(); + + enum SendingIds { + SendToAll = 0 + }; + + /** + * @return The name that will be shown for messages from this widget. Either the + * string that was set by setFromName or the name of the player + * that was set by setFromPlayer + **/ + virtual const QString& fromName() const = 0; + + /** + * Adds a new entry in the combo box. The default is "send to all + * players" only. This function is provided for convenience. You can + * also call inserSendingEntry with index = -1. + * See also nextId! + * @param text The text of the new entry + * @param id An ID for this entry. This must be unique for this + * entry. It has nothing to do with the position of the entry in the + * combo box. See nextId + * @return True if successful, otherwise false (e.g. if the id is already used) + **/ + bool addSendingEntry(const QString& text, int id); + + /** + * Inserts a new entry in the combo box. + * @param text The entry + * @param id An ID for this entry. This must be unique for this + * entry. It has nothing to do with the position of the entry in the + * combo box! + * @see nextId + * @param index The position of the entry. If -1 the entry will be added + * at the bottom + * @return True if successful, otherwise false (e.g. if the id is already used) + **/ + bool insertSendingEntry(const QString& text, int id, int index = -1); + + /** + * This changes a combo box entry. + * @param text The new text of the entry + * @param id The ID of the item to be changed + **/ + void changeSendingEntry(const QString& text, int id); + + /** + * This selects a combo box entry. + * @param id The ID of the item to be selected + **/ + void setSendingEntry(int id); + + /** + * Removes the entry with the ID id from the combo box. Note that id is + * _not_ the index of the entry! + * @see addSendingEntry + * @param id The unique id of the entry + **/ + void removeSendingEntry(int id); + + /** + * @return The _unique ID_ of the sending entry that has been selected. + * @see addSendingEntry + * + * Note that the entry "send to all" _always_ uses + * KChatBase::SendToAll, i.e. 0 as id! + **/ + int sendingEntry() const; + + /** + * @return The index of the combo box entry with the given id + **/ + int findIndex(int id) const; + + /** + * @return An ID that has not yet been used in the combo box. + * @see addSendingEntry + **/ + int nextId() const; + + /** + * @return True if this widget is able to send messages (see + * returnPressed) and false if not. The default implementation returns + * the value which has been set by setAcceptMessage (true by + * default) + **/ + virtual bool acceptMessage() const; + + /** + * See KLineEdit::setCompletionMode + **/ + void setCompletionMode(KGlobalSettings::Completion mode); + + /** + * Set the font that used used for the name part of a message. See also + * nameFont and setBothFont + **/ + void setNameFont(const QFont& font); + + /** + * Set the font that used used for the message part of a message. + * @see messageFont, setBothFont + **/ + void setMessageFont(const QFont& font); + + /** + * This sets both - nameFont and messageFont to font. You + * probably want to use this if you don't wish to distinguish between + * these parts of a message. + * @param font A font used for both nameFont and messageFont + **/ + void setBothFont(const QFont& font); + + /** + * Same as setNameFont but applies only to system messages. + * @see layoutSystemMessage + **/ + void setSystemNameFont(const QFont& font); + + /** + * Same as setMessageFont but applies only to system messages. + * @see layoutSystemMessage + **/ + void setSystemMessageFont(const QFont& font); + + /** + * Same as setBothFont but applies only to system messages. + * @see layoutSystemMessage + **/ + void setSystemBothFont(const QFont& font); + + /** + * This font should be used for the name (the "from: " part) of a + * message. layoutMessage uses this to set the font using + * KChatBaseText::setNameFont but if you want to overwrite + * layoutMessage you should do this yourself. + * @return The font that is used for the name part of the message. + **/ + const QFont& nameFont() const; + + /** + * This font should be used for a message. layoutMessage sets the + * font of a message using KChatBaseText::setMessageFont but if ypu + * replace layoutMessage with your own function you should use + * messageFont() yourself. + * @return The font that is used for a message + **/ + const QFont& messageFont() const; + + /** + * Same as systemNameFont but applies only to system messages. + * @see layoutSystemMessage + **/ + const QFont& systemNameFont() const; + + /** + * Same as systemMessageFont but applies only to system messages. + * @see layoutSystemMessage + **/ + const QFont& systemMessageFont() const; + + /** + * Save the configuration of the dialog to a KConfig object. If + * the supplied KConfig pointer is NULL then kapp->config() is used + * instead (and the group is changed to "KChatBase") butr the current + * group is restored at the end. + * @param conf A pointer to the KConfig object to save the config + * to. If you use 0 then kapp->config() is used and the group is changed + * to "KChatBase" (the current group is restored at the end). + **/ + virtual void saveConfig(KConfig* conf = 0); + + /** + * Read the configuration from a KConfig object. If the pointer is + * NULL kapp->config() is used and the group is changed to "KChatBase". + * The current KConfig::group is restored after this call. + **/ + virtual void readConfig(KConfig* conf = 0); + + /** + * Set the maximum number of items in the list. If the number of item + * exceeds the maximum as many items are deleted (oldest first) as + * necessary. The number of items will never exceed this value. + * @param maxItems the maximum number of items. -1 (default) for + * unlimited. + **/ + void setMaxItems(int maxItems); + + /** + * Clear all messages in the list. + **/ + void clear(); + + /** + * @return The maximum number of messages in the list. -1 is unlimited. See also + * setMaxItems + **/ + int maxItems() const; + + +public slots: + /** + * Add a text in the listbox. See also signalSendMessage() + * + * Maybe you want to replace this with a function that creates a nicer text + * than "fromName: text" + * + * Update: the function layoutMessage is called by this now. This + * means that you will get user defined outlook on the messages :-) + * @param fromName The player who sent this message + * @param text The text to be added + **/ + virtual void addMessage(const QString& fromName, const QString& text); + + /** + * This works just like addMessage but adds a system message. + * layoutSystemMessage is used to generate the displayed item. System + * messages will have a different look than player messages. + * + * You may wish to use this to display status information from your game. + **/ + virtual void addSystemMessage(const QString& fromName, const QString& text); + + /** + * This member function is mainly internally used to add a message. It + * is called by addMessage which creates a single text from a + * player name and a text. You will hardly ever use this - but if you + * need it it will be here ;-) + * + * But you may want to replace this in a derived class to create a + * non-default (maybe nicer ;-) ) behaviour + * @param item The QListBoxItem that is being added + **/ + virtual void addItem(const QListBoxItem* item); + + + /** + * This clears all messages in the view. Note that only the messages are + * cleared, not the sender names in the combo box! + **/ + void slotClear(); + + /** + * @param a If false this widget cannot send a message until + * setAcceptMessage(true) is called + **/ + void setAcceptMessage(bool a); + +signals: + /** + * Emitted when the user right-clicks on a list item. + * @see QListBox::rightButtonClicked + **/ + void rightButtonClicked(QListBoxItem*, const QPoint&); + +protected: + /** + * This is called whenever the user pushed return ie wants to send a + * message. + * + * Note that you MUST add the message to the widget when this function + * is called as it has already been added to the KCompletion object + * of the KLineEdit widget! + * + * Must be implemented in derived classes + * @param text The message to be sent + **/ + virtual void returnPressed(const QString& text) = 0; + + /** + * Replace to customise the combo box. + * + * Default: i18n("Send to %1).arg(name) + * @param name The name of the player + * @return The string as it will be shown in the combo box + **/ + virtual QString comboBoxItem(const QString& name) const; + + /** + * Create a QListBoxItem for this message. This function is not yet + * written usefully - currently just a QListBoxTex object is + * created which shows the message in this format: "fromName: text". + * This should fit most peoples needs but needs further improvements. + **/ + virtual QListBoxItem* layoutMessage(const QString& fromName, const QString& text); + + /** + * Create a QListBoxItem for this message. This does the same as + * layoutMessage but generates a system message. You might want to + * use such a message to display e.g. status information from your game. + * + * The default implementation just prepends "--- ". + **/ + virtual QListBoxItem* layoutSystemMessage(const QString& fromName, const QString& text); + +private slots: + /** + * Check if a text was entered and if acceptMessage returns true. + * Then add the message to the KCompletion object of the KLineEdit + * widget and call returnPressed + **/ + void slotReturnPressed(const QString&); + +private: + void init(bool noComboBox); + + KChatBasePrivate* d; +}; + +#endif |