Made LuaUI_BasePanel's SetPos/SetSize/DrawText functions use proportionality, so that size/position is scaled appropriately depending on your resolution

* SetPos can use .res-style string parameters with the 'r' and 'c' prefixes to set alignment
 * SetSize can use .res-style string parameters with the 'f' prefix to make it fill its parent
Had to edit vgui_controls/Panel.h to make a few member variables protected instead of private
This commit is contained in:
squeek 2013-11-09 03:27:09 +00:00
parent 369121c058
commit 450bf12e72
4 changed files with 253 additions and 3 deletions

View file

@ -82,13 +82,21 @@ void FF_Lua_InitUI( lua_State *L )
.def("SetPaintBackgroundEnabled", &vgui::Panel::SetPaintBackgroundEnabled)
.def("SetPaintBackgroundType", &vgui::Panel::SetPaintBackgroundType)
.def("GetSize", &vgui::Panel::GetSize, pure_out_value(_2) + pure_out_value(_3)) // _1 is the this pointer
.def("SetSize", &vgui::Panel::SetSize)
.def("SetRawSize", &vgui::Panel::SetSize)
.def("GetPos", &vgui::Panel::GetPos, pure_out_value(_2) + pure_out_value(_3)) // _1 is the this pointer
.def("SetPos", &vgui::Panel::SetPos)
.def("SetRawPos", &vgui::Panel::SetPos)
.def("SetEnabled", &vgui::Panel::SetEnabled),
class_<CFF_CL_LuaUI_BasePanel, bases<CHudElement, vgui::Panel>>("Panel")
.def(constructor<lua_State *, const char *>())
.def("SetPos", (void(CFF_CL_LuaUI_BasePanel::*)(const char*, const char*))&CFF_CL_LuaUI_BasePanel::SetProportionalPos)
.def("SetPos", (void(CFF_CL_LuaUI_BasePanel::*)(int, int))&CFF_CL_LuaUI_BasePanel::SetProportionalPos)
.def("SetWide", (void(CFF_CL_LuaUI_BasePanel::*)(const char*))&CFF_CL_LuaUI_BasePanel::SetProportionalWide)
.def("SetWide", (void(CFF_CL_LuaUI_BasePanel::*)(int))&CFF_CL_LuaUI_BasePanel::SetProportionalWide)
.def("SetTall", (void(CFF_CL_LuaUI_BasePanel::*)(const char*))&CFF_CL_LuaUI_BasePanel::SetProportionalTall)
.def("SetTall", (void(CFF_CL_LuaUI_BasePanel::*)(int))&CFF_CL_LuaUI_BasePanel::SetProportionalTall)
.def("SetSize", (void(CFF_CL_LuaUI_BasePanel::*)(const char*, const char*))&CFF_CL_LuaUI_BasePanel::SetProportionalSize)
.def("SetSize", (void(CFF_CL_LuaUI_BasePanel::*)(int, int))&CFF_CL_LuaUI_BasePanel::SetProportionalSize)
.def("DrawText", &CFF_CL_LuaUI_BasePanel::DrawText)
.def("DrawBox", &CFF_CL_LuaUI_BasePanel::DrawBox),

View file

@ -95,6 +95,7 @@ void CFF_CL_LuaUI_BasePanel::Paint()
}
}
/// Drawtext helper function
void CFF_CL_LuaUI_BasePanel::DrawText( const char *szText, int xpos, int ypos )
{
wchar_t wszText[255];
@ -107,6 +108,230 @@ void CFF_CL_LuaUI_BasePanel::DrawText( const char *szText, int xpos, int ypos )
surface()->DrawSetTextFont(font);
surface()->DrawSetTextColor(GetFgColor());
if (IsProportional())
{
xpos = scheme()->GetProportionalScaledValueEx(GetScheme(), xpos);
ypos = scheme()->GetProportionalScaledValueEx(GetScheme(), ypos);
}
surface()->DrawSetTextPos(xpos, ypos);
surface()->DrawUnicodeString( wszText );
}
/*
==========================================================
Note: Proportional width/height/pos code is based on
vgui::Panel::ApplySettings in Panel.cpp
FF TODO: Rewrite this to be more Lua-friendly (get rid of
string-based alignment settings)
==========================================================
*/
/// Set width proportionally
void CFF_CL_LuaUI_BasePanel::SetProportionalWide( int wide )
{
if ( IsProportional() )
{
// scale the width up to our screen co-ords
wide = scheme()->GetProportionalScaledValueEx(GetScheme(), wide);
}
BaseClass::SetWide( wide );
}
/// Set width proportionally with an optional 'f' prefix to fill the parent
void CFF_CL_LuaUI_BasePanel::SetProportionalWide( const char *wstr )
{
int iScreenWide, iScreenTall;
surface()->GetScreenSize( iScreenWide, iScreenTall );
_buildModeFlags &= ~(BUILDMODE_SAVE_WIDE_FULL);
if (wstr[0] == 'f' || wstr[0] == 'F')
{
_buildModeFlags |= BUILDMODE_SAVE_WIDE_FULL;
wstr++;
}
int wide = atoi(wstr);
// now correct the alignment
if (_buildModeFlags & BUILDMODE_SAVE_WIDE_FULL)
{
wide = iScreenWide - wide;
}
SetProportionalWide( wide );
}
/// Set height proportionally
void CFF_CL_LuaUI_BasePanel::SetProportionalTall( int tall )
{
if ( IsProportional() )
{
// scale the height up to our screen co-ords
tall = scheme()->GetProportionalScaledValueEx(GetScheme(), tall);
}
BaseClass::SetTall( tall );
}
/// Set height proportionally with an optional 'f' prefix to fill the parent
void CFF_CL_LuaUI_BasePanel::SetProportionalTall( const char *hstr )
{
int iScreenWide, iScreenTall;
surface()->GetScreenSize( iScreenWide, iScreenTall );
_buildModeFlags &= ~(BUILDMODE_SAVE_TALL_FULL);
// allow tall to be use the "fill" option, set to the height of the parent/screen
if (hstr[0] == 'f' || hstr[0] == 'F')
{
_buildModeFlags |= BUILDMODE_SAVE_TALL_FULL;
hstr++;
}
int tall = atoi(hstr);
// now correct the alignment
if (_buildModeFlags & BUILDMODE_SAVE_TALL_FULL)
{
tall = iScreenTall - tall;
}
SetProportionalTall( tall );
}
/// Set size proportionally
void CFF_CL_LuaUI_BasePanel::SetProportionalSize( int w, int h )
{
SetProportionalWide( w );
SetProportionalTall( h );
}
/// Set size proportionally with optional 'f' prefixes to fill the parent
void CFF_CL_LuaUI_BasePanel::SetProportionalSize( const char *wstr, const char *hstr )
{
SetProportionalWide( wstr );
SetProportionalTall( hstr );
}
/// Set position proportionally
void CFF_CL_LuaUI_BasePanel::SetProportionalPos( int x, int y )
{
// scale the x up to our screen co-ords
if ( IsProportional() )
{
x = scheme()->GetProportionalScaledValueEx(GetScheme(), x);
y = scheme()->GetProportionalScaledValueEx(GetScheme(), y);
}
BaseClass::SetPos( x, y );
}
void CFF_CL_LuaUI_BasePanel::SetProportionalPos( const char *xstr, const char *ystr )
{
// clear any alignment flags
_buildModeFlags &= ~(BUILDMODE_SAVE_XPOS_RIGHTALIGNED | BUILDMODE_SAVE_XPOS_CENTERALIGNED | BUILDMODE_SAVE_YPOS_BOTTOMALIGNED | BUILDMODE_SAVE_YPOS_CENTERALIGNED | BUILDMODE_SAVE_PROPORTIONAL_TO_PARENT);
// get the position
int alignScreenWide, alignScreenTall; // screen dimensions used for pinning in splitscreen
surface()->GetScreenSize( alignScreenWide, alignScreenTall );
int screenWide = alignScreenWide;
int screenTall = alignScreenTall;
// temporarily remove the override to get the fullscreen dimensions
if ( surface()->IsScreenSizeOverrideActive() )
{
surface()->ForceScreenSizeOverride( false, 0, 0 );
surface()->GetScreenSize( screenWide, screenTall );
// restore the override
surface()->ForceScreenSizeOverride( true, alignScreenWide, alignScreenTall );
}
int parentX = 0;
int parentY = 0;
/*
// flag to cause windows to get screenWide and screenTall from their parents,
// this allows children windows to use fill and right/bottom alignment even
// if their parent does not use the full screen.
if ( inResourceData->GetInt( "proportionalToParent", 0 ) == 1 )
{
_buildModeFlags |= BUILDMODE_SAVE_PROPORTIONAL_TO_PARENT;
if ( GetParent() != NULL )
{
GetParent()->GetBounds( parentX, parentY, alignScreenWide, alignScreenTall );
}
}
*/
int x, y;
GetPos(x, y);
if (xstr)
{
// look for alignment flags
if (xstr[0] == 'r' || xstr[0] == 'R')
{
_buildModeFlags |= BUILDMODE_SAVE_XPOS_RIGHTALIGNED;
xstr++;
}
else if (xstr[0] == 'c' || xstr[0] == 'C')
{
_buildModeFlags |= BUILDMODE_SAVE_XPOS_CENTERALIGNED;
xstr++;
}
// get the value
x = atoi(xstr);
// scale the x up to our screen co-ords
if ( IsProportional() )
{
x = scheme()->GetProportionalScaledValueEx(GetScheme(), x);
y = scheme()->GetProportionalScaledValueEx(GetScheme(), y);
}
// now correct the alignment
if (_buildModeFlags & BUILDMODE_SAVE_XPOS_RIGHTALIGNED)
{
x = alignScreenWide - x;
}
else if (_buildModeFlags & BUILDMODE_SAVE_XPOS_CENTERALIGNED)
{
x = (alignScreenWide / 2) + x;
}
}
if (ystr)
{
// look for alignment flags
if (ystr[0] == 'r' || ystr[0] == 'R')
{
_buildModeFlags |= BUILDMODE_SAVE_YPOS_BOTTOMALIGNED;
ystr++;
}
else if (ystr[0] == 'c' || ystr[0] == 'C')
{
_buildModeFlags |= BUILDMODE_SAVE_YPOS_CENTERALIGNED;
ystr++;
}
y = atoi(ystr);
if (IsProportional())
{
// scale the y up to our screen co-ords
y = scheme()->GetProportionalScaledValueEx(GetScheme(), y);
}
// now correct the alignment
if (_buildModeFlags & BUILDMODE_SAVE_YPOS_BOTTOMALIGNED)
{
y = alignScreenTall - y;
}
else if (_buildModeFlags & BUILDMODE_SAVE_YPOS_CENTERALIGNED)
{
y = (alignScreenTall / 2) + y;
}
}
BaseClass::SetPos( x, y );
}

View file

@ -24,6 +24,16 @@ public:
virtual void Paint();
// --> from vgui::Panel
void SetProportionalWide( int wide );
void SetProportionalWide( const char *wstr );
void SetProportionalTall( int tall );
void SetProportionalTall( const char *hstr );
void SetProportionalSize( int w, int h );
void SetProportionalSize( const char *wstr, const char *hstr );
void SetProportionalPos( int x, int y );
void SetProportionalPos( const char *xstr, const char *ystr );
void DrawText( const char *szText, int xpos, int ypos );
private:

View file

@ -722,7 +722,8 @@ protected:
bool m_PassUnhandledInput;
NAV_DIRECTION m_LastNavDirection;
private:
// FF --> Make these accessible in derived classes
protected:
enum BuildModeFlags_t
{
BUILDMODE_EDITABLE = 0x01,
@ -758,6 +759,8 @@ private:
IS_MOUSE_DISABLED_FOR_THIS_PANEL_ONLY = 0x8000,
ALL_FLAGS = 0xFFFF,
};
private:
// FF <--
// used to get the Panel * for users with only IClientPanel
virtual Panel *GetPanel() { return this; }
@ -849,7 +852,11 @@ private:
short m_nResizeDeltaY;
HCursor _cursor;
// FF --> Make this accessible in derived classes
protected:
unsigned short _buildModeFlags; // flags that control how the build mode dialog handles this panel
private:
// FF <--
byte _pinCorner : 4; // the corner of the dialog this panel is pinned to
byte _autoResizeDirection : 4; // the directions in which the panel will auto-resize to