147 lines
8.1 KiB
C++
147 lines
8.1 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef PANELANIMATIONVAR_H
|
|
#define PANELANIMATIONVAR_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "../tier1/utlvector.h"
|
|
#include "Panel.h"
|
|
|
|
#define DECLARE_PANELANIMATION(className) \
|
|
static void AddToAnimationMap(char const *scriptname, char const *type, \
|
|
char const *var, char const *defaultvalue, \
|
|
bool array, PANELLOOKUPFUNC func) { \
|
|
PanelAnimationMap *map = \
|
|
FindOrAddPanelAnimationMap(GetPanelClassName()); \
|
|
\
|
|
PanelAnimationMapEntry entry; \
|
|
entry.m_pszScriptName = scriptname; \
|
|
entry.m_pszVariable = var; \
|
|
entry.m_pszType = type; \
|
|
entry.m_pszDefaultValue = defaultvalue; \
|
|
entry.m_pfnLookup = func; \
|
|
entry.m_bArray = array; \
|
|
\
|
|
map->entries.AddToTail(entry); \
|
|
} \
|
|
\
|
|
static void ChainToAnimationMap(void) { \
|
|
static bool chained = false; \
|
|
if (chained) return; \
|
|
chained = true; \
|
|
PanelAnimationMap *map = \
|
|
FindOrAddPanelAnimationMap(GetPanelClassName()); \
|
|
map->pfnClassName = GetPanelClassName; \
|
|
if (map && GetPanelBaseClassName() && GetPanelBaseClassName()[0]) { \
|
|
map->baseMap = \
|
|
FindOrAddPanelAnimationMap(GetPanelBaseClassName()); \
|
|
} \
|
|
} \
|
|
\
|
|
class className##_Register; \
|
|
friend class className##_Register; \
|
|
class className##_Register { \
|
|
public: \
|
|
className##_Register() { className::ChainToAnimationMap(); } \
|
|
}; \
|
|
className##_Register m_RegisterAnimationClass; \
|
|
\
|
|
virtual PanelAnimationMap *GetAnimMap() { \
|
|
return FindOrAddPanelAnimationMap(GetPanelClassName()); \
|
|
}
|
|
|
|
typedef void *(*PANELLOOKUPFUNC)(vgui::Panel *panel);
|
|
|
|
// Use this macro to define a variable which hudanimations.txt and hudlayout.res
|
|
// scripts can access
|
|
#define CPanelAnimationVarAliasType(type, name, scriptname, defaultvalue, \
|
|
typealias) \
|
|
class PanelAnimationVar_##name; \
|
|
friend class PanelAnimationVar_##name; \
|
|
static void *GetVar_##name(vgui::Panel *panel) { \
|
|
return &((ThisClass *)panel)->name; \
|
|
} \
|
|
class PanelAnimationVar_##name { \
|
|
public: \
|
|
static void InitVar() { \
|
|
static bool bAdded = false; \
|
|
if (!bAdded) { \
|
|
bAdded = true; \
|
|
AddToAnimationMap(scriptname, typealias, #name, defaultvalue, \
|
|
false, ThisClass::GetVar_##name); \
|
|
} \
|
|
} \
|
|
PanelAnimationVar_##name() { PanelAnimationVar_##name::InitVar(); } \
|
|
}; \
|
|
PanelAnimationVar_##name m_##name##_register; \
|
|
type name;
|
|
|
|
#define CPanelAnimationVar(type, name, scriptname, defaultvalue) \
|
|
CPanelAnimationVarAliasType(type, name, scriptname, defaultvalue, #type)
|
|
|
|
// Use this macro to define a variable which hudanimations.txt and hudlayout.res
|
|
// scripts can access
|
|
#define CPanelAnimationStringVarAliasType(count, name, scriptname, \
|
|
defaultvalue, typealias) \
|
|
class PanelAnimationVar_##name; \
|
|
friend class PanelAnimationVar_##name; \
|
|
static void *GetVar_##name(vgui::Panel *panel) { \
|
|
return &((ThisClass *)panel)->name; \
|
|
} \
|
|
class PanelAnimationVar_##name { \
|
|
public: \
|
|
static void InitVar() { \
|
|
static bool bAdded = false; \
|
|
if (!bAdded) { \
|
|
bAdded = true; \
|
|
AddToAnimationMap(scriptname, typealias, #name, defaultvalue, \
|
|
true, ThisClass::GetVar_##name); \
|
|
} \
|
|
} \
|
|
PanelAnimationVar_##name() { PanelAnimationVar_##name::InitVar(); } \
|
|
}; \
|
|
PanelAnimationVar_##name m_##name##_register; \
|
|
char name[count];
|
|
|
|
#define CPanelAnimationStringVar(count, name, scriptname, defaultvalue) \
|
|
CPanelAnimationStringVarAliasType(count, name, scriptname, defaultvalue, \
|
|
"string")
|
|
|
|
struct PanelAnimationMapEntry {
|
|
char const *name() { return m_pszScriptName; }
|
|
char const *type() { return m_pszType; }
|
|
char const *defaultvalue() { return m_pszDefaultValue; }
|
|
bool isarray() { return m_bArray; }
|
|
|
|
char const *m_pszScriptName;
|
|
char const *m_pszVariable;
|
|
char const *m_pszType;
|
|
char const *m_pszDefaultValue;
|
|
bool m_bArray;
|
|
|
|
PANELLOOKUPFUNC m_pfnLookup;
|
|
};
|
|
|
|
struct PanelAnimationMap {
|
|
PanelAnimationMap() {
|
|
baseMap = NULL;
|
|
pfnClassName = NULL;
|
|
}
|
|
|
|
CUtlVector<PanelAnimationMapEntry> entries;
|
|
PanelAnimationMap *baseMap;
|
|
char const *(*pfnClassName)(void);
|
|
};
|
|
|
|
PanelAnimationMap *FindPanelAnimationMap(char const *className);
|
|
PanelAnimationMap *FindOrAddPanelAnimationMap(char const *className);
|
|
void PanelAnimationDumpVars(char const *className);
|
|
|
|
#endif // PANELANIMATIONVAR_H
|