diff --git a/mp/src/game/client/ff/ff_cl_luabind_ui.cpp b/mp/src/game/client/ff/ff_cl_luabind_ui.cpp index e12a1aee..07c10073 100644 --- a/mp/src/game/client/ff/ff_cl_luabind_ui.cpp +++ b/mp/src/game/client/ff/ff_cl_luabind_ui.cpp @@ -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_>("Panel") .def(constructor()) + .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), diff --git a/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.cpp b/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.cpp index 7e2a0bc3..f89d0ccb 100644 --- a/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.cpp +++ b/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.cpp @@ -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 ); } \ No newline at end of file diff --git a/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.h b/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.h index 9947a0ef..842ca1fe 100644 --- a/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.h +++ b/mp/src/game/client/ff/ui/ff_cl_luaui_basepanel.h @@ -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: diff --git a/mp/src/public/vgui_controls/Panel.h b/mp/src/public/vgui_controls/Panel.h index 23af650c..2c1905a9 100644 --- a/mp/src/public/vgui_controls/Panel.h +++ b/mp/src/public/vgui_controls/Panel.h @@ -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