You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/libtdegames/kgame/dialogs/kgamedialog.h

322 lines
10 KiB

/*
This file is part of the TDE games library
Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de)
Copyright (C) 2001 Martin Heni (martin@heni-online.de)
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.
*/
// NAMING
// please follow these naming rules if you add/change classes:
// the main dialog is named KGameDialog and the base config widget
// KGameDialogConfig. All config widgets are named KGameDialogXYZConfig (where
// XYZ = the name of the config widget, like "general" or "network") and are
// inherited from KGameDialogConfig.
#ifndef __KGAMEDIALOG_H__
#define __KGAMEDIALOG_H__
#include <kdialogbase.h>
#include <kdemacros.h>
class TQGridLayout;
class TQVBoxLayout;
class TQListBoxItem;
class KGame;
class KPlayer;
class KGamePropertyBase;
class KGameDialogConfig;
class KGameDialogGeneralConfig;
class KGameDialogNetworkConfig;
class KGameDialogMsgServerConfig;
class KGameDialogChatConfig;
class KGameDialogConnectionConfig;
class KGameDialogPrivate;
/**
* TODO: rewrite entire documentation. Nearly nothing is valid anymore.
* The main configuration dialog for KGame. Here all players meat each other,
* every player can see how many players connected (and their names) and the
* ADMIN can even "kick" players out. You can talk to each other (using
* KGameChat and the ADMIN can define the maxPlayers/minPlayers as well as the
* number of computer players.
*
*
* AB: setDefaultXYZ is obsolete!!
* You will usually create an instance of KGameDialog or any derived class and
* call setDefaultXYZ methods. Example (maybe
* obsoleted parameters - docu is currently changing very fast):
* \code
* KGameDialog dlg(kgame, i18n("New Game"), localPlayer, this, true,
* ID_CHAT);
* dlg.setDefaultNetworkInfo(port, host); // AB: obsolete!
* dlg.exec();
* \endcode
* This will create a default modal dialog with the title "New Game". You don't
* have to do more than this.
*
* @short Main configuration dialog for KGame
* @author Andreas Beckermann <b_mann@gmx.de>
**/
class KDE_EXPORT KGameDialog : public KDialogBase
{
Q_OBJECT
public:
enum ConfigOptions
{
NoConfig = 0,
ChatConfig = 1,
GameConfig = 2,
NetworkConfig = 4,
MsgServerConfig = 8,
BanPlayerConfig = 16,
AllConfig = 0xffff
};
/**
* Create an empty KGameDialog. You can add widgets using
* addConfigPage.
* @param g The KGame object of this game
* @param owner The KPlayer object who is responsible for this
* dialog, aka "the local player"
* @param title The title of the dialog - see KDialog::setCaption
* @param parent The parent of the dialog
* @param modal Whether the dialog is modal or not
**/
KGameDialog(KGame* g, KPlayer* owner, const TQString& title,
TQWidget* parent, bool modal = false);
/**
* Create a KGameDialog with the standard configuration widgets. This
* creates the following widgets:
* <ul>
* <li> KGameDialogGeneralConfig
* <li> KGameDialogNetworkConfig
* <li> KGameDialogMsgServerConfig
* <li> KGameDialogChatConfig
* <li> KGameDialogConnectionConfig
* </ul>
* If you want to use your own implementations (or none) of the widgets
* above you should subclass KGameDialog. Use addGameConfig,
* addNetworkConfig, addMsgConfig, addChatWidget and
* addConnectionList in this case.
*
* If you want to add further configuration widget you can simply use
* addConfigPage
* @param g The KGame object of this game
* @param owner The KPlayer object who is responsible for this
* dialog, aka "the local player"
* @param title The title of the dialog - see KDialog::setCaption
* @param parent The parent of the dialog
* @param modal Whether the dialog is modal or not
* @param initConfigs whether the default KGameDialogConfig widgets
* shall be created using initDefaultDialog. Use false if you want
* to use custom widgets.
* @param chatMsgId The ID of Chat messages. See KGameChat. Unused
* if initConfigs = false
**/
KGameDialog(KGame* g, KPlayer* owner, const TQString& title,
TQWidget* parent, long initConfigs = AllConfig,
int chatMsgId = 15432, bool modal = false);
virtual ~KGameDialog();
/**
* Change the owner of the dialog. This will be used as the fromPlayer in
* KGameChat and will receive the entered player name.
* @param owner The owner of the dialog. It must already be added to the
* KGame object!
*
* Calls the KGameDialogConfig::setOwner implementation of all
* widgets that have been added by addConfigWidget
* @param owner The new owner player of this dialog must already be
* added to the KGame object. Can even be NULL (then no player
* configuration is made)
**/
void setOwner(KPlayer* owner);
/**
* Change the KGame object this dialog is used for.
*
* Calls the KGameDialogConfig::setKGame implementation of all
* widgets that have been added by addConfigWidget
* @param g The new KGame object
**/
void setKGame(KGame* g);
/**
* This will submit all configuration data to the KGame object.
* Automatically called by slotApply and slotOk
* There is no need to replace this unless you
* want to add widgets which are not derived from those classes
**/
virtual void submitToKGame();
/**
* Adds a KGameChat to the dialog. If no parent is specified the
* game page will be used.
* @param chat The chat widget
* @param parent The parent of the chat widget. This MUST be an
* already added config widget. Note that the game page will be used
* if parent is 0.
**/
void addChatWidget(KGameDialogChatConfig* chat, TQVBox* parent = 0);
/**
* Add a connection list to the dialog. The list consists of a
* KLisBox containing all players in the current game (see
* KGame::playerList). The admin can "ban" players, ie kick them out of
* the game.
*
* This is another not-really-config-config-widget. It just displays the
* connections and lets you ban players.
* @param c The KGameDialogConnectionConfig object
* @param parent The parent of the widget. If 0 the networkConfig
* page is used.
**/
void addConnectionList(KGameDialogConnectionConfig* c, TQVBox* parent = 0);
/**
* Add a new page to the dialog. The page will contain you new config
* widget and will have your provided title.
*
* The widget will be reparented to this dialog. This also calls
* KGameDialogConfig::setKGame and KGameDialogConfig::setOwner.
* @param widget The new config widget
* @param title The title of the newly added page.
* @return The newly added page which contains your config widget.
**/
TQVBox* addConfigPage(KGameDialogConfig* widget, const TQString& title);
/**
* @return The TQVBox of the given key, The key is from ConfigOptions
* Note that not all are supported yet
**/
TQVBox *configPage(ConfigOptions which);
/**
* @return The default netowrk config. Note that this always returns 0 if
* you did not specify NetworkConfig in the constructor!
**/
KGameDialogNetworkConfig* networkConfig() const;
/**
* @return The default game config. Note that this always returns 0 if
* you did not specify GameConfig in the constructor!
**/
KGameDialogGeneralConfig* gameConfig() const;
/**
* Add a config widget to the specified parent. Usually you call
* addConfigPage for one widget and addConfigWidget for another to add
* it to the same page. Just use the returned page of
* addConfigPage.
**/
void addConfigWidget(KGameDialogConfig* widget, TQWidget* parent);
/**
* Used to add the main network config widget in a new page. Use this to
* make networkConfig return something useful.
**/
void addNetworkConfig(KGameDialogNetworkConfig* netConf);
/**
* Add the main game config widget in a new page. Use this to make
* gameConfig return something useful.
**/
void addGameConfig(KGameDialogGeneralConfig* conf);
/**
* Used to add the message server config widget in a new page.
**/
void addMsgServerConfig(KGameDialogMsgServerConfig* conf);
protected:
/**
* This is used to create a dialog containing all the default widgets.
*
* You may want to use this if you just want to use your own
* configuration widgets which inherit the standard ones.
*
* Note that if one of the widgets is NULL the default implementation
* will be used! (except the chat widget - you need to create it
* yourself as you have to provide a message id)
* @param initConfigs The widgets to be created
* @param chatMsgId The msgid for the chat config (only if specified in
* initConfigs) - see KGameDialogChatConfig
**/
void initDefaultDialog(ConfigOptions initConfigs, int chatMsgId = 15432);
/**
* Go through all config widgets and call their
* KGameDialogConfig::setKGame and KGameDialogConfig::setOwner implementation
*
* This function could be private and probably will be very soon.
* Don't use it yourself
**/
void configureConfigWidgets();
protected slots:
/**
* Called when the user clicks on Ok. Calls slotApply and
* TQDialog::accept()
**/
virtual void slotOk();
/**
* Just calls submitToKGame()
**/
virtual void slotApply();
/**
* Sets the default values for the configuration widgets. Set these
* values by (e.g.) setDefaultMaxPlayers()
* @deprecated
**/
virtual void slotDefault();
/**
* Called when the KGame object is destroyed. Calls setKGame(0) so
* that all widgets can disconnect their slots and so on.
**/
void slotUnsetKGame();
/**
* Called when the ADMIN status of this KGame client changes. See
* KGameNetwork::signalAdminStatusChanged
* @param isAdmin TRUE if this client is now the ADMIN otherwise FALSE
**/
void setAdmin(bool isAdmin);
/**
* Remove a config widget from the widget list.
* @see TQObject::destroyed
**/
void slotRemoveConfigWidget(TQObject* configWidget);
private:
void init(KGame*, KPlayer*);
private:
KGameDialogPrivate* d;
};
#endif