| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- /*
- ** Command & Conquer Generals Zero Hour(tm)
- ** Copyright 2025 Electronic Arts 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/>.
- */
- ////////////////////////////////////////////////////////////////////////////////
- // //
- // (c) 2001-2003 Electronic Arts Inc. //
- // //
- ////////////////////////////////////////////////////////////////////////////////
- // FILE: GameWindowManager.h //////////////////////////////////////////////////////////////////////
- // Created: Colin Day, June 2001
- // Desc: The game window manager is the interface for interacting with
- // the windowing system for purposes of any menus, or GUI
- // controls.
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- #pragma once
- #ifndef __GAMEWINDOWMANAGER_H_
- #define __GAMEWINDOWMANAGER_H_
- #include "Common/STLTypedefs.h"
- #include "Common/SubsystemInterface.h"
- #include "GameClient/WindowLayout.h"
- #include "GameClient/KeyDefs.h"
- #include "GameClient/Gadget.h"
- class GameWindow;
- //-------------------------------------------------------------------------------------------------
- /** Window layout info is a structure that can be passed to the load function of
- * a window script. After the script is loaded, this parameter (if present)
- * will contain information about the script file at a global level such
- * as what file version was loaded, global layout callbacks, etc */
- //-------------------------------------------------------------------------------------------------
- enum { MAX_LAYOUT_FUNC_LEN = 256 };
- typedef std::list <GameWindow *> GameWindowList;
- class WindowLayoutInfo
- {
- public:
- WindowLayoutInfo();
- UnsignedInt version; ///< file version that was loaded
- WindowLayoutInitFunc init; ///< init method (if specified)
- WindowLayoutUpdateFunc update; ///< update method (if specified)
- WindowLayoutShutdownFunc shutdown; ///< shutdown method (if specified)
- AsciiString initNameString; ///< init method in flavor of string name
- AsciiString updateNameString; ///< update method in string flavor
- AsciiString shutdownNameString; ///< shutdown method in string flavor, mmm!
- std::list<GameWindow *> windows; ///< list of top-level windows in the layout
- };
- //-------------------------------------------------------------------------------------------------
- /** There exists a singleton GameWindowManager that defines how we can
- * interact with the game windowing system */
- //-------------------------------------------------------------------------------------------------
- class GameWindowManager : public SubsystemInterface
- {
- friend class GameWindow;
- public:
- GameWindowManager( void );
- virtual ~GameWindowManager( void );
- //-----------------------------------------------------------------------------------------------
- virtual void init( void ); ///< initialize function
- virtual void reset( void ); ///< reset the system
- virtual void update( void ); ///< update method, called once per frame
- virtual GameWindow *allocateNewWindow( void ) = 0; ///< new game window
- void linkWindow( GameWindow *window ); ///< link into master list
- void unlinkWindow( GameWindow *window ); ///< unlink from master list
- void unlinkChildWindow( GameWindow *window ); ///< remove child from parent list
- void insertWindowAheadOf( GameWindow *window, GameWindow *aheadOf ); ///< add window to list 'ahead of'
- virtual GameWinDrawFunc getPushButtonImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getPushButtonDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getCheckBoxImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getCheckBoxDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getRadioButtonImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getRadioButtonDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getTabControlImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getTabControlDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getListBoxImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getListBoxDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getComboBoxImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getComboBoxDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getHorizontalSliderImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getHorizontalSliderDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getVerticalSliderImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getVerticalSliderDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getProgressBarImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getProgressBarDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getStaticTextImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getStaticTextDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getTextEntryImageDrawFunc( void ) = 0;
- virtual GameWinDrawFunc getTextEntryDrawFunc( void ) = 0;
- //---------------------------------------------------------------------------
- virtual GameWinDrawFunc getDefaultDraw( void ); ///< return default draw func
- virtual GameWinSystemFunc getDefaultSystem( void ); ///< return default system func
- virtual GameWinInputFunc getDefaultInput( void ); ///< return default input func
- virtual GameWinTooltipFunc getDefaultTooltip( void ); ///< return default tooltip func
- //---------------------------------------------------------------------------
- // MessageBox creation
- virtual GameWindow *gogoMessageBox(Int x, Int y, Int width, Int height, UnsignedShort buttonFlags,
- UnicodeString titleString, UnicodeString bodyString,
- GameWinMsgBoxFunc yesCallback,
- GameWinMsgBoxFunc noCallback,
- GameWinMsgBoxFunc okCallback,
- GameWinMsgBoxFunc cancelCallback );
- virtual GameWindow *gogoMessageBox(Int x, Int y, Int width, Int height, UnsignedShort buttonFlags,
- UnicodeString titleString, UnicodeString bodyString,
- GameWinMsgBoxFunc yesCallback,
- GameWinMsgBoxFunc noCallback,
- GameWinMsgBoxFunc okCallback,
- GameWinMsgBoxFunc cancelCallback, Bool useLogo );
- //---------------------------------------------------------------------------
- // gadget creation
- virtual GameWindow *gogoGadgetPushButton( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetCheckbox( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetRadioButton( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- RadioButtonData *rData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetTabControl( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- TabControlData *rData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetListBox( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- ListboxData *listboxData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetSlider( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- SliderData *sliderData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetProgressBar( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetStaticText( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- TextData *textData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetTextEntry( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- EntryData *entryData,
- GameFont *defaultFont, Bool defaultVisual );
- virtual GameWindow *gogoGadgetComboBox( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- WinInstanceData *instData,
- ComboBoxData *comboBoxDataTemplate,
- GameFont *defaultFont, Bool defaultVisual );
- /** Use this method to assign the default images to gadgets as
- * they area created */
- virtual void assignDefaultGadgetLook( GameWindow *gadget,
- GameFont *defaultFont,
- Bool assignVisual );
- //---------------------------------------------------------------------------
- // Creating windows
- /// create new window(s) from .wnd file ... see definition for what is returned
- virtual GameWindow *winCreateFromScript( AsciiString filename, WindowLayoutInfo *info = NULL );
- /// create new window(s) from .wnd file and wrap in a WindowLayout
- virtual WindowLayout *winCreateLayout( AsciiString filename );
- /// free temporary strings to make the memory leak manager happy.
- virtual void freeStaticStrings(void);
- /// create a new window by setting up parameters and callbacks
- virtual GameWindow *winCreate( GameWindow *parent, UnsignedInt status,
- Int x, Int y, Int width, Int height,
- GameWinSystemFunc system,
- WinInstanceData *instData = NULL );
- //---------------------------------------------------------------------------
- // Manipulating windows in the system
- virtual Int winDestroy( GameWindow *window ); ///< destroy this window
- virtual Int winDestroyAll( void ); ///< destroy all windows in the system
- virtual GameWindow *winGetWindowList( void ); ///< get head of master list
- /// hide all windows in a certain range of id's (inclusinve );
- virtual void hideWindowsInRange( GameWindow *baseWindow, Int first, Int last,
- Bool hideFlag );
- /// enable all windows in a range of id's (inclusive)
- virtual void enableWindowsInRange( GameWindow *baseWindow, Int first, Int last,
- Bool enableFlag );
- /// this gets called from winHide() when a window hides itself
- virtual void windowHiding( GameWindow *window );
- virtual void winRepaint( void ); ///< draw GUI in reverse order
- virtual void winNextTab( GameWindow *window ); ///< give keyboard focus to the next window in the tab list
- virtual void winPrevTab( GameWindow *window ); ///< give keyboard focus to the previous window in the tab list
- virtual void registerTabList( GameWindowList tabList ); ///< we have to register a Tab List
- virtual void clearTabList( void ); ///< we's gotz ta clear the tab list yo!
- // --------------------------------------------------------------------------
- /// process a single mouse event
- virtual WinInputReturnCode winProcessMouseEvent( GameWindowMessage msg,
- ICoord2D *mousePos,
- void *data );
- /// process a singke key event
- virtual WinInputReturnCode winProcessKey( UnsignedByte key,
- UnsignedByte state );
- // --------------------------------------------------------------------------
- virtual GameWindow *winGetFocus( void ); ///< return window that has the focus
- virtual Int winSetFocus( GameWindow *window ); ///< set this window as has focus
- virtual void winSetGrabWindow( GameWindow *window ); ///< set the grab window
- virtual GameWindow *winGetGrabWindow( void ); ///< who is currently 'held' by mouse
- virtual void winSetLoneWindow( GameWindow *window ); ///< set the open window
- virtual Bool isEnabled( GameWindow *win ); ///< is window or parents enabled
- virtual Bool isHidden( GameWindow *win ); ///< is parent or parents hidden
- virtual void addWindowToParent( GameWindow *window, GameWindow *parent );
- virtual void addWindowToParentAtEnd( GameWindow *window, GameWindow *parent );
- /// sends a system message to specified window
- virtual WindowMsgHandledType winSendSystemMsg( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- /// sends an input message to the specified window
- virtual WindowMsgHandledType winSendInputMsg( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- /** get the window pointer from id, starting at 'window' and searching
- down the heirarchy. If 'window' is NULL then all windows will
- be searched */
- virtual GameWindow *winGetWindowFromId( GameWindow *window, Int id );
- virtual Int winCapture( GameWindow *window ); ///< captures the mouse
- virtual Int winRelease( GameWindow *window ); ///< release mouse capture
- virtual GameWindow *winGetCapture( void ); ///< current mouse capture settings
- virtual Int winSetModal( GameWindow *window ); ///< put at top of modal stack
- virtual Int winUnsetModal( GameWindow *window ); /**< take window off modal stack, if window is
- not at top of stack and error will occur */
- //---------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
- //---------------------------------------------------------------------------
- // The following public functions you should implement change the guts
- // for to work with your application. Rather than draw images, or do string
- // operations with native methods, the game window system will always call
- // these methods to get the work done it needs
- //---------------------------------------------------------------------------
- //---------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
- /// draw image, coord are in screen and should be kepth within that box specified
- virtual void winDrawImage( const Image *image, Int startX, Int startY, Int endX, Int endY, Color color = 0xFFFFFFFF );
- /// draw filled rect, coords are absolute screen coords
- virtual void winFillRect( Color color, Real width, Int startX, Int startY, Int endX, Int endY );
- /// draw rect outline, coords are absolute screen coords
- virtual void winOpenRect( Color color, Real width, Int startX, Int startY, Int endX, Int endY );
- /// draw line, coords are absolute screen coords
- virtual void winDrawLine( Color color, Real width, Int startX, Int startY, Int endX, Int endY );
- /// Make a color representation out of RGBA components
- virtual Color winMakeColor( UnsignedByte red, UnsignedByte green, UnsignedByte blue, UnsignedByte alpha );
- /** Find an image reference and return a pointer to its image, you may
- recreate all Image structs to suit your project */
- virtual const Image *winFindImage( const char *name );
- virtual Int winFontHeight( GameFont *font ); ///< get height of font in pixels
- virtual Int winIsDigit( Int c ); ///< is character a digit
- virtual Int winIsAscii( Int c ); ///< is character a digit
- virtual Int winIsAlNum( Int c ); ///< is character alpha-numeric
- virtual void winFormatText( GameFont *font, UnicodeString text, Color color,
- Int x, Int y, Int width, Int height );
- virtual void winGetTextSize( GameFont *font, UnicodeString text,
- Int *width, Int *height, Int maxWidth );
- virtual UnicodeString winTextLabelToText( AsciiString label ); ///< convert localizable text label to real text
- virtual GameFont *winFindFont( AsciiString fontName, Int pointSize, Bool bold ); ///< get a font given a name
- /// @todo just for testing, remov this
- Bool initTestGUI( void );
-
- virtual GameWindow *getWindowUnderCursor( Int x, Int y, Bool ignoreEnabled = FALSE ); ///< find the top window at the given coordinates
- //---------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
- //---------------------------------------------------------------------------
- //---------------------------------------------------------------------------
- //---------------------------------------------------------------------------
- /////////////////////////////////////////////////////////////////////////////
- //---------------------------------------------------------------------------
- protected:
- void processDestroyList( void ); ///< process windows waiting to be killed
- Int drawWindow( GameWindow *window ); ///< draw this window
- void dumpWindow( GameWindow *window ); ///< for debugging
- GameWindow *m_windowList; // list of all top level windows
- GameWindow *m_windowTail; // last in windowList
- GameWindow *m_destroyList; // list of windows to destroy
- GameWindow *m_currMouseRgn; // window that mouse is over
- GameWindow *m_mouseCaptor; // window that captured mouse
- GameWindow *m_keyboardFocus; // window that has input focus
- ModalWindow *m_modalHead; // top of windows in the modal stack
- GameWindow *m_grabWindow; // window that grabbed the last down event
- GameWindow *m_loneWindow; // Set if we just opened a Lone Window
- GameWindowList m_tabList; // we have to register a tab list to make a tab list.
- const Image *m_cursorBitmap;
- UnsignedInt m_captureFlags;
- }; // end GameWindowManager
- // INLINE /////////////////////////////////////////////////////////////////////////////////////////
- inline GameWinDrawFunc GameWindowManager::getDefaultDraw( void ) { return GameWinDefaultDraw; }
- inline GameWinSystemFunc GameWindowManager::getDefaultSystem( void ) { return GameWinDefaultSystem; }
- inline GameWinInputFunc GameWindowManager::getDefaultInput( void ) { return GameWinDefaultInput; }
- inline GameWinTooltipFunc GameWindowManager::getDefaultTooltip( void ) { return GameWinDefaultTooltip; }
- // EXTERN /////////////////////////////////////////////////////////////////////////////////////////
- extern GameWindowManager *TheWindowManager; ///< singleton extern definition
- extern UnsignedInt WindowLayoutCurrentVersion; ///< current version of our window layouts
- // this function lets us generically pass button selections to our parent, we may
- // frequently want to do this because we want windows grouped on child windows for
- // convenience, but only want one logical system procedure responding to them all
- extern WindowMsgHandledType PassSelectedButtonsToParentSystem( GameWindow *window,
- UnsignedInt msg,
- WindowMsgData mData1,
- WindowMsgData mData2 );
- extern WindowMsgHandledType PassMessagesToParentSystem( GameWindow *window,
- UnsignedInt msg,
- WindowMsgData mData1,
- WindowMsgData mData2 );
- #endif // __GAMEWINDOWMANAGER_H_
|