1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342 |
- /*
- ===========================================================================
- Doom 3 BFG Edition GPL Source Code
- Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
- Doom 3 BFG Edition Source Code 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.
- Doom 3 BFG Edition Source Code 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 Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #ifndef __MENU_WIDGET_H__
- #define __MENU_WIDGET_H__
- class idMenuHandler;
- class idMenuWidget;
- enum menuOption_t {
- OPTION_INVALID = -1,
- OPTION_BUTTON_TEXT,
- OPTION_SLIDER_BAR,
- OPTION_SLIDER_TEXT,
- OPTION_SLIDER_TOGGLE,
- OPTION_BUTTON_INFO,
- OPTION_BUTTON_FULL_TEXT_SLIDER,
- MAX_MENU_OPTION_TYPES
- };
- enum widgetEvent_t {
- WIDGET_EVENT_PRESS,
- WIDGET_EVENT_RELEASE,
- WIDGET_EVENT_ROLL_OVER,
- WIDGET_EVENT_ROLL_OUT,
- WIDGET_EVENT_FOCUS_ON,
- WIDGET_EVENT_FOCUS_OFF,
-
- WIDGET_EVENT_SCROLL_UP_LSTICK,
- WIDGET_EVENT_SCROLL_UP_LSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_DOWN_LSTICK,
- WIDGET_EVENT_SCROLL_DOWN_LSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_LEFT_LSTICK,
- WIDGET_EVENT_SCROLL_LEFT_LSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_RIGHT_LSTICK,
- WIDGET_EVENT_SCROLL_RIGHT_LSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_UP_RSTICK,
- WIDGET_EVENT_SCROLL_UP_RSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_DOWN_RSTICK,
- WIDGET_EVENT_SCROLL_DOWN_RSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_LEFT_RSTICK,
- WIDGET_EVENT_SCROLL_LEFT_RSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_RIGHT_RSTICK,
- WIDGET_EVENT_SCROLL_RIGHT_RSTICK_RELEASE,
- WIDGET_EVENT_SCROLL_UP,
- WIDGET_EVENT_SCROLL_UP_RELEASE,
- WIDGET_EVENT_SCROLL_DOWN,
- WIDGET_EVENT_SCROLL_DOWN_RELEASE,
- WIDGET_EVENT_SCROLL_LEFT,
- WIDGET_EVENT_SCROLL_LEFT_RELEASE,
- WIDGET_EVENT_SCROLL_RIGHT,
- WIDGET_EVENT_SCROLL_RIGHT_RELEASE,
- WIDGET_EVENT_DRAG_START,
- WIDGET_EVENT_DRAG_STOP,
- WIDGET_EVENT_SCROLL_PAGEDWN,
- WIDGET_EVENT_SCROLL_PAGEDWN_RELEASE,
- WIDGET_EVENT_SCROLL_PAGEUP,
- WIDGET_EVENT_SCROLL_PAGEUP_RELEASE,
- WIDGET_EVENT_SCROLL,
- WIDGET_EVENT_SCROLL_RELEASE,
- WIDGET_EVENT_BACK,
- WIDGET_EVENT_COMMAND,
- WIDGET_EVENT_TAB_NEXT,
- WIDGET_EVENT_TAB_PREV,
- MAX_WIDGET_EVENT
- };
- enum scrollType_t {
- SCROLL_SINGLE, // scroll a single unit
- SCROLL_PAGE, // scroll a page
- SCROLL_FULL, // scroll all the way to the end
- SCROLL_TOP, // scroll to the first selection
- SCROLL_END, // scroll to the last selection
- };
- enum widgetAction_t {
- WIDGET_ACTION_NONE,
- WIDGET_ACTION_COMMAND,
- WIDGET_ACTION_FUNCTION, // call the SWF function
- WIDGET_ACTION_SCROLL_VERTICAL, // scroll something. takes one param = amount to scroll (can be negative)
- WIDGET_ACTION_SCROLL_VERTICAL_VARIABLE,
- WIDGET_ACTION_SCROLL_PAGE,
- WIDGET_ACTION_SCROLL_HORIZONTAL, // scroll something. takes one param = amount to scroll (can be negative)
- WIDGET_ACTION_SCROLL_TAB,
- WIDGET_ACTION_START_REPEATER,
- WIDGET_ACTION_STOP_REPEATER,
- WIDGET_ACTION_ADJUST_FIELD,
- WIDGET_ACTION_PRESS_FOCUSED,
- WIDGET_ACTION_JOY3_ON_PRESS,
- WIDGET_ACTION_JOY4_ON_PRESS,
- //
- WIDGET_ACTION_GOTO_MENU,
- WIDGET_ACTION_GO_BACK,
- WIDGET_ACTION_EXIT_GAME,
- WIDGET_ACTION_LAUNCH_MULTIPLAYER,
- WIDGET_ACTION_MENU_BAR_SELECT,
- WIDGET_ACTION_EMAIL_HOVER,
- // PDA USER DATA ACTIONS
- WIDGET_ACTION_PDA_SELECT_USER,
- WIDGET_ACTION_SELECT_GAMERTAG,
- WIDGET_ACTION_PDA_SELECT_NAV,
- WIDGET_ACTION_SELECT_PDA_AUDIO,
- WIDGET_ACTION_SELECT_PDA_VIDEO,
- WIDGET_ACTION_SELECT_PDA_ITEM,
- WIDGET_ACTION_SCROLL_DRAG,
- // PDA EMAIL ACTIONS
- WIDGET_ACTION_PDA_SELECT_EMAIL,
- WIDGET_ACTION_PDA_CLOSE,
- WIDGET_ACTION_REFRESH,
- WIDGET_ACTION_MUTE_PLAYER,
- MAX_WIDGET_ACTION
- };
- enum actionHandler_t {
- WIDGET_ACTION_EVENT_SCROLL_UP_START_REPEATER,
- WIDGET_ACTION_EVENT_SCROLL_UP_START_REPEATER_VARIABLE,
- WIDGET_ACTION_EVENT_SCROLL_DOWN_START_REPEATER,
- WIDGET_ACTION_EVENT_SCROLL_DOWN_START_REPEATER_VARIABLE,
- WIDGET_ACTION_EVENT_SCROLL_LEFT_START_REPEATER,
- WIDGET_ACTION_EVENT_SCROLL_RIGHT_START_REPEATER,
- WIDGET_ACTION_EVENT_SCROLL_PAGE_DOWN_START_REPEATER,
- WIDGET_ACTION_EVENT_SCROLL_PAGE_UP_START_REPEATER,
- WIDGET_ACTION_EVENT_STOP_REPEATER,
- WIDGET_ACTION_EVENT_TAB_NEXT,
- WIDGET_ACTION_EVENT_TAB_PREV,
- WIDGET_ACTION_EVENT_DRAG_START,
- WIDGET_ACTION_EVENT_DRAG_STOP,
- WIDGET_ACTION_EVENT_JOY3_ON_PRESS,
- };
- struct widgetTransition_t {
- widgetTransition_t() :
- animationName( NULL ) {
- }
- const char * animationName; // name of the animation to run
- idStaticList< const char *, 4 > prefixes; // prefixes to try to use for animation
- };
- /*
- ================================================
- scoreboardInfo_t
- ================================================
- */
- struct scoreboardInfo_t {
- scoreboardInfo_t() :
- index( -1 ),
- voiceState( VOICECHAT_DISPLAY_NONE ) {
- }
- idList< idStr, TAG_IDLIB_LIST_MENU> values;
- int index;
- voiceStateDisplay_t voiceState;
- };
- /*
- ================================================
- idSort_SavesByDate
- ================================================
- */
- class idSort_SavesByDate : public idSort_Quick< idSaveGameDetails, idSort_SavesByDate > {
- public:
- int Compare( const idSaveGameDetails & a, const idSaveGameDetails & b ) const {
- return b.date - a.date;
- }
- };
- /*
- ================================================
- idMenuDataSource
- ================================================
- */
- class idMenuDataSource {
- public:
- virtual ~idMenuDataSource() { }
- virtual void LoadData() = 0;
- virtual void CommitData() = 0;
- virtual bool IsDataChanged() const = 0;
- virtual idSWFScriptVar GetField( const int fieldIndex ) const = 0;
- virtual void AdjustField( const int fieldIndex, const int adjustAmount ) = 0;
- };
- /*
- ================================================
- idWidgetEvent
- ================================================
- */
- class idWidgetEvent {
- public:
- idWidgetEvent() :
- type( WIDGET_EVENT_PRESS ),
- arg( 0 ),
- thisObject( NULL ) {
- }
- idWidgetEvent( const widgetEvent_t type_, const int arg_, idSWFScriptObject * thisObject_, const idSWFParmList & parms_ ) :
- type( type_ ),
- arg( arg_ ),
- thisObject( thisObject_ ),
- parms( parms_ ) {
- }
- widgetEvent_t type;
- int arg;
- idSWFScriptObject * thisObject;
- idSWFParmList parms;
- };
- /*
- ================================================
- idWidgetAction
- ================================================
- */
- class idWidgetAction {
- public:
- idWidgetAction() :
- action( WIDGET_ACTION_NONE ),
- scriptFunction( NULL ) {
- }
- idWidgetAction( const idWidgetAction & src ) {
- action = src.action;
- parms = src.parms;
- scriptFunction = src.scriptFunction;
- if ( scriptFunction != NULL ) {
- scriptFunction->AddRef();
- }
- }
- ~idWidgetAction() {
- if ( scriptFunction != NULL ) {
- scriptFunction->Release();
- }
- }
- void operator=( const idWidgetAction & src ) {
- action = src.action;
- parms = src.parms;
- scriptFunction = src.scriptFunction;
- if ( scriptFunction != NULL ) {
- scriptFunction->AddRef();
- }
- }
- bool operator==( const idWidgetAction & otherAction ) const {
- if ( GetType() != otherAction.GetType()
- || GetParms().Num() != otherAction.GetParms().Num() ) {
- return false;
- }
- // everything else is equal, so check all parms. NOTE: this assumes we are only sending
- // integral types.
- for ( int i = 0; i < GetParms().Num(); ++i ) {
- if ( GetParms()[ i ].GetType() != otherAction.GetParms()[ i ].GetType()
- || GetParms()[ i ].ToInteger() != otherAction.GetParms()[ i ].ToInteger() ) {
- return false;
- }
- }
- return true;
- }
- void Set( idSWFScriptFunction * function ) {
- action = WIDGET_ACTION_FUNCTION;
- if ( scriptFunction != NULL ) {
- scriptFunction->Release();
- }
- scriptFunction = function;
- scriptFunction->AddRef();
- }
- void Set( widgetAction_t action_ ) {
- action = action_;
- parms.Clear();
- }
- void Set( widgetAction_t action_, const idSWFScriptVar & var1 ) {
- action = action_;
- parms.Clear();
- parms.Append( var1 );
- }
- void Set( widgetAction_t action_, const idSWFScriptVar & var1, const idSWFScriptVar & var2 ) {
- action = action_;
- parms.Clear();
- parms.Append( var1 );
- parms.Append( var2 );
- }
- void Set( widgetAction_t action_, const idSWFScriptVar & var1, const idSWFScriptVar & var2, const idSWFScriptVar & var3 ) {
- action = action_;
- parms.Clear();
- parms.Append( var1 );
- parms.Append( var2 );
- parms.Append( var3 );
- }
- void Set( widgetAction_t action_, const idSWFScriptVar & var1, const idSWFScriptVar & var2, const idSWFScriptVar & var3, const idSWFScriptVar & var4 ) {
- action = action_;
- parms.Clear();
- parms.Append( var1 );
- parms.Append( var2 );
- parms.Append( var3 );
- parms.Append( var4 );
- }
- idSWFScriptFunction * GetScriptFunction() { return scriptFunction; }
- const widgetAction_t GetType() const { return action; }
- const idSWFParmList & GetParms() const { return parms; }
- private:
- widgetAction_t action;
- idSWFParmList parms;
- idSWFScriptFunction * scriptFunction;
- };
- typedef idList< idMenuWidget *, TAG_IDLIB_LIST_MENU > idMenuWidgetList;
- /*
- ================================================
- idMenuWidget
- We're using a model/view architecture, so this is the combination of both model and view. The
- other part of the view is the SWF itself.
- ================================================
- */
- class idMenuWidget {
- public:
- /*
- ================================================
- WrapWidgetSWFEvent
- ================================================
- */
- class WrapWidgetSWFEvent : public idSWFScriptFunction_RefCounted {
- public:
- WrapWidgetSWFEvent( idMenuWidget * widget, const widgetEvent_t event, const int eventArg ) :
- targetWidget( widget ),
- targetEvent( event ),
- targetEventArg( eventArg ) {
- }
- idSWFScriptVar Call( idSWFScriptObject * thisObject, const idSWFParmList & parms ) {
- targetWidget->ReceiveEvent( idWidgetEvent( targetEvent, targetEventArg, thisObject, parms ) );
- return idSWFScriptVar();
- }
- private:
- idMenuWidget * targetWidget;
- widgetEvent_t targetEvent;
- int targetEventArg;
- };
- enum widgetState_t {
- WIDGET_STATE_HIDDEN, // hidden
- WIDGET_STATE_NORMAL, // normal
- WIDGET_STATE_SELECTING, // going into the selected state
- WIDGET_STATE_SELECTED, // fully selected
- WIDGET_STATE_DISABLED, // disabled
- WIDGET_STATE_MAX
- };
- idMenuWidget();
- virtual ~idMenuWidget();
- void Cleanup();
- // typically this is where the allocations for a widget will occur: sub widgets, etc.
- // Note that SWF sprite objects may not be accessible at this point.
- virtual void Initialize( idMenuHandler * data ) { menuData = data; }
- // takes the information described in this widget and applies it to a given script object.
- // the script object should point to the root that you want to run from. Running this will
- // also create the sprite binding, if any.
- virtual void Update() {}
- virtual void Show();
- virtual void Hide();
- widgetState_t GetState() const { return widgetState; }
- void SetState( const widgetState_t state );
- // actually binds the sprite. this must be called after setting sprite path!
- idSWFSpriteInstance * GetSprite() { return boundSprite; }
- idSWF * GetSWFObject();
- idMenuHandler * GetMenuData();
- bool BindSprite( idSWFScriptObject & root );
- void ClearSprite();
- void SetSpritePath( const char * arg1, const char * arg2 = NULL, const char * arg3 = NULL, const char * arg4 = NULL, const char * arg5 = NULL );
- void SetSpritePath( const idList< idStr > & spritePath_, const char * arg1 = NULL, const char * arg2 = NULL, const char * arg3 = NULL, const char * arg4 = NULL, const char * arg5 = NULL );
- idList< idStr, TAG_IDLIB_LIST_MENU > & GetSpritePath() { return spritePath; }
- int GetRefCount() const { return refCount; }
- void AddRef() { refCount++; }
- void Release() { assert( refCount > 0 ); if ( --refCount == 0 && !noAutoFree ) { delete this; } }
- //------------------------
- // Event Handling
- //------------------------
- virtual bool HandleAction( idWidgetAction & action, const idWidgetEvent & event, idMenuWidget * widget, bool forceHandled = false );
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event ) { }
- void SendEventToObservers( const idWidgetEvent & event );
- void RegisterEventObserver( idMenuWidget * observer );
- void ReceiveEvent( const idWidgetEvent & event );
- // Executes an event in the context of this widget. Only rarely should this be called
- // directly. Instead calls should go through ReceiveEvent which will propagate the event
- // through the standard focus order.
- virtual bool ExecuteEvent( const idWidgetEvent & event );
- // returns the list of actions for a given event, or NULL if no actions are registered for
- // that event. Events should not be directly added to the returned list. Instead use
- // AddEventAction for adding new events.
- idList< idWidgetAction, TAG_IDLIB_LIST_MENU > * GetEventActions( const widgetEvent_t eventType );
- // allocates an action for the given event
- idWidgetAction & AddEventAction( const widgetEvent_t eventType );
- void ClearEventActions();
- //------------------------
- // Data modeling
- //------------------------
- void SetDataSource( idMenuDataSource * dataSource, const int fieldIndex );
- idMenuDataSource * GetDataSource() { return dataSource; }
- void SetDataSourceFieldIndex( const int dataSourceFieldIndex_ ) { dataSourceFieldIndex = dataSourceFieldIndex_; }
- int GetDataSourceFieldIndex() const { return dataSourceFieldIndex; }
- idMenuWidget * GetFocus() { return ( focusIndex >= 0 && focusIndex < children.Num() ) ? children[ focusIndex ] : NULL; }
- int GetFocusIndex() const { return focusIndex; }
- void SetFocusIndex( const int index, bool skipSound = false );
- //------------------------
- // Hierarchy
- //------------------------
- idMenuWidgetList & GetChildren() { return children; }
- const idMenuWidgetList & GetChildren() const { return children; }
- idMenuWidget & GetChildByIndex( const int index ) const { return *children[ index ]; }
- void AddChild( idMenuWidget * widget );
- void RemoveChild( idMenuWidget * widget );
- bool HasChild( idMenuWidget * widget );
- void RemoveAllChildren();
- idMenuWidget * GetParent() { return parent; }
- const idMenuWidget * GetParent() const { return parent; }
- void SetParent( idMenuWidget * parent_ ) { parent = parent_; }
- void SetSWFObj( idSWF * obj ) { swfObj = obj; }
- bool GetHandlerIsParent() { return handlerIsParent; }
- void SetHandlerIsParent( bool val ) { handlerIsParent = val; }
- void SetNoAutoFree( bool b ) { noAutoFree = b; }
- protected:
- void ForceFocusIndex( const int index ) { focusIndex = index; }
- protected:
- bool handlerIsParent;
- idMenuHandler * menuData;
- idSWF * swfObj;
- idSWFSpriteInstance * boundSprite;
- idMenuWidget * parent;
- idList< idStr, TAG_IDLIB_LIST_MENU > spritePath;
- idMenuWidgetList children;
- idMenuWidgetList observers;
- static const int INVALID_ACTION_INDEX = -1;
- idList< idList< idWidgetAction, TAG_IDLIB_LIST_MENU >, TAG_IDLIB_LIST_MENU > eventActions;
- idStaticList< int, MAX_WIDGET_EVENT > eventActionLookup;
- idMenuDataSource * dataSource;
- int dataSourceFieldIndex;
- int focusIndex;
- widgetState_t widgetState;
- int refCount;
- bool noAutoFree;
- };
- /*
- ================================================
- idMenuWidget_Button
- This might be better named "ComboButton", as it contains behavior for several controls along
- with standard button behavior.
- ================================================
- */
- class idMenuWidget_Button : public idMenuWidget {
- public:
- enum animState_t {
- ANIM_STATE_UP, // standard
- ANIM_STATE_DOWN, // pressed down
- ANIM_STATE_OVER, // hovered over this
- ANIM_STATE_MAX
- };
- idMenuWidget_Button() :
- animState( ANIM_STATE_UP ),
- img( NULL ),
- ignoreColor( false ) {
- }
- virtual ~idMenuWidget_Button() {}
- virtual bool ExecuteEvent( const idWidgetEvent & event );
- virtual void Update();
- //---------------
- // Model
- //---------------
- void SetLabel( const idStr & label ) { btnLabel = label; }
- const idStr & GetLabel() const { return btnLabel; }
- void SetValues( idList< idStr > & list );
- const idStr & GetValue( int index ) const;
- void SetImg( const idMaterial * val ) { img = val; }
- const idMaterial * GetImg() { return img; }
- void SetDescription( const char * desc_ ) { description = desc_; }
- const idStr & GetDescription() const { return description; }
- void SetIgnoreColor( const bool b ) { ignoreColor = b; }
- animState_t GetAnimState() const { return animState; }
- void SetAnimState( const animState_t state ) { animState = state; }
- void SetOnPressFunction( idSWFScriptFunction * func ) { scriptFunction = func; }
- protected:
- void SetupTransitionInfo( widgetTransition_t & trans, const widgetState_t buttonState, const animState_t sourceAnimState, const animState_t destAnimState ) const;
- void AnimateToState( const animState_t targetState, const bool force = false );
- idList< idStr, TAG_IDLIB_LIST_MENU > values;
- idStr btnLabel;
- idStr description;
- animState_t animState;
- const idMaterial * img;
- idSWFScriptFunction * scriptFunction;
- bool ignoreColor;
- };
- /*
- ================================================
- idMenuWidget_LobbyButton
- ================================================
- */
- class idMenuWidget_LobbyButton : public idMenuWidget_Button {
- public:
- idMenuWidget_LobbyButton() :
- voiceState( VOICECHAT_DISPLAY_NONE ) {
- }
- virtual void Update();
- void SetButtonInfo( idStr name_, voiceStateDisplay_t voiceState_ );
- bool IsValid() { return !name.IsEmpty(); }
- protected:
- idStr name;
- voiceStateDisplay_t voiceState;
- };
- /*
- ================================================
- idMenuWidget_ScoreboardButton
- ================================================
- */
- class idMenuWidget_ScoreboardButton : public idMenuWidget_Button {
- public:
- idMenuWidget_ScoreboardButton() :
- voiceState( VOICECHAT_DISPLAY_NONE ),
- index( -1 ) {
- }
- virtual void Update();
- void SetButtonInfo( int index_, idList< idStr > & list, voiceStateDisplay_t voiceState_ );
- protected:
- voiceStateDisplay_t voiceState;
- int index;
- };
- /*
- ================================================
- idMenuWidget_ControlButton
- ================================================
- */
- class idMenuWidget_ControlButton : public idMenuWidget_Button {
- public:
- idMenuWidget_ControlButton() :
- optionType( OPTION_BUTTON_TEXT ),
- disabled( false ) {
- }
- virtual void Update();
- void SetOptionType( const menuOption_t type ) { optionType = type; }
- menuOption_t GetOptionType() const { return optionType; }
- void SetupEvents( int delay, int index );
- void SetDisabled( bool disable ) { disabled = disable; }
- protected:
- menuOption_t optionType;
- bool disabled;
- };
- /*
- ================================================
- idMenuWidget_ServerButton
- ================================================
- */
- class idMenuWidget_ServerButton : public idMenuWidget_Button {
- public:
- idMenuWidget_ServerButton() :
- players( 0 ),
- index( 0 ),
- maxPlayers( 0 ),
- joinable( false ),
- validMap( false ) {
- }
- virtual void Update();
- void SetButtonInfo( idStr name_, idStrId mapName_, idStr modeName_, int index_ = 0, int players_ = 0, int maxPlayers_ = 0, bool joinable_ = false, bool validMap_ = false );
- bool IsValid() { return !serverName.IsEmpty(); }
- bool CanJoin() { return ( joinable && validMap ); }
- protected:
- idStr serverName;
- int index;
- int players;
- int maxPlayers;
- bool joinable;
- bool validMap;
- idStrId mapName;
- idStr modeName;
- };
- /*
- ================================================
- idMenuWidget_NavButton
- ================================================
- */
- class idMenuWidget_NavButton : public idMenuWidget_Button {
- public:
- enum navWidgetState_t {
- NAV_WIDGET_LEFT, // option on left side
- NAV_WIDGET_RIGHT, // option on right side
- NAV_WIDGET_SELECTED // option is selected
- };
- idMenuWidget_NavButton() :
- navIndex( 0 ),
- xPos( 0 ) {
- }
- virtual bool ExecuteEvent( const idWidgetEvent & event );
- virtual void Update();
- void SetNavIndex( int i, const navWidgetState_t type ) { navIndex = i; navState = type; }
- void SetPosition( float pos ) { xPos = pos; }
- private:
- int navIndex;
- float xPos;
- navWidgetState_t navState;
- };
- /*
- ================================================
- idMenuWidget_NavButton
- ================================================
- */
- class idMenuWidget_MenuButton : public idMenuWidget_Button {
- public:
- idMenuWidget_MenuButton() :
- xPos( 0 ) {
- }
- virtual void Update();
- void SetPosition( float pos ) { xPos = pos; }
- private:
- float xPos;
- };
- /*
- ================================================
- idMenuWidget_List
- Stores a list of widgets but displays only a segment of them at a time.
- ================================================
- */
- class idMenuWidget_List : public idMenuWidget {
- public:
- idMenuWidget_List() :
- numVisibleOptions( 0 ),
- viewOffset( 0 ),
- viewIndex( 0 ),
- allowWrapping( false ) {
- }
- virtual void Update();
- virtual bool HandleAction( idWidgetAction & action, const idWidgetEvent & event, idMenuWidget * widget, bool forceHandled = false );
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- virtual void Scroll( const int scrollIndexAmount, const bool wrapAround = false );
- virtual void ScrollOffset( const int scrollIndexAmount );
- virtual int GetTotalNumberOfOptions() const { return GetChildren().Num(); }
- virtual bool PrepareListElement( idMenuWidget & widget, const int childIndex ) { return true; }
- bool IsWrappingAllowed() const { return allowWrapping; }
- void SetWrappingAllowed( const bool allow ) { allowWrapping = allow; }
- void SetNumVisibleOptions( const int numVisibleOptions_ ) { numVisibleOptions = numVisibleOptions_; }
- int GetNumVisibleOptions() const { return numVisibleOptions; }
- int GetViewOffset() const { return viewOffset; }
- void SetViewOffset( const int offset ) { viewOffset = offset; }
- int GetViewIndex() const { return viewIndex; }
- void SetViewIndex( const int index ) { viewIndex = index; }
- void CalculatePositionFromIndexDelta( int & outIndex, int & outOffset, const int currentIndex, const int currentOffset, const int windowSize, const int maxSize, const int indexDelta, const bool allowWrapping, const bool wrapAround = false ) const;
- void CalculatePositionFromOffsetDelta( int & outIndex, int & outOffset, const int currentIndex, const int currentOffset, const int windowSize, const int maxSize, const int offsetDelta ) const;
- private:
- int numVisibleOptions;
- int viewOffset;
- int viewIndex;
- bool allowWrapping;
- };
- class idBrowserEntry_t {
- public:
- idStr serverName;
- int index;
- int players;
- int maxPlayers;
- bool joinable;
- bool validMap;
- idStrId mapName;
- idStr modeName;
- };
- /*
- ================================================
- idMenuWidget_GameBrowserList
- ================================================
- */
- class idMenuWidget_GameBrowserList : public idMenuWidget_List {
- public:
- virtual void Update();
- virtual bool PrepareListElement( idMenuWidget & widget, const int childIndex );
- virtual int GetTotalNumberOfOptions() const;
- void ClearGames();
- void AddGame( idStr name_, idStrId mapName_, idStr modeName_, int index_ = 0, int players_ = 0, int maxPlayers_ = 0, bool joinable_ = false, bool validMap_ = false );
- int GetServerIndex();
- private:
- idList< idBrowserEntry_t > games;
- };
- /*
- ================================================
- idMenuWidget_Carousel
- Displays a list of items in a looping carousel pattern
- ================================================
- */
- class idMenuWidget_Carousel : public idMenuWidget {
- public:
- idMenuWidget_Carousel() :
- numVisibleOptions( 0 ),
- viewIndex( 0 ),
- moveToIndex( 0 ),
- scrollLeft( false ),
- fastScroll( false ),
- moveDiff( 0 ) {
- }
- virtual void Initialize( idMenuHandler * data );
- virtual void Update();
- virtual bool HandleAction( idWidgetAction & action, const idWidgetEvent & event, idMenuWidget * widget, bool forceHandled = false );
- virtual int GetTotalNumberOfOptions() const { return imgList.Num(); }
- virtual bool PrepareListElement( idMenuWidget & widget, const int childIndex ) { return true; }
- void SetNumVisibleOptions( const int numVisibleOptions_ ) { numVisibleOptions = numVisibleOptions_; }
- int GetNumVisibleOptions() const { return numVisibleOptions; }
-
- void MoveToIndex( int index, bool instant = false );
- void MoveToFirstItem( bool instant = true );
- void MoveToLastItem( bool instant = true );
- int GetMoveToIndex() { return moveToIndex; }
- void SetMoveToIndex( int index ) { moveToIndex = index; }
- void SetViewIndex( int index ) { viewIndex = index; }
- int GetViewIndex() const { return viewIndex; }
- void SetListImages( idList<const idMaterial *> & list );
- void SetMoveDiff( int val ) { moveDiff = val; }
- int GetMoveDiff() { return moveDiff; }
- bool GetScrollLeft() { return scrollLeft; }
- private:
- int numVisibleOptions;
- int viewIndex;
- int moveToIndex;
- int moveDiff;
- bool fastScroll;
- bool scrollLeft;
- idList<const idMaterial *> imgList;
- };
- /*
- ================================================
- idMenuWidget_Help
- Knows how to display help tooltips by observing events from other widgets
- ================================================
- */
- class idMenuWidget_Help : public idMenuWidget {
- public:
- virtual void Update();
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- private:
- idStr lastFocusedMessage; // message from last widget that had focus
- idStr lastHoveredMessage; // message from last widget that was hovered over
- bool hideMessage;
- };
- /*
- ================================================
- idMenuWidget_CommandBar
- ================================================
- */
- class idMenuWidget_CommandBar : public idMenuWidget {
- public:
- enum button_t {
- BUTTON_JOY1,
- BUTTON_JOY2,
- BUTTON_JOY3,
- BUTTON_JOY4,
- BUTTON_JOY10,
- BUTTON_TAB,
- MAX_BUTTONS
- };
- enum alignment_t {
- LEFT,
- RIGHT
- };
- struct buttonInfo_t {
- idStr label; // empty labels are treated as hidden buttons
- idWidgetAction action;
- };
- idMenuWidget_CommandBar() :
- alignment( LEFT ) {
- buttons.SetNum( MAX_BUTTONS );
- }
- virtual void Update();
- virtual bool ExecuteEvent( const idWidgetEvent & event );
- buttonInfo_t * GetButton( const button_t button ) { return &buttons[ button ]; }
- void ClearAllButtons();
- alignment_t GetAlignment() const { return alignment; }
- void SetAlignment( const alignment_t alignment_ ) { alignment = alignment_; }
- private:
- idStaticList< buttonInfo_t, MAX_BUTTONS > buttons;
- alignment_t alignment;
- };
- /*
- ================================================
- idMenuWidget_DynamicList
- ================================================
- */
- class idMenuWidget_LobbyList : public idMenuWidget_List {
- public:
- idMenuWidget_LobbyList() :
- numEntries( 0 ) {
- }
-
- virtual void Update();
- virtual bool PrepareListElement( idMenuWidget & widget, const int childIndex );
- virtual int GetTotalNumberOfOptions() const { return numEntries; }
- void SetEntryData( int index, idStr name, voiceStateDisplay_t voiceState );
- void SetHeadingInfo( idList< idStr > & list );
- void SetNumEntries( int num ) { numEntries = num; }
- int GetNumEntries() { return numEntries; }
- void SetRefreshFunction( const char* func );
- private:
- idList< idStr, TAG_IDLIB_LIST_MENU > headings;
- int numEntries;
- };
- /*
- ================================================
- idMenuWidget_DynamicList
- ================================================
- */
- class idMenuWidget_DynamicList : public idMenuWidget_List {
- public:
- idMenuWidget_DynamicList() :
- controlList( false ),
- ignoreColor( false ) {
- }
- virtual void Update();
- virtual void Initialize( idMenuHandler * data );
- virtual int GetTotalNumberOfOptions() const;
- virtual bool PrepareListElement( idMenuWidget & widget, const int childIndex );
- virtual void Recalculate();
- virtual void SetListData( idList< idList< idStr, TAG_IDLIB_LIST_MENU >, TAG_IDLIB_LIST_MENU > & list );
-
- void SetControlList( bool val ) { controlList = val; }
- void SetIgnoreColor( bool val ) { ignoreColor = val; }
- protected:
- idList< idList< idStr, TAG_IDLIB_LIST_MENU >, TAG_IDLIB_LIST_MENU > listItemInfo;
- bool controlList;
- bool ignoreColor;
- };
- /*
- ================================================
- idMenuWidget_ScoreboardList
- ================================================
- */
- class idMenuWidget_ScoreboardList : public idMenuWidget_DynamicList {
- public:
- virtual void Update();
- virtual int GetTotalNumberOfOptions() const;
- };
- /*
- ================================================
- idMenuWidget_NavBar
- The nav bar is set up with the main option being at the safe frame line.
- ================================================
- */
- class idMenuWidget_NavBar : public idMenuWidget_DynamicList {
- public:
- idMenuWidget_NavBar() :
- initialPos( 0.0f ),
- buttonPos( 0.0f ),
- leftSpacer( 0.0f ),
- rightSpacer( 0.0f ),
- selectedSpacer( 0.0f ) {
- }
- virtual void Update();
- virtual void Initialize( idMenuHandler * data );
- virtual void SetInitialXPos( float pos ) { initialPos = pos; }
- virtual void SetButtonSpacing( float lSpace, float rSpace, float sSpace ) { leftSpacer = lSpace; rightSpacer = rSpace; selectedSpacer = sSpace; }
- virtual bool PrepareListElement( idMenuWidget & widget, const int navIndex );
- virtual void SetListHeadings( idList< idStr > & list );
- virtual int GetTotalNumberOfOptions() const;
- private:
- idList< idStr, TAG_IDLIB_LIST_MENU > headings;
- float initialPos;
- float buttonPos;
- float leftSpacer;
- float rightSpacer;
- float selectedSpacer;
- };
- /*
- ================================================
- idMenuWidget_NavBar
- The nav bar is set up with the main option being at the safe frame line.
- ================================================
- */
- class idMenuWidget_MenuBar : public idMenuWidget_DynamicList {
- public:
- idMenuWidget_MenuBar() :
- totalWidth( 0.0f ),
- buttonPos( 0.0f ),
- rightSpacer( 0.0f ) {
- }
- virtual void Update();
- virtual void Initialize( idMenuHandler * data );
- virtual void SetButtonSpacing( float rSpace ) { rightSpacer = rSpace; }
- virtual bool PrepareListElement( idMenuWidget & widget, const int navIndex );
- virtual void SetListHeadings( idList< idStr > & list );
- virtual int GetTotalNumberOfOptions() const;
- private:
- idList< idStr, TAG_IDLIB_LIST_MENU > headings;
- float totalWidth;
- float buttonPos;
- float rightSpacer;
-
- };
- /*
- ================================================
- idMenuWidget_PDA_UserData
- ================================================
- */
- class idMenuWidget_PDA_UserData : public idMenuWidget {
- public:
- idMenuWidget_PDA_UserData() :
- pdaIndex( 0 ) {
- }
- virtual ~idMenuWidget_PDA_UserData() {}
- virtual void Update();
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- private:
- int pdaIndex;
- };
- /*
- ================================================
- idMenuWidget_DynamicList
- ================================================
- */
- class idMenuWidget_ScrollBar : public idMenuWidget {
- public:
- idMenuWidget_ScrollBar() :
- yTop( 0.0f ),
- yBot( 0.0f ),
- dragging( false ) {
- }
- virtual void Initialize( idMenuHandler * data );
- virtual void Update();
- virtual bool HandleAction( idWidgetAction & action, const idWidgetEvent & event, idMenuWidget * widget, bool forceHandled = false );
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- void CalcTopAndBottom();
- void CalculatePosition( float x, float y );
- float yTop;
- float yBot;
- bool dragging;
- };
- /*
- ================================================
- idMenuWidget_InfoBox
- ================================================
- */
- class idMenuWidget_InfoBox: public idMenuWidget {
- public:
- idMenuWidget_InfoBox() :
- scrollbar( NULL ) {
- }
- virtual void Initialize( idMenuHandler * data );
- virtual void Update();
- virtual bool HandleAction( idWidgetAction & action, const idWidgetEvent & event, idMenuWidget * widget, bool forceHandled = false );
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- void SetHeading( idStr val ) { heading = val; }
- void SetBody( idStr val ) { info = val; }
- void ResetInfoScroll();
- void Scroll( int d );
- int GetScroll();
- int GetMaxScroll();
- void SetScroll( int scroll );
- void SetScrollbar( idMenuWidget_ScrollBar * bar );
- private:
- idMenuWidget_ScrollBar * scrollbar;
- idStr heading;
- idStr info;
- };
- /*
- ================================================
- idMenuWidget_PDA_Objective
- ================================================
- */
- class idMenuWidget_PDA_Objective: public idMenuWidget {
- public:
- idMenuWidget_PDA_Objective() :
- pdaIndex( 0 ) {
- }
- virtual void Update();
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- private:
- int pdaIndex;
- };
- /*
- ================================================
- idMenuWidget_Shell_SaveInfo
- ================================================
- */
- class idMenuWidget_Shell_SaveInfo: public idMenuWidget {
- public:
- idMenuWidget_Shell_SaveInfo() :
- loadIndex( 0 ),
- forSaveScreen( false ) {
- }
- virtual void Update();
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- void SetForSaveScreen( bool val ) { forSaveScreen = val; }
- private:
- int loadIndex;
- bool forSaveScreen;
- };
- /*
- ================================================
- idMenuWidget_PDA_AudioFiles
- ================================================
- */
- class idMenuWidget_PDA_AudioFiles: public idMenuWidget {
- public:
- idMenuWidget_PDA_AudioFiles() :
- pdaIndex( 0 ) {
- }
- virtual ~idMenuWidget_PDA_AudioFiles();
- virtual void Update();
- virtual void Initialize( idMenuHandler * data );
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- private:
- int pdaIndex;
- idList< idList< idStr, TAG_IDLIB_LIST_MENU >, TAG_IDLIB_LIST_MENU > audioFileNames;
- };
- /*
- ================================================
- idMenuWidget_PDA_AudioFiles
- ================================================
- */
- class idMenuWidget_PDA_EmailInbox: public idMenuWidget {
- public:
- idMenuWidget_PDA_EmailInbox() :
- pdaIndex( 0 ),
- emailList( NULL ),
- scrollbar( NULL ) {
- }
- virtual void Update();
- virtual void Initialize( idMenuHandler * data );
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- idMenuWidget_DynamicList * GetEmailList() { return emailList; }
- idMenuWidget_ScrollBar * GetScrollbar() { return scrollbar; }
- private:
- idMenuWidget_DynamicList * emailList;
- idMenuWidget_ScrollBar * scrollbar;
- int pdaIndex;
- idList< idList< idStr, TAG_IDLIB_LIST_MENU >, TAG_IDLIB_LIST_MENU > emailInfo;
- };
- /*
- ================================================
- idMenuWidget_PDA_AudioFiles
- ================================================
- */
- class idMenuWidget_ItemAssignment: public idMenuWidget {
- public:
- idMenuWidget_ItemAssignment() :
- slotIndex( 0 ) {
- }
- virtual void Update();
- void SetIcon( int index, const idMaterial * icon );
- void FindFreeSpot();
- int GetSlotIndex() { return slotIndex; }
- void SetSlotIndex( int num ) { slotIndex = num; }
- private:
- const idMaterial * images[ NUM_QUICK_SLOTS ];
- int slotIndex;
- };
- /*
- ================================================
- idMenuWidget_PDA_AudioFiles
- ================================================
- */
- class idMenuWidget_PDA_VideoInfo: public idMenuWidget {
- public:
- virtual void Update();
- virtual void ObserveEvent( const idMenuWidget & widget, const idWidgetEvent & event );
- private:
- int videoIndex;
- };
- /*
- ================================================
- idWidgetActionHandler
- ================================================
- */
- class idWidgetActionHandler : public idSWFScriptFunction_RefCounted {
- public:
- idWidgetActionHandler( idMenuWidget * widget, actionHandler_t actionEventType, widgetEvent_t _event ) :
- targetWidget( widget ),
- type( actionEventType ),
- targetEvent( _event ) {
- }
- idSWFScriptVar Call( idSWFScriptObject * thisObject, const idSWFParmList & parms ) {
- idWidgetAction action;
- bool handled = false;
- switch ( type ) {
- case WIDGET_ACTION_EVENT_SCROLL_DOWN_START_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_VERTICAL, 1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_UP_START_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_VERTICAL, -1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_DOWN_START_REPEATER_VARIABLE: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_VERTICAL_VARIABLE, 1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_UP_START_REPEATER_VARIABLE: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_VERTICAL_VARIABLE, -1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_PAGE_DOWN_START_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_PAGE, 1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_PAGE_UP_START_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_PAGE, -1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_STOP_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_STOP_REPEATER );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_TAB_NEXT: {
- action.Set( (widgetAction_t)WIDGET_ACTION_SCROLL_TAB, 1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_TAB_PREV: {
- action.Set( (widgetAction_t)WIDGET_ACTION_SCROLL_TAB, -1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_JOY3_ON_PRESS: {
- action.Set( (widgetAction_t)WIDGET_ACTION_JOY3_ON_PRESS );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_LEFT_START_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_HORIZONTAL, -1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_SCROLL_RIGHT_START_REPEATER: {
- action.Set( (widgetAction_t)WIDGET_ACTION_START_REPEATER, WIDGET_ACTION_SCROLL_HORIZONTAL, 1 );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_DRAG_START: {
- action.Set( (widgetAction_t)WIDGET_ACTION_SCROLL_DRAG );
- handled = true;
- break;
- }
- case WIDGET_ACTION_EVENT_DRAG_STOP: {
- action.Set( (widgetAction_t)WIDGET_ACTION_EVENT_DRAG_STOP );
- handled = true;
- break;
- }
- }
- if ( handled ) {
- targetWidget->HandleAction( action, idWidgetEvent( targetEvent, 0, thisObject, parms ), targetWidget );
- }
- return idSWFScriptVar();
- }
- private:
- idMenuWidget * targetWidget;
- actionHandler_t type;
- widgetEvent_t targetEvent;
- };
- #endif
|