This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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