/* =========================================================================== 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 . 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 __WINVAR_H__ #define __WINVAR_H__ #include "Rectangle.h" static const char* VAR_GUIPREFIX = "gui::"; static const int VAR_GUIPREFIX_LEN = strlen( VAR_GUIPREFIX ); class idWindow; class idWinVar { public: idWinVar(); virtual ~idWinVar(); void SetGuiInfo( idDict* gd, const char* _name ); const char* GetName() const { if( name ) { if( guiDict && *name == '*' ) { return guiDict->GetString( &name[1] ); } return name; } return ""; } void SetName( const char* _name ) { delete []name; name = NULL; if( _name ) { name = new( TAG_OLD_UI ) char[strlen( _name ) + 1]; strcpy( name, _name ); } } idWinVar& operator=( const idWinVar& other ) { guiDict = other.guiDict; SetName( other.name ); return *this; } idDict* GetDict() const { return guiDict; } bool NeedsUpdate() { return ( guiDict != NULL ); } virtual void Init( const char* _name, idWindow* win ) = 0; virtual void Set( const char* val ) = 0; virtual void Update() = 0; virtual const char* c_str() const = 0; virtual size_t Size() { size_t sz = ( name ) ? strlen( name ) : 0; return sz + sizeof( *this ); } virtual void WriteToSaveGame( idFile* savefile ) = 0; virtual void ReadFromSaveGame( idFile* savefile ) = 0; virtual float x() const = 0; void SetEval( bool b ) { eval = b; } bool GetEval() { return eval; } protected: idDict* guiDict; char* name; bool eval; }; class idWinBool : public idWinVar { public: idWinBool() : idWinVar() {}; ~idWinBool() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { data = guiDict->GetBool( GetName() ); } } int operator==( const bool& other ) { return ( other == data ); } bool& operator=( const bool& other ) { data = other; if( guiDict ) { guiDict->SetBool( GetName(), data ); } return data; } idWinBool& operator=( const idWinBool& other ) { idWinVar::operator=( other ); data = other.data; return *this; } operator bool() const { return data; } virtual void Set( const char* val ) { data = ( atoi( val ) != 0 ); if( guiDict ) { guiDict->SetBool( GetName(), data ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetBool( s ); } } virtual const char* c_str() const { return va( "%i", data ); } // SaveGames virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } virtual float x() const { return data ? 1.0f : 0.0f; }; protected: bool data; }; class idWinStr : public idWinVar { public: idWinStr() : idWinVar() {}; ~idWinStr() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { const char* name = GetName(); if( name[0] == 0 ) { data = ""; } else { data = guiDict->GetString( name ); } } } int operator==( const idStr& other ) const { return ( other == data ); } int operator==( const char* other ) const { return ( data == other ); } idStr& operator=( const idStr& other ) { data = other; if( guiDict ) { guiDict->Set( GetName(), data ); } return data; } idWinStr& operator=( const idWinStr& other ) { idWinVar::operator=( other ); data = other.data; return *this; } operator const char* () const { return data.c_str(); } operator const idStr& () const { return data; } int LengthWithoutColors() { if( guiDict && name && *name ) { data = guiDict->GetString( GetName() ); } return data.LengthWithoutColors(); } int Length() { if( guiDict && name && *name ) { data = guiDict->GetString( GetName() ); } return data.Length(); } void RemoveColors() { if( guiDict && name && *name ) { data = guiDict->GetString( GetName() ); } data.RemoveColors(); } virtual const char* c_str() const { return data.c_str(); } virtual void Set( const char* val ) { data = val; if( guiDict ) { guiDict->Set( GetName(), data ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetString( s ); } } virtual size_t Size() { size_t sz = idWinVar::Size(); return sz + data.Allocated(); } // SaveGames virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); int len = data.Length(); savefile->Write( &len, sizeof( len ) ); if( len > 0 ) { savefile->Write( data.c_str(), len ); } } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); int len; savefile->Read( &len, sizeof( len ) ); if( len > 0 ) { data.Fill( ' ', len ); savefile->Read( &data[0], len ); } } // return wether string is emtpy virtual float x() const { return data[0] ? 1.0f : 0.0f; }; protected: idStr data; }; class idWinInt : public idWinVar { public: idWinInt() : idWinVar() {}; ~idWinInt() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { data = guiDict->GetInt( GetName() ); } } int& operator=( const int& other ) { data = other; if( guiDict ) { guiDict->SetInt( GetName(), data ); } return data; } idWinInt& operator=( const idWinInt& other ) { idWinVar::operator=( other ); data = other.data; return *this; } operator int () const { return data; } virtual void Set( const char* val ) { data = atoi( val );; if( guiDict ) { guiDict->SetInt( GetName(), data ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetInt( s ); } } virtual const char* c_str() const { return va( "%i", data ); } // SaveGames virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } // no suitable conversion virtual float x() const { assert( false ); return 0.0f; }; protected: int data; }; class idWinFloat : public idWinVar { public: idWinFloat() : idWinVar() {}; ~idWinFloat() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { data = guiDict->GetFloat( GetName() ); } } idWinFloat& operator=( const idWinFloat& other ) { idWinVar::operator=( other ); data = other.data; return *this; } float& operator=( const float& other ) { data = other; if( guiDict ) { guiDict->SetFloat( GetName(), data ); } return data; } operator float() const { return data; } virtual void Set( const char* val ) { data = atof( val ); if( guiDict ) { guiDict->SetFloat( GetName(), data ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetFloat( s ); } } virtual const char* c_str() const { return va( "%f", data ); } virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } virtual float x() const { return data; }; protected: float data; }; class idWinRectangle : public idWinVar { public: idWinRectangle() : idWinVar() {}; ~idWinRectangle() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { idVec4 v = guiDict->GetVec4( GetName() ); data.x = v.x; data.y = v.y; data.w = v.z; data.h = v.w; } } int operator==( const idRectangle& other ) const { return ( other == data ); } idWinRectangle& operator=( const idWinRectangle& other ) { idWinVar::operator=( other ); data = other.data; return *this; } idRectangle& operator=( const idVec4& other ) { data = other; if( guiDict ) { guiDict->SetVec4( GetName(), other ); } return data; } idRectangle& operator=( const idRectangle& other ) { data = other; if( guiDict ) { idVec4 v = data.ToVec4(); guiDict->SetVec4( GetName(), v ); } return data; } operator const idRectangle& () const { return data; } float x() const { return data.x; } float y() const { return data.y; } float w() const { return data.w; } float h() const { return data.h; } float Right() const { return data.Right(); } float Bottom() const { return data.Bottom(); } idVec4& ToVec4() { static idVec4 ret; ret = data.ToVec4(); return ret; } virtual void Set( const char* val ) { if( strchr( val, ',' ) ) { sscanf( val, "%f,%f,%f,%f", &data.x, &data.y, &data.w, &data.h ); } else { sscanf( val, "%f %f %f %f", &data.x, &data.y, &data.w, &data.h ); } if( guiDict ) { idVec4 v = data.ToVec4(); guiDict->SetVec4( GetName(), v ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { idVec4 v = guiDict->GetVec4( s ); data.x = v.x; data.y = v.y; data.w = v.z; data.h = v.w; } } virtual const char* c_str() const { return data.ToVec4().ToString(); } virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } protected: idRectangle data; }; class idWinVec2 : public idWinVar { public: idWinVec2() : idWinVar() {}; ~idWinVec2() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { data = guiDict->GetVec2( GetName() ); } } int operator==( const idVec2& other ) const { return ( other == data ); } idWinVec2& operator=( const idWinVec2& other ) { idWinVar::operator=( other ); data = other.data; return *this; } idVec2& operator=( const idVec2& other ) { data = other; if( guiDict ) { guiDict->SetVec2( GetName(), data ); } return data; } float x() const { return data.x; } float y() const { return data.y; } virtual void Set( const char* val ) { if( strchr( val, ',' ) ) { sscanf( val, "%f,%f", &data.x, &data.y ); } else { sscanf( val, "%f %f", &data.x, &data.y ); } if( guiDict ) { guiDict->SetVec2( GetName(), data ); } } operator const idVec2& () const { return data; } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetVec2( s ); } } virtual const char* c_str() const { return data.ToString(); } void Zero() { data.Zero(); } virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } protected: idVec2 data; }; class idWinVec4 : public idWinVar { public: idWinVec4() : idWinVar() {}; ~idWinVec4() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { data = guiDict->GetVec4( GetName() ); } } int operator==( const idVec4& other ) const { return ( other == data ); } idWinVec4& operator=( const idWinVec4& other ) { idWinVar::operator=( other ); data = other.data; return *this; } idVec4& operator=( const idVec4& other ) { data = other; if( guiDict ) { guiDict->SetVec4( GetName(), data ); } return data; } operator const idVec4& () const { return data; } float x() const { return data.x; } float y() const { return data.y; } float z() const { return data.z; } float w() const { return data.w; } virtual void Set( const char* val ) { if( strchr( val, ',' ) ) { sscanf( val, "%f,%f,%f,%f", &data.x, &data.y, &data.z, &data.w ); } else { sscanf( val, "%f %f %f %f", &data.x, &data.y, &data.z, &data.w ); } if( guiDict ) { guiDict->SetVec4( GetName(), data ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetVec4( s ); } } virtual const char* c_str() const { return data.ToString(); } void Zero() { data.Zero(); if( guiDict ) { guiDict->SetVec4( GetName(), data ); } } const idVec3& ToVec3() const { return data.ToVec3(); } virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } protected: idVec4 data; }; class idWinVec3 : public idWinVar { public: idWinVec3() : idWinVar() {}; ~idWinVec3() {}; virtual void Init( const char* _name, idWindow* win ) { idWinVar::Init( _name, win ); if( guiDict ) { data = guiDict->GetVector( GetName() ); } } int operator==( const idVec3& other ) const { return ( other == data ); } idWinVec3& operator=( const idWinVec3& other ) { idWinVar::operator=( other ); data = other.data; return *this; } idVec3& operator=( const idVec3& other ) { data = other; if( guiDict ) { guiDict->SetVector( GetName(), data ); } return data; } operator const idVec3& () const { return data; } float x() const { return data.x; } float y() const { return data.y; } float z() const { return data.z; } virtual void Set( const char* val ) { sscanf( val, "%f %f %f", &data.x, &data.y, &data.z ); if( guiDict ) { guiDict->SetVector( GetName(), data ); } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetVector( s ); } } virtual const char* c_str() const { return data.ToString(); } void Zero() { data.Zero(); if( guiDict ) { guiDict->SetVector( GetName(), data ); } } virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); savefile->Write( &data, sizeof( data ) ); } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); savefile->Read( &data, sizeof( data ) ); } protected: idVec3 data; }; class idWinBackground : public idWinStr { public: idWinBackground() : idWinStr() { mat = NULL; }; ~idWinBackground() {}; virtual void Init( const char* _name, idWindow* win ) { idWinStr::Init( _name, win ); if( guiDict ) { data = guiDict->GetString( GetName() ); } } int operator==( const idStr& other ) const { return ( other == data ); } int operator==( const char* other ) const { return ( data == other ); } idStr& operator=( const idStr& other ) { data = other; if( guiDict ) { guiDict->Set( GetName(), data ); } if( mat ) { if( data == "" ) { ( *mat ) = NULL; } else { ( *mat ) = declManager->FindMaterial( data ); } } return data; } idWinBackground& operator=( const idWinBackground& other ) { idWinVar::operator=( other ); data = other.data; mat = other.mat; if( mat ) { if( data == "" ) { ( *mat ) = NULL; } else { ( *mat ) = declManager->FindMaterial( data ); } } return *this; } operator const char* () const { return data.c_str(); } operator const idStr& () const { return data; } int Length() { if( guiDict ) { data = guiDict->GetString( GetName() ); } return data.Length(); } virtual const char* c_str() const { return data.c_str(); } virtual void Set( const char* val ) { data = val; if( guiDict ) { guiDict->Set( GetName(), data ); } if( mat ) { if( data == "" ) { ( *mat ) = NULL; } else { ( *mat ) = declManager->FindMaterial( data ); } } } virtual void Update() { const char* s = GetName(); if( guiDict && s[0] != '\0' ) { data = guiDict->GetString( s ); if( mat ) { if( data == "" ) { ( *mat ) = NULL; } else { ( *mat ) = declManager->FindMaterial( data ); } } } } virtual size_t Size() { size_t sz = idWinVar::Size(); return sz + data.Allocated(); } void SetMaterialPtr( const idMaterial** m ) { mat = m; } virtual void WriteToSaveGame( idFile* savefile ) { savefile->Write( &eval, sizeof( eval ) ); int len = data.Length(); savefile->Write( &len, sizeof( len ) ); if( len > 0 ) { savefile->Write( data.c_str(), len ); } } virtual void ReadFromSaveGame( idFile* savefile ) { savefile->Read( &eval, sizeof( eval ) ); int len; savefile->Read( &len, sizeof( len ) ); if( len > 0 ) { data.Fill( ' ', len ); savefile->Read( &data[0], len ); } if( mat ) { if( len > 0 ) { ( *mat ) = declManager->FindMaterial( data ); } else { ( *mat ) = NULL; } } } protected: idStr data; const idMaterial** mat; }; /* ================ idMultiWinVar multiplexes access to a list if idWinVar* ================ */ class idMultiWinVar : public idList< idWinVar* > { public: void Set( const char* val ); void Update(); void SetGuiInfo( idDict* dict ); }; #endif /* !__WINVAR_H__ */