// --------------------------------------------------------------------------- // // @file TwMgr.h // @brief Tweak bar manager. // @author Philippe Decaudin - http://www.antisphere.com // @license This file is part of the AntTweakBar library. // Copyright © 2005, 2006 Philippe Decaudin. // For conditions of distribution and use, see License.txt // // notes: Private header // TAB=4 // // --------------------------------------------------------------------------- #if !defined ANT_TW_MGR_INCLUDED #define ANT_TW_MGR_INCLUDED #include #define ANT_CALL TW_CALL #include "TwColors.h" #include "TwFonts.h" #include "TwGraph.h" #include "AntPerfTimer.h" //#define BENCH // uncomment to activate bench #ifdef BENCH # define PERF(cmd) cmd #else // BENCH # define PERF(cmd) #endif // BENCH const int NB_ROTO_CURSORS = 12; // --------------------------------------------------------------------------- // API unexposed by AntTweakBar.h // --------------------------------------------------------------------------- // bar states -> use TwDefine instead typedef enum ETwState { TW_STATE_SHOWN = 1, TW_STATE_ICONIFIED = 2, TW_STATE_HIDDEN = 3, TW_STATE_ERROR = 0 } TwState; /*ANT_TWEAK_BAR_API*/ int ANT_CALL TwSetBarState(TwBar *bar, TwState state); /*ANT_TWEAK_BAR_API*/ TwState ANT_CALL TwGetBarState(const TwBar *bar); // var states -> use TwDefine instead: show/hide/iconify implemented only as string commands //ANT_TWEAK_BAR_API int ANT_CALL TwSetVarState(TwBar *bar, const char *name, TwState state); //ANT_TWEAK_BAR_API TwState ANT_CALL TwGetVarState(const TwBar *bar, const char *name); typedef void (ANT_CALL *TwStructExtInitCallback)(void *structExtValue, void *clientData); typedef void (ANT_CALL *TwCopyVarFromExtCallback)(void *structValue, const void *structExtValue, unsigned int structExtMemberIndex, void *clientData); typedef void (ANT_CALL *TwCopyVarToExtCallback)(const void *structValue, void *structExtValue, unsigned int structExtMemberIndex, void *clientData); /*ANT_TWEAK_BAR_API*/ TwType ANT_CALL TwDefineStructExt(const char *name, const TwStructMember *structExtMembers, unsigned int nbExtMembers, size_t structSize, size_t structExtSize, TwStructExtInitCallback structExtInitCallback, TwCopyVarFromExtCallback copyVarFromExtCallback, TwCopyVarToExtCallback copyVarToExtCallback, TwSummaryCallback summaryCallback, void *clientData); // --------------------------------------------------------------------------- // AntTweakBar Manager // --------------------------------------------------------------------------- struct CTwMgr { ETwGraphAPI m_GraphAPI; void * m_Device; class ITwGraph * m_Graph; int m_WndWidth; int m_WndHeight; const CTexFont * m_CurrentFont; std::vector m_Bars; std::vector m_Order; std::vector m_MinOccupied; void Minimize(TwBar *_Bar); void Maximize(TwBar *_Bar); void Hide(TwBar *_Bar); void Unhide(TwBar *_Bar); void SetFont(const CTexFont *_Font, bool _ResizeBars); int m_LastMouseX; int m_LastMouseY; int m_LastMouseWheelPos; std::string m_Help; TwBar * m_HelpBar; float m_LastHelpUpdateTime; void UpdateHelpBar(); bool m_HelpBarNotUpToDate; bool m_HelpBarUpdateNow; void * m_KeyPressedTextObj; bool m_KeyPressedBuildText; std::string m_KeyPressedStr; float m_KeyPressedTime; void * m_InfoTextObj; bool m_InfoBuildText; int m_BarInitColorHue; int FindBar(const char *_Name) const; int HasAttrib(const char *_Attrib, bool *_HasValue) const; int SetAttrib(int _AttribID, const char *_Value); void SetLastError(const char *_StaticErrorMesssage); // _StaticErrorMesssage must be a static string const char * GetLastError(); // returns a static string describing the error, and set LastError to NULL const char * CheckLastError() const; // returns the LastError, but does not set it to NULL void SetCurrentDbgParams(const char *file, int line); TwBar * m_PopupBar; CTwMgr(ETwGraphAPI _GraphAPI, void *_Device); ~CTwMgr(); struct CStructMember { std::string m_Name; std::string m_Label; TwType m_Type; size_t m_Offset; std::string m_DefString; size_t m_Size; std::string m_Help; }; struct CStruct { std::string m_Name; std::vector m_Members; size_t m_Size; TwSummaryCallback m_SummaryCallback; void * m_SummaryClientData; std::string m_Help; bool m_IsExt; size_t m_ClientStructSize; TwStructExtInitCallback m_StructExtInitCallback; TwCopyVarFromExtCallback m_CopyVarFromExtCallback; TwCopyVarToExtCallback m_CopyVarToExtCallback; void * m_ExtClientData; CStruct() : m_IsExt(false), m_StructExtInitCallback(NULL), m_CopyVarFromExtCallback(NULL), m_CopyVarToExtCallback(NULL), m_ExtClientData(NULL) {} static void ANT_CALL DefaultSummary(char *_SummaryString, size_t _SummaryMaxLength, const void *_Value, void *_ClientData); static void * s_PassProxyAsClientData; }; std::vector m_Structs; // followings are used for TwAddVarCB( ... StructType ... ) struct CStructProxy { TwType m_Type; void * m_StructData; bool m_DeleteStructData; void * m_StructExtData; TwSetVarCallback m_StructSetCallback; TwGetVarCallback m_StructGetCallback; void * m_StructClientData; CStructProxy(); ~CStructProxy(); }; struct CMemberProxy { CStructProxy * m_StructProxy; int m_MemberIndex; struct CTwVar * m_Var; struct CTwVarGroup * m_VarParent; CTwBar * m_Bar; CMemberProxy(); ~CMemberProxy(); static void ANT_CALL SetCB(const void *_Value, void *_ClientData); static void ANT_CALL GetCB(void *_Value, void *_ClientData); }; std::list m_StructProxies; // elements should not move std::list m_MemberProxies; // elements should not move struct CEnum { std::string m_Name; typedef std::map CEntries; CEntries m_Entries; }; std::vector m_Enums; TwType m_TypeColor32; TwType m_TypeColor3F; TwType m_TypeColor4F; PerfTimer m_Timer; double m_LastMousePressedTime; TwMouseButtonID m_LastMousePressedButtonID; int m_LastMousePressedPosition[2]; double m_RepeatMousePressedDelay; double m_RepeatMousePressedPeriod; bool m_CanRepeatMousePressed; bool m_IsRepeatingMousePressed; #if defined(ANT_WINDOWS) typedef HCURSOR CCursor; #elif defined(ANT_UNIX) typedef Cursor CCursor; CCursor PixmapCursor(int _CurIdx); Display * m_CurrentXDisplay; Window m_CurrentXWindow; #endif // defined(ANT_UNIX) bool m_CursorsCreated; void CreateCursors(); void FreeCursors(); void SetCursor(CCursor _Cursor); CCursor m_CursorArrow; CCursor m_CursorMove; CCursor m_CursorWE; CCursor m_CursorNS; CCursor m_CursorTopLeft; CCursor m_CursorTopRight; CCursor m_CursorBottomLeft; CCursor m_CursorBottomRight; CCursor m_CursorHelp; CCursor m_CursorHand; CCursor m_CursorCross; CCursor m_CursorUpArrow; CCursor m_CursorNo; CCursor m_RotoCursors[NB_ROTO_CURSORS]; CCursor m_CursorCenter; CCursor m_CursorPoint; protected: int m_NbMinimizedBars; const char * m_LastError; const char * m_CurrentDbgFile; int m_CurrentDbgLine; }; extern CTwMgr *g_TwMgr; // --------------------------------------------------------------------------- // Extra functions and twtypes // --------------------------------------------------------------------------- bool TwGetKeyCode(int *_Code, int *_Modif, const char *_String); bool TwGetKeyString(std::string *_String, int _Code, int _Modif); const ETwType TW_TYPE_SHORTCUT = ETwType(0xfff1); const ETwType TW_TYPE_HELP_GRP = ETwType(0xfff2); const ETwType TW_TYPE_HELP_ATOM = ETwType(0xfff3); const ETwType TW_TYPE_HELP_HEADER = ETwType(0xfff4); const ETwType TW_TYPE_HELP_STRUCT = ETwType(0xfff5); const ETwType TW_TYPE_BUTTON = ETwType(0xfff6); const ETwType TW_TYPE_STRUCT_BASE = ETwType(0x10000000); const ETwType TW_TYPE_ENUM_BASE = ETwType(0x20000000); // --------------------------------------------------------------------------- // Color struct ext // --------------------------------------------------------------------------- struct CColorExt { int R, G, B; int H, L, S; int A; bool m_HLS, m_HasAlpha, m_OGL; bool m_CanHaveAlpha; bool m_IsColorF; unsigned int m_PrevConvertedColor; CTwMgr::CStructProxy*m_StructProxy; void RGB2HLS(); void HLS2RGB(); static void ANT_CALL InitColor32CB(void *_ExtValue, void *_ClientData); static void ANT_CALL InitColor3FCB(void *_ExtValue, void *_ClientData); static void ANT_CALL InitColor4FCB(void *_ExtValue, void *_ClientData); static void ANT_CALL CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); static void ANT_CALL CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); static void ANT_CALL SummaryCB(char *_SummaryString, size_t _SummaryMaxLength, const void *_ExtValue, void *_ClientData); static void CreateTypes(); }; // --------------------------------------------------------------------------- // CTwFPU objects set and restore the fpu precision if needed. // (could be usefull because DirectX changes it and AntTweakBar requires default double precision) // --------------------------------------------------------------------------- struct CTwFPU { CTwFPU() { #ifdef ANT_WINDOWS state0 = _controlfp(0, 0); if( (state0&MCW_PC)==_PC_24 ) // we need at least _PC_53 _controlfp(_PC_53, MCW_PC); #else state0 = 0; #endif } ~CTwFPU() { #ifdef ANT_WINDOWS if( (state0&MCW_PC)==_PC_24 ) _controlfp(_PC_24, MCW_PC); #else state0 = 0; #endif } private: unsigned int state0; }; // --------------------------------------------------------------------------- #endif // !defined ANT_TW_MGR_INCLUDED