Files
bullet3/Extras/CDTestFramework/AntTweakBar/src/TwBar.h
erwin.coumans 4442a826ed add commandline arguments to serialize demo for xml export and Bullet import file name
update AntTweakBar version in CDTestFramework
add btCompoundShape support in BulletXmlWorldImporter (this importer is still premature/work-in-progress)
2012-09-26 19:47:18 +00:00

439 lines
19 KiB
C++

// ---------------------------------------------------------------------------
//
// @file TwBar.h
// @brief Tweak bar and var classes.
// @author Philippe Decaudin - http://www.antisphere.com
// @license This file is part of the AntTweakBar library.
// For conditions of distribution and use, see License.txt
//
// note: Private header
//
// ---------------------------------------------------------------------------
#if !defined ANT_TW_BAR_INCLUDED
#define ANT_TW_BAR_INCLUDED
#include <AntTweakBar.h>
#include "TwColors.h"
#define ANT_TWEAK_BAR_DLL "AntTweakBar"
// ---------------------------------------------------------------------------
bool IsCustomType(int _Type);
struct CTwVar
{
std::string m_Name;
std::string m_Label;
std::string m_Help;
bool m_IsRoot;
bool m_DontClip;
bool m_Visible;
signed short m_LeftMargin;
signed short m_TopMargin;
const color32 * m_ColorPtr;
const color32 * m_BgColorPtr;
virtual bool IsGroup() const = 0;
virtual bool IsCustom() const { return false; }
virtual const CTwVar * Find(const char *_Name, struct CTwVarGroup **_Parent, int *_Index) const = 0;
virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const;
virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex);
virtual ERetType GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector<double>& outDouble, std::ostringstream& outString) const;
virtual void SetReadOnly(bool _ReadOnly) = 0;
virtual bool IsReadOnly() const = 0;
CTwVar();
virtual ~CTwVar() {}
static size_t GetDataSize(TwType _Type);
};
struct CTwVarAtom : CTwVar
{
ETwType m_Type;
void * m_Ptr;
TwSetVarCallback m_SetCallback;
TwGetVarCallback m_GetCallback;
void * m_ClientData;
bool m_ReadOnly;
bool m_NoSlider;
int m_KeyIncr[2]; // [0]=key_code [1]=modifiers
int m_KeyDecr[2]; // [0]=key_code [1]=modifiers
template <typename _T> struct TVal
{
_T m_Min;
_T m_Max;
_T m_Step;
signed char m_Precision;
bool m_Hexa;
};
union UVal
{
TVal<unsigned char> m_Char;
TVal<signed char> m_Int8;
TVal<unsigned char> m_UInt8;
TVal<signed short> m_Int16;
TVal<unsigned short>m_UInt16;
TVal<signed int> m_Int32;
TVal<unsigned int> m_UInt32;
TVal<float> m_Float32;
TVal<double> m_Float64;
struct CBoolVal
{
char * m_TrueString;
char * m_FalseString;
bool m_FreeTrueString;
bool m_FreeFalseString;
} m_Bool;
struct CEnumVal // empty -> enum entries are deduced from m_Type
{
//typedef std::map<unsigned int, std::string> CEntries;
//CEntries * m_Entries;
} m_Enum;
struct CShortcutVal
{
int m_Incr[2];
int m_Decr[2];
} m_Shortcut;
struct CHelpStruct
{
int m_StructType;
} m_HelpStruct;
struct CButtonVal
{
TwButtonCallback m_Callback;
int m_Separator;
} m_Button;
struct CCustomVal
{
CTwMgr::CMemberProxy *m_MemberProxy;
} m_Custom;
};
UVal m_Val;
virtual bool IsGroup() const { return false; }
virtual bool IsCustom() const { return IsCustomType(m_Type); }
virtual void ValueToString(std::string *_Str) const;
virtual double ValueToDouble() const;
virtual void ValueFromDouble(double _Val);
virtual void MinMaxStepToDouble(double *_Min, double *_Max, double *_Step) const;
virtual const CTwVar * Find(const char *_Name, struct CTwVarGroup **_Parent, int *_Index) const;
virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const;
virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex);
virtual ERetType GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector<double>& outDouble, std::ostringstream& outString) const;
virtual void Increment(int _Step);
virtual void SetDefaults();
virtual void SetReadOnly(bool _ReadOnly) { m_ReadOnly=_ReadOnly; if( m_Type!=TW_TYPE_BUTTON && m_SetCallback==NULL && m_Ptr==NULL ) m_ReadOnly=true; }
virtual bool IsReadOnly() const { if( m_Type!=TW_TYPE_BUTTON && m_SetCallback==NULL && m_Ptr==NULL ) return true; else return m_ReadOnly; }
//virtual int DefineEnum(const TwEnumVal *_EnumValues, unsigned int _NbValues);
CTwVarAtom();
virtual ~CTwVarAtom();
};
struct CTwVarGroup : CTwVar
{
std::vector<CTwVar *> m_Vars;
bool m_Open;
TwSummaryCallback m_SummaryCallback;
void * m_SummaryClientData;
void * m_StructValuePtr;
TwType m_StructType;
virtual bool IsGroup() const { return true; }
virtual const CTwVar * Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const;
virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const;
virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex);
virtual ERetType GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector<double>& outDouble, std::ostringstream& outString) const;
virtual CTwVarAtom * FindShortcut(int _Key, int _Modifiers, bool *_DoIncr);
virtual void SetReadOnly(bool _ReadOnly) { for(size_t i=0; i<m_Vars.size(); ++i) if(m_Vars[i]) m_Vars[i]->SetReadOnly(_ReadOnly); }
virtual bool IsReadOnly() const { for(size_t i=0; i<m_Vars.size(); ++i) if(m_Vars[i] && !m_Vars[i]->IsReadOnly()) return false; return true; }
CTwVarGroup() { m_Open=false; m_StructType=TW_TYPE_UNDEF; m_SummaryCallback=NULL; m_SummaryClientData=NULL; m_StructValuePtr=NULL; }
virtual ~CTwVarGroup();
};
// ---------------------------------------------------------------------------
struct CTwBar
{
std::string m_Name;
std::string m_Label;
std::string m_Help;
bool m_Visible;
int m_PosX;
int m_PosY;
int m_Width;
int m_Height;
color32 m_Color;
bool m_DarkText;
const CTexFont * m_Font;
int m_ValuesWidth;
int m_Sep;
int m_LineSep;
int m_FirstLine;
float m_UpdatePeriod;
bool m_IsHelpBar;
int m_MinNumber; // accessed by TwDeleteBar
bool m_IsPopupList;
CTwVarAtom * m_VarEnumLinkedToPopupList;
CTwBar * m_BarLinkedToPopupList;
bool m_Resizable;
bool m_Movable;
bool m_Iconifiable;
bool m_Contained;
CTwVarGroup m_VarRoot;
enum EDrawPart { DRAW_BG=(1<<0), DRAW_CONTENT=(1<<1), DRAW_ALL=DRAW_BG|DRAW_CONTENT };
void Draw(int _DrawPart=DRAW_ALL);
void NotUpToDate();
const CTwVar * Find(const char *_Name, CTwVarGroup **_Parent=NULL, int *_Index=NULL) const;
CTwVar * Find(const char *_Name, CTwVarGroup **_Parent=NULL, int *_Index=NULL);
int HasAttrib(const char *_Attrib, bool *_HasValue) const;
int SetAttrib(int _AttribID, const char *_Value);
ERetType GetAttrib(int _AttribID, std::vector<double>& outDouble, std::ostringstream& outString) const;
bool MouseMotion(int _X, int _Y);
bool MouseButton(ETwMouseButtonID _Button, bool _Pressed, int _X, int _Y);
bool MouseWheel(int _Pos, int _PrevPos, int _MouseX, int _MouseY);
bool KeyPressed(int _Key, int _Modifiers);
bool KeyTest(int _Key, int _Modifiers);
bool IsMinimized() const { return m_IsMinimized; }
bool IsDragging() const { return m_MouseDrag; }
bool Show(CTwVar *_Var); // display the line associated to _Var
bool OpenHier(CTwVarGroup *_Root, CTwVar *_Var); // open a hierarchy if it contains _Var
int LineInHier(CTwVarGroup *_Root, CTwVar *_Var); // returns the number of the line associated to _Var
void UnHighlightLine() { m_HighlightedLine = -1; NotUpToDate(); } // used by PopupCallback
void HaveFocus(bool _Focus) { m_DrawHandles = _Focus; } // used by PopupCallback
void StopEditInPlace() { if( m_EditInPlace.m_Active ) EditInPlaceEnd(false); }
CTwBar(const char *_Name);
~CTwBar();
color32 m_ColBg, m_ColBg1, m_ColBg2;
color32 m_ColHighBg0;
color32 m_ColHighBg1;
color32 m_ColLabelText;
color32 m_ColStructText;
color32 m_ColValBg;
color32 m_ColValText;
color32 m_ColValTextRO;
color32 m_ColValTextNE;
color32 m_ColValMin;
color32 m_ColValMax;
color32 m_ColStructBg;
color32 m_ColTitleBg;
color32 m_ColTitleHighBg;
color32 m_ColTitleUnactiveBg;
color32 m_ColTitleText;
color32 m_ColTitleShadow;
color32 m_ColLine;
color32 m_ColLineShadow;
color32 m_ColUnderline;
color32 m_ColBtn;
color32 m_ColHighBtn;
color32 m_ColFold;
color32 m_ColHighFold;
color32 m_ColGrpBg;
color32 m_ColGrpText;
color32 m_ColHierBg;
color32 m_ColShortcutText;
color32 m_ColShortcutBg;
color32 m_ColInfoText;
color32 m_ColHelpBg;
color32 m_ColHelpText;
color32 m_ColRoto;
color32 m_ColRotoVal;
color32 m_ColRotoBound;
color32 m_ColEditBg;
color32 m_ColEditText;
color32 m_ColEditSelBg;
color32 m_ColEditSelText;
color32 m_ColSeparator;
color32 m_ColStaticText;
void UpdateColors();
protected:
int m_TitleWidth;
int m_VarX0;
int m_VarX1;
int m_VarX2;
int m_VarY0;
int m_VarY1;
int m_VarY2;
int m_ScrollYW;
int m_ScrollYH;
int m_ScrollY0;
int m_ScrollY1;
int m_NbHierLines;
int m_NbDisplayedLines;
bool m_UpToDate;
float m_LastUpdateTime;
void Update();
bool m_MouseDrag;
bool m_MouseDragVar;
bool m_MouseDragTitle;
bool m_MouseDragScroll;
bool m_MouseDragResizeUR;
bool m_MouseDragResizeUL;
bool m_MouseDragResizeLR;
bool m_MouseDragResizeLL;
bool m_MouseDragValWidth;
int m_MouseOriginX;
int m_MouseOriginY;
double m_ValuesWidthRatio;
bool m_VarHasBeenIncr;
int m_FirstLine0;
int m_HighlightedLine;
int m_HighlightedLinePrev;
int m_HighlightedLineLastValid;
bool m_HighlightIncrBtn;
bool m_HighlightDecrBtn;
bool m_HighlightRotoBtn;
bool m_HighlightListBtn;
bool m_HighlightBoolBtn;
bool m_HighlightClickBtn;
double m_HighlightClickBtnAuto;
bool m_HighlightTitle;
bool m_HighlightScroll;
bool m_HighlightUpScroll;
bool m_HighlightDnScroll;
bool m_HighlightMinimize;
bool m_HighlightFont;
bool m_HighlightValWidth;
bool m_HighlightLabelsHeader;
bool m_HighlightValuesHeader;
bool m_DrawHandles;
bool m_IsMinimized;
int m_MinPosX;
int m_MinPosY;
bool m_HighlightMaximize;
bool m_DrawIncrDecrBtn;
bool m_DrawRotoBtn;
bool m_DrawClickBtn;
bool m_DrawListBtn;
bool m_DrawBoolBtn;
EButtonAlign m_ButtonAlign;
struct CHierTag
{
CTwVar * m_Var;
int m_Level;
bool m_Closing;
};
std::vector<CHierTag> m_HierTags;
void BrowseHierarchy(int *_LineNum, int _CurrLevel, const CTwVar *_Var, int _First, int _Last);
void * m_TitleTextObj;
void * m_LabelsTextObj;
void * m_ValuesTextObj;
void * m_ShortcutTextObj;
int m_ShortcutLine;
void * m_HeadersTextObj;
void ListLabels(std::vector<std::string>& _Labels, std::vector<color32>& _Colors, std::vector<color32>& _BgColors, bool *_HasBgColors, const CTexFont *_Font, int _AtomWidthMax, int _GroupWidthMax);
void ListValues(std::vector<std::string>& _Values, std::vector<color32>& _Colors, std::vector<color32>& _BgColors, const CTexFont *_Font, int _WidthMax);
int ComputeLabelsWidth(const CTexFont *_Font);
int ComputeValuesWidth(const CTexFont *_Font);
void DrawHierHandle();
enum EValuesWidthFit { VALUES_WIDTH_FIT = -5555 };
// RotoSlider
struct CPoint
{
int x, y;
CPoint() {}
CPoint(int _X, int _Y):x(_X), y(_Y) {}
const CPoint operator+ (const CPoint& p) const { return CPoint(x+p.x, y+p.y); }
const CPoint operator- (const CPoint& p) const { return CPoint(x-p.x, y-p.y); }
};
struct CRotoSlider
{
CRotoSlider();
CTwVarAtom * m_Var;
double m_PreciseValue;
double m_CurrentValue;
double m_Value0;
double m_ValueAngle0;
bool m_Active;
bool m_ActiveMiddle;
CPoint m_Origin;
CPoint m_Current;
bool m_HasPrevious;
CPoint m_Previous;
double m_Angle0;
double m_AngleDT;
int m_Subdiv;
};
CRotoSlider m_Roto;
int m_RotoMinRadius;
int m_RotoNbSubdiv; // number of steps for one turn
void RotoDraw();
void RotoOnMouseMove(int _X, int _Y);
void RotoOnLButtonDown(int _X, int _Y);
void RotoOnLButtonUp(int _X, int _Y);
void RotoOnMButtonDown(int _X, int _Y);
void RotoOnMButtonUp(int _X, int _Y);
double RotoGetValue() const;
void RotoSetValue(double _Val);
double RotoGetMin() const;
double RotoGetMax() const;
double RotoGetStep() const;
double RotoGetSteppedValue() const;
// Edit-in-place
struct CEditInPlace
{
CEditInPlace();
~CEditInPlace();
CTwVarAtom * m_Var;
bool m_Active;
std::string m_String;
void * m_EditTextObj;
void * m_EditSelTextObj;
int m_CaretPos;
int m_SelectionStart;
int m_X, m_Y;
int m_Width;
int m_FirstChar;
std::string m_Clipboard;
};
CEditInPlace m_EditInPlace;
void EditInPlaceDraw();
bool EditInPlaceAcceptVar(const CTwVarAtom* _Var);
bool EditInPlaceIsReadOnly();
void EditInPlaceStart(CTwVarAtom* _Var, int _X, int _Y, int _Width);
void EditInPlaceEnd(bool _Commit);
bool EditInPlaceKeyPressed(int _Key, int _Modifiers);
bool EditInPlaceEraseSelect();
bool EditInPlaceMouseMove(int _X, int _Y, bool _Select);
bool EditInPlaceSetClipboard(const std::string& _String);
bool EditInPlaceGetClipboard(std::string *_OutString);
struct CCustomRecord
{
int m_IndexMin;
int m_IndexMax;
int m_XMin, m_XMax;
int m_YMin, m_YMax; // Y visible range
int m_Y0, m_Y1; // Y widget range
CTwVarGroup * m_Var;
};
typedef std::map<CTwMgr::CStructProxy*, CCustomRecord> CustomMap;
CustomMap m_CustomRecords;
CTwMgr::CStructProxy * m_CustomActiveStructProxy;
friend struct CTwMgr;
};
void DrawArc(int _X, int _Y, int _Radius, float _StartAngleDeg, float _EndAngleDeg, color32 _Color);
// ---------------------------------------------------------------------------
#endif // !defined ANT_TW_BAR_INCLUDED