2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2011-08-31 11:56:04 +00:00
# include <base/tl/array.h>
2008-08-27 15:48:50 +00:00
# include <math.h>
# include <base/system.h>
2010-05-29 07:25:38 +00:00
# include <base/math.h>
# include <base/vmath.h>
2008-08-27 15:48:50 +00:00
2011-03-23 12:06:35 +00:00
# include <engine/config.h>
2011-03-21 23:31:42 +00:00
# include <engine/editor.h>
2011-04-13 18:00:54 +00:00
# include <engine/engine.h>
2011-03-23 12:06:35 +00:00
# include <engine/friends.h>
2010-05-29 07:25:38 +00:00
# include <engine/graphics.h>
# include <engine/keys.h>
2011-03-21 23:31:42 +00:00
# include <engine/serverbrowser.h>
2010-10-06 21:07:35 +00:00
# include <engine/storage.h>
2011-03-21 23:31:42 +00:00
# include <engine/textrender.h>
2010-05-29 07:25:38 +00:00
# include <engine/shared/config.h>
2009-06-13 17:18:06 +00:00
2010-05-29 07:25:38 +00:00
# include <game/version.h>
# include <game/generated/protocol.h>
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
# include <game/generated/client_data.h>
2019-04-28 17:22:19 +00:00
# include <game/client/components/binds.h>
2011-04-13 18:00:54 +00:00
# include <game/client/components/sounds.h>
2010-05-29 07:25:38 +00:00
# include <game/client/gameclient.h>
# include <game/client/lineinput.h>
# include <game/localization.h>
2008-08-27 15:48:50 +00:00
# include <mastersrv/mastersrv.h>
2011-06-29 20:27:32 +00:00
# include "countryflags.h"
2011-03-23 12:06:35 +00:00
# include "menus.h"
# include "skins.h"
2014-06-16 11:29:18 +00:00
# include "controls.h"
2011-03-23 12:06:35 +00:00
2019-04-26 21:47:34 +00:00
ColorRGBA CMenus : : ms_GuiColor ;
ColorRGBA CMenus : : ms_ColorTabbarInactiveOutgame ;
ColorRGBA CMenus : : ms_ColorTabbarActiveOutgame ;
ColorRGBA CMenus : : ms_ColorTabbarInactive ;
ColorRGBA CMenus : : ms_ColorTabbarActive = ColorRGBA ( 0 , 0 , 0 , 0.5f ) ;
ColorRGBA CMenus : : ms_ColorTabbarInactiveIngame ;
ColorRGBA CMenus : : ms_ColorTabbarActiveIngame ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
float CMenus : : ms_ButtonHeight = 25.0f ;
float CMenus : : ms_ListheaderHeight = 17.0f ;
float CMenus : : ms_FontmodHeight = 0.8f ;
2008-10-06 18:05:01 +00:00
2010-05-29 07:25:38 +00:00
IInput : : CEvent CMenus : : m_aInputEvents [ MAX_INPUTEVENTS ] ;
int CMenus : : m_NumInputEvents ;
2008-08-30 09:28:31 +00:00
2010-05-29 07:25:38 +00:00
CMenus : : CMenus ( )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_NONE ;
m_ActivePage = PAGE_INTERNET ;
m_GamePage = PAGE_GAME ;
2011-04-13 18:37:12 +00:00
2010-10-16 09:24:42 +00:00
m_NeedRestartGraphics = false ;
m_NeedRestartSound = false ;
2010-05-29 07:25:38 +00:00
m_NeedSendinfo = false ;
2014-04-28 13:19:57 +00:00
m_NeedSendDummyinfo = false ;
2010-05-29 07:25:38 +00:00
m_MenuActive = true ;
m_UseMouseButtons = true ;
2016-05-03 13:11:52 +00:00
m_MouseSlow = false ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
m_EscapePressed = false ;
m_EnterPressed = false ;
2010-09-03 18:05:22 +00:00
m_DeletePressed = false ;
2010-05-29 07:25:38 +00:00
m_NumInputEvents = 0 ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
m_LastInput = time_get ( ) ;
2011-04-13 18:37:12 +00:00
2010-06-04 20:14:02 +00:00
str_copy ( m_aCurrentDemoFolder , " demos " , sizeof ( m_aCurrentDemoFolder ) ) ;
2010-10-09 18:34:17 +00:00
m_aCallvoteReason [ 0 ] = 0 ;
2011-03-23 12:06:35 +00:00
m_FriendlistSelectedIndex = - 1 ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
2011-04-09 06:41:31 +00:00
2014-08-23 15:48:04 +00:00
m_DemoPlayerState = DEMOPLAYER_NONE ;
2015-08-28 18:44:07 +00:00
m_Dummy = false ;
2008-08-27 15:48:50 +00:00
}
2019-04-26 21:47:34 +00:00
float CMenus : : ButtonColorMul ( const void * pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > ActiveItem ( ) = = pID )
2019-04-26 21:47:34 +00:00
return 0.5f ;
2009-10-27 14:38:53 +00:00
else if ( UI ( ) - > HotItem ( ) = = pID )
2019-04-26 21:47:34 +00:00
return 1.5f ;
return 1 ;
2008-08-27 15:48:50 +00:00
}
2010-11-17 18:46:50 +00:00
int CMenus : : DoButton_Icon ( int ImageId , int SpriteId , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2019-03-19 15:07:32 +00:00
int x = pRect - > x ;
int y = pRect - > y ;
int w = pRect - > w ;
int h = pRect - > h ;
// Square and center
if ( w > h )
{
x + = ( w - h ) / 2 ;
w = h ;
}
else if ( h > w )
{
y + = ( h - w ) / 2 ;
h = w ;
}
2010-11-17 18:46:50 +00:00
Graphics ( ) - > TextureSet ( g_pData - > m_aImages [ ImageId ] . m_Id ) ;
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
2010-11-17 18:46:50 +00:00
RenderTools ( ) - > SelectSprite ( SpriteId ) ;
2019-03-19 15:07:32 +00:00
IGraphics : : CQuadItem QuadItem ( x , y , w , h ) ;
2010-05-29 07:25:38 +00:00
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
return 0 ;
2008-08-27 15:48:50 +00:00
}
2012-01-10 22:03:23 +00:00
int CMenus : : DoButton_Toggle ( const void * pID , int Checked , const CUIRect * pRect , bool Active )
2011-04-06 18:18:31 +00:00
{
Graphics ( ) - > TextureSet ( g_pData - > m_aImages [ IMAGE_GUIBUTTONS ] . m_Id ) ;
Graphics ( ) - > QuadsBegin ( ) ;
2012-01-10 22:03:23 +00:00
if ( ! Active )
Graphics ( ) - > SetColor ( 1.0f , 1.0f , 1.0f , 0.5f ) ;
2011-04-06 18:18:31 +00:00
RenderTools ( ) - > SelectSprite ( Checked ? SPRITE_GUIBUTTON_ON : SPRITE_GUIBUTTON_OFF ) ;
IGraphics : : CQuadItem QuadItem ( pRect - > x , pRect - > y , pRect - > w , pRect - > h ) ;
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
2012-01-10 22:03:23 +00:00
if ( UI ( ) - > HotItem ( ) = = pID & & Active )
2011-04-06 18:18:31 +00:00
{
RenderTools ( ) - > SelectSprite ( SPRITE_GUIBUTTON_HOVER ) ;
IGraphics : : CQuadItem QuadItem ( pRect - > x , pRect - > y , pRect - > w , pRect - > h ) ;
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
}
Graphics ( ) - > QuadsEnd ( ) ;
2011-04-13 18:37:12 +00:00
2012-01-10 22:03:23 +00:00
return Active ? UI ( ) - > DoButtonLogic ( pID , " " , Checked , pRect ) : 0 ;
2011-04-06 18:18:31 +00:00
}
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
int CMenus : : DoButton_Menu ( const void * pID , const char * pText , int Checked , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( pRect , ColorRGBA ( 1 , 1 , 1 , 0.5f * ButtonColorMul ( pID ) ) , CUI : : CORNER_ALL , 5.0f ) ;
2011-04-01 15:57:04 +00:00
CUIRect Temp ;
pRect - > HMargin ( pRect - > h > = 20.0f ? 2.0f : 1.0f , & Temp ) ;
UI ( ) - > DoLabel ( & Temp , pText , Temp . h * ms_FontmodHeight , 0 ) ;
2009-10-27 14:38:53 +00:00
return UI ( ) - > DoButtonLogic ( pID , pText , Checked , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMenus : : DoButton_KeySelect ( const void * pID , const char * pText , int Checked , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( pRect , ColorRGBA ( 1 , 1 , 1 , 0.5f * ButtonColorMul ( pID ) ) , CUI : : CORNER_ALL , 5.0f ) ;
2011-04-01 15:57:04 +00:00
CUIRect Temp ;
pRect - > HMargin ( 1.0f , & Temp ) ;
UI ( ) - > DoLabel ( & Temp , pText , Temp . h * ms_FontmodHeight , 0 ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int CMenus : : DoButton_MenuTab ( const void * pID , const char * pText , int Checked , const CUIRect * pRect , int Corners )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( Checked )
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > DrawUIRect ( pRect , ms_ColorTabbarActive , Corners , 10.0f ) ;
2008-08-27 15:48:50 +00:00
else
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > DrawUIRect ( pRect , ms_ColorTabbarInactive , Corners , 10.0f ) ;
2011-04-01 15:57:04 +00:00
CUIRect Temp ;
pRect - > HMargin ( 2.0f , & Temp ) ;
UI ( ) - > DoLabel ( & Temp , pText , Temp . h * ms_FontmodHeight , 0 ) ;
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
return UI ( ) - > DoButtonLogic ( pID , pText , Checked , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int CMenus : : DoButton_GridHeader ( const void * pID , const char * pText , int Checked , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2020-08-24 21:23:37 +00:00
if ( Checked = = 2 )
RenderTools ( ) - > DrawUIRect ( pRect , ColorRGBA ( 1 , 0.98f , 0.5f , 0.55f ) , CUI : : CORNER_T , 5.0f ) ;
else if ( Checked )
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( pRect , ColorRGBA ( 1 , 1 , 1 , 0.5f ) , CUI : : CORNER_T , 5.0f ) ;
2009-10-27 14:38:53 +00:00
CUIRect t ;
pRect - > VSplitLeft ( 5.0f , 0 , & t ) ;
2010-05-29 07:25:38 +00:00
UI ( ) - > DoLabel ( & t , pText , pRect - > h * ms_FontmodHeight , - 1 ) ;
2009-10-27 14:38:53 +00:00
return UI ( ) - > DoButtonLogic ( pID , pText , Checked , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int CMenus : : DoButton_CheckBox_Common ( const void * pID , const char * pText , const char * pBoxText , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
CUIRect c = * pRect ;
CUIRect t = * pRect ;
2008-08-27 15:48:50 +00:00
c . w = c . h ;
t . x + = c . w ;
t . w - = c . w ;
2009-10-27 14:38:53 +00:00
t . VSplitLeft ( 5.0f , 0 , & t ) ;
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
c . Margin ( 2.0f , & c ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & c , ColorRGBA ( 1 , 1 , 1 , 0.25f * ButtonColorMul ( pID ) ) , CUI : : CORNER_ALL , 3.0f ) ;
2018-03-13 20:59:07 +00:00
2018-03-21 14:53:29 +00:00
TextRender ( ) - > SetRenderFlags ( ETextRenderFlags : : TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags : : TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags : : TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags : : TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT ) ;
2018-03-13 20:59:07 +00:00
bool CheckAble = * pBoxText = = ' X ' ;
if ( CheckAble )
{
TextRender ( ) - > SetCurFont ( TextRender ( ) - > GetFont ( TEXT_FONT_ICON_FONT ) ) ;
2019-03-19 15:31:24 +00:00
UI ( ) - > DoLabel ( & c , " \xEE \x97 \x8D " , c . h * ms_FontmodHeight , 0 ) ;
2018-03-13 20:59:07 +00:00
TextRender ( ) - > SetCurFont ( NULL ) ;
}
else
UI ( ) - > DoLabel ( & c , pBoxText , c . h * ms_FontmodHeight , 0 ) ;
TextRender ( ) - > SetRenderFlags ( 0 ) ;
UI ( ) - > DoLabel ( & t , pText , c . h * ms_FontmodHeight , - 1 ) ;
2009-10-27 14:38:53 +00:00
return UI ( ) - > DoButtonLogic ( pID , pText , 0 , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int CMenus : : DoButton_CheckBox ( const void * pID , const char * pText , int Checked , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
return DoButton_CheckBox_Common ( pID , pText , Checked ? " X " : " " , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int CMenus : : DoButton_CheckBox_Number ( const void * pID , const char * pText , int Checked , const CUIRect * pRect )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
char aBuf [ 16 ] ;
str_format ( aBuf , sizeof ( aBuf ) , " %d " , Checked ) ;
return DoButton_CheckBox_Common ( pID , pText , aBuf , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2014-12-24 02:38:40 +00:00
int CMenus : : DoEditBox ( void * pID , const CUIRect * pRect , char * pStr , unsigned StrSize , float FontSize , float * Offset , bool Hidden , int Corners , const char * pEmptyText )
2008-08-27 15:48:50 +00:00
{
2011-04-13 18:37:12 +00:00
int Inside = UI ( ) - > MouseInside ( pRect ) ;
2010-05-29 07:25:38 +00:00
bool ReturnValue = false ;
2010-10-10 23:36:46 +00:00
bool UpdateOffset = false ;
2010-05-29 07:25:38 +00:00
static int s_AtIndex = 0 ;
2010-10-10 23:36:46 +00:00
static bool s_DoScroll = false ;
static float s_ScrollStart = 0.0f ;
2008-08-27 15:48:50 +00:00
2010-12-14 00:20:47 +00:00
FontSize * = UI ( ) - > Scale ( ) ;
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > LastActiveItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
int Len = str_length ( pStr ) ;
if ( Len = = 0 )
s_AtIndex = 0 ;
2011-04-13 18:37:12 +00:00
2016-04-30 18:11:26 +00:00
if ( Input ( ) - > KeyIsPressed ( KEY_LCTRL ) & & Input ( ) - > KeyPress ( KEY_V ) )
2015-08-25 12:24:46 +00:00
{
const char * Text = Input ( ) - > GetClipboardText ( ) ;
2015-08-26 14:40:59 +00:00
if ( Text )
2015-08-25 12:24:46 +00:00
{
2015-08-26 14:40:59 +00:00
int Offset = str_length ( pStr ) ;
2016-05-11 15:51:22 +00:00
int CharsLeft = StrSize - Offset - 1 ;
for ( int i = 0 ; i < str_length ( Text ) & & i < CharsLeft ; i + + )
2015-08-26 14:40:59 +00:00
{
if ( Text [ i ] = = ' \n ' )
pStr [ i + Offset ] = ' ' ;
else
pStr [ i + Offset ] = Text [ i ] ;
}
s_AtIndex = str_length ( pStr ) ;
2019-06-02 19:55:38 +00:00
ReturnValue = true ;
2015-08-25 12:24:46 +00:00
}
}
2016-04-30 18:11:26 +00:00
if ( Input ( ) - > KeyIsPressed ( KEY_LCTRL ) & & Input ( ) - > KeyPress ( KEY_C ) )
2015-08-25 12:24:46 +00:00
{
Input ( ) - > SetClipboardText ( pStr ) ;
}
2020-08-16 16:57:41 +00:00
/* TODO: Doesn't work, SetClipboardText doesn't retain the string quickly enough?
if ( Input ( ) - > KeyIsPressed ( KEY_LCTRL ) & & Input ( ) - > KeyPress ( KEY_X ) )
{
Input ( ) - > SetClipboardText ( pStr ) ;
pStr [ 0 ] = ' \0 ' ;
s_AtIndex = 0 ;
ReturnValue = true ;
}
*/
if ( Input ( ) - > KeyIsPressed ( KEY_LCTRL ) & & Input ( ) - > KeyPress ( KEY_U ) )
{
pStr [ 0 ] = ' \0 ' ;
s_AtIndex = 0 ;
ReturnValue = true ;
}
2009-10-27 14:38:53 +00:00
if ( Inside & & UI ( ) - > MouseButton ( 0 ) )
2008-08-27 15:48:50 +00:00
{
2010-10-10 23:36:46 +00:00
s_DoScroll = true ;
s_ScrollStart = UI ( ) - > MouseX ( ) ;
2010-05-29 07:25:38 +00:00
int MxRel = ( int ) ( UI ( ) - > MouseX ( ) - pRect - > x ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
for ( int i = 1 ; i < = Len ; i + + )
2008-08-27 15:48:50 +00:00
{
2020-07-15 19:10:13 +00:00
if ( TextRender ( ) - > TextWidth ( 0 , FontSize , pStr , i , - 1.0f ) - * Offset > MxRel )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
s_AtIndex = i - 1 ;
2008-08-27 15:48:50 +00:00
break ;
}
2010-05-29 07:25:38 +00:00
if ( i = = Len )
s_AtIndex = Len ;
2008-08-27 15:48:50 +00:00
}
}
2010-10-10 23:36:46 +00:00
else if ( ! UI ( ) - > MouseButton ( 0 ) )
s_DoScroll = false ;
else if ( s_DoScroll )
{
// do scrolling
if ( UI ( ) - > MouseX ( ) < pRect - > x & & s_ScrollStart - UI ( ) - > MouseX ( ) > 10.0f )
{
2019-04-26 19:36:49 +00:00
s_AtIndex = maximum ( 0 , s_AtIndex - 1 ) ;
2010-10-10 23:36:46 +00:00
s_ScrollStart = UI ( ) - > MouseX ( ) ;
UpdateOffset = true ;
}
else if ( UI ( ) - > MouseX ( ) > pRect - > x + pRect - > w & & UI ( ) - > MouseX ( ) - s_ScrollStart > 10.0f )
{
2019-04-26 19:36:49 +00:00
s_AtIndex = minimum ( Len , s_AtIndex + 1 ) ;
2010-10-10 23:36:46 +00:00
s_ScrollStart = UI ( ) - > MouseX ( ) ;
UpdateOffset = true ;
}
}
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
for ( int i = 0 ; i < m_NumInputEvents ; i + + )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
Len = str_length ( pStr ) ;
2013-04-01 18:30:58 +00:00
int NumChars = Len ;
ReturnValue | = CLineInput : : Manipulate ( m_aInputEvents [ i ] , pStr , StrSize , StrSize , & Len , & s_AtIndex , & NumChars ) ;
2008-08-27 15:48:50 +00:00
}
}
2009-10-27 14:38:53 +00:00
bool JustGotActive = false ;
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > ActiveItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( ! UI ( ) - > MouseButton ( 0 ) )
2010-10-10 23:36:46 +00:00
{
2019-04-26 19:36:49 +00:00
s_AtIndex = minimum ( s_AtIndex , str_length ( pStr ) ) ;
2010-10-10 23:36:46 +00:00
s_DoScroll = false ;
2009-10-27 14:38:53 +00:00
UI ( ) - > SetActiveItem ( 0 ) ;
2010-10-10 23:36:46 +00:00
}
2008-08-27 15:48:50 +00:00
}
2009-10-27 14:38:53 +00:00
else if ( UI ( ) - > HotItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > MouseButton ( 0 ) )
2008-08-27 15:48:50 +00:00
{
2018-03-13 20:59:07 +00:00
if ( UI ( ) - > LastActiveItem ( ) ! = pID )
2009-10-27 14:38:53 +00:00
JustGotActive = true ;
UI ( ) - > SetActiveItem ( pID ) ;
2008-08-27 15:48:50 +00:00
}
}
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
if ( Inside )
2014-06-16 11:29:18 +00:00
{
2009-10-27 14:38:53 +00:00
UI ( ) - > SetHotItem ( pID ) ;
2014-06-16 11:29:18 +00:00
}
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
CUIRect Textbox = * pRect ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Textbox , ColorRGBA ( 1 , 1 , 1 , 0.5f ) , Corners , 3.0f ) ;
2010-05-30 12:01:11 +00:00
Textbox . VMargin ( 2.0f , & Textbox ) ;
Textbox . HMargin ( 2.0f , & Textbox ) ;
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
const char * pDisplayStr = pStr ;
char aStars [ 128 ] ;
2011-04-13 18:37:12 +00:00
2014-12-24 02:38:40 +00:00
if ( pDisplayStr [ 0 ] = = ' \0 ' )
{
pDisplayStr = pEmptyText ;
TextRender ( ) - > TextColor ( 1 , 1 , 1 , 0.75f ) ;
}
2009-10-27 14:38:53 +00:00
if ( Hidden )
2008-08-27 15:48:50 +00:00
{
2014-12-24 02:38:40 +00:00
unsigned s = str_length ( pDisplayStr ) ;
2009-10-27 14:38:53 +00:00
if ( s > = sizeof ( aStars ) )
s = sizeof ( aStars ) - 1 ;
2010-05-29 07:25:38 +00:00
for ( unsigned int i = 0 ; i < s ; + + i )
aStars [ i ] = ' * ' ;
2009-10-27 14:38:53 +00:00
aStars [ s ] = 0 ;
pDisplayStr = aStars ;
2008-08-27 15:48:50 +00:00
}
2016-08-15 05:16:06 +00:00
char aInputing [ 32 ] = { 0 } ;
if ( UI ( ) - > HotItem ( ) = = pID & & Input ( ) - > GetIMEState ( ) )
{
2017-07-26 01:58:00 +00:00
str_copy ( aInputing , pStr , sizeof ( aInputing ) ) ;
2016-08-15 05:16:06 +00:00
const char * Text = Input ( ) - > GetIMECandidate ( ) ;
2018-03-13 20:59:07 +00:00
if ( str_length ( Text ) )
2016-08-15 05:16:06 +00:00
{
int NewTextLen = str_length ( Text ) ;
int CharsLeft = StrSize - str_length ( aInputing ) - 1 ;
2019-04-26 19:36:49 +00:00
int FillCharLen = minimum ( NewTextLen , CharsLeft ) ;
2016-08-15 05:16:06 +00:00
//Push Char Backward
for ( int i = str_length ( aInputing ) ; i > = s_AtIndex ; i - - )
aInputing [ i + FillCharLen ] = aInputing [ i ] ;
for ( int i = 0 ; i < FillCharLen ; i + + )
{
if ( Text [ i ] = = ' \n ' )
aInputing [ s_AtIndex + i ] = ' ' ;
else
aInputing [ s_AtIndex + i ] = Text [ i ] ;
}
2017-02-21 16:10:08 +00:00
//s_AtIndex = s_AtIndex+FillCharLen;
2016-08-15 05:16:06 +00:00
pDisplayStr = aInputing ;
}
}
2010-05-29 15:53:57 +00:00
// check if the text has to be moved
2010-10-10 23:36:46 +00:00
if ( UI ( ) - > LastActiveItem ( ) = = pID & & ! JustGotActive & & ( UpdateOffset | | m_NumInputEvents ) )
2010-05-29 15:53:57 +00:00
{
2020-07-15 19:10:13 +00:00
float w = TextRender ( ) - > TextWidth ( 0 , FontSize , pDisplayStr , s_AtIndex , - 1.0f ) ;
2010-05-29 15:53:57 +00:00
if ( w - * Offset > Textbox . w )
{
// move to the left
2020-07-15 19:10:13 +00:00
float wt = TextRender ( ) - > TextWidth ( 0 , FontSize , pDisplayStr , - 1 , - 1.0f ) ;
2010-05-29 15:53:57 +00:00
do
{
2019-04-26 19:36:49 +00:00
* Offset + = minimum ( wt - * Offset - Textbox . w , Textbox . w / 3 ) ;
2010-05-29 15:53:57 +00:00
}
while ( w - * Offset > Textbox . w ) ;
}
else if ( w - * Offset < 0.0f )
{
// move to the right
do
{
2019-04-26 19:36:49 +00:00
* Offset = maximum ( 0.0f , * Offset - Textbox . w / 3 ) ;
2010-05-29 15:53:57 +00:00
}
while ( w - * Offset < 0.0f ) ;
}
}
UI ( ) - > ClipEnable ( pRect ) ;
2010-12-14 00:20:47 +00:00
Textbox . x - = * Offset ;
2010-05-29 15:53:57 +00:00
2009-10-27 14:38:53 +00:00
UI ( ) - > DoLabel ( & Textbox , pDisplayStr , FontSize , - 1 ) ;
2014-12-24 02:38:40 +00:00
TextRender ( ) - > TextColor ( 1 , 1 , 1 , 1 ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 15:53:57 +00:00
// render the cursor
2010-05-29 07:25:38 +00:00
if ( UI ( ) - > LastActiveItem ( ) = = pID & & ! JustGotActive )
2008-08-27 15:48:50 +00:00
{
2018-03-13 20:59:07 +00:00
if ( str_length ( aInputing ) )
2016-08-15 05:16:06 +00:00
{
2020-07-15 19:10:13 +00:00
float w = TextRender ( ) - > TextWidth ( 0 , FontSize , pDisplayStr , s_AtIndex + Input ( ) - > GetEditingCursor ( ) , - 1.0f ) ;
2016-08-15 05:16:06 +00:00
Textbox = * pRect ;
Textbox . VSplitLeft ( 2.0f , 0 , & Textbox ) ;
2020-07-15 19:10:13 +00:00
Textbox . x + = ( w - * Offset - TextRender ( ) - > TextWidth ( 0 , FontSize , " | " , - 1 , - 1.0f ) / 2 ) ;
2016-08-15 05:16:06 +00:00
UI ( ) - > DoLabel ( & Textbox , " | " , FontSize , - 1 ) ;
}
2020-07-15 19:10:13 +00:00
float w = TextRender ( ) - > TextWidth ( 0 , FontSize , pDisplayStr , s_AtIndex , - 1.0f ) ;
2010-05-29 07:25:38 +00:00
Textbox = * pRect ;
Textbox . VSplitLeft ( 2.0f , 0 , & Textbox ) ;
2020-07-15 19:10:13 +00:00
Textbox . x + = ( w - * Offset - TextRender ( ) - > TextWidth ( 0 , FontSize , " | " , - 1 , - 1.0f ) / 2 ) ;
2010-05-30 12:01:11 +00:00
2010-05-29 15:53:57 +00:00
if ( ( 2 * time_get ( ) / time_freq ( ) ) % 2 ) // make it blink
2010-05-30 12:01:11 +00:00
UI ( ) - > DoLabel ( & Textbox , " | " , FontSize , - 1 ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 15:53:57 +00:00
UI ( ) - > ClipDisable ( ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
return ReturnValue ;
2008-08-27 15:48:50 +00:00
}
2018-09-20 05:43:05 +00:00
int CMenus : : DoClearableEditBox ( void * pID , void * pClearID , const CUIRect * pRect , char * pStr , unsigned StrSize , float FontSize , float * Offset , bool Hidden , int Corners , const char * pEmptyText )
{
bool ReturnValue = false ;
CUIRect EditBox ;
CUIRect ClearButton ;
pRect - > VSplitRight ( 15.0f , & EditBox , & ClearButton ) ;
if ( DoEditBox ( pID , & EditBox , pStr , StrSize , FontSize , Offset , Hidden , Corners & ~ CUI : : CORNER_R , pEmptyText ) )
{
ReturnValue = true ;
}
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & ClearButton , ColorRGBA ( 1 , 1 , 1 , 0.33f * ButtonColorMul ( pID ) ) , Corners & ~ CUI : : CORNER_L , 3.0f ) ;
2018-09-20 05:43:05 +00:00
UI ( ) - > DoLabel ( & ClearButton , " × " , ClearButton . h * ms_FontmodHeight , 0 ) ;
if ( UI ( ) - > DoButtonLogic ( pClearID , " × " , 0 , & ClearButton ) )
{
pStr [ 0 ] = 0 ;
UI ( ) - > SetActiveItem ( pID ) ;
ReturnValue = true ;
}
return ReturnValue ;
}
2010-05-29 07:25:38 +00:00
float CMenus : : DoScrollbarV ( const void * pID , const CUIRect * pRect , float Current )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
CUIRect Handle ;
static float OffsetY ;
pRect - > HSplitTop ( 33 , & Handle , 0 ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
Handle . y + = ( pRect - > h - Handle . h ) * Current ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
// logic
2011-04-13 18:37:12 +00:00
float ReturnValue = Current ;
int Inside = UI ( ) - > MouseInside ( & Handle ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > ActiveItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( ! UI ( ) - > MouseButton ( 0 ) )
UI ( ) - > SetActiveItem ( 0 ) ;
2011-04-13 18:37:12 +00:00
2016-05-03 13:11:52 +00:00
if ( Input ( ) - > KeyIsPressed ( KEY_LSHIFT ) | | Input ( ) - > KeyIsPressed ( KEY_RSHIFT ) )
m_MouseSlow = true ;
2010-05-29 07:25:38 +00:00
float Min = pRect - > y ;
float Max = pRect - > h - Handle . h ;
float Cur = UI ( ) - > MouseY ( ) - OffsetY ;
ReturnValue = ( Cur - Min ) / Max ;
2009-10-27 14:38:53 +00:00
if ( ReturnValue < 0.0f ) ReturnValue = 0.0f ;
if ( ReturnValue > 1.0f ) ReturnValue = 1.0f ;
2008-08-27 15:48:50 +00:00
}
2009-10-27 14:38:53 +00:00
else if ( UI ( ) - > HotItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > MouseButton ( 0 ) )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
UI ( ) - > SetActiveItem ( pID ) ;
OffsetY = UI ( ) - > MouseY ( ) - Handle . y ;
2008-08-27 15:48:50 +00:00
}
}
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
if ( Inside )
UI ( ) - > SetHotItem ( pID ) ;
2008-08-27 15:48:50 +00:00
// render
2009-10-27 14:38:53 +00:00
CUIRect Rail ;
pRect - > VMargin ( 5.0f , & Rail ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Rail , ColorRGBA ( 1 , 1 , 1 , 0.25f ) , 0 , 0.0f ) ;
2009-10-27 14:38:53 +00:00
CUIRect Slider = Handle ;
Slider . w = Rail . x - Slider . x ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Slider , ColorRGBA ( 1 , 1 , 1 , 0.25f ) , CUI : : CORNER_L , 2.5f ) ;
2009-10-27 14:38:53 +00:00
Slider . x = Rail . x + Rail . w ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Slider , ColorRGBA ( 1 , 1 , 1 , 0.25f ) , CUI : : CORNER_R , 2.5f ) ;
2009-10-27 14:38:53 +00:00
Slider = Handle ;
Slider . Margin ( 5.0f , & Slider ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Slider , ColorRGBA ( 1 , 1 , 1 , 0.25f * ButtonColorMul ( pID ) ) , CUI : : CORNER_ALL , 2.5f ) ;
2011-04-13 18:37:12 +00:00
return ReturnValue ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
float CMenus : : DoScrollbarH ( const void * pID , const CUIRect * pRect , float Current )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
CUIRect Handle ;
static float OffsetX ;
pRect - > VSplitLeft ( 33 , & Handle , 0 ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
Handle . x + = ( pRect - > w - Handle . w ) * Current ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
// logic
2011-04-13 18:37:12 +00:00
float ReturnValue = Current ;
int Inside = UI ( ) - > MouseInside ( & Handle ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > ActiveItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( ! UI ( ) - > MouseButton ( 0 ) )
UI ( ) - > SetActiveItem ( 0 ) ;
2011-04-13 18:37:12 +00:00
2016-05-03 13:11:52 +00:00
if ( Input ( ) - > KeyIsPressed ( KEY_LSHIFT ) | | Input ( ) - > KeyIsPressed ( KEY_RSHIFT ) )
m_MouseSlow = true ;
2010-05-29 07:25:38 +00:00
float Min = pRect - > x ;
float Max = pRect - > w - Handle . w ;
float Cur = UI ( ) - > MouseX ( ) - OffsetX ;
ReturnValue = ( Cur - Min ) / Max ;
2009-10-27 14:38:53 +00:00
if ( ReturnValue < 0.0f ) ReturnValue = 0.0f ;
if ( ReturnValue > 1.0f ) ReturnValue = 1.0f ;
2008-08-27 15:48:50 +00:00
}
2009-10-27 14:38:53 +00:00
else if ( UI ( ) - > HotItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > MouseButton ( 0 ) )
2008-08-27 15:48:50 +00:00
{
2009-10-27 14:38:53 +00:00
UI ( ) - > SetActiveItem ( pID ) ;
OffsetX = UI ( ) - > MouseX ( ) - Handle . x ;
2008-08-27 15:48:50 +00:00
}
}
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
if ( Inside )
UI ( ) - > SetHotItem ( pID ) ;
2008-08-27 15:48:50 +00:00
// render
2009-10-27 14:38:53 +00:00
CUIRect Rail ;
pRect - > HMargin ( 5.0f , & Rail ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Rail , ColorRGBA ( 1 , 1 , 1 , 0.25f ) , 0 , 0.0f ) ;
2009-10-27 14:38:53 +00:00
CUIRect Slider = Handle ;
Slider . h = Rail . y - Slider . y ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Slider , ColorRGBA ( 1 , 1 , 1 , 0.25f ) , CUI : : CORNER_T , 2.5f ) ;
2009-10-27 14:38:53 +00:00
Slider . y = Rail . y + Rail . h ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Slider , ColorRGBA ( 1 , 1 , 1 , 0.25f ) , CUI : : CORNER_B , 2.5f ) ;
2009-10-27 14:38:53 +00:00
Slider = Handle ;
Slider . Margin ( 5.0f , & Slider ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Slider , ColorRGBA ( 1 , 1 , 1 , 0.25f * ButtonColorMul ( pID ) ) , CUI : : CORNER_ALL , 2.5f ) ;
2011-04-13 18:37:12 +00:00
return ReturnValue ;
2008-08-27 15:48:50 +00:00
}
2019-04-28 17:22:19 +00:00
int CMenus : : DoKeyReader ( void * pID , const CUIRect * pRect , int Key , int Modifier , int * NewModifier )
2008-08-27 15:48:50 +00:00
{
// process
2009-10-27 14:38:53 +00:00
static void * pGrabbedID = 0 ;
static bool MouseReleased = true ;
2010-09-12 15:15:09 +00:00
static int ButtonUsed = 0 ;
2009-10-27 14:38:53 +00:00
int Inside = UI ( ) - > MouseInside ( pRect ) ;
int NewKey = Key ;
2019-04-28 17:22:19 +00:00
* NewModifier = Modifier ;
2011-04-13 18:37:12 +00:00
2010-09-12 15:15:09 +00:00
if ( ! UI ( ) - > MouseButton ( 0 ) & & ! UI ( ) - > MouseButton ( 1 ) & & pGrabbedID = = pID )
2009-10-27 14:38:53 +00:00
MouseReleased = true ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
if ( UI ( ) - > ActiveItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( m_Binder . m_GotKey )
2008-08-27 15:48:50 +00:00
{
2010-09-12 11:40:24 +00:00
// abort with escape key
if ( m_Binder . m_Key . m_Key ! = KEY_ESCAPE )
2019-04-28 17:22:19 +00:00
{
2010-09-12 11:40:24 +00:00
NewKey = m_Binder . m_Key . m_Key ;
2019-04-28 17:22:19 +00:00
* NewModifier = m_Binder . m_Modifier ;
}
2010-05-29 07:25:38 +00:00
m_Binder . m_GotKey = false ;
2009-10-27 14:38:53 +00:00
UI ( ) - > SetActiveItem ( 0 ) ;
MouseReleased = false ;
pGrabbedID = pID ;
2008-08-27 15:48:50 +00:00
}
2010-09-12 15:15:09 +00:00
if ( ButtonUsed = = 1 & & ! UI ( ) - > MouseButton ( 1 ) )
{
if ( Inside )
NewKey = 0 ;
UI ( ) - > SetActiveItem ( 0 ) ;
}
2008-08-27 15:48:50 +00:00
}
2009-10-27 14:38:53 +00:00
else if ( UI ( ) - > HotItem ( ) = = pID )
2008-08-27 15:48:50 +00:00
{
2010-09-12 15:15:09 +00:00
if ( MouseReleased )
2008-10-20 23:10:00 +00:00
{
2010-09-12 15:15:09 +00:00
if ( UI ( ) - > MouseButton ( 0 ) )
{
m_Binder . m_TakeKey = true ;
m_Binder . m_GotKey = false ;
UI ( ) - > SetActiveItem ( pID ) ;
ButtonUsed = 0 ;
}
if ( UI ( ) - > MouseButton ( 1 ) )
{
UI ( ) - > SetActiveItem ( pID ) ;
ButtonUsed = 1 ;
}
2008-10-20 23:10:00 +00:00
}
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2009-10-27 14:38:53 +00:00
if ( Inside )
UI ( ) - > SetHotItem ( pID ) ;
2008-08-27 15:48:50 +00:00
// draw
2018-03-13 20:59:07 +00:00
if ( UI ( ) - > ActiveItem ( ) = = pID & & ButtonUsed = = 0 )
2009-10-27 14:38:53 +00:00
DoButton_KeySelect ( pID , " ??? " , 0 , pRect ) ;
2008-08-27 15:48:50 +00:00
else
{
2019-04-28 17:22:19 +00:00
if ( Key )
{
char aBuf [ 64 ] ;
if ( * NewModifier )
str_format ( aBuf , sizeof ( aBuf ) , " %s+%s " , CBinds : : GetModifierName ( * NewModifier ) , Input ( ) - > KeyName ( Key ) ) ;
else
str_format ( aBuf , sizeof ( aBuf ) , " %s " , Input ( ) - > KeyName ( Key ) ) ;
DoButton_KeySelect ( pID , aBuf , 0 , pRect ) ;
}
2008-08-27 15:48:50 +00:00
else
2019-04-28 17:22:19 +00:00
DoButton_KeySelect ( pID , " " , 0 , pRect ) ;
2008-08-27 15:48:50 +00:00
}
2009-10-27 14:38:53 +00:00
return NewKey ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int CMenus : : RenderMenubar ( CUIRect r )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CUIRect Box = r ;
CUIRect Button ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
m_ActivePage = g_Config . m_UiPage ;
int NewPage = - 1 ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
if ( Client ( ) - > State ( ) ! = IClient : : STATE_OFFLINE )
m_ActivePage = m_GamePage ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
if ( Client ( ) - > State ( ) = = IClient : : STATE_OFFLINE )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
// offline menus
2020-06-20 12:55:44 +00:00
Box . VSplitLeft ( 60.0f , & Button , & Box ) ;
2014-06-05 10:11:41 +00:00
static int s_NewsButton = 0 ;
2020-06-19 15:04:35 +00:00
if ( DoButton_MenuTab ( & s_NewsButton , Localize ( " News " ) , m_ActivePage = = PAGE_NEWS , & Button , CUI : : CORNER_TL ) )
2014-06-16 11:29:18 +00:00
{
2014-06-05 10:11:41 +00:00
NewPage = PAGE_NEWS ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
}
2020-06-20 12:55:44 +00:00
Box . VSplitLeft ( 60.0f , & Button , & Box ) ;
2020-06-19 15:04:35 +00:00
static int s_LearnButton = 0 ;
if ( DoButton_MenuTab ( & s_LearnButton , Localize ( " Learn " ) , false , & Button , CUI : : CORNER_TR ) )
{
if ( ! open_link ( " https://wiki.ddnet.tw/ " ) )
{
dbg_msg ( " menus " , " couldn't open link " ) ;
}
m_DoubleClickIndex = - 1 ;
}
2020-06-20 12:55:44 +00:00
Box . VSplitLeft ( 5.0f , 0 , & Box ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
Box . VSplitLeft ( 100.0f , & Button , & Box ) ;
static int s_InternetButton = 0 ;
if ( DoButton_MenuTab ( & s_InternetButton , Localize ( " Internet " ) , m_ActivePage = = PAGE_INTERNET , & Button , CUI : : CORNER_TL ) )
2008-08-27 15:48:50 +00:00
{
2015-05-11 19:51:06 +00:00
if ( ServerBrowser ( ) - > GetCurrentType ( ) ! = IServerBrowser : : TYPE_INTERNET )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_INTERNET ) ;
2010-05-29 07:25:38 +00:00
NewPage = PAGE_INTERNET ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
2008-08-27 15:48:50 +00:00
}
2014-09-20 11:37:00 +00:00
Box . VSplitLeft ( 60.0f , & Button , & Box ) ;
2010-05-29 07:25:38 +00:00
static int s_LanButton = 0 ;
if ( DoButton_MenuTab ( & s_LanButton , Localize ( " LAN " ) , m_ActivePage = = PAGE_LAN , & Button , 0 ) )
2008-08-27 15:48:50 +00:00
{
2015-05-11 19:51:06 +00:00
if ( ServerBrowser ( ) - > GetCurrentType ( ) ! = IServerBrowser : : TYPE_LAN )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_LAN ) ;
2010-05-29 07:25:38 +00:00
NewPage = PAGE_LAN ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
2008-08-27 15:48:50 +00:00
}
2014-09-20 11:37:00 +00:00
Box . VSplitLeft ( 100.0f , & Button , & Box ) ;
2010-05-29 07:25:38 +00:00
static int s_FavoritesButton = 0 ;
2014-09-13 14:36:25 +00:00
if ( DoButton_MenuTab ( & s_FavoritesButton , Localize ( " Favorites " ) , m_ActivePage = = PAGE_FAVORITES , & Button , 0 ) )
2008-08-27 15:48:50 +00:00
{
2015-05-11 19:51:06 +00:00
if ( ServerBrowser ( ) - > GetCurrentType ( ) ! = IServerBrowser : : TYPE_FAVORITES )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_FAVORITES ) ;
2011-04-13 18:37:12 +00:00
NewPage = PAGE_FAVORITES ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2019-03-24 22:15:38 +00:00
Box . VSplitLeft ( 80.0f , & Button , & Box ) ;
2014-09-13 14:36:25 +00:00
static int s_DDNetButton = 0 ;
2019-03-24 22:15:38 +00:00
if ( DoButton_MenuTab ( & s_DDNetButton , " DDNet " , m_ActivePage = = PAGE_DDNET , & Button , 0 ) )
2014-09-13 14:36:25 +00:00
{
2015-05-11 19:51:06 +00:00
if ( ServerBrowser ( ) - > GetCurrentType ( ) ! = IServerBrowser : : TYPE_DDNET )
2017-09-03 15:36:51 +00:00
{
Client ( ) - > RequestDDNetInfo ( ) ;
2015-05-11 19:51:06 +00:00
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_DDNET ) ;
2017-09-03 15:36:51 +00:00
}
2014-09-13 14:36:25 +00:00
NewPage = PAGE_DDNET ;
m_DoubleClickIndex = - 1 ;
}
2019-03-24 22:15:38 +00:00
Box . VSplitLeft ( 60.0f , & Button , & Box ) ;
static int s_KoGButton = 0 ;
if ( DoButton_MenuTab ( & s_KoGButton , " KoG " , m_ActivePage = = PAGE_KOG , & Button , CUI : : CORNER_TR ) )
{
if ( ServerBrowser ( ) - > GetCurrentType ( ) ! = IServerBrowser : : TYPE_KOG )
{
Client ( ) - > RequestDDNetInfo ( ) ;
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_KOG ) ;
}
NewPage = PAGE_KOG ;
m_DoubleClickIndex = - 1 ;
}
2020-06-20 12:55:44 +00:00
Box . VSplitLeft ( 5.0f , 0 , & Box ) ;
Box . VSplitLeft ( 80.0f , & Button , & Box ) ;
2010-05-29 07:25:38 +00:00
static int s_DemosButton = 0 ;
if ( DoButton_MenuTab ( & s_DemosButton , Localize ( " Demos " ) , m_ActivePage = = PAGE_DEMOS , & Button , CUI : : CORNER_T ) )
2008-10-06 18:05:01 +00:00
{
2010-05-29 07:25:38 +00:00
DemolistPopulate ( ) ;
2011-04-13 18:37:12 +00:00
NewPage = PAGE_DEMOS ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
2011-04-13 18:37:12 +00:00
}
2008-08-27 15:48:50 +00:00
}
else
{
2010-05-29 07:25:38 +00:00
// online menus
Box . VSplitLeft ( 90.0f , & Button , & Box ) ;
static int s_GameButton = 0 ;
2011-04-06 18:18:31 +00:00
if ( DoButton_MenuTab ( & s_GameButton , Localize ( " Game " ) , m_ActivePage = = PAGE_GAME , & Button , CUI : : CORNER_TL ) )
2010-05-29 07:25:38 +00:00
NewPage = PAGE_GAME ;
2011-04-06 18:18:31 +00:00
Box . VSplitLeft ( 90.0f , & Button , & Box ) ;
static int s_PlayersButton = 0 ;
if ( DoButton_MenuTab ( & s_PlayersButton , Localize ( " Players " ) , m_ActivePage = = PAGE_PLAYERS , & Button , 0 ) )
NewPage = PAGE_PLAYERS ;
Box . VSplitLeft ( 130.0f , & Button , & Box ) ;
2010-05-29 07:25:38 +00:00
static int s_ServerInfoButton = 0 ;
2011-04-06 18:18:31 +00:00
if ( DoButton_MenuTab ( & s_ServerInfoButton , Localize ( " Server info " ) , m_ActivePage = = PAGE_SERVER_INFO , & Button , 0 ) )
2010-05-29 07:25:38 +00:00
NewPage = PAGE_SERVER_INFO ;
2016-04-27 18:14:03 +00:00
Box . VSplitLeft ( 90.0f , & Button , & Box ) ;
static int s_NetworkButton = 0 ;
if ( DoButton_MenuTab ( & s_NetworkButton , Localize ( " Browser " ) , m_ActivePage = = PAGE_NETWORK , & Button , 0 ) )
NewPage = PAGE_NETWORK ;
2016-04-28 20:40:46 +00:00
{
2019-07-18 15:56:01 +00:00
static int s_GhostButton = 0 ;
2019-06-03 19:52:14 +00:00
if ( GameClient ( ) - > m_GameInfo . m_Race )
2016-04-28 20:40:46 +00:00
{
Box . VSplitLeft ( 70.0f , & Button , & Box ) ;
if ( DoButton_MenuTab ( & s_GhostButton , Localize ( " Ghost " ) , m_ActivePage = = PAGE_GHOST , & Button , 0 ) )
NewPage = PAGE_GHOST ;
}
}
2010-05-29 07:25:38 +00:00
2011-04-09 20:45:34 +00:00
Box . VSplitLeft ( 100.0f , & Button , & Box ) ;
2010-05-29 07:25:38 +00:00
Box . VSplitLeft ( 4.0f , 0 , & Box ) ;
static int s_CallVoteButton = 0 ;
2011-04-06 18:18:31 +00:00
if ( DoButton_MenuTab ( & s_CallVoteButton , Localize ( " Call vote " ) , m_ActivePage = = PAGE_CALLVOTE , & Button , CUI : : CORNER_TR ) )
2010-05-29 07:25:38 +00:00
NewPage = PAGE_CALLVOTE ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2018-03-13 20:59:07 +00:00
TextRender ( ) - > SetCurFont ( TextRender ( ) - > GetFont ( TEXT_FONT_ICON_FONT ) ) ;
2019-01-06 05:42:57 +00:00
TextRender ( ) - > SetRenderFlags ( ETextRenderFlags : : TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags : : TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags : : TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags : : TEXT_RENDER_FLAG_NO_OVERSIZE ) ;
2018-03-13 20:59:07 +00:00
Box . VSplitRight ( 33.0f , & Box , & Button ) ;
2010-05-29 07:25:38 +00:00
static int s_QuitButton = 0 ;
2018-03-13 20:59:07 +00:00
if ( DoButton_MenuTab ( & s_QuitButton , " \xEE \x97 \x8D " , 0 , & Button , CUI : : CORNER_T ) )
2019-03-25 19:02:50 +00:00
{
2019-03-29 13:56:02 +00:00
if ( m_pClient - > Editor ( ) - > HasUnsavedData ( ) | | ( Client ( ) - > GetCurrentRaceTime ( ) / 60 > = g_Config . m_ClConfirmQuitTime & & g_Config . m_ClConfirmQuitTime > = 0 ) )
2019-03-25 19:02:50 +00:00
{
m_Popup = POPUP_QUIT ;
}
else
{
Client ( ) - > Quit ( ) ;
}
}
2010-05-29 07:25:38 +00:00
2014-05-08 12:08:15 +00:00
Box . VSplitRight ( 10.0f , & Box , & Button ) ;
2018-03-13 20:59:07 +00:00
Box . VSplitRight ( 33.0f , & Box , & Button ) ;
2010-05-29 07:25:38 +00:00
static int s_SettingsButton = 0 ;
2019-04-28 17:22:19 +00:00
2018-03-13 20:59:07 +00:00
if ( DoButton_MenuTab ( & s_SettingsButton , " \xEE \xA2 \xB8 " , m_ActivePage = = PAGE_SETTINGS , & Button , CUI : : CORNER_T ) )
2010-05-29 07:25:38 +00:00
NewPage = PAGE_SETTINGS ;
2011-04-13 18:37:12 +00:00
2014-07-08 18:21:19 +00:00
Box . VSplitRight ( 10.0f , & Box , & Button ) ;
2018-03-13 20:59:07 +00:00
Box . VSplitRight ( 33.0f , & Box , & Button ) ;
2014-07-08 18:21:19 +00:00
static int s_EditorButton = 0 ;
2018-03-13 20:59:07 +00:00
if ( DoButton_MenuTab ( & s_EditorButton , " \xEE \x8F \x89 " , 0 , & Button , CUI : : CORNER_T ) )
2014-07-08 18:21:19 +00:00
{
g_Config . m_ClEditor = 1 ;
}
2018-03-13 20:59:07 +00:00
TextRender ( ) - > SetRenderFlags ( 0 ) ;
TextRender ( ) - > SetCurFont ( NULL ) ;
2010-05-29 07:25:38 +00:00
if ( NewPage ! = - 1 )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( Client ( ) - > State ( ) = = IClient : : STATE_OFFLINE )
g_Config . m_UiPage = NewPage ;
2008-08-27 15:48:50 +00:00
else
2010-05-29 07:25:38 +00:00
m_GamePage = NewPage ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
return 0 ;
}
2011-02-27 16:56:03 +00:00
void CMenus : : RenderLoading ( )
2008-08-27 15:48:50 +00:00
{
2011-12-30 15:02:22 +00:00
// TODO: not supported right now due to separate render thread
2010-05-29 07:25:38 +00:00
static int64 LastLoadRender = 0 ;
2011-02-27 16:56:03 +00:00
float Percent = m_LoadCurrent + + / ( float ) m_LoadTotal ;
2009-06-07 14:36:54 +00:00
// make sure that we don't render for each little thing we load
// because that will slow down loading if we have vsync
2010-05-29 07:25:38 +00:00
if ( time_get ( ) - LastLoadRender < time_freq ( ) / 60 )
2009-06-07 14:36:54 +00:00
return ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
LastLoadRender = time_get ( ) ;
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
// need up date this here to get correct
2019-04-26 23:02:31 +00:00
ms_GuiColor = color_cast < ColorRGBA > ( ColorHSLA ( g_Config . m_UiColor , true ) ) ;
2011-04-13 18:37:12 +00:00
CUIRect Screen = * UI ( ) - > Screen ( ) ;
2010-05-29 07:25:38 +00:00
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ;
2010-12-14 00:20:47 +00:00
2010-05-29 07:25:38 +00:00
RenderBackground ( ) ;
2008-08-27 15:48:50 +00:00
float w = 700 ;
float h = 200 ;
2010-05-29 07:25:38 +00:00
float x = Screen . w / 2 - w / 2 ;
float y = Screen . h / 2 - h / 2 ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
Graphics ( ) - > BlendNormal ( ) ;
2008-08-27 15:48:50 +00:00
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureClear ( ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
Graphics ( ) - > SetColor ( 0 , 0 , 0 , 0.50f ) ;
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > DrawRoundRect ( x , y , w , h , 40.0f ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2008-08-27 15:48:50 +00:00
2014-01-03 02:06:23 +00:00
const char * pCaption = Localize ( " Loading DDNet Client " ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
CUIRect r ;
2008-08-27 15:48:50 +00:00
r . x = x ;
r . y = y + 20 ;
r . w = w ;
2018-03-13 20:59:07 +00:00
r . h = h - 130 ;
2010-05-29 07:25:38 +00:00
UI ( ) - > DoLabel ( & r , pCaption , 48.0f , 0 , - 1 ) ;
2008-08-27 15:48:50 +00:00
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureClear ( ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
Graphics ( ) - > SetColor ( 1 , 1 , 1 , 0.75f ) ;
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > DrawRoundRect ( x + 40 , y + h - 75 , ( w - 80 ) * Percent , 25 , 5.0f ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
Graphics ( ) - > Swap ( ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMenus : : RenderNews ( CUIRect MainView )
2008-08-27 15:48:50 +00:00
{
2019-03-24 22:15:38 +00:00
RenderTools ( ) - > DrawUIRect ( & MainView , ms_ColorTabbarActive , CUI : : CORNER_B , 10.0f ) ;
2014-06-05 10:11:41 +00:00
MainView . HSplitTop ( 15.0f , 0 , & MainView ) ;
MainView . VSplitLeft ( 15.0f , 0 , & MainView ) ;
CUIRect Label ;
2019-04-29 20:55:12 +00:00
const char * pStr = Client ( ) - > m_aNews ;
char aLine [ 256 ] ;
while ( ( pStr = str_next_token ( pStr , " \n " , aLine , sizeof ( aLine ) ) ) )
2014-06-05 10:11:41 +00:00
{
2019-04-29 20:55:12 +00:00
const int Len = str_length ( aLine ) ;
if ( Len > 0 & & aLine [ 0 ] = = ' | ' & & aLine [ Len - 1 ] = = ' | ' )
2014-06-05 10:11:41 +00:00
{
MainView . HSplitTop ( 30.0f , & Label , & MainView ) ;
2019-04-29 20:55:12 +00:00
aLine [ Len - 1 ] = ' \0 ' ;
UI ( ) - > DoLabelScaled ( & Label , aLine + 1 , 20.0f , - 1 ) ;
2014-06-05 10:11:41 +00:00
}
else
{
MainView . HSplitTop ( 20.0f , & Label , & MainView ) ;
2020-06-14 09:38:52 +00:00
UI ( ) - > DoLabelScaled ( & Label , aLine , 15.f , - 1 , - 1 ) ;
2014-06-05 10:11:41 +00:00
}
}
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMenus : : OnInit ( )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( g_Config . m_ClShowWelcome )
2010-12-12 18:20:30 +00:00
m_Popup = POPUP_LANGUAGE ;
2010-07-04 14:10:00 +00:00
Console ( ) - > Chain ( " add_favorite " , ConchainServerbrowserUpdate , this ) ;
2011-03-27 16:05:11 +00:00
Console ( ) - > Chain ( " remove_favorite " , ConchainServerbrowserUpdate , this ) ;
2011-06-26 15:10:13 +00:00
Console ( ) - > Chain ( " add_friend " , ConchainFriendlistUpdate , this ) ;
Console ( ) - > Chain ( " remove_friend " , ConchainFriendlistUpdate , this ) ;
2011-02-27 16:56:03 +00:00
2012-08-12 10:41:50 +00:00
m_TextureBlob = Graphics ( ) - > LoadTexture ( " blob.png " , IStorage : : TYPE_ALL , CImageInfo : : FORMAT_AUTO , 0 ) ;
2011-02-27 16:56:03 +00:00
// setup load amount
m_LoadCurrent = 0 ;
m_LoadTotal = g_pData - > m_NumImages ;
if ( ! g_Config . m_ClThreadsoundloading )
m_LoadTotal + = g_pData - > m_NumSounds ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMenus : : PopupMessage ( const char * pTopic , const char * pBody , const char * pButton )
2009-06-15 13:16:33 +00:00
{
2010-06-03 20:03:27 +00:00
// reset active item
UI ( ) - > SetActiveItem ( 0 ) ;
2010-05-29 07:25:38 +00:00
str_copy ( m_aMessageTopic , pTopic , sizeof ( m_aMessageTopic ) ) ;
str_copy ( m_aMessageBody , pBody , sizeof ( m_aMessageBody ) ) ;
str_copy ( m_aMessageButton , pButton , sizeof ( m_aMessageButton ) ) ;
2009-06-15 13:16:33 +00:00
}
2020-08-29 10:49:45 +00:00
void CMenus : : PopupWarning ( const char * pTopic , const char * pBody , const char * pButton , int64 Duration )
{
// reset active item
UI ( ) - > SetActiveItem ( 0 ) ;
str_copy ( m_aMessageTopic , pTopic , sizeof ( m_aMessageTopic ) ) ;
str_copy ( m_aMessageBody , pBody , sizeof ( m_aMessageBody ) ) ;
str_copy ( m_aMessageButton , pButton , sizeof ( m_aMessageButton ) ) ;
m_Popup = POPUP_WARNING ;
SetActive ( true ) ;
m_PopupWarningDuration = Duration ;
m_PopupWarningLastTime = time_get_microseconds ( ) ;
}
bool CMenus : : CanDisplayWarning ( )
{
return m_Popup = = POPUP_NONE & & ( Client ( ) - > State ( ) = = IClient : : STATE_DEMOPLAYBACK | | Client ( ) - > State ( ) = = IClient : : STATE_ONLINE ) ;
}
2009-06-15 13:16:33 +00:00
2010-05-29 07:25:38 +00:00
int CMenus : : Render ( )
2008-08-27 15:48:50 +00:00
{
2020-08-29 10:49:45 +00:00
if ( Client ( ) - > State ( ) = = IClient : : STATE_DEMOPLAYBACK & & m_Popup = = POPUP_NONE )
return 0 ;
2011-04-13 18:37:12 +00:00
CUIRect Screen = * UI ( ) - > Screen ( ) ;
2010-05-29 07:25:38 +00:00
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ;
2008-08-27 15:48:50 +00:00
2016-05-03 13:11:52 +00:00
m_MouseSlow = false ;
2016-06-03 17:50:49 +00:00
static int s_Frame = 0 ;
if ( s_Frame = = 0 )
{
s_Frame + + ;
}
else if ( s_Frame = = 1 )
2008-08-27 15:48:50 +00:00
{
2014-09-20 14:20:27 +00:00
m_pClient - > m_pSounds - > Enqueue ( CSounds : : CHN_MUSIC , SOUND_MENU ) ;
2016-06-03 17:50:49 +00:00
s_Frame + + ;
2014-09-20 14:20:27 +00:00
m_DoubleClickIndex = - 1 ;
2010-05-29 07:25:38 +00:00
if ( g_Config . m_UiPage = = PAGE_INTERNET )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_INTERNET ) ;
else if ( g_Config . m_UiPage = = PAGE_LAN )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_LAN ) ;
else if ( g_Config . m_UiPage = = PAGE_FAVORITES )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_FAVORITES ) ;
2014-09-13 14:36:25 +00:00
else if ( g_Config . m_UiPage = = PAGE_DDNET )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_DDNET ) ;
2019-03-24 22:15:38 +00:00
else if ( g_Config . m_UiPage = = PAGE_KOG )
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_KOG ) ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2020-08-29 10:49:45 +00:00
if ( Client ( ) - > State ( ) > = IClient : : STATE_ONLINE )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
ms_ColorTabbarInactive = ms_ColorTabbarInactiveIngame ;
ms_ColorTabbarActive = ms_ColorTabbarActiveIngame ;
2008-08-27 15:48:50 +00:00
}
else
{
2010-05-29 07:25:38 +00:00
RenderBackground ( ) ;
ms_ColorTabbarInactive = ms_ColorTabbarInactiveOutgame ;
ms_ColorTabbarActive = ms_ColorTabbarActiveOutgame ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
CUIRect TabBar ;
CUIRect MainView ;
2008-08-27 15:48:50 +00:00
// some margin around the screen
2010-05-29 07:25:38 +00:00
Screen . Margin ( 10.0f , & Screen ) ;
2011-04-13 18:37:12 +00:00
2011-01-17 12:28:15 +00:00
static bool s_SoundCheck = false ;
if ( ! s_SoundCheck & & m_Popup = = POPUP_NONE )
{
if ( Client ( ) - > SoundInitFailed ( ) )
m_Popup = POPUP_SOUNDERROR ;
s_SoundCheck = true ;
}
2010-05-29 07:25:38 +00:00
if ( m_Popup = = POPUP_NONE )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
Screen . HSplitTop ( 24.0f , & TabBar , & MainView ) ;
2011-04-13 18:37:12 +00:00
2017-07-22 15:35:30 +00:00
// render news
2014-06-05 10:11:41 +00:00
if ( g_Config . m_UiPage < PAGE_NEWS | | g_Config . m_UiPage > PAGE_SETTINGS | | ( Client ( ) - > State ( ) = = IClient : : STATE_OFFLINE & & g_Config . m_UiPage > = PAGE_GAME & & g_Config . m_UiPage < = PAGE_CALLVOTE ) )
2008-10-01 18:40:09 +00:00
{
2010-05-29 07:25:38 +00:00
ServerBrowser ( ) - > Refresh ( IServerBrowser : : TYPE_INTERNET ) ;
g_Config . m_UiPage = PAGE_INTERNET ;
2014-06-16 11:29:18 +00:00
m_DoubleClickIndex = - 1 ;
2008-10-01 18:40:09 +00:00
}
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
// render current page
2010-10-25 18:09:08 +00:00
if ( Client ( ) - > State ( ) ! = IClient : : STATE_OFFLINE )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( m_GamePage = = PAGE_GAME )
RenderGame ( MainView ) ;
2011-04-06 18:18:31 +00:00
else if ( m_GamePage = = PAGE_PLAYERS )
RenderPlayers ( MainView ) ;
2010-05-29 07:25:38 +00:00
else if ( m_GamePage = = PAGE_SERVER_INFO )
RenderServerInfo ( MainView ) ;
2016-04-27 18:14:03 +00:00
else if ( m_GamePage = = PAGE_NETWORK )
RenderInGameNetwork ( MainView ) ;
else if ( m_GamePage = = PAGE_GHOST )
RenderGhost ( MainView ) ;
2010-05-29 07:25:38 +00:00
else if ( m_GamePage = = PAGE_CALLVOTE )
RenderServerControl ( MainView ) ;
else if ( m_GamePage = = PAGE_SETTINGS )
RenderSettings ( MainView ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
else if ( g_Config . m_UiPage = = PAGE_NEWS )
RenderNews ( MainView ) ;
else if ( g_Config . m_UiPage = = PAGE_INTERNET )
RenderServerbrowser ( MainView ) ;
else if ( g_Config . m_UiPage = = PAGE_LAN )
RenderServerbrowser ( MainView ) ;
else if ( g_Config . m_UiPage = = PAGE_DEMOS )
RenderDemoList ( MainView ) ;
else if ( g_Config . m_UiPage = = PAGE_FAVORITES )
RenderServerbrowser ( MainView ) ;
2014-09-13 14:36:25 +00:00
else if ( g_Config . m_UiPage = = PAGE_DDNET )
RenderServerbrowser ( MainView ) ;
2019-03-24 22:15:38 +00:00
else if ( g_Config . m_UiPage = = PAGE_KOG )
RenderServerbrowser ( MainView ) ;
2010-05-29 07:25:38 +00:00
else if ( g_Config . m_UiPage = = PAGE_SETTINGS )
RenderSettings ( MainView ) ;
2017-07-22 15:35:30 +00:00
// do tab bar
RenderMenubar ( TabBar ) ;
2008-08-27 15:48:50 +00:00
}
else
{
// make sure that other windows doesn't do anything funnay!
2009-10-27 14:38:53 +00:00
//UI()->SetHotItem(0);
//UI()->SetActiveItem(0);
2020-06-26 16:17:20 +00:00
char aBuf [ 1536 ] ;
2010-05-29 07:25:38 +00:00
const char * pTitle = " " ;
const char * pExtraText = " " ;
const char * pButtonText = " " ;
int ExtraAlign = 0 ;
2011-04-13 18:37:12 +00:00
2020-08-29 10:49:45 +00:00
ColorRGBA BgColor = ColorRGBA { 0.0f , 0.0f , 0.0f , 0.5f } ;
2010-05-29 07:25:38 +00:00
if ( m_Popup = = POPUP_MESSAGE )
2009-06-15 13:16:33 +00:00
{
2010-05-29 07:25:38 +00:00
pTitle = m_aMessageTopic ;
pExtraText = m_aMessageBody ;
pButtonText = m_aMessageButton ;
2009-06-15 13:16:33 +00:00
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_CONNECTING )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
pTitle = Localize ( " Connecting to " ) ;
2011-04-13 18:37:12 +00:00
pExtraText = g_Config . m_UiServerAddress ; // TODO: query the client about the address
2010-05-29 07:25:38 +00:00
pButtonText = Localize ( " Abort " ) ;
if ( Client ( ) - > MapDownloadTotalsize ( ) > 0 )
2008-08-27 15:48:50 +00:00
{
2014-08-15 23:06:17 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %s: %s " , Localize ( " Downloading map " ) , Client ( ) - > MapDownloadName ( ) ) ;
pTitle = aBuf ;
2010-12-16 00:52:29 +00:00
pExtraText = " " ;
2008-08-27 15:48:50 +00:00
}
}
2018-03-13 20:59:07 +00:00
else if ( m_Popup = = POPUP_DISCONNECTED )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
pTitle = Localize ( " Disconnected " ) ;
pExtraText = Client ( ) - > ErrorString ( ) ;
pButtonText = Localize ( " Ok " ) ;
2016-05-04 16:23:00 +00:00
if ( Client ( ) - > m_ReconnectTime > 0 )
2014-06-26 22:28:57 +00:00
{
2020-06-26 16:17:20 +00:00
str_format ( aBuf , sizeof ( aBuf ) , Localize ( " Reconnect in %d sec " ) , ( int ) ( ( Client ( ) - > m_ReconnectTime - time_get ( ) ) / time_freq ( ) ) ) ;
2016-05-04 16:23:00 +00:00
pTitle = Client ( ) - > ErrorString ( ) ;
pExtraText = aBuf ;
pButtonText = Localize ( " Abort " ) ;
2014-06-26 22:28:57 +00:00
}
ExtraAlign = 0 ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_PURE )
2009-01-11 10:40:14 +00:00
{
2010-05-29 07:25:38 +00:00
pTitle = Localize ( " Disconnected " ) ;
pExtraText = Localize ( " The server is running a non-standard tuning on a pure game type. " ) ;
pButtonText = Localize ( " Ok " ) ;
ExtraAlign = - 1 ;
2009-01-11 10:40:14 +00:00
}
2010-09-05 15:53:31 +00:00
else if ( m_Popup = = POPUP_DELETE_DEMO )
{
pTitle = Localize ( " Delete demo " ) ;
pExtraText = Localize ( " Are you sure that you want to delete the demo? " ) ;
ExtraAlign = - 1 ;
}
2011-03-12 18:08:44 +00:00
else if ( m_Popup = = POPUP_RENAME_DEMO )
{
pTitle = Localize ( " Rename demo " ) ;
pExtraText = " " ;
ExtraAlign = - 1 ;
}
2019-09-27 07:22:50 +00:00
# if defined(CONF_VIDEORECORDER)
2019-09-27 03:06:02 +00:00
else if ( m_Popup = = POPUP_RENDER_DEMO )
{
pTitle = Localize ( " Render demo " ) ;
pExtraText = " " ;
ExtraAlign = - 1 ;
}
2019-09-27 06:51:08 +00:00
else if ( m_Popup = = POPUP_REPLACE_VIDEO )
{
pTitle = Localize ( " Replace video " ) ;
2019-11-03 03:20:24 +00:00
pExtraText = Localize ( " File already exists, do you want to overwrite it? " ) ;
2019-09-27 06:51:08 +00:00
ExtraAlign = - 1 ;
}
2019-09-27 07:22:50 +00:00
# endif
2011-03-23 12:06:35 +00:00
else if ( m_Popup = = POPUP_REMOVE_FRIEND )
{
pTitle = Localize ( " Remove friend " ) ;
pExtraText = Localize ( " Are you sure that you want to remove the player from your friends list? " ) ;
ExtraAlign = - 1 ;
}
2011-01-17 12:28:15 +00:00
else if ( m_Popup = = POPUP_SOUNDERROR )
{
pTitle = Localize ( " Sound error " ) ;
pExtraText = Localize ( " The audio device couldn't be initialised. " ) ;
pButtonText = Localize ( " Ok " ) ;
ExtraAlign = - 1 ;
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_PASSWORD )
2008-08-27 15:48:50 +00:00
{
2010-06-02 19:03:15 +00:00
pTitle = Localize ( " Password incorrect " ) ;
2010-11-20 22:39:17 +00:00
pExtraText = " " ;
2010-05-29 07:25:38 +00:00
pButtonText = Localize ( " Try again " ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_QUIT )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
pTitle = Localize ( " Quit " ) ;
pExtraText = Localize ( " Are you sure that you want to quit? " ) ;
2011-03-21 23:31:42 +00:00
ExtraAlign = - 1 ;
2008-08-27 15:48:50 +00:00
}
2014-07-08 18:21:19 +00:00
else if ( m_Popup = = POPUP_DISCONNECT )
{
pTitle = Localize ( " Disconnect " ) ;
pExtraText = Localize ( " Are you sure that you want to disconnect? " ) ;
ExtraAlign = - 1 ;
}
2019-03-30 15:59:25 +00:00
else if ( m_Popup = = POPUP_DISCONNECT_DUMMY )
{
pTitle = Localize ( " Disconnect Dummy " ) ;
pExtraText = Localize ( " Are you sure that you want to disconnect your dummy? " ) ;
ExtraAlign = - 1 ;
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_FIRST_LAUNCH )
2008-08-27 15:48:50 +00:00
{
2017-09-07 18:51:46 +00:00
pTitle = Localize ( " Welcome to DDNet " ) ;
2020-08-18 08:32:44 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %s \n \n %s \n \n %s \n \n %s \n \n %s \n \n %s \n \n %s \n \n %s " ,
2020-06-26 16:17:20 +00:00
Localize ( " DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you. " ) ,
Localize ( " The maps contain freeze, which temporarily make a tee unable to move. You have to work together to get through these parts. " ) ,
Localize ( " The mouse wheel changes weapons. Hammer (left mouse) can be used to hit other tees and wake them up from being frozen. " ) ,
Localize ( " Hook (right mouse) can be used to swing through the map and to hook other tees to you. " ) ,
Localize ( " Most importantly communication is key: There is no tutorial so you'll have to chat (t key) with other players to learn the basics and tricks of the game. " ) ,
2020-08-18 08:32:44 +00:00
Localize ( " Use k key to kill (restart), q to pause and watch other players. See settings for other key binds. " ) ,
2020-06-26 16:17:20 +00:00
Localize ( " It's recommended that you check the settings to adjust them to your liking before joining a server. " ) ,
Localize ( " Please enter your nick name below. " ) ) ;
pExtraText = aBuf ;
2010-05-29 07:25:38 +00:00
pButtonText = Localize ( " Ok " ) ;
ExtraAlign = - 1 ;
2008-08-27 15:48:50 +00:00
}
2020-08-29 10:49:45 +00:00
else if ( m_Popup = = POPUP_WARNING )
{
BgColor = ColorRGBA { 0.5f , 0.0f , 0.0f , 0.7f } ;
pTitle = m_aMessageTopic ;
pExtraText = m_aMessageBody ;
pButtonText = m_aMessageButton ;
ExtraAlign = - 1 ;
}
2011-04-13 18:37:12 +00:00
2010-09-27 19:41:41 +00:00
CUIRect Box , Part ;
2010-05-29 07:25:38 +00:00
Box = Screen ;
2020-06-19 09:53:26 +00:00
if ( m_Popup ! = POPUP_FIRST_LAUNCH )
{
Box . VMargin ( 150.0f / UI ( ) - > Scale ( ) , & Box ) ;
Box . HMargin ( 150.0f / UI ( ) - > Scale ( ) , & Box ) ;
}
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
// render the box
2020-08-29 10:49:45 +00:00
RenderTools ( ) - > DrawUIRect ( & Box , BgColor , CUI : : CORNER_ALL , 15.0f ) ;
2011-04-13 18:37:12 +00:00
2010-12-14 00:20:47 +00:00
Box . HSplitTop ( 20.f / UI ( ) - > Scale ( ) , & Part , & Box ) ;
Box . HSplitTop ( 24.f / UI ( ) - > Scale ( ) , & Part , & Box ) ;
2015-03-29 12:20:34 +00:00
Part . VMargin ( 20.f / UI ( ) - > Scale ( ) , & Part ) ;
2020-07-15 19:10:13 +00:00
if ( TextRender ( ) - > TextWidth ( 0 , 24.f , pTitle , - 1 , - 1.0f ) > Part . w )
2015-03-29 12:20:34 +00:00
UI ( ) - > DoLabelScaled ( & Part , pTitle , 24.f , - 1 , ( int ) Part . w ) ;
else
UI ( ) - > DoLabelScaled ( & Part , pTitle , 24.f , 0 ) ;
2010-12-14 00:20:47 +00:00
Box . HSplitTop ( 20.f / UI ( ) - > Scale ( ) , & Part , & Box ) ;
Box . HSplitTop ( 24.f / UI ( ) - > Scale ( ) , & Part , & Box ) ;
Part . VMargin ( 20.f / UI ( ) - > Scale ( ) , & Part ) ;
2011-04-13 18:37:12 +00:00
2020-06-19 09:53:26 +00:00
float FontSize = m_Popup = = POPUP_FIRST_LAUNCH ? 16.0f : 20.f ;
2010-05-29 07:25:38 +00:00
if ( ExtraAlign = = - 1 )
2020-06-19 09:53:26 +00:00
UI ( ) - > DoLabelScaled ( & Part , pExtraText , FontSize , - 1 , ( int ) Part . w ) ;
2008-08-27 15:48:50 +00:00
else
2015-04-27 21:17:28 +00:00
{
2020-07-15 19:10:13 +00:00
if ( TextRender ( ) - > TextWidth ( 0 , FontSize , pExtraText , - 1 , - 1.0f ) > Part . w )
2020-06-19 09:53:26 +00:00
UI ( ) - > DoLabelScaled ( & Part , pExtraText , FontSize , - 1 , ( int ) Part . w ) ;
2015-04-27 21:17:28 +00:00
else
2020-06-19 09:53:26 +00:00
UI ( ) - > DoLabelScaled ( & Part , pExtraText , FontSize , 0 , - 1 ) ;
2015-04-27 21:17:28 +00:00
}
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
if ( m_Popup = = POPUP_QUIT )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CUIRect Yes , No ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
2011-03-21 23:31:42 +00:00
// additional info
Box . VMargin ( 20.f / UI ( ) - > Scale ( ) , & Box ) ;
if ( m_pClient - > Editor ( ) - > HasUnsavedData ( ) )
2011-04-02 10:08:46 +00:00
{
2011-04-20 08:21:39 +00:00
char aBuf [ 256 ] ;
2011-04-02 10:08:46 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %s \n %s " , Localize ( " There's an unsaved map in the editor, you might want to save it before you quit the game. " ) , Localize ( " Quit anyway? " ) ) ;
UI ( ) - > DoLabelScaled ( & Box , aBuf , 20.f , - 1 , Part . w - 20.0f ) ;
}
2011-03-21 23:31:42 +00:00
// buttons
2010-05-29 07:25:38 +00:00
Part . VMargin ( 80.0f , & Part ) ;
Part . VSplitMid ( & No , & Yes ) ;
Yes . VMargin ( 20.0f , & Yes ) ;
No . VMargin ( 20.0f , & No ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " No " ) , 0 , & No ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Yes " ) , 0 , & Yes ) | | m_EnterPressed )
Client ( ) - > Quit ( ) ;
2008-08-27 15:48:50 +00:00
}
2014-07-08 19:04:04 +00:00
else if ( m_Popup = = POPUP_DISCONNECT )
2014-07-08 18:21:19 +00:00
{
CUIRect Yes , No ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
// buttons
Part . VMargin ( 80.0f , & Part ) ;
Part . VSplitMid ( & No , & Yes ) ;
Yes . VMargin ( 20.0f , & Yes ) ;
No . VMargin ( 20.0f , & No ) ;
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " No " ) , 0 , & No ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Yes " ) , 0 , & Yes ) | | m_EnterPressed )
Client ( ) - > Disconnect ( ) ;
}
2019-03-30 15:59:25 +00:00
else if ( m_Popup = = POPUP_DISCONNECT_DUMMY )
{
CUIRect Yes , No ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
// buttons
Part . VMargin ( 80.0f , & Part ) ;
Part . VSplitMid ( & No , & Yes ) ;
Yes . VMargin ( 20.0f , & Yes ) ;
No . VMargin ( 20.0f , & No ) ;
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " No " ) , 0 , & No ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Yes " ) , 0 , & Yes ) | | m_EnterPressed )
{
Client ( ) - > DummyDisconnect ( 0 ) ;
m_Popup = POPUP_NONE ;
}
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_PASSWORD )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CUIRect Label , TextBox , TryAgain , Abort ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 80.0f , & Part ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
Part . VSplitMid ( & Abort , & TryAgain ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
TryAgain . VMargin ( 20.0f , & TryAgain ) ;
Abort . VMargin ( 20.0f , & Abort ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " Abort " ) , 0 , & Abort ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Try again " ) , 0 , & TryAgain ) | | m_EnterPressed )
2008-08-27 15:48:50 +00:00
{
2017-07-15 15:29:20 +00:00
Client ( ) - > Connect ( g_Config . m_UiServerAddress , g_Config . m_Password ) ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
Box . HSplitBottom ( 60.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
Part . VSplitLeft ( 60.0f , 0 , & Label ) ;
Label . VSplitLeft ( 100.0f , 0 , & TextBox ) ;
TextBox . VSplitLeft ( 20.0f , 0 , & TextBox ) ;
TextBox . VSplitRight ( 60.0f , & TextBox , 0 ) ;
UI ( ) - > DoLabel ( & Label , Localize ( " Password " ) , 18.0f , - 1 ) ;
2010-05-29 15:53:57 +00:00
static float Offset = 0.0f ;
DoEditBox ( & g_Config . m_Password , & TextBox , g_Config . m_Password , sizeof ( g_Config . m_Password ) , 12.0f , & Offset , true ) ;
2008-08-27 15:48:50 +00:00
}
2010-12-16 00:52:29 +00:00
else if ( m_Popup = = POPUP_CONNECTING )
{
Box = Screen ;
Box . VMargin ( 150.0f , & Box ) ;
Box . HMargin ( 150.0f , & Box ) ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 120.0f , & Part ) ;
static int s_Button = 0 ;
if ( DoButton_Menu ( & s_Button , pButtonText , 0 , & Part ) | | m_EscapePressed | | m_EnterPressed )
{
Client ( ) - > Disconnect ( ) ;
m_Popup = POPUP_NONE ;
}
if ( Client ( ) - > MapDownloadTotalsize ( ) > 0 )
{
int64 Now = time_get ( ) ;
if ( Now - m_DownloadLastCheckTime > = time_freq ( ) )
{
if ( m_DownloadLastCheckSize > Client ( ) - > MapDownloadAmount ( ) )
{
// map downloaded restarted
m_DownloadLastCheckSize = 0 ;
}
// update download speed
2012-04-20 20:11:41 +00:00
float Diff = ( Client ( ) - > MapDownloadAmount ( ) - m_DownloadLastCheckSize ) / ( ( int ) ( ( Now - m_DownloadLastCheckTime ) / time_freq ( ) ) ) ;
2011-04-12 16:59:08 +00:00
float StartDiff = m_DownloadLastCheckSize - 0.0f ;
if ( StartDiff + Diff > 0.0f )
m_DownloadSpeed = ( Diff / ( StartDiff + Diff ) ) * ( Diff / 1.0f ) + ( StartDiff / ( Diff + StartDiff ) ) * m_DownloadSpeed ;
else
m_DownloadSpeed = 0.0f ;
2010-12-16 00:52:29 +00:00
m_DownloadLastCheckTime = Now ;
m_DownloadLastCheckSize = Client ( ) - > MapDownloadAmount ( ) ;
}
Box . HSplitTop ( 64.f , 0 , & Box ) ;
Box . HSplitTop ( 24.f , & Part , & Box ) ;
2011-04-12 16:59:08 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %d/%d KiB (%.1f KiB/s) " , Client ( ) - > MapDownloadAmount ( ) / 1024 , Client ( ) - > MapDownloadTotalsize ( ) / 1024 , m_DownloadSpeed / 1024.0f ) ;
2010-12-16 00:52:29 +00:00
UI ( ) - > DoLabel ( & Part , aBuf , 20.f , 0 , - 1 ) ;
2011-04-13 18:37:12 +00:00
2010-12-16 00:52:29 +00:00
// time left
2019-04-26 19:36:49 +00:00
int TimeLeft = maximum ( 1 , m_DownloadSpeed > 0.0f ? static_cast < int > ( ( Client ( ) - > MapDownloadTotalsize ( ) - Client ( ) - > MapDownloadAmount ( ) ) / m_DownloadSpeed ) : 1 ) ;
2010-12-16 00:52:29 +00:00
if ( TimeLeft > = 60 )
{
TimeLeft / = 60 ;
2017-07-26 01:58:00 +00:00
str_format ( aBuf , sizeof ( aBuf ) , TimeLeft = = 1 ? Localize ( " %i minute left " ) : Localize ( " %i minutes left " ) , TimeLeft ) ;
2010-12-16 00:52:29 +00:00
}
else
2017-07-26 01:58:00 +00:00
{
str_format ( aBuf , sizeof ( aBuf ) , TimeLeft = = 1 ? Localize ( " %i second left " ) : Localize ( " %i seconds left " ) , TimeLeft ) ;
}
2010-12-16 00:52:29 +00:00
Box . HSplitTop ( 20.f , 0 , & Box ) ;
Box . HSplitTop ( 24.f , & Part , & Box ) ;
UI ( ) - > DoLabel ( & Part , aBuf , 20.f , 0 , - 1 ) ;
// progress bar
Box . HSplitTop ( 20.f , 0 , & Box ) ;
Box . HSplitTop ( 24.f , & Part , & Box ) ;
Part . VMargin ( 40.0f , & Part ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Part , ColorRGBA ( 1.0f , 1.0f , 1.0f , 0.25f ) , CUI : : CORNER_ALL , 5.0f ) ;
2019-04-26 19:36:49 +00:00
Part . w = maximum ( 10.0f , ( Part . w * Client ( ) - > MapDownloadAmount ( ) ) / Client ( ) - > MapDownloadTotalsize ( ) ) ;
2019-04-26 21:47:34 +00:00
RenderTools ( ) - > DrawUIRect ( & Part , ColorRGBA ( 1.0f , 1.0f , 1.0f , 0.5f ) , CUI : : CORNER_ALL , 5.0f ) ;
2010-12-16 00:52:29 +00:00
}
}
2010-12-12 18:20:30 +00:00
else if ( m_Popup = = POPUP_LANGUAGE )
{
Box = Screen ;
Box . VMargin ( 150.0f , & Box ) ;
Box . HMargin ( 150.0f , & Box ) ;
Box . HSplitTop ( 20.f , & Part , & Box ) ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Box . HSplitBottom ( 20.f , & Box , 0 ) ;
Box . VMargin ( 20.0f , & Box ) ;
RenderLanguageSelection ( Box ) ;
Part . VMargin ( 120.0f , & Part ) ;
static int s_Button = 0 ;
if ( DoButton_Menu ( & s_Button , Localize ( " Ok " ) , 0 , & Part ) | | m_EscapePressed | | m_EnterPressed )
m_Popup = POPUP_FIRST_LAUNCH ;
}
2011-06-29 20:27:32 +00:00
else if ( m_Popup = = POPUP_COUNTRY )
{
Box = Screen ;
Box . VMargin ( 150.0f , & Box ) ;
Box . HMargin ( 150.0f , & Box ) ;
Box . HSplitTop ( 20.f , & Part , & Box ) ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Box . HSplitBottom ( 20.f , & Box , 0 ) ;
Box . VMargin ( 20.0f , & Box ) ;
2011-08-11 08:59:14 +00:00
2011-06-29 20:27:32 +00:00
static int ActSelection = - 2 ;
if ( ActSelection = = - 2 )
ActSelection = g_Config . m_BrFilterCountryIndex ;
static float s_ScrollValue = 0.0f ;
int OldSelected = - 1 ;
2020-08-23 17:40:17 +00:00
UiDoListboxStart ( & s_ScrollValue , & Box , 50.0f , Localize ( " Country / Region " ) , " " , m_pClient - > m_pCountryFlags - > Num ( ) , 6 , OldSelected , s_ScrollValue ) ;
2011-06-29 20:27:32 +00:00
for ( int i = 0 ; i < m_pClient - > m_pCountryFlags - > Num ( ) ; + + i )
{
const CCountryFlags : : CCountryFlag * pEntry = m_pClient - > m_pCountryFlags - > GetByIndex ( i ) ;
if ( pEntry - > m_CountryCode = = ActSelection )
OldSelected = i ;
CListboxItem Item = UiDoListboxNextItem ( & pEntry - > m_CountryCode , OldSelected = = i ) ;
if ( Item . m_Visible )
{
2011-07-31 00:04:46 +00:00
CUIRect Label ;
Item . m_Rect . Margin ( 5.0f , & Item . m_Rect ) ;
Item . m_Rect . HSplitBottom ( 10.0f , & Item . m_Rect , & Label ) ;
2011-06-29 20:27:32 +00:00
float OldWidth = Item . m_Rect . w ;
Item . m_Rect . w = Item . m_Rect . h * 2 ;
Item . m_Rect . x + = ( OldWidth - Item . m_Rect . w ) / 2.0f ;
2019-04-26 21:47:34 +00:00
ColorRGBA Color ( 1.0f , 1.0f , 1.0f , 1.0f ) ;
2012-01-08 17:16:38 +00:00
m_pClient - > m_pCountryFlags - > Render ( pEntry - > m_CountryCode , & Color , Item . m_Rect . x , Item . m_Rect . y , Item . m_Rect . w , Item . m_Rect . h ) ;
2011-07-31 00:04:46 +00:00
UI ( ) - > DoLabel ( & Label , pEntry - > m_aCountryCodeString , 10.0f , 0 ) ;
2011-06-29 20:27:32 +00:00
}
}
const int NewSelected = UiDoListboxEnd ( & s_ScrollValue , 0 ) ;
if ( OldSelected ! = NewSelected )
ActSelection = m_pClient - > m_pCountryFlags - > GetByIndex ( NewSelected ) - > m_CountryCode ;
Part . VMargin ( 120.0f , & Part ) ;
static int s_Button = 0 ;
if ( DoButton_Menu ( & s_Button , Localize ( " Ok " ) , 0 , & Part ) | | m_EnterPressed )
{
g_Config . m_BrFilterCountryIndex = ActSelection ;
Client ( ) - > ServerBrowserUpdate ( ) ;
m_Popup = POPUP_NONE ;
}
if ( m_EscapePressed )
{
ActSelection = g_Config . m_BrFilterCountryIndex ;
m_Popup = POPUP_NONE ;
}
}
2010-09-05 15:53:31 +00:00
else if ( m_Popup = = POPUP_DELETE_DEMO )
{
CUIRect Yes , No ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 80.0f , & Part ) ;
2011-04-13 18:37:12 +00:00
2010-09-05 15:53:31 +00:00
Part . VSplitMid ( & No , & Yes ) ;
2011-04-13 18:37:12 +00:00
2010-09-05 15:53:31 +00:00
Yes . VMargin ( 20.0f , & Yes ) ;
No . VMargin ( 20.0f , & No ) ;
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " No " ) , 0 , & No ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Yes " ) , 0 , & Yes ) | | m_EnterPressed )
{
m_Popup = POPUP_NONE ;
2011-01-05 21:22:07 +00:00
// delete demo
if ( m_DemolistSelectedIndex > = 0 & & ! m_DemolistSelectedIsDir )
{
char aBuf [ 512 ] ;
str_format ( aBuf , sizeof ( aBuf ) , " %s/%s " , m_aCurrentDemoFolder , m_lDemos [ m_DemolistSelectedIndex ] . m_aFilename ) ;
if ( Storage ( ) - > RemoveFile ( aBuf , m_lDemos [ m_DemolistSelectedIndex ] . m_StorageType ) )
{
DemolistPopulate ( ) ;
DemolistOnUpdate ( false ) ;
}
else
PopupMessage ( Localize ( " Error " ) , Localize ( " Unable to delete the demo " ) , Localize ( " Ok " ) ) ;
}
2010-09-05 15:53:31 +00:00
}
}
2011-03-12 18:08:44 +00:00
else if ( m_Popup = = POPUP_RENAME_DEMO )
{
CUIRect Label , TextBox , Ok , Abort ;
2011-04-13 18:37:12 +00:00
2011-03-12 18:08:44 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 80.0f , & Part ) ;
2011-04-13 18:37:12 +00:00
2011-03-12 18:08:44 +00:00
Part . VSplitMid ( & Abort , & Ok ) ;
2011-04-13 18:37:12 +00:00
2011-03-12 18:08:44 +00:00
Ok . VMargin ( 20.0f , & Ok ) ;
Abort . VMargin ( 20.0f , & Abort ) ;
2011-04-13 18:37:12 +00:00
2011-03-12 18:08:44 +00:00
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " Abort " ) , 0 , & Abort ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
static int s_ButtonOk = 0 ;
if ( DoButton_Menu ( & s_ButtonOk , Localize ( " Ok " ) , 0 , & Ok ) | | m_EnterPressed )
{
m_Popup = POPUP_NONE ;
// rename demo
if ( m_DemolistSelectedIndex > = 0 & & ! m_DemolistSelectedIsDir )
{
char aBufOld [ 512 ] ;
str_format ( aBufOld , sizeof ( aBufOld ) , " %s/%s " , m_aCurrentDemoFolder , m_lDemos [ m_DemolistSelectedIndex ] . m_aFilename ) ;
2011-03-31 16:33:46 +00:00
int Length = str_length ( m_aCurrentDemoFile ) ;
2011-03-12 18:08:44 +00:00
char aBufNew [ 512 ] ;
2011-03-31 16:33:46 +00:00
if ( Length < = 4 | | m_aCurrentDemoFile [ Length - 5 ] ! = ' . ' | | str_comp_nocase ( m_aCurrentDemoFile + Length - 4 , " demo " ) )
str_format ( aBufNew , sizeof ( aBufNew ) , " %s/%s.demo " , m_aCurrentDemoFolder , m_aCurrentDemoFile ) ;
else
str_format ( aBufNew , sizeof ( aBufNew ) , " %s/%s " , m_aCurrentDemoFolder , m_aCurrentDemoFile ) ;
2011-03-12 18:08:44 +00:00
if ( Storage ( ) - > RenameFile ( aBufOld , aBufNew , m_lDemos [ m_DemolistSelectedIndex ] . m_StorageType ) )
{
DemolistPopulate ( ) ;
DemolistOnUpdate ( false ) ;
}
else
PopupMessage ( Localize ( " Error " ) , Localize ( " Unable to rename the demo " ) , Localize ( " Ok " ) ) ;
}
}
2011-04-13 18:37:12 +00:00
2011-03-12 18:08:44 +00:00
Box . HSplitBottom ( 60.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
2011-04-13 18:37:12 +00:00
2011-03-12 18:08:44 +00:00
Part . VSplitLeft ( 60.0f , 0 , & Label ) ;
Label . VSplitLeft ( 120.0f , 0 , & TextBox ) ;
TextBox . VSplitLeft ( 20.0f , 0 , & TextBox ) ;
TextBox . VSplitRight ( 60.0f , & TextBox , 0 ) ;
UI ( ) - > DoLabel ( & Label , Localize ( " New name: " ) , 18.0f , - 1 ) ;
static float Offset = 0.0f ;
DoEditBox ( & Offset , & TextBox , m_aCurrentDemoFile , sizeof ( m_aCurrentDemoFile ) , 12.0f , & Offset ) ;
}
2019-09-27 07:22:50 +00:00
# if defined(CONF_VIDEORECORDER)
2019-09-27 03:06:02 +00:00
else if ( m_Popup = = POPUP_RENDER_DEMO )
{
2019-09-28 04:18:38 +00:00
CUIRect Label , TextBox , Ok , Abort , IncSpeed , DecSpeed , Button ;
2019-09-27 03:06:02 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
# if defined(__ANDROID__)
Box . HSplitBottom ( 60.f , & Box , & Part ) ;
# else
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
# endif
Part . VMargin ( 80.0f , & Part ) ;
Part . VSplitMid ( & Abort , & Ok ) ;
Ok . VMargin ( 20.0f , & Ok ) ;
Abort . VMargin ( 20.0f , & Abort ) ;
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " Abort " ) , 0 , & Abort ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
static int s_ButtonOk = 0 ;
if ( DoButton_Menu ( & s_ButtonOk , Localize ( " Ok " ) , 0 , & Ok ) | | m_EnterPressed )
{
m_Popup = POPUP_NONE ;
// name video
if ( m_DemolistSelectedIndex > = 0 & & ! m_DemolistSelectedIsDir )
{
char aBufOld [ 512 ] ;
str_format ( aBufOld , sizeof ( aBufOld ) , " %s/%s " , m_aCurrentDemoFolder , m_lDemos [ m_DemolistSelectedIndex ] . m_aFilename ) ;
int Length = str_length ( m_aCurrentDemoFile ) ;
char aBufNew [ 512 ] ;
if ( Length < = 3 | | m_aCurrentDemoFile [ Length - 4 ] ! = ' . ' | | str_comp_nocase ( m_aCurrentDemoFile + Length - 3 , " mp4 " ) )
str_format ( aBufNew , sizeof ( aBufNew ) , " %s.mp4 " , m_aCurrentDemoFile ) ;
else
str_format ( aBufNew , sizeof ( aBufNew ) , " %s " , m_aCurrentDemoFile ) ;
2019-09-27 06:51:08 +00:00
char aWholePath [ 1024 ] ;
// store new video filename to origin buffer
str_copy ( m_aCurrentDemoFile , aBufNew , sizeof ( m_aCurrentDemoFile ) ) ;
if ( Storage ( ) - > FindFile ( m_aCurrentDemoFile , " videos " , IStorage : : TYPE_ALL , aWholePath , sizeof ( aWholePath ) ) )
{
PopupMessage ( Localize ( " Error " ) , Localize ( " Destination file already exist " ) , Localize ( " Ok " ) ) ;
m_Popup = POPUP_REPLACE_VIDEO ;
}
else
{
2019-09-28 04:18:38 +00:00
const char * pError = Client ( ) - > DemoPlayer_Render ( aBufOld , m_lDemos [ m_DemolistSelectedIndex ] . m_StorageType , m_aCurrentDemoFile , m_Speed ) ;
m_Speed = 4 ;
2019-09-27 06:51:08 +00:00
//Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "demo_render_path", aWholePath);
if ( pError )
PopupMessage ( Localize ( " Error " ) , str_comp ( pError , " error loading demo " ) ? pError : Localize ( " Error loading demo " ) , Localize ( " Ok " ) ) ;
}
2019-09-27 03:06:02 +00:00
}
}
Box . HSplitBottom ( 60.f , & Box , & Part ) ;
2019-09-28 04:18:38 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Part . VSplitLeft ( 60.0f , 0 , & Part ) ;
Part . VSplitLeft ( 60.0f , 0 , & Label ) ;
Part . VSplitMid ( & IncSpeed , & DecSpeed ) ;
IncSpeed . VMargin ( 20.0f , & IncSpeed ) ;
DecSpeed . VMargin ( 20.0f , & DecSpeed ) ;
Part . VSplitLeft ( 20.0f , & Button , & Part ) ;
bool IncDemoSpeed = false , DecDemoSpeed = false ;
// slowdown
Part . VSplitLeft ( 5.0f , 0 , & Part ) ;
Part . VSplitLeft ( Button . h , & Button , & Part ) ;
static int s_SlowDownButton = 0 ;
if ( DoButton_Sprite ( & s_SlowDownButton , IMAGE_DEMOBUTTONS , SPRITE_DEMOBUTTON_SLOWER , 0 , & Button , CUI : : CORNER_ALL ) )
DecDemoSpeed = true ;
// fastforward
Part . VSplitLeft ( 5.0f , 0 , & Part ) ;
Part . VSplitLeft ( Button . h , & Button , & Part ) ;
static int s_FastForwardButton = 0 ;
if ( DoButton_Sprite ( & s_FastForwardButton , IMAGE_DEMOBUTTONS , SPRITE_DEMOBUTTON_FASTER , 0 , & Button , CUI : : CORNER_ALL ) )
IncDemoSpeed = true ;
// speed meter
Part . VSplitLeft ( 15.0f , 0 , & Part ) ;
char aBuffer [ 64 ] ;
str_format ( aBuffer , sizeof ( aBuffer ) , " Speed: × %g " , g_aSpeeds [ m_Speed ] ) ;
//str_format(aBuffer, sizeof(aBuffer), "Speed: × %g", Speed);
UI ( ) - > DoLabel ( & Part , aBuffer , Button . h * 0.7f , - 1 ) ;
if ( IncDemoSpeed )
m_Speed = clamp ( m_Speed + 1 , 0 , ( int ) ( sizeof ( g_aSpeeds ) / sizeof ( g_aSpeeds [ 0 ] ) - 1 ) ) ;
else if ( DecDemoSpeed )
m_Speed = clamp ( m_Speed - 1 , 0 , ( int ) ( sizeof ( g_aSpeeds ) / sizeof ( g_aSpeeds [ 0 ] ) - 1 ) ) ;
2019-10-02 05:11:58 +00:00
Part . VSplitLeft ( 100.0f , 0 , & Part ) ;
Part . VSplitLeft ( Button . h , & Button , & Part ) ;
if ( DoButton_CheckBox ( & g_Config . m_ClVideoShowhud , Localize ( " Show ingame HUD " ) , g_Config . m_ClVideoShowhud , & Button ) )
g_Config . m_ClVideoShowhud ^ = 1 ;
2019-10-13 12:29:55 +00:00
Part . VSplitLeft ( 150.0f , 0 , & Part ) ;
Part . VSplitLeft ( Button . h , & Button , & Part ) ;
if ( DoButton_CheckBox ( & g_Config . m_ClVideoShowChat , Localize ( " Show chat " ) , g_Config . m_ClVideoShowChat , & Button ) )
g_Config . m_ClVideoShowChat ^ = 1 ;
2019-10-17 05:38:00 +00:00
Part . VSplitLeft ( 150.0f , 0 , & Part ) ;
Part . VSplitLeft ( Button . h , & Button , & Part ) ;
if ( DoButton_CheckBox ( & g_Config . m_ClVideoSndEnable , Localize ( " Use sounds " ) , g_Config . m_ClVideoSndEnable , & Button ) )
g_Config . m_ClVideoSndEnable ^ = 1 ;
2019-09-28 04:18:38 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
2019-09-27 03:06:02 +00:00
# if defined(__ANDROID__)
Box . HSplitBottom ( 60.f , & Box , & Part ) ;
# else
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
# endif
Part . VSplitLeft ( 60.0f , 0 , & Label ) ;
Label . VSplitLeft ( 120.0f , 0 , & TextBox ) ;
TextBox . VSplitLeft ( 20.0f , 0 , & TextBox ) ;
TextBox . VSplitRight ( 60.0f , & TextBox , 0 ) ;
UI ( ) - > DoLabel ( & Label , Localize ( " Video name: " ) , 18.0f , - 1 ) ;
static float Offset = 0.0f ;
DoEditBox ( & Offset , & TextBox , m_aCurrentDemoFile , sizeof ( m_aCurrentDemoFile ) , 12.0f , & Offset ) ;
}
2019-09-27 06:51:08 +00:00
else if ( m_Popup = = POPUP_REPLACE_VIDEO )
{
CUIRect Yes , No ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
# if defined(__ANDROID__)
Box . HSplitBottom ( 60.f , & Box , & Part ) ;
# else
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
# endif
Part . VMargin ( 80.0f , & Part ) ;
Part . VSplitMid ( & No , & Yes ) ;
Yes . VMargin ( 20.0f , & Yes ) ;
No . VMargin ( 20.0f , & No ) ;
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " No " ) , 0 , & No ) | | m_EscapePressed )
m_Popup = POPUP_RENDER_DEMO ;
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Yes " ) , 0 , & Yes ) | | m_EnterPressed )
{
m_Popup = POPUP_NONE ;
// render video
char aBuf [ 512 ] ;
str_format ( aBuf , sizeof ( aBuf ) , " %s/%s " , m_aCurrentDemoFolder , m_lDemos [ m_DemolistSelectedIndex ] . m_aFilename ) ;
2019-09-28 04:18:38 +00:00
const char * pError = Client ( ) - > DemoPlayer_Render ( aBuf , m_lDemos [ m_DemolistSelectedIndex ] . m_StorageType , m_aCurrentDemoFile , m_Speed ) ;
m_Speed = 4 ;
2019-09-27 06:51:08 +00:00
if ( pError )
PopupMessage ( Localize ( " Error " ) , str_comp ( pError , " error loading demo " ) ? pError : Localize ( " Error loading demo " ) , Localize ( " Ok " ) ) ;
}
}
2019-09-27 07:22:50 +00:00
# endif
2011-03-23 12:06:35 +00:00
else if ( m_Popup = = POPUP_REMOVE_FRIEND )
{
CUIRect Yes , No ;
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 80.0f , & Part ) ;
2011-04-13 18:37:12 +00:00
2011-03-23 12:06:35 +00:00
Part . VSplitMid ( & No , & Yes ) ;
2011-04-13 18:37:12 +00:00
2011-03-23 12:06:35 +00:00
Yes . VMargin ( 20.0f , & Yes ) ;
No . VMargin ( 20.0f , & No ) ;
static int s_ButtonAbort = 0 ;
if ( DoButton_Menu ( & s_ButtonAbort , Localize ( " No " ) , 0 , & No ) | | m_EscapePressed )
m_Popup = POPUP_NONE ;
static int s_ButtonTryAgain = 0 ;
if ( DoButton_Menu ( & s_ButtonTryAgain , Localize ( " Yes " ) , 0 , & Yes ) | | m_EnterPressed )
{
m_Popup = POPUP_NONE ;
// remove friend
if ( m_FriendlistSelectedIndex > = 0 )
{
2011-06-26 15:10:13 +00:00
m_pClient - > Friends ( ) - > RemoveFriend ( m_lFriends [ m_FriendlistSelectedIndex ] . m_pFriendInfo - > m_aName ,
m_lFriends [ m_FriendlistSelectedIndex ] . m_pFriendInfo - > m_aClan ) ;
FriendlistOnUpdate ( ) ;
2011-03-23 12:06:35 +00:00
Client ( ) - > ServerBrowserUpdate ( ) ;
}
}
}
2010-05-29 07:25:38 +00:00
else if ( m_Popup = = POPUP_FIRST_LAUNCH )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CUIRect Label , TextBox ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 80.0f , & Part ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
static int s_EnterButton = 0 ;
if ( DoButton_Menu ( & s_EnterButton , Localize ( " Enter " ) , 0 , & Part ) | | m_EnterPressed )
2017-09-07 18:51:46 +00:00
{
Client ( ) - > RequestDDNetInfo ( ) ;
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_NONE ;
2017-09-07 18:51:46 +00:00
}
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
2020-06-19 09:53:26 +00:00
Part . VSplitLeft ( 30.0f , 0 , & Part ) ;
2020-06-26 16:17:20 +00:00
char aBuf [ 128 ] ;
str_format ( aBuf , sizeof ( aBuf ) , " %s \n (%s) " ,
Localize ( " Show DDNet map finishes in server browser " ) ,
2020-08-19 15:50:36 +00:00
Localize ( " transmits your player name to info2.ddnet.tw " ) ) ;
2020-06-26 16:17:20 +00:00
if ( DoButton_CheckBox ( & g_Config . m_BrIndicateFinished , aBuf , g_Config . m_BrIndicateFinished , & Part ) )
2017-09-07 18:51:46 +00:00
g_Config . m_BrIndicateFinished ^ = 1 ;
2011-04-13 18:37:12 +00:00
2020-06-19 09:53:26 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
2010-05-29 07:25:38 +00:00
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
Part . VSplitLeft ( 60.0f , 0 , & Label ) ;
Label . VSplitLeft ( 100.0f , 0 , & TextBox ) ;
TextBox . VSplitLeft ( 20.0f , 0 , & TextBox ) ;
TextBox . VSplitRight ( 60.0f , & TextBox , 0 ) ;
2020-06-19 09:53:26 +00:00
UI ( ) - > DoLabel ( & Label , Localize ( " Nickname " ) , 16.0f , - 1 ) ;
2010-05-29 15:53:57 +00:00
static float Offset = 0.0f ;
2020-08-20 10:19:03 +00:00
DoEditBox ( & g_Config . m_PlayerName , & TextBox , g_Config . m_PlayerName , sizeof ( g_Config . m_PlayerName ) , 12.0f , & Offset , false , CUI : : CORNER_ALL , Client ( ) - > PlayerName ( ) ) ;
2008-08-27 15:48:50 +00:00
}
2020-08-29 10:49:45 +00:00
else if ( m_Popup = = POPUP_WARNING )
{
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 120.0f , & Part ) ;
static int s_Button = 0 ;
if ( DoButton_Menu ( & s_Button , pButtonText , 0 , & Part ) | | m_EscapePressed | | m_EnterPressed | | ( time_get_microseconds ( ) - m_PopupWarningLastTime > = m_PopupWarningDuration ) )
{
m_Popup = POPUP_NONE ;
SetActive ( false ) ;
}
}
2008-08-27 15:48:50 +00:00
else
{
2010-05-29 07:25:38 +00:00
Box . HSplitBottom ( 20.f , & Box , & Part ) ;
Box . HSplitBottom ( 24.f , & Box , & Part ) ;
Part . VMargin ( 120.0f , & Part ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
static int s_Button = 0 ;
if ( DoButton_Menu ( & s_Button , pButtonText , 0 , & Part ) | | m_EscapePressed | | m_EnterPressed )
2016-05-07 14:12:23 +00:00
{
if ( m_Popup = = POPUP_DISCONNECTED & & Client ( ) - > m_ReconnectTime > 0 )
Client ( ) - > m_ReconnectTime = 0 ;
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_NONE ;
2016-05-07 14:12:23 +00:00
}
2008-08-27 15:48:50 +00:00
}
2013-03-16 14:30:40 +00:00
if ( m_Popup = = POPUP_NONE )
UI ( ) - > SetActiveItem ( 0 ) ;
2008-08-27 15:48:50 +00:00
}
return 0 ;
}
2008-10-20 23:38:23 +00:00
2010-05-29 07:25:38 +00:00
void CMenus : : SetActive ( bool Active )
2008-10-20 23:38:23 +00:00
{
2017-07-15 13:37:05 +00:00
if ( Active ! = m_MenuActive )
Input ( ) - > SetIMEState ( Active ) ;
2010-05-29 07:25:38 +00:00
m_MenuActive = Active ;
2010-09-12 10:43:03 +00:00
if ( ! m_MenuActive )
2008-10-20 23:38:23 +00:00
{
2010-09-12 10:43:03 +00:00
if ( m_NeedSendinfo )
{
m_pClient - > SendInfo ( false ) ;
m_NeedSendinfo = false ;
}
2014-04-28 13:19:57 +00:00
if ( m_NeedSendDummyinfo )
{
m_pClient - > SendDummyInfo ( false ) ;
m_NeedSendDummyinfo = false ;
}
2010-10-25 18:09:08 +00:00
if ( Client ( ) - > State ( ) = = IClient : : STATE_ONLINE )
2010-09-12 10:43:03 +00:00
{
m_pClient - > OnRelease ( ) ;
}
2008-10-20 23:38:23 +00:00
}
2011-01-12 00:33:16 +00:00
else if ( Client ( ) - > State ( ) = = IClient : : STATE_DEMOPLAYBACK )
{
m_pClient - > OnRelease ( ) ;
}
2008-10-20 23:38:23 +00:00
}
2010-05-29 07:25:38 +00:00
void CMenus : : OnReset ( )
2008-08-27 15:48:50 +00:00
{
}
2010-05-29 07:25:38 +00:00
bool CMenus : : OnMouseMove ( float x , float y )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
m_LastInput = time_get ( ) ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
if ( ! m_MenuActive )
2008-08-27 15:48:50 +00:00
return false ;
2011-04-13 18:37:12 +00:00
2011-07-02 22:36:07 +00:00
UI ( ) - > ConvertMouseMove ( & x , & y ) ;
2016-05-03 13:11:52 +00:00
if ( m_MouseSlow )
{
m_MousePos . x + = x * 0.05f ;
m_MousePos . y + = y * 0.05f ;
}
else
{
m_MousePos . x + = x ;
m_MousePos . y + = y ;
}
2019-01-10 14:54:42 +00:00
m_MousePos . x = clamp ( m_MousePos . x , 0.f , ( float ) Graphics ( ) - > ScreenWidth ( ) ) ;
m_MousePos . y = clamp ( m_MousePos . y , 0.f , ( float ) Graphics ( ) - > ScreenHeight ( ) ) ;
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
return true ;
}
2010-05-29 07:25:38 +00:00
bool CMenus : : OnInput ( IInput : : CEvent e )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
m_LastInput = time_get ( ) ;
2011-04-13 18:37:12 +00:00
2008-10-21 18:25:28 +00:00
// special handle esc and enter for popup purposes
2010-05-29 07:25:38 +00:00
if ( e . m_Flags & IInput : : FLAG_PRESS )
2008-08-27 20:23:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( e . m_Key = = KEY_ESCAPE )
2008-10-18 10:52:26 +00:00
{
2010-05-29 07:25:38 +00:00
m_EscapePressed = true ;
2019-03-25 19:01:10 +00:00
if ( m_Popup = = POPUP_NONE )
SetActive ( ! IsActive ( ) ) ;
2008-10-21 18:25:28 +00:00
return true ;
2008-10-18 10:52:26 +00:00
}
2008-10-21 18:25:28 +00:00
}
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
if ( IsActive ( ) )
2008-10-21 18:25:28 +00:00
{
2010-09-03 18:05:22 +00:00
if ( e . m_Flags & IInput : : FLAG_PRESS )
{
// special for popups
2010-09-08 00:32:41 +00:00
if ( e . m_Key = = KEY_RETURN | | e . m_Key = = KEY_KP_ENTER )
2010-09-03 18:05:22 +00:00
m_EnterPressed = true ;
else if ( e . m_Key = = KEY_DELETE )
m_DeletePressed = true ;
}
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
if ( m_NumInputEvents < MAX_INPUTEVENTS )
m_aInputEvents [ m_NumInputEvents + + ] = e ;
2008-08-27 20:23:50 +00:00
return true ;
2008-08-30 09:28:31 +00:00
}
2008-08-27 15:48:50 +00:00
return false ;
}
2010-05-29 07:25:38 +00:00
void CMenus : : OnStateChange ( int NewState , int OldState )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
// reset active item
UI ( ) - > SetActiveItem ( 0 ) ;
if ( NewState = = IClient : : STATE_OFFLINE )
2008-08-27 15:48:50 +00:00
{
2012-01-06 19:03:57 +00:00
if ( OldState > = IClient : : STATE_ONLINE & & NewState < IClient : : STATE_QUITING )
2012-01-06 18:38:40 +00:00
m_pClient - > m_pSounds - > Play ( CSounds : : CHN_MUSIC , SOUND_MENU , 1.0f ) ;
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_NONE ;
if ( Client ( ) - > ErrorString ( ) & & Client ( ) - > ErrorString ( ) [ 0 ] ! = 0 )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( str_find ( Client ( ) - > ErrorString ( ) , " password " ) )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_PASSWORD ;
UI ( ) - > SetHotItem ( & g_Config . m_Password ) ;
UI ( ) - > SetActiveItem ( & g_Config . m_Password ) ;
2008-08-27 15:48:50 +00:00
}
else
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_DISCONNECTED ;
}
}
else if ( NewState = = IClient : : STATE_LOADING )
2009-01-12 14:03:19 +00:00
{
2010-05-29 07:25:38 +00:00
m_Popup = POPUP_CONNECTING ;
2010-12-16 00:52:29 +00:00
m_DownloadLastCheckTime = time_get ( ) ;
m_DownloadLastCheckSize = 0 ;
2011-04-12 16:59:08 +00:00
m_DownloadSpeed = 0.0f ;
2009-01-12 14:03:19 +00:00
}
2010-05-29 07:25:38 +00:00
else if ( NewState = = IClient : : STATE_CONNECTING )
m_Popup = POPUP_CONNECTING ;
2018-03-13 20:59:07 +00:00
else if ( NewState = = IClient : : STATE_ONLINE | | NewState = = IClient : : STATE_DEMOPLAYBACK )
2008-08-27 15:48:50 +00:00
{
2020-08-29 10:49:45 +00:00
if ( m_Popup ! = POPUP_WARNING )
{
m_Popup = POPUP_NONE ;
SetActive ( false ) ;
}
2008-08-27 15:48:50 +00:00
}
}
2009-06-07 14:36:54 +00:00
extern " C " void font_debug_render ( ) ;
2010-05-29 07:25:38 +00:00
void CMenus : : OnRender ( )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( Client ( ) - > State ( ) ! = IClient : : STATE_ONLINE & & Client ( ) - > State ( ) ! = IClient : : STATE_DEMOPLAYBACK )
SetActive ( true ) ;
2008-10-06 18:05:01 +00:00
2010-05-29 07:25:38 +00:00
if ( Client ( ) - > State ( ) = = IClient : : STATE_DEMOPLAYBACK )
2008-10-06 18:05:01 +00:00
{
2010-05-29 07:25:38 +00:00
CUIRect Screen = * UI ( ) - > Screen ( ) ;
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ;
RenderDemoPlayer ( Screen ) ;
2008-10-06 18:05:01 +00:00
}
2011-04-13 18:37:12 +00:00
2010-10-22 13:22:17 +00:00
if ( Client ( ) - > State ( ) = = IClient : : STATE_ONLINE & & m_pClient - > m_ServerMode = = m_pClient - > SERVERMODE_PUREMOD )
2009-01-11 10:40:14 +00:00
{
2010-05-29 07:25:38 +00:00
Client ( ) - > Disconnect ( ) ;
SetActive ( true ) ;
m_Popup = POPUP_PURE ;
2010-10-22 13:22:17 +00:00
}
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
if ( ! IsActive ( ) )
2008-10-18 10:52:26 +00:00
{
2010-05-29 07:25:38 +00:00
m_EscapePressed = false ;
m_EnterPressed = false ;
2010-09-03 18:05:22 +00:00
m_DeletePressed = false ;
2010-05-29 07:25:38 +00:00
m_NumInputEvents = 0 ;
2008-08-27 15:48:50 +00:00
return ;
2008-10-18 10:52:26 +00:00
}
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
// update colors
2019-04-26 23:02:31 +00:00
ms_GuiColor = color_cast < ColorRGBA > ( ColorHSLA ( g_Config . m_UiColor , true ) ) ;
2010-05-29 07:25:38 +00:00
2019-04-26 21:47:34 +00:00
ms_ColorTabbarInactiveOutgame = ColorRGBA ( 0 , 0 , 0 , 0.25f ) ;
ms_ColorTabbarActiveOutgame = ColorRGBA ( 0 , 0 , 0 , 0.5f ) ;
2010-05-29 07:25:38 +00:00
float ColorIngameScaleI = 0.5f ;
float ColorIngameAcaleA = 0.2f ;
2019-04-26 21:47:34 +00:00
ms_ColorTabbarInactiveIngame = ColorRGBA (
2010-05-29 07:25:38 +00:00
ms_GuiColor . r * ColorIngameScaleI ,
ms_GuiColor . g * ColorIngameScaleI ,
ms_GuiColor . b * ColorIngameScaleI ,
ms_GuiColor . a * 0.8f ) ;
2011-04-13 18:37:12 +00:00
2019-04-26 21:47:34 +00:00
ms_ColorTabbarActiveIngame = ColorRGBA (
2010-05-29 07:25:38 +00:00
ms_GuiColor . r * ColorIngameAcaleA ,
ms_GuiColor . g * ColorIngameAcaleA ,
ms_GuiColor . b * ColorIngameAcaleA ,
ms_GuiColor . a ) ;
2011-04-13 18:37:12 +00:00
2008-08-27 15:48:50 +00:00
// update the ui
2010-05-29 07:25:38 +00:00
CUIRect * pScreen = UI ( ) - > Screen ( ) ;
float mx = ( m_MousePos . x / ( float ) Graphics ( ) - > ScreenWidth ( ) ) * pScreen - > w ;
float my = ( m_MousePos . y / ( float ) Graphics ( ) - > ScreenHeight ( ) ) * pScreen - > h ;
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
int Buttons = 0 ;
if ( m_UseMouseButtons )
{
2016-04-30 18:11:26 +00:00
if ( Input ( ) - > KeyIsPressed ( KEY_MOUSE_1 ) ) Buttons | = 1 ;
if ( Input ( ) - > KeyIsPressed ( KEY_MOUSE_2 ) ) Buttons | = 2 ;
if ( Input ( ) - > KeyIsPressed ( KEY_MOUSE_3 ) ) Buttons | = 4 ;
2010-05-29 07:25:38 +00:00
}
2011-04-13 18:37:12 +00:00
2010-05-29 07:25:38 +00:00
UI ( ) - > Update ( mx , my , mx * 3.0f , my * 3.0f , Buttons ) ;
2011-04-13 18:37:12 +00:00
2009-01-10 11:16:21 +00:00
// render
2020-08-29 10:49:45 +00:00
Render ( ) ;
2008-09-24 15:09:09 +00:00
2009-01-10 11:16:21 +00:00
// render cursor
2010-05-29 07:25:38 +00:00
Graphics ( ) - > TextureSet ( g_pData - > m_aImages [ IMAGE_CURSOR ] . m_Id ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
Graphics ( ) - > SetColor ( 1 , 1 , 1 , 1 ) ;
2010-05-29 07:25:38 +00:00
IGraphics : : CQuadItem QuadItem ( mx , my , 24 , 24 ) ;
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2009-01-10 11:16:21 +00:00
// render debug information
2010-05-29 07:25:38 +00:00
if ( g_Config . m_Debug )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CUIRect Screen = * UI ( ) - > Screen ( ) ;
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ;
char aBuf [ 512 ] ;
str_format ( aBuf , sizeof ( aBuf ) , " %p %p %p " , UI ( ) - > HotItem ( ) , UI ( ) - > ActiveItem ( ) , UI ( ) - > LastActiveItem ( ) ) ;
CTextCursor Cursor ;
TextRender ( ) - > SetCursor ( & Cursor , 10 , 10 , 10 , TEXTFLAG_RENDER ) ;
TextRender ( ) - > TextEx ( & Cursor , aBuf , - 1 ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
m_EscapePressed = false ;
m_EnterPressed = false ;
2010-09-03 18:05:22 +00:00
m_DeletePressed = false ;
2010-05-29 07:25:38 +00:00
m_NumInputEvents = 0 ;
2008-08-27 15:48:50 +00:00
}
2008-09-11 22:45:28 +00:00
2010-05-29 07:25:38 +00:00
void CMenus : : RenderBackground ( )
2008-09-11 22:45:28 +00:00
{
2009-10-27 14:38:53 +00:00
float sw = 300 * Graphics ( ) - > ScreenAspect ( ) ;
2008-09-24 15:09:09 +00:00
float sh = 300 ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > MapScreen ( 0 , 0 , sw , sh ) ;
2008-09-23 11:58:12 +00:00
2008-09-24 15:09:09 +00:00
// render background color
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureClear ( ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
2019-04-26 22:11:15 +00:00
ColorRGBA Bottom ( ms_GuiColor . r , ms_GuiColor . g , ms_GuiColor . b , 1.0f ) ;
ColorRGBA Top ( ms_GuiColor . r , ms_GuiColor . g , ms_GuiColor . b , 1.0f ) ;
2010-05-29 07:25:38 +00:00
IGraphics : : CColorVertex Array [ 4 ] = {
IGraphics : : CColorVertex ( 0 , Top . r , Top . g , Top . b , Top . a ) ,
IGraphics : : CColorVertex ( 1 , Top . r , Top . g , Top . b , Top . a ) ,
IGraphics : : CColorVertex ( 2 , Bottom . r , Bottom . g , Bottom . b , Bottom . a ) ,
IGraphics : : CColorVertex ( 3 , Bottom . r , Bottom . g , Bottom . b , Bottom . a ) } ;
Graphics ( ) - > SetColorVertex ( Array , 4 ) ;
IGraphics : : CQuadItem QuadItem ( 0 , 0 , sw , sh ) ;
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2011-04-13 18:37:12 +00:00
2008-09-24 15:09:09 +00:00
// render the tiles
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureClear ( ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
2010-05-29 07:25:38 +00:00
float Size = 15.0f ;
2016-08-30 23:39:59 +00:00
float OffsetTime = fmod ( LocalTime ( ) * 0.15f , 2.0f ) ;
2010-05-29 07:25:38 +00:00
for ( int y = - 2 ; y < ( int ) ( sw / Size ) ; y + + )
for ( int x = - 2 ; x < ( int ) ( sh / Size ) ; x + + )
2008-09-24 15:09:09 +00:00
{
2009-10-27 14:38:53 +00:00
Graphics ( ) - > SetColor ( 0 , 0 , 0 , 0.045f ) ;
2010-05-29 07:25:38 +00:00
IGraphics : : CQuadItem QuadItem ( ( x - OffsetTime ) * Size * 2 + ( y & 1 ) * Size , ( y + OffsetTime ) * Size , Size , Size ) ;
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
2008-09-24 15:09:09 +00:00
}
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2008-09-24 15:09:09 +00:00
// render border fade
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureSet ( m_TextureBlob ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
2016-02-16 16:04:46 +00:00
Graphics ( ) - > SetColor ( 1 , 1 , 1 , 1 ) ;
2010-05-29 07:25:38 +00:00
QuadItem = IGraphics : : CQuadItem ( - 100 , - 100 , sw + 200 , sh + 200 ) ;
Graphics ( ) - > QuadsDrawTL ( & QuadItem , 1 ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > QuadsEnd ( ) ;
2008-09-24 15:09:09 +00:00
2011-04-13 18:37:12 +00:00
// restore screen
{ CUIRect Screen = * UI ( ) - > Screen ( ) ;
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ; }
2008-09-11 22:45:28 +00:00
}
2011-01-30 16:21:41 +00:00
int CMenus : : DoButton_CheckBox_DontCare ( const void * pID , const char * pText , int Checked , const CUIRect * pRect )
{
switch ( Checked )
{
case 0 :
return DoButton_CheckBox_Common ( pID , pText , " " , pRect ) ;
case 1 :
return DoButton_CheckBox_Common ( pID , pText , " X " , pRect ) ;
case 2 :
return DoButton_CheckBox_Common ( pID , pText , " O " , pRect ) ;
default :
return DoButton_CheckBox_Common ( pID , pText , " " , pRect ) ;
}
2011-12-01 17:48:09 +00:00
}
2014-04-27 03:01:03 +00:00
void CMenus : : RenderUpdating ( const char * pCaption , int current , int total )
{
// make sure that we don't render for each little thing we load
// because that will slow down loading if we have vsync
static int64 LastLoadRender = 0 ;
if ( time_get ( ) - LastLoadRender < time_freq ( ) / 60 )
return ;
LastLoadRender = time_get ( ) ;
// need up date this here to get correct
2019-04-26 23:02:31 +00:00
ms_GuiColor = color_cast < ColorRGBA > ( ColorHSLA ( g_Config . m_UiColor , true ) ) ;
2014-04-27 03:01:03 +00:00
CUIRect Screen = * UI ( ) - > Screen ( ) ;
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ;
2019-04-28 17:22:19 +00:00
2018-03-13 20:59:07 +00:00
Graphics ( ) - > BlendNormal ( ) ;
2014-04-27 03:01:03 +00:00
RenderBackground ( ) ;
float w = 700 ;
float h = 200 ;
float x = Screen . w / 2 - w / 2 ;
float y = Screen . h / 2 - h / 2 ;
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureClear ( ) ;
2014-04-27 03:01:03 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
Graphics ( ) - > SetColor ( 0 , 0 , 0 , 0.50f ) ;
RenderTools ( ) - > DrawRoundRect ( 0 , y , Screen . w , h , 0.0f ) ;
Graphics ( ) - > QuadsEnd ( ) ;
CUIRect r ;
r . x = x ;
r . y = y + 20 ;
r . w = w ;
r . h = h ;
UI ( ) - > DoLabel ( & r , Localize ( pCaption ) , 32.0f , 0 , - 1 ) ;
2018-03-13 20:59:07 +00:00
if ( total > 0 )
2014-04-27 03:01:03 +00:00
{
float Percent = current / ( float ) total ;
2012-08-12 10:41:50 +00:00
Graphics ( ) - > TextureClear ( ) ;
2014-04-27 03:01:03 +00:00
Graphics ( ) - > QuadsBegin ( ) ;
Graphics ( ) - > SetColor ( 0.15f , 0.15f , 0.15f , 0.75f ) ;
RenderTools ( ) - > DrawRoundRect ( x + 40 , y + h - 75 , w - 80 , 30 , 5.0f ) ;
Graphics ( ) - > SetColor ( 1 , 1 , 1 , 0.75f ) ;
RenderTools ( ) - > DrawRoundRect ( x + 45 , y + h - 70 , ( w - 85 ) * Percent , 20 , 5.0f ) ;
Graphics ( ) - > QuadsEnd ( ) ;
}
Graphics ( ) - > Swap ( ) ;
}