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.
237 lines
8.2 KiB
237 lines
8.2 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program 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 General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
////////////////////////////////////////////////////////////////////////////// |
|
// // |
|
// pfGameGUIMgr Header // |
|
// A.K.A. "Ooh, we get a GUI!" // |
|
// // |
|
//// Description ///////////////////////////////////////////////////////////// |
|
// // |
|
// The in-game GUI manager. Handles reading, creation, and input for // |
|
// dialog boxes at runtime. // |
|
// // |
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
#ifndef _pfGameGUIMgr_h |
|
#define _pfGameGUIMgr_h |
|
|
|
#include "HeadSpin.h" |
|
#include "hsTemplates.h" |
|
#include "pnInputCore/plKeyDef.h" |
|
#include "pnKeyedObject/hsKeyedObject.h" |
|
#include <vector> |
|
|
|
class plPipeline; |
|
class plMessage; |
|
class pfGUIDialogMod; |
|
class pfGUIControlMod; |
|
class pfGameUIInputInterface; |
|
class plPostEffectMod; |
|
|
|
//// Tag Definitions ///////////////////////////////////////////////////////// |
|
// Each dialog/control gets an optional tag ID number. This is the link |
|
// between MAX and C++. You attach a Tag component to a control or dialog |
|
// in MAX and assign it an ID (supplied by a list of konstants that are |
|
// hard-coded). Then, in code, you ask the gameGUIMgr for the dialog (or |
|
// control) with that ID, and pop, you get it back. Then you run with it. |
|
// |
|
// Easy, huh? |
|
|
|
class pfGUITag |
|
{ |
|
public: |
|
uint32_t fID; |
|
char fName[ 128 ]; |
|
}; |
|
|
|
|
|
// |
|
// This class just holds a name and the key to set the receiver to |
|
// after the dialog gets loaded. |
|
class pfDialogNameSetKey |
|
{ |
|
private: |
|
char *fName; |
|
plKey fKey; |
|
public: |
|
pfDialogNameSetKey(const char *name, plKey key) { fName = hsStrcpy(name); fKey=key; } |
|
~pfDialogNameSetKey() { delete [] fName; } |
|
const char *GetName() { return fName; } |
|
plKey GetKey() { return fKey; } |
|
}; |
|
|
|
//// Manager Class Definition //////////////////////////////////////////////// |
|
|
|
class pfGUIPopUpMenu; |
|
class pfGameGUIMgr : public hsKeyedObject |
|
{ |
|
friend class pfGameUIInputInterface; |
|
|
|
public: |
|
|
|
enum EventType |
|
{ |
|
kMouseDown, |
|
kMouseUp, |
|
kMouseMove, |
|
kMouseDrag, |
|
kKeyDown, |
|
kKeyUp, |
|
kKeyRepeat, |
|
kMouseDblClick |
|
}; |
|
|
|
enum |
|
{ |
|
kNoModifiers = 0, |
|
kShiftDown = 0x01, |
|
kCtrlDown = 0x02, |
|
kCapsDown = 0x04 |
|
}; |
|
|
|
private: |
|
|
|
static pfGameGUIMgr *fInstance; |
|
|
|
protected: |
|
|
|
hsTArray<pfGUIDialogMod *> fDialogs; |
|
pfGUIDialogMod *fActiveDialogs; |
|
|
|
// These two lists help us manage when dialogs get told to load or unload versus when they actually *do* |
|
hsTArray<pfDialogNameSetKey *> fDlgsPendingLoad; |
|
hsTArray<pfDialogNameSetKey *> fDlgsPendingUnload; |
|
|
|
bool fActivated; |
|
uint32_t fActiveDlgCount; |
|
|
|
pfGameUIInputInterface *fInputConfig; |
|
uint32_t fInputCtlIndex; |
|
|
|
uint32_t fDefaultCursor; |
|
float fCursorOpacity; |
|
float fAspectRatio; |
|
|
|
// This is an array of the dialogs (by name) that need their |
|
// receiver key set once they are loaded. |
|
// This array shouldn't get more than one entry... but |
|
// it could be more.... |
|
// LoadDialog adds an entry and MsgReceive removes it |
|
hsTArray<pfDialogNameSetKey *> fDialogToSetKeyOf; |
|
|
|
void ILoadDialog( const char *name ); |
|
void IShowDialog( const char *name ); |
|
void IHideDialog( const char *name ); |
|
|
|
void IAddDlgToList( hsKeyedObject *obj ); |
|
void IRemoveDlgFromList( hsKeyedObject *obj ); |
|
|
|
void IActivateGUI( bool activate ); |
|
|
|
bool IHandleMouse( EventType event, float mouseX, float mouseY, uint8_t modifiers, uint32_t *desiredCursor ); |
|
bool IHandleKeyEvt( EventType event, plKeyDef key, uint8_t modifiers ); |
|
bool IHandleKeyPress( wchar_t key, uint8_t modifiers ); |
|
|
|
bool IModalBlocking( void ); |
|
|
|
pfGUIDialogMod *IGetTopModal( void ) const; |
|
|
|
public: |
|
|
|
enum |
|
{ |
|
kDlgModRef = 0 |
|
}; |
|
|
|
|
|
pfGameGUIMgr(); |
|
~pfGameGUIMgr(); |
|
|
|
CLASSNAME_REGISTER( pfGameGUIMgr ); |
|
GETINTERFACE_ANY( pfGameGUIMgr, hsKeyedObject ); |
|
|
|
void Draw( plPipeline *p ); |
|
|
|
bool Init( void ); |
|
|
|
virtual bool MsgReceive( plMessage* pMsg ); |
|
|
|
void LoadDialog( const char *name, plKey recvrKey=nil, const char *ageName = nil ); // AgeName = nil defaults to "GUI" |
|
void ShowDialog( const char *name ) { IShowDialog(name); } |
|
void HideDialog( const char *name ) { IHideDialog(name); } |
|
void UnloadDialog( const char *name ); |
|
void UnloadDialog( pfGUIDialogMod *dlg ); |
|
|
|
void ShowDialog( pfGUIDialogMod *dlg, bool resetClickables=true ); |
|
void HideDialog( pfGUIDialogMod *dlg ); |
|
|
|
bool IsDialogLoaded( const char *name ); |
|
pfGUIDialogMod *GetDialogFromString( const char *name ); |
|
|
|
void SetDialogToNotify(const char *name, plKey recvrKey); |
|
void SetDialogToNotify(pfGUIDialogMod *dlg, plKey recvrKey); |
|
|
|
void SetDefaultCursor(uint32_t defaultCursor) { fDefaultCursor = defaultCursor; } |
|
uint32_t GetDefaultCursor() { return fDefaultCursor; } |
|
void SetCursorOpacity(float opacity) { fCursorOpacity = opacity; } |
|
float GetCursorOpacity() { return fCursorOpacity; } |
|
|
|
pfGUIPopUpMenu *FindPopUpMenu( const char *name ); |
|
|
|
std::vector<plPostEffectMod*> GetDlgRenderMods( void ) const; |
|
bool IsModalBlocking( void ) {return IModalBlocking();} |
|
|
|
// Tag ID stuff |
|
pfGUIDialogMod *GetDialogFromTag( uint32_t tagID ); |
|
pfGUIControlMod *GetControlFromTag( pfGUIDialogMod *dlg, uint32_t tagID ); |
|
|
|
static uint32_t GetNumTags( void ); |
|
static pfGUITag *GetTag( uint32_t tagIndex ); |
|
static uint32_t GetHighestTag( void ); |
|
void SetAspectRatio(float aspectratio); |
|
float GetAspectRatio() { return fAspectRatio; } |
|
|
|
static pfGameGUIMgr *GetInstance( void ) { return fInstance; } |
|
}; |
|
|
|
#endif //_pfGameGUIMgr_h |
|
|
|
|