2016-03-27 11:49:47 +02:00
/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Copyright ( C ) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code .
OpenMoHAA source code is free software ; you can redistribute it
and / or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation ; either version 2 of the License ,
or ( at your option ) any later version .
OpenMoHAA source code is distributed in the hope that it will be
useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
# include "ui_local.h"
2023-06-17 01:24:20 +02:00
# include "../qcommon/localization.h"
2016-03-27 11:49:47 +02:00
Event W_Destroyed
(
" widget_destroyed " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Specifies that the widget has been destroyed. "
) ;
Event W_SizeChanged
(
" size_changed " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Specifies that the size of the widget has changed. "
) ;
Event W_FrameChanged
(
" frame_changed " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Specifies that the frame has changed. "
) ;
Event W_OriginChanged
(
" origin_changed " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Specifies that the origin f the widget has changed. "
) ;
Event W_Activated
(
" activated " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Signals that the widget has been activated. "
) ;
Event EV_Widget_Activate
(
" activate " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Activate this widget. "
) ;
Event W_Deactivated
(
" deactivated " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Signals that the widget has been deactivated. "
) ;
Event EV_Widget_Hide
(
" hide " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Hides the widget. "
) ;
Event EV_Widget_Enable
(
" enable " ,
EV_DEFAULT ,
NULL ,
NULL ,
" enable the widget. "
) ;
Event EV_Widget_Disable
(
" disable " ,
EV_DEFAULT ,
NULL ,
NULL ,
" enable the widget. "
) ;
Event W_RealignWidget
(
" realign_widget " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Specifies that the widget has been realigned. "
) ;
Event W_Draw
(
" draw_widget " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Draw the widget. "
) ;
Event EV_Layout_Size
(
" size " ,
EV_DEFAULT ,
" ffff " ,
" x y width height " ,
" Set the size of the widget "
) ;
Event EV_Layout_Rect
(
" rect " ,
EV_DEFAULT ,
" ffff " ,
" x y width height " ,
" Set the rect of the widget "
) ;
Event EV_Layout_Name
(
" name " ,
EV_DEFAULT ,
" s " ,
" name " ,
" Set the name of the widget "
) ;
Event EV_Layout_Title
(
" title " ,
EV_DEFAULT ,
" s " ,
" title " ,
" Set the title of the widget to be displayed in the center of it "
) ;
Event EV_Layout_Font
(
" font " ,
EV_DEFAULT ,
" s " ,
" title " ,
" Set the font of the widget "
) ;
Event EV_Layout_BGColor
(
" bgcolor " ,
EV_DEFAULT ,
" ffff " ,
" red green blue alpha " ,
" Set the background color of the widget "
) ;
Event EV_Layout_FGColor
(
" fgcolor " ,
EV_DEFAULT ,
" ffff " ,
" red green blue alpha " ,
" Set the foreground color of the widget "
) ;
Event EV_Layout_Borderstyle
(
" borderstyle " ,
EV_DEFAULT ,
" s " ,
" style " ,
" Set the borderstyle of the widget(NONE, 3D_BORDER, INDENT_BORDER) "
) ;
Event EV_Layout_BorderColor
(
" bordercolor " ,
EV_DEFAULT ,
" ffff " ,
" red green blue alpha " ,
" Set the border color of the widget "
) ;
Event EV_Layout_Shader
(
" shader " ,
EV_DEFAULT ,
" s " ,
" shaderName " ,
" Set the shader to draw on the background of the widget "
) ;
Event EV_Layout_TileShader
(
" tileshader " ,
EV_DEFAULT ,
" s " ,
" shaderName " ,
" Set the shader to draw tiled on the background of the widget "
) ;
Event EV_Layout_HoverShader
(
" hovershader " ,
EV_DEFAULT ,
" s " ,
" shaderName " ,
" Set the shader to on the background of the widget when the mouse is over the widget "
) ;
Event EV_Layout_PressedShader
(
" pressedshader " ,
EV_DEFAULT ,
" s " ,
" shaderName " ,
" Set the shader to on the background of the widget when it is pressed in "
) ;
Event EV_Layout_FadeIn
(
" fadein " ,
EV_DEFAULT ,
" f " ,
" fadetime " ,
" Set the amount of time it takes for the widget to fade in "
) ;
Event EV_Layout_StopSound
(
" stopsound " ,
EV_DEFAULT ,
" s " ,
" soundName " ,
" Set the sound to be played when the widget stops moving "
) ;
Event EV_Layout_ClickSound
(
" clicksound " ,
EV_DEFAULT ,
" s " ,
" soundName " ,
" Set the sound to be played when the widget is clicked "
) ;
Event EV_Layout_Stretch
(
" stretch " ,
EV_DEFAULT ,
" s " ,
" stretchdir " ,
" Set the widget to be stretched horizontally or vertically across the screen "
) ;
Event EV_Layout_VirtualRes
(
" virtualres " ,
EV_DEFAULT ,
" i " ,
" usevirtualres " ,
" Set the widget to be modified horizontally or vertically across the screen to account for resolutions != 640x480 "
) ;
Event EV_Layout_InitData
(
" initdata " ,
EV_DEFAULT ,
" s " ,
" datastring " ,
" Set the linkcvar to be initialized to this value "
) ;
Event EV_Layout_Direction
(
" direction " ,
EV_DEFAULT ,
" sF " ,
" direction time " ,
" Set the direction the widget will appear from on the screen \n (from_top, from_bottom, from_left, or from_right) \n Time is specified to determine how fast the widget will scroll in \n "
) ;
Event EV_Layout_Align
(
" align " ,
EV_DEFAULT ,
" s " ,
" alignment " ,
" Set the side of the screen to align the widget(left right top bottom centerx centery) "
) ;
Event EV_Layout_StuffCommand
(
" stuffcommand " ,
EV_DEFAULT ,
" s " ,
" command " ,
" Set the command to be stuffed when the widget is clicked "
) ;
Event EV_Layout_LinkCvar
(
" linkcvar " ,
EV_DEFAULT ,
" s " ,
" cvarname " ,
" Set the cvar that will be updated when the widget is changed "
) ;
Event EV_Layout_NoParentClipping
(
" noparentclip " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Set the widget to not be clipped by the parent widget "
) ;
Event EV_Layout_NoParentAdjustment
(
" noparentadjust " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Set the widget to not be adjusted by the parent widget "
) ;
Event EV_Widget_HideCommand
(
" hidecommand " ,
EV_DEFAULT ,
" s " ,
" command " ,
" Set a command to be executed when the widget is hidden "
) ;
Event EV_Widget_ShowCommand
(
" showcommand " ,
EV_DEFAULT ,
" s " ,
" command " ,
" Set a command to be executed when the widget is shown "
) ;
Event EV_Widget_OrderNumber
(
" ordernumber " ,
EV_DEFAULT ,
" d " ,
" num " ,
" Set the order the widget should be activated in "
) ;
Event EV_Widget_TextAlignment
(
" textalign " ,
EV_DEFAULT ,
" s " ,
" alignment " ,
" Sets the alignment of text for this widget "
) ;
Event EV_Widget_EnabledCvar
(
" enabledcvar " ,
EV_DEFAULT ,
" s " ,
" cvar_name " ,
" Set the cvar to check to see if this button is enabled or not "
) ;
2023-05-29 20:32:22 +02:00
Event EV_Widget_ScaleCvar
(
" scalecvar " ,
EV_DEFAULT ,
" s " ,
" cvar_name " ,
" Set the cvar to check to scale this component "
) ;
2016-03-27 11:49:47 +02:00
Event EV_Layout_AliasCache
(
" aliascache " ,
EV_DEFAULT ,
" ssSSSSSS " ,
" alias realPath arg1 arg2 arg3 arg4 arg5 arg6 " ,
" Create an alias to the specified path and cache the resource "
) ;
2023-07-30 00:56:54 +02:00
Event EV_Layout_DontLocalize
(
" dontlocalize " ,
EV_DEFAULT ,
NULL ,
NULL ,
" Disables localization for this widget "
) ;
Event EV_Layout_FadeSequence
(
" fadesequence " ,
EV_DEFAULT ,
" ffff " ,
" delay fadein hold fadeout " ,
" Set up for a delay/fadein/hold/fadeout "
) ;
2016-03-27 11:49:47 +02:00
Event EV_Layout_BGFill
(
" bgfill " ,
EV_DEFAULT ,
" ffff " ,
" red green blue alpha " ,
" Set a color to fill the entire background "
) ;
Event EV_Layout_Fullscreen
(
" fullscreen " ,
EV_DEFAULT ,
" b " ,
" fullscreen " ,
" Set container to be fullscreen. This will disable the game rendering if it's active "
) ;
Event EV_Layout_VidMode
(
" vidmode " ,
EV_DEFAULT ,
" i " ,
" vidmode " ,
" Set container's vidmode to change to when it's active "
) ;
CLASS_DECLARATION ( USignal , UIWidget , NULL )
{
{ & EV_Widget_Hide , & UIWidget : : Hide } ,
{ & EV_Widget_Activate , & UIWidget : : Activate } ,
{ & EV_Layout_Size , & UIWidget : : LayoutSize } ,
{ & EV_Layout_Rect , & UIWidget : : LayoutRect } ,
{ & EV_Layout_Name , & UIWidget : : LayoutName } ,
{ & EV_Layout_Title , & UIWidget : : LayoutTitle } ,
{ & EV_Layout_Font , & UIWidget : : LayoutFont } ,
{ & EV_Layout_BGColor , & UIWidget : : LayoutBgColor } ,
{ & EV_Layout_FGColor , & UIWidget : : LayoutFgColor } ,
{ & EV_Layout_Borderstyle , & UIWidget : : LayoutBorderStyle } ,
{ & EV_Layout_BorderColor , & UIWidget : : LayoutBorderColor } ,
{ & EV_Layout_Shader , & UIWidget : : LayoutShader } ,
{ & EV_Layout_TileShader , & UIWidget : : LayoutTileShader } ,
{ & EV_Layout_HoverShader , & UIWidget : : LayoutHoverShader } ,
{ & EV_Layout_PressedShader , & UIWidget : : LayoutPressedShader } ,
{ & EV_Layout_FadeIn , & UIWidget : : LayoutFadeIn } ,
{ & EV_Layout_StopSound , & UIWidget : : LayoutStopSound } ,
{ & EV_Layout_ClickSound , & UIWidget : : LayoutClickSound } ,
{ & EV_Layout_Stretch , & UIWidget : : LayoutStretch } ,
{ & EV_Layout_VirtualRes , & UIWidget : : LayoutVirtualRes } ,
{ & EV_Layout_InitData , & UIWidget : : LayoutInitData } ,
{ & EV_Layout_Direction , & UIWidget : : LayoutDirection } ,
{ & EV_Layout_Align , & UIWidget : : LayoutAlign } ,
{ & EV_Layout_NoParentClipping , & UIWidget : : LayoutNoParentClipping } ,
{ & EV_Layout_NoParentAdjustment , & UIWidget : : LayoutNoParentAdjustment } ,
{ & EV_Layout_StuffCommand , & UIWidget : : LayoutStuffCommand } ,
{ & EV_Layout_LinkCvar , & UIWidget : : LayoutLinkCvar } ,
{ & EV_Layout_AliasCache , & UIWidget : : LayoutAliasCache } ,
{ & EV_Widget_ShowCommand , & UIWidget : : ShowCommand } ,
{ & EV_Widget_HideCommand , & UIWidget : : HideCommand } ,
{ & EV_Widget_OrderNumber , & UIWidget : : LayoutOrderNumber } ,
{ & EV_Widget_TextAlignment , & UIWidget : : TextAlignment } ,
{ & EV_Widget_Enable , & UIWidget : : EnableEvent } ,
{ & EV_Widget_Disable , & UIWidget : : DisableEvent } ,
{ & EV_Widget_EnabledCvar , & UIWidget : : SetEnabledCvar } ,
2023-05-29 20:32:22 +02:00
{ & EV_Widget_ScaleCvar , & UIWidget : : SetScaleCvar } ,
2023-07-30 00:56:54 +02:00
{ & EV_Layout_DontLocalize , & UIWidget : : SetDontLocalize } ,
{ & EV_Layout_FadeSequence , & UIWidget : : EventFadeSequence } ,
2016-03-27 11:49:47 +02:00
{ NULL , NULL }
} ;
void SetColor ( const UColor & color , float alpha )
{
2023-05-15 20:13:04 +02:00
const vec4_t col = {
color . r ,
color . g ,
color . b ,
color . a * alpha
} ;
uii . Rend_SetColor ( col ) ;
2016-03-27 11:49:47 +02:00
}
void DrawBox ( const UIRect2D & rect , const UColor & color , float alpha )
{
DrawBox ( rect . pos . x , rect . pos . y , rect . size . width , rect . size . height , color , alpha ) ;
}
void Draw3DBox ( const UIRect2D & rect , bool indent , const UBorderColor & color , float alpha )
{
Draw3DBox ( rect . pos . x , rect . pos . y , rect . size . width , rect . size . height , indent , color , alpha ) ;
}
void DrawBox ( float x , float y , float width , float height , const UColor & color , float alpha )
{
SetColor ( color , alpha ) ;
uii . Rend_DrawBox ( x , y , width , height ) ;
}
void Draw3DBox ( float x , float y , float width , float height , bool indent , const UBorderColor & color , float alpha )
{
if ( indent )
{
DrawBox ( x , y , 1.0 , height - 1.0 , color . dark , alpha ) ;
DrawBox ( x + 1.0 , y + 1.0 , 1.0 , height - 3.0 , color . reallydark , alpha ) ;
DrawBox ( x , y , width - 1.0 , 1.0 , color . dark , alpha ) ;
DrawBox ( x + 1.0 , y + 1.0 , width - 1.0 , 1.0 , color . reallydark , alpha ) ;
DrawBox ( x + width - 1.0 , y , 1.0 , height , color . light , alpha ) ;
DrawBox ( x , y + height - 1.0 , width , 1.0 , color . light , alpha ) ;
}
else
{
DrawBox ( x + width - 2.0 , y + 1.0 , 1.0 , height - 2.0 , color . dark , alpha ) ;
DrawBox ( x + width - 1.0 , y , 1.0 , height , color . reallydark , alpha ) ;
DrawBox ( x + 1.0 , y + height - 2.0 , width - 2.0 , 1.0 , color . dark , alpha ) ;
DrawBox ( x , y + height - 1.0 , width , 1.0 , color . reallydark , alpha ) ;
DrawBox ( x , y , 1.0 , height - 1.0 , color . light , alpha ) ;
DrawBox ( x , y , width - 1.0 , 1.0 , color . light , alpha ) ;
}
}
void DrawMac3DBox ( const UIRect2D & rect , bool indent , const UBorderColor & color , int inset , float alpha )
{
float x , y ;
float width , height ;
x = rect . pos . x + inset ;
y = rect . pos . y + inset ;
width = rect . size . width - inset * 2 ;
height = rect . size . height - inset * 2 ;
if ( indent )
{
DrawBox ( x + 1.0 , y + 1.0 , width - 2.0 , height - 2.0 , color . dark , alpha ) ;
DrawBox ( x , y , width , 1.0 , color . reallydark , alpha ) ;
DrawBox ( x , y + 1.0 , 1.0 , width - 2.0 , color . reallydark , alpha ) ;
DrawBox ( x + width - 1.0 , y + 1.0 , 1.0 , height - 1.0 , color . light , alpha ) ;
DrawBox ( x , y + height - 1.0 , width - 1.0 , 1.0 , color . light , alpha ) ;
}
else
{
DrawBox ( x , y , width , 1.0 , color . light , alpha ) ;
DrawBox ( x , y + 1.0 , 1.0 , height - 2.0 , color . light , alpha ) ;
DrawBox ( x + width - 1.0 , y + 1.0 , 1.0 , height - 1.0 , color . dark , alpha ) ;
DrawBox ( x , y + height - 1.0 , width - 1.0 , 1.0 , color . dark , alpha ) ;
}
}
void DrawBoxWithSolidBorder ( const UIRect2D & rect , const UColor & inside , const UColor & outside , int size , int flags , float alpha )
{
if ( flags & 1 )
{
DrawBox ( rect . pos . x + size , rect . pos . y + size , rect . size . width - size * 2 , rect . size . height - size * 2 , inside , alpha ) ;
}
if ( size & & flags & 2 )
{
DrawBox ( rect . pos . x , rect . pos . y , size , rect . size . height - size , outside , alpha ) ;
DrawBox ( rect . pos . x + size , rect . pos . y , rect . size . width - size , size , outside , alpha ) ;
DrawBox ( rect . pos . x + rect . size . width - size , rect . pos . y + size , size , rect . size . height - size , outside , alpha ) ;
DrawBox ( rect . pos . x , rect . pos . y + rect . size . height - size , rect . size . width - size , size , outside , alpha ) ;
}
}
UIReggedMaterial : : UIReggedMaterial ( )
{
hMat = 0 ;
isSet = true ;
isGot = false ;
}
uihandle_t UIReggedMaterial : : GetMaterial ( )
{
2023-12-30 21:09:23 +01:00
ReregisterMaterial ( ) ;
2016-03-27 11:49:47 +02:00
return hMat ;
}
void UIReggedMaterial : : ReregisterMaterial
(
void
)
{
if ( ! isGot )
{
isGot = true ;
2023-05-16 14:11:09 +02:00
this - > hMat = uii . Rend_RegisterMaterial ( name . c_str ( ) ) ;
2016-03-27 11:49:47 +02:00
}
}
void UIReggedMaterial : : CleanupMaterial
(
void
)
{
isGot = false ;
}
void UIReggedMaterial : : SetMaterial
(
const str & name
)
{
this - > name = name ;
}
void UIReggedMaterial : : RefreshMaterial
(
void
)
{
2024-02-07 23:33:02 +01:00
if ( isGot )
2016-03-27 11:49:47 +02:00
{
2024-07-23 19:06:48 +02:00
this - > hMat = uii . Rend_RefreshMaterial ( name . c_str ( ) ) ;
2016-03-27 11:49:47 +02:00
}
}
str UIReggedMaterial : : GetName
(
void
)
{
return name ;
}
UIWidget : : UIWidget ( )
{
2023-09-07 19:31:31 +02:00
VectorSet2D ( m_vVirtualScale , 1 , 1 ) ;
2016-03-27 11:49:47 +02:00
m_parent = NULL ;
2023-05-17 19:08:48 +02:00
m_background_color . set ( 0.075f , 0.097f , 0.139f , 1.0f ) ;
2023-05-16 22:02:45 +02:00
m_foreground_color = UColor ( UHudColor ) ;
m_border_color = UColor ( 0.15f , 0.195f , 0.278f , 1.0f ) ;
2016-03-27 11:49:47 +02:00
m_indent = 10.0f ;
m_bottomindent = 5.0f ;
m_borderStyle = border_indent ;
m_visible = true ;
m_enabled = true ;
m_canactivate = false ;
2024-06-08 01:40:36 +02:00
m_commandhandler = NULL ;
2016-03-27 11:49:47 +02:00
m_font = NULL ;
m_material = NULL ;
m_hovermaterial = NULL ;
m_pressedmaterial = NULL ;
m_hovermaterial_active = false ;
m_pressedmaterial_active = false ;
m_direction = D_NONE ;
m_fadetime = 0.0f ;
m_alpha = 1.0f ;
m_motiontime = 0.0f ;
m_starttime = 0.0f ;
m_direction_orig = D_NONE ;
m_motiontype = MOTION_IN ;
m_align = 0 ;
m_flags = 0 ;
m_dying = false ;
m_ordernum = 0 ;
m_configstring_index = - 1 ;
m_iFontAlignmentHorizontal = FONT_JUSTHORZ_CENTER ;
m_iFontAlignmentVertical = FONT_JUSTVERT_CENTER ;
m_bVirtual = false ;
2023-09-07 19:31:31 +02:00
m_scaleCvar = NULL ;
2016-03-27 11:49:47 +02:00
m_enabledCvar = " " ;
2023-09-07 19:31:31 +02:00
m_fadeSequenceDelayStart = 0 ;
m_fadeSequenceFadeIn = 0 ;
m_fadeSequenceHold = 0 ;
m_fadeSequenceFadeOut = 0 ;
m_fadeSequenceState = fadesequence_t : : SEQUENCE_NONE ;
m_fadeSequenceAlpha = 0 ;
2016-03-27 11:49:47 +02:00
UIRect2D frame ( 6.0f , 6.0f , 100.0f , 13.0f ) ;
setFrame ( frame ) ;
}
UIWidget : : ~ UIWidget ( )
{
//int i;
m_dying = true ;
2023-12-30 17:11:12 +01:00
if ( IsActive ( ) ) {
2016-03-27 11:49:47 +02:00
uWinMan . DeactivateCurrentSmart ( ) ;
2023-12-30 17:11:12 +01:00
}
2016-03-27 11:49:47 +02:00
//for( i = m_children.NumObjects(); i > 0; i-- ) {
//
//}
// remove this child from our parent
2023-12-30 17:11:12 +01:00
if ( m_parent ) {
2016-03-27 11:49:47 +02:00
m_parent - > removeChild ( this ) ;
2023-12-30 17:11:12 +01:00
}
2016-03-27 11:49:47 +02:00
// delete font
2023-05-17 21:50:50 +02:00
if ( m_font )
{
2016-03-27 11:49:47 +02:00
delete m_font ;
2023-05-17 21:50:50 +02:00
m_font = NULL ;
}
2016-03-27 11:49:47 +02:00
SendSignal ( W_Destroyed ) ;
}
bool UIWidget : : addChild
(
UIWidget * widget
)
{
2023-05-16 16:23:13 +02:00
if ( m_children . ObjectInList ( widget ) )
2016-03-27 11:49:47 +02:00
{
return false ;
}
2023-05-16 16:23:13 +02:00
m_children . AddObject ( widget ) ;
if ( m_children . NumObjects ( ) ! = 1 )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
UIWidget * child = m_children . ObjectAt ( m_children . NumObjects ( ) - 1 ) ;
if ( ( child - > m_flags & ( WF_ALWAYS_TOP | WF_ALWAYS_BOTTOM ) ) ! = ( widget - > m_flags & ( WF_ALWAYS_TOP | WF_ALWAYS_BOTTOM ) ) )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
ArrangeWidgetList ( m_children ) ;
2016-03-27 11:49:47 +02:00
}
}
return true ;
}
bool UIWidget : : removeChild
(
UIWidget * widget
)
{
if ( m_children . ObjectInList ( widget ) )
{
m_children . RemoveObject ( widget ) ;
return true ;
}
return false ;
}
void UIWidget : : PropogateCoordinateSystem
(
void
)
{
int i ;
int n ;
UIWidget * subview ;
2023-05-29 20:32:22 +02:00
if ( m_parent )
{
if ( m_parent - > m_scaleCvar ) {
m_scaleCvar = m_parent - > m_scaleCvar ;
}
}
2023-05-16 16:23:13 +02:00
if ( ! m_parent | | ( m_flags & WF_NOPARENTADJUST ) )
2016-03-27 11:49:47 +02:00
{
m_screenorigin = m_origin ;
m_clippedorigin = m_origin ;
m_screenframe = m_frame ;
m_clippedframe = m_frame ;
}
else
{
2023-05-16 16:23:13 +02:00
m_screenframe . pos . x = m_frame . pos . x + m_parent - > m_screenorigin . x ;
m_screenframe . pos . y = m_frame . pos . y + m_parent - > m_screenorigin . y ;
2016-03-27 11:49:47 +02:00
m_screenframe . size = m_frame . size ;
m_screenorigin . x = m_screenframe . pos . x - m_origin . x ;
m_screenorigin . y = m_screenframe . pos . y - m_origin . y ;
m_clippedframe = m_screenframe ;
m_clippedorigin . x = - m_origin . x ;
m_clippedorigin . y = - m_origin . y ;
}
if ( m_parent & & ! ( m_flags & WF_DIRECTED ) )
{
if ( m_parent - > m_clippedframe . pos . x > m_clippedframe . pos . x )
{
m_clippedframe . size . width - = ( m_parent - > m_clippedframe . pos . x - m_clippedframe . pos . x ) ;
if ( m_clippedframe . size . width < 0.0 )
m_clippedframe . size . width = 0.0 ;
m_clippedframe . pos . x = m_parent - > m_clippedframe . pos . x ;
}
if ( m_parent - > m_clippedframe . pos . y > m_clippedframe . pos . y )
{
m_clippedframe . size . height - = ( m_parent - > m_clippedframe . pos . y - m_clippedframe . pos . y ) ;
if ( m_clippedframe . size . height < 0.0 )
m_clippedframe . size . height = 0.0 ;
m_clippedframe . pos . y = m_parent - > m_clippedframe . pos . y ;
}
if ( m_parent - > m_clippedframe . getMaxX ( ) < m_clippedframe . getMaxX ( ) )
{
m_clippedframe . size . width = m_parent - > m_clippedframe . getMaxX ( ) - m_clippedframe . pos . x ;
if ( m_clippedframe . size . width < 0.0 )
m_clippedframe . size . width = 0.0 ;
}
if ( m_parent - > m_clippedframe . getMaxY ( ) < m_clippedframe . getMaxY ( ) )
{
m_clippedframe . size . height = m_parent - > m_clippedframe . getMaxY ( ) - m_clippedframe . pos . y ;
if ( m_clippedframe . size . height < 0.0 )
m_clippedframe . size . height = 0.0 ;
}
}
n = m_children . NumObjects ( ) ;
for ( i = 1 ; i < = n ; i + + )
{
subview = m_children . ObjectAt ( i ) ;
subview - > PropogateCoordinateSystem ( ) ;
}
}
void UIWidget : : set2D
(
void
)
{
uii . Rend_Set2D ( m_screenframe . pos . x ,
2023-05-16 00:07:36 +02:00
uid . vidHeight - ( int ) ( m_screenframe . size . height + m_screenframe . pos . y ) ,
2016-03-27 11:49:47 +02:00
m_screenframe . size . width ,
m_screenframe . size . height ,
m_clippedorigin . x ,
m_clippedorigin . x + m_screenframe . size . width ,
m_clippedorigin . y + m_screenframe . size . height ,
m_clippedorigin . y ,
- 1.0 , 1.0 ) ;
uii . Rend_Scissor ( m_clippedframe . pos . x ,
2023-05-16 00:07:36 +02:00
uid . vidHeight - ( int ) ( m_clippedframe . size . height + m_clippedframe . pos . y ) ,
2016-03-27 11:49:47 +02:00
m_clippedframe . size . width ,
m_clippedframe . size . height ) ;
}
void UIWidget : : Draw
(
void
)
{
}
void UIWidget : : FrameInitialized
(
void
)
{
2023-07-30 00:56:54 +02:00
if ( m_fadeSequenceDelayStart | | m_fadeSequenceFadeIn | | m_fadeSequenceHold | | m_fadeSequenceFadeOut ) {
m_fadeSequenceDelayEnd = m_fadeSequenceDelayStart ;
m_fadeSequenceState = fadesequence_t : : SEQUENCE_FADEIN ;
}
2016-03-27 11:49:47 +02:00
}
void UIWidget : : DrawTitle
(
float x ,
float y
)
{
m_font - > setColor ( m_foreground_color ) ;
m_font - > Print ( x , y , Sys_LV_CL_ConvertString ( m_title ) , - 1 , m_bVirtual ) ;
}
void UIWidget : : Motion
(
void
)
{
float t ;
float frac ;
int i ;
float nx , ny ;
t = uid . time / 1000.0 ;
2023-07-30 00:56:54 +02:00
if ( m_fadeSequenceState ! = fadesequence_t : : SEQUENCE_NONE )
2016-03-27 11:49:47 +02:00
{
2023-07-30 00:56:54 +02:00
if ( ! paused - > integer ) {
switch ( m_fadeSequenceState )
{
case fadesequence_t : : SEQUENCE_STARTING :
m_alpha = 0.f ;
m_fadeSequenceDelayEnd - = t - m_fadeSequenceAlpha ;
if ( m_fadeSequenceDelayEnd > = 0.f ) {
m_fadeSequenceAlpha = t ;
} else {
m_fadeSequenceState = fadesequence_t : : SEQUENCE_FADEIN ;
m_fadeSequenceAlpha = t ;
m_fadeSequenceDelayEnd = m_fadeSequenceFadeIn ;
}
break ;
case fadesequence_t : : SEQUENCE_FADEIN :
m_alpha = 1.f - m_fadeSequenceDelayEnd / m_fadeSequenceFadeIn ;
m_fadeSequenceDelayEnd - = t - m_fadeSequenceAlpha ;
if ( m_fadeSequenceDelayEnd > = 0.f ) {
m_fadeSequenceAlpha = t ;
} else {
m_fadeSequenceState = fadesequence_t : : SEQUENCE_HOLD ;
m_fadeSequenceAlpha = t ;
m_fadeSequenceDelayEnd = m_fadeSequenceHold ;
}
break ;
case fadesequence_t : : SEQUENCE_HOLD :
m_alpha = 1.f ;
m_fadeSequenceDelayEnd - = t - m_fadeSequenceAlpha ;
if ( m_fadeSequenceDelayEnd > = 0.f ) {
m_fadeSequenceAlpha = t ;
} else {
m_fadeSequenceState = fadesequence_t : : SEQUENCE_FADEOUT ;
m_fadeSequenceAlpha = t ;
m_fadeSequenceDelayEnd = m_fadeSequenceFadeOut ;
}
break ;
case fadesequence_t : : SEQUENCE_FADEOUT :
m_alpha = m_fadeSequenceDelayEnd / m_fadeSequenceFadeOut ;
m_fadeSequenceDelayEnd - = ( t - m_fadeSequenceAlpha ) ;
if ( m_fadeSequenceDelayEnd > = 0.f ) {
m_fadeSequenceAlpha = t ;
} else {
m_alpha = 0.f ;
m_fadeSequenceState = fadesequence_t : : SEQUENCE_NONE ;
}
break ;
default :
m_fadeSequenceAlpha = t ;
break ;
}
} else {
m_fadeSequenceAlpha = t ;
}
} else if ( m_fadetime > = 0.0 ) {
2016-03-27 11:49:47 +02:00
frac = ( t - m_starttime ) / m_fadetime ;
m_alpha = frac ;
if ( m_alpha > 1.0 )
m_alpha = 1.0 ;
if ( m_motiontype = = MOTION_OUT )
m_alpha = 1.0 - m_alpha ;
}
if ( m_direction )
{
frac = ( t - m_starttime ) / m_motiontime ;
2023-05-16 20:19:13 +02:00
if ( m_motiontype = = MOTION_OUT )
2016-03-27 11:49:47 +02:00
{
2023-05-16 20:19:13 +02:00
frac = 1.0 - frac ;
if ( frac < = 0.0 )
2016-03-27 11:49:47 +02:00
{
2023-05-16 20:19:13 +02:00
switch ( m_direction )
2016-03-27 11:49:47 +02:00
{
2023-05-16 20:19:13 +02:00
case D_FROM_BOTTOM :
setFrame ( UIRect2D ( m_frame . pos . x , uid . vidHeight , m_frame . size . width , m_frame . size . height ) ) ;
break ;
case D_FROM_TOP :
setFrame ( UIRect2D ( m_frame . pos . x , - m_frame . size . height - m_parent - > m_screenorigin . y , m_frame . size . width , m_frame . size . height ) ) ;
break ;
case D_FROM_LEFT :
setFrame ( UIRect2D ( - m_frame . size . width - m_parent - > m_screenorigin . x , m_frame . pos . y , m_frame . size . width , m_frame . size . height ) ) ;
break ;
case D_FROM_RIGHT :
setFrame ( UIRect2D ( uid . vidWidth , m_frame . pos . y , m_frame . size . width , m_frame . size . height ) ) ;
break ;
default :
setFrame ( UIRect2D ( m_frame . pos . x , m_frame . pos . y , m_frame . size . width , m_frame . size . height ) ) ;
break ;
2016-03-27 11:49:47 +02:00
}
m_direction = D_NONE ;
}
}
else
{
2023-05-16 20:19:13 +02:00
if ( frac > = 1.0 )
2016-03-27 11:49:47 +02:00
{
2023-05-16 20:19:13 +02:00
// done moving
setFrame ( UIRect2D ( m_startingpos , m_frame . size ) ) ;
FrameInitialized ( ) ;
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
2016-03-27 11:49:47 +02:00
{
2023-05-16 20:19:13 +02:00
m_children . ObjectAt ( i ) - > FrameInitialized ( ) ;
2016-03-27 11:49:47 +02:00
}
m_direction = D_NONE ;
}
}
}
switch ( m_direction )
{
case D_FROM_LEFT :
nx = 0 ;
if ( m_parent )
nx = m_frame . size . width + m_parent - > m_screenorigin . x ;
nx = ( m_startingpos . x + nx ) * frac - nx ;
ny = m_frame . pos . y ;
2023-05-16 20:19:13 +02:00
setFrame ( UIRect2D ( nx , ny , m_frame . size . width , m_frame . size . height ) ) ;
2016-03-27 11:49:47 +02:00
break ;
case D_FROM_RIGHT :
nx = uid . vidWidth - ( uid . vidWidth - m_startingpos . x ) * frac ;
ny = m_frame . pos . y ;
2023-05-16 20:19:13 +02:00
setFrame ( UIRect2D ( nx , ny , m_frame . size . width , m_frame . size . height ) ) ;
2016-03-27 11:49:47 +02:00
break ;
case D_FROM_BOTTOM :
nx = m_frame . pos . x ;
ny = uid . vidHeight - ( uid . vidHeight - m_startingpos . y ) * frac ;
2023-05-16 20:19:13 +02:00
setFrame ( UIRect2D ( nx , ny , m_frame . size . width , m_frame . size . height ) ) ;
2016-03-27 11:49:47 +02:00
break ;
case D_FROM_TOP :
nx = m_frame . pos . y ;
ny = 0 ;
if ( m_parent )
ny = m_frame . size . height + m_parent - > m_screenorigin . y ;
2023-05-16 20:19:13 +02:00
ny = ( m_startingpos . y + ny ) * frac - ny ;
setFrame ( UIRect2D ( nx , ny , m_frame . size . width , m_frame . size . height ) ) ;
2016-03-27 11:49:47 +02:00
break ;
default :
2023-05-16 20:19:13 +02:00
break ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 20:19:13 +02:00
if ( m_direction = = D_NONE )
{
//
// play a sound to indicate the motion has finished
if ( m_stopsound . length ( ) ) {
uii . Snd_PlaySound ( m_stopsound ) ;
}
}
2016-03-27 11:49:47 +02:00
}
void UIWidget : : AlignPosition
(
void
)
{
2023-05-16 16:23:13 +02:00
if ( m_bVirtual )
2016-03-27 11:49:47 +02:00
{
vec2_t vNewVirtualScale ;
2023-05-29 20:32:22 +02:00
SetVirtualScale ( vNewVirtualScale ) ;
2016-03-27 11:49:47 +02:00
2023-05-16 16:23:13 +02:00
if ( ! VectorCompare2D ( m_vVirtualScale , vNewVirtualScale ) )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . x = m_frame . pos . x / m_vVirtualScale [ 0 ] * vNewVirtualScale [ 0 ] ;
m_frame . pos . y = m_frame . pos . y / m_vVirtualScale [ 1 ] * vNewVirtualScale [ 1 ] ;
m_frame . size . width = m_frame . size . width / m_vVirtualScale [ 0 ] * vNewVirtualScale [ 0 ] ;
m_frame . size . height = m_frame . size . height / m_vVirtualScale [ 1 ] * vNewVirtualScale [ 1 ] ;
m_vVirtualScale [ 0 ] = vNewVirtualScale [ 0 ] ;
m_vVirtualScale [ 1 ] = vNewVirtualScale [ 1 ] ;
2016-03-27 11:49:47 +02:00
}
}
2023-05-16 16:23:13 +02:00
if ( m_flags & WF_STRETCH_VERTICAL )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = 0 ;
m_frame . size . height = uid . vidHeight ;
}
2023-05-16 16:23:13 +02:00
if ( m_flags & WF_STRETCH_HORIZONTAL )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = 0 ;
m_frame . size . width = uid . vidWidth ;
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_CENTERX )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . x = uid . vidWidth * 0.5 - m_frame . size . width * 0.5 ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_RIGHT )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = uid . vidWidth - m_frame . size . width ;
}
2023-05-16 16:23:13 +02:00
else if ( m_align & WA_LEFT )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = 0 ;
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_CENTERY )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . y = uid . vidHeight * 0.5 - m_frame . size . height * 0.5 ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_BOTTOM )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = uid . vidHeight - m_frame . size . height ;
}
2023-05-16 16:23:13 +02:00
else if ( m_align & WA_TOP )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = 0 ;
}
2023-05-16 16:23:13 +02:00
setFrame ( m_frame ) ;
2016-03-27 11:49:47 +02:00
}
void UIWidget : : Hide
(
Event * ev
)
{
setShow ( false ) ;
}
void UIWidget : : Activate
(
Event * ev
)
{
uWinMan . ActivateControl ( this ) ;
}
void UIWidget : : BringToFront
(
void
)
{
UIWidget * me ;
if ( m_parent - > m_children . NumObjects ( ) > 1 )
{
me = m_parent - > m_children . ObjectAt ( m_parent - > m_children . NumObjects ( ) ) ;
if ( me ! = this )
{
m_parent - > m_children . RemoveObject ( this ) ;
m_parent - > m_children . AddObject ( this ) ;
if ( ( m_parent - > m_children . ObjectAt ( m_parent - > m_children . NumObjects ( ) - 1 ) - > m_flags & 0x30 ) ! = ( m_flags & 0x30 ) )
{
ArrangeWidgetList ( m_parent - > m_children ) ;
}
}
}
}
void UIWidget : : SplitWidgets
(
Container < UIWidget * > & src ,
Container < UIWidget * > & bottom ,
Container < UIWidget * > & normal ,
Container < UIWidget * > & top
)
{
int i ;
bottom . FreeObjectList ( ) ;
normal . FreeObjectList ( ) ;
top . FreeObjectList ( ) ;
for ( i = 1 ; i < = src . NumObjects ( ) ; i + + )
{
UIWidget * wid = src . ObjectAt ( i ) ;
if ( wid - > m_flags & 0x10 )
{
bottom . AddObject ( wid ) ;
}
else if ( wid - > m_flags & 0x20 )
{
top . AddObject ( wid ) ;
}
else
{
normal . AddObject ( wid ) ;
}
}
}
void UIWidget : : CombineWidgets
(
Container < UIWidget * > & dst ,
Container < UIWidget * > & bottom ,
Container < UIWidget * > & normal ,
Container < UIWidget * > & top
)
{
Container < UIWidget * > * lists [ 3 ] ;
int list ;
int i ;
dst . ClearObjectList ( ) ;
lists [ 0 ] = & bottom ;
lists [ 1 ] = & normal ;
lists [ 2 ] = & top ;
for ( list = 0 ; list < 3 ; list + + )
{
for ( i = 1 ; i < = lists [ list ] - > NumObjects ( ) ; i + + )
{
dst . AddObject ( lists [ list ] - > ObjectAt ( i ) ) ;
}
}
}
void UIWidget : : ArrangeWidgetList
(
Container < UIWidget * > & list
)
{
Container < UIWidget * > bottom ;
Container < UIWidget * > normal ;
Container < UIWidget * > top ;
SplitWidgets ( list , bottom , normal , top ) ;
CombineWidgets ( list , bottom , normal , top ) ;
}
void UIWidget : : Shutdown
(
void
)
{
int i ;
if ( IsActive ( ) )
uWinMan . DeactivateCurrentSmart ( ) ;
// notify childs
for ( i = m_children . NumObjects ( ) ; i > 0 ; i - - )
{
UIWidget * wid = m_children . ObjectAt ( i ) ;
wid - > Shutdown ( ) ;
delete wid ;
}
if ( m_font )
{
delete m_font ;
m_font = NULL ;
}
}
void UIWidget : : InitFrame
(
UIWidget * parentview ,
float x ,
float y ,
float width ,
float height ,
int border ,
const char * fontname
)
{
if ( border ! = - 1 )
{
setBorderStyle ( ( borderstyle_t ) border ) ;
}
setFrame ( UIRect2D ( x , y , width , height ) ) ;
if ( parentview )
{
setParent ( parentview ) ;
}
else if ( this ! = & uWinMan )
{
setParent ( & uWinMan ) ;
}
m_startingpos = m_frame . pos ;
setFont ( fontname ) ;
FrameInitialized ( ) ;
}
void UIWidget : : InitFrame
(
UIWidget * parentview ,
const UIRect2D & r ,
int border ,
const char * fontname
)
{
InitFrame ( parentview , r . pos . x , r . pos . y , r . size . width , r . size . height , border , fontname ) ;
}
void UIWidget : : LayoutSize
(
Event * ev
)
{
LayoutRect ( ev ) ;
}
void UIWidget : : LayoutRect
(
Event * ev
)
{
UIPoint2D pos ;
UISize2D size ;
if ( ev - > NumArgs ( ) = = 4 )
{
pos . x = ev - > GetFloat ( 1 ) ;
pos . y = ev - > GetFloat ( 2 ) ;
size . width = ev - > GetFloat ( 3 ) ;
size . height = ev - > GetFloat ( 4 ) ;
setFrame ( UIRect2D ( pos , size ) ) ;
m_startingpos = pos ;
}
}
void UIWidget : : LayoutName
(
Event * ev
)
{
setName ( ev - > GetString ( 1 ) ) ;
}
void UIWidget : : LayoutTitle
(
Event * ev
)
{
setTitle ( ev - > GetString ( 1 ) ) ;
}
void UIWidget : : LayoutFont
(
Event * ev
)
{
setFont ( ev - > GetString ( 1 ) ) ;
}
void UIWidget : : LayoutBgColor
(
Event * ev
)
{
setBackgroundColor ( UColor ( ev - > GetFloat ( 1 ) , ev - > GetFloat ( 2 ) , ev - > GetFloat ( 3 ) , ev - > GetFloat ( 4 ) ) , true ) ;
}
void UIWidget : : LayoutFgColor
(
Event * ev
)
{
setForegroundColor ( UColor ( ev - > GetFloat ( 1 ) , ev - > GetFloat ( 2 ) , ev - > GetFloat ( 3 ) , ev - > GetFloat ( 4 ) ) ) ;
}
void UIWidget : : LayoutBorderStyle
(
Event * ev
)
{
str style = ev - > GetString ( 1 ) ;
if ( ! stricmp ( style , " NONE " ) )
{
setBorderStyle ( border_none ) ;
}
else if ( ! stricmp ( style , " 3D_BORDER " ) )
{
setBorderStyle ( border_3D ) ;
}
else if ( ! stricmp ( style , " INDENT_BORDER " ) )
{
setBorderStyle ( border_indent ) ;
}
}
void UIWidget : : LayoutBorderColor
(
Event * ev
)
{
setBorderColor ( UColor ( ev - > GetFloat ( 1 ) , ev - > GetFloat ( 2 ) , ev - > GetFloat ( 3 ) , ev - > GetFloat ( 4 ) ) ) ;
}
void UIWidget : : LayoutShader
(
Event * ev
)
{
setMaterial ( uWinMan . RegisterShader ( ev - > GetString ( 1 ) ) ) ;
m_flags & = ~ WF_TILESHADER ;
}
void UIWidget : : LayoutTileShader
(
Event * ev
)
{
setMaterial ( uWinMan . RegisterShader ( ev - > GetString ( 1 ) ) ) ;
m_flags | = WF_TILESHADER ;
}
void UIWidget : : LayoutHoverShader
(
Event * ev
)
{
setHoverMaterial ( uWinMan . RegisterShader ( ev - > GetString ( 1 ) ) ) ;
}
void UIWidget : : LayoutPressedShader
(
Event * ev
)
{
setPressedMaterial ( uWinMan . RegisterShader ( ev - > GetString ( 1 ) ) ) ;
}
void UIWidget : : LayoutFadeIn
(
Event * ev
)
{
m_fadetime = ev - > GetFloat ( 1 ) ;
if ( m_motiontime ! = 0.0 )
{
setMotionTime ( m_fadetime ) ;
}
}
void UIWidget : : LayoutStopSound
(
Event * ev
)
{
m_stopsound = ev - > GetString ( 1 ) ;
uii . Snd_RegisterSound ( m_stopsound , false ) ;
}
void UIWidget : : LayoutClickSound
(
Event * ev
)
{
m_clicksound = ev - > GetString ( 1 ) ;
uii . Snd_RegisterSound ( m_clicksound , false ) ;
}
void UIWidget : : LayoutStretch
(
Event * ev
)
{
str stretch = ev - > GetString ( 1 ) ;
if ( ! stricmp ( stretch , " vertical " ) )
{
m_flags | = WF_STRETCH_VERTICAL ;
}
else if ( ! stricmp ( stretch , " horizontal " ) )
{
m_flags | = WF_STRETCH_HORIZONTAL ;
}
else if ( ! stricmp ( stretch , " both " ) )
{
m_flags | = WF_STRETCH_VERTICAL | WF_STRETCH_HORIZONTAL ;
}
m_flags | = WF_NOPARENTADJUST | WF_DIRECTED ;
}
void UIWidget : : LayoutVirtualRes
(
Event * ev
)
{
if ( ev - > GetInteger ( 1 ) )
{
m_bVirtual = true ;
}
}
void UIWidget : : LayoutInitData
(
Event * ev
)
{
if ( m_cvarname . length ( ) )
{
uii . Cvar_Set ( m_cvarname , ev - > GetString ( 1 ) ) ;
}
}
void UIWidget : : LayoutDirection
(
Event * ev
)
{
str direction = ev - > GetString ( 1 ) ;
if ( ! stricmp ( direction , " from_bottom " ) )
{
setDirection ( D_FROM_BOTTOM ) ;
}
else if ( ! stricmp ( direction , " from_top " ) )
{
setDirection ( D_FROM_TOP ) ;
}
else if ( ! stricmp ( direction , " from_left " ) )
{
setDirection ( D_FROM_LEFT ) ;
}
else if ( ! stricmp ( direction , " from_right " ) )
{
setDirection ( D_FROM_RIGHT ) ;
}
else
{
setDirection ( D_NONE ) ;
}
if ( ev - > NumArgs ( ) > 1 )
{
setMotionTime ( ev - > GetFloat ( 2 ) ) ;
}
m_flags | = WF_DIRECTED ;
}
void UIWidget : : LayoutAlign
(
Event * ev
)
{
2023-05-16 19:02:46 +02:00
for ( int i = 1 ; i < = ev - > NumArgs ( ) ; i + + )
2016-03-27 11:49:47 +02:00
{
str align = ev - > GetString ( i ) ;
if ( ! stricmp ( align , " left " ) )
{
m_align | = WA_LEFT ;
}
else if ( ! stricmp ( align , " right " ) )
{
m_align | = WA_RIGHT ;
}
else if ( ! stricmp ( align , " top " ) )
{
m_align | = WA_TOP ;
}
else if ( ! stricmp ( align , " bottom " ) )
{
m_align | = WA_BOTTOM ;
}
else if ( ! stricmp ( align , " centerx " ) )
{
m_align | = WA_CENTERX ;
}
else if ( ! stricmp ( align , " centery " ) )
{
m_align | = WA_CENTERY ;
}
}
if ( ! isSubclassOf ( UIWidgetContainer ) )
{
2023-05-16 16:23:13 +02:00
m_flags | = WF_NOPARENTADJUST | WF_DIRECTED ;
2016-03-27 11:49:47 +02:00
}
}
void UIWidget : : LayoutStuffCommand
(
Event * ev
)
{
LinkCommand ( ev - > GetString ( 1 ) ) ;
}
void UIWidget : : LayoutLinkCvar
(
Event * ev
)
{
LinkCvar ( ev - > GetString ( 1 ) ) ;
}
void UIWidget : : LayoutNoParentClipping
(
Event * ev
)
{
m_flags | = WF_DIRECTED ;
}
void UIWidget : : LayoutNoParentAdjustment
(
Event * ev
)
{
m_flags | = WF_NOPARENTADJUST ;
}
void UIWidget : : LayoutOrderNumber
(
Event * ev
)
{
m_ordernum = ev - > GetInteger ( 1 ) ;
}
void UIWidget : : TextAlignment
(
Event * ev
)
{
2023-05-19 15:44:31 +02:00
for ( int i = 1 ; i < = ev - > NumArgs ( ) ; i + + )
2016-03-27 11:49:47 +02:00
{
str align = ev - > GetString ( 1 ) ;
if ( ! stricmp ( align , " left " ) )
{
setFontHorizontalAlignment ( FONT_JUSTHORZ_LEFT ) ;
}
else if ( ! stricmp ( align , " right " ) )
{
setFontHorizontalAlignment ( FONT_JUSTHORZ_RIGHT ) ;
}
else if ( ! stricmp ( align , " top " ) )
{
setFontVerticalAlignment ( FONT_JUSTVERT_TOP ) ;
}
else if ( ! stricmp ( align , " bottom " ) )
{
setFontVerticalAlignment ( FONT_JUSTVERT_BOTTOM ) ;
}
else if ( ! stricmp ( align , " centerx " ) )
{
setFontHorizontalAlignment ( FONT_JUSTHORZ_CENTER ) ;
}
else if ( ! stricmp ( align , " centery " ) )
{
setFontVerticalAlignment ( FONT_JUSTVERT_CENTER ) ;
}
}
}
void UIWidget : : LayoutAliasCache
(
Event * ev
)
{
int i ;
str parms ;
str realSound ;
if ( ev - > NumArgs ( ) < = 1 )
return ;
for ( i = 3 ; i < = ev - > NumArgs ( ) ; i + + )
{
parms + = ev - > GetToken ( i ) ;
parms + = " " ;
}
realSound = ev - > GetString ( 2 ) ;
uii . Alias_Add ( parms , realSound , parms ) ;
if ( strstr ( realSound , " .wav " ) | | strstr ( realSound , " .mp3 " ) )
{
uii . Snd_RegisterSound ( realSound , false ) ;
}
}
void UIWidget : : setParent
(
UIWidget * parent
)
{
if ( m_parent )
m_parent - > removeChild ( this ) ;
m_parent = parent ;
if ( m_parent )
m_parent - > addChild ( this ) ;
PropogateCoordinateSystem ( ) ;
}
UIWidget * UIWidget : : getParent
(
void
)
{
return m_parent ;
}
UIWidget * UIWidget : : getFirstChild
(
void
)
{
if ( m_children . NumObjects ( ) > 0 )
return m_children . ObjectAt ( 1 ) ;
return NULL ;
}
UIWidget * UIWidget : : getNextSibling
(
void
)
{
if ( m_parent )
return m_parent - > getNextChild ( this ) ;
return NULL ;
}
UIWidget * UIWidget : : getNextChild
(
UIWidget * child
)
{
int index = m_children . IndexOfObject ( child ) ;
if ( index & & m_children . NumObjects ( ) ! = index )
{
return m_children . ObjectAt ( index + 1 ) ;
}
return NULL ;
}
UIWidget * UIWidget : : getPrevChild
(
UIWidget * child
)
{
int index ;
if ( child )
{
index = m_children . IndexOfObject ( child ) ;
}
else
{
index = m_children . NumObjects ( ) ;
}
if ( index > 1 )
{
return m_children . ObjectAt ( index - 1 ) ;
}
return NULL ;
}
UIWidget * UIWidget : : getPrevSibling
(
void
)
{
if ( m_parent )
return m_parent - > getPrevChild ( this ) ;
return NULL ;
}
UIWidget * UIWidget : : getPrevSibling
(
UIWidget * curr
)
{
if ( m_parent )
return m_parent - > getPrevChild ( curr ) ;
return NULL ;
}
UIWidget * UIWidget : : getLastSibling
(
void
)
{
if ( m_parent & & m_children . NumObjects ( ) )
{
UIWidget * wid = m_parent - > m_children . ObjectAt ( m_parent - > m_children . NumObjects ( ) ) ;
if ( wid = = this )
{
return getPrevSibling ( ) ;
}
else
{
return wid ;
}
}
else
{
return NULL ;
}
}
UIWidget * UIWidget : : findSibling
(
str name
)
{
UIWidget * wid ;
for ( wid = getLastSibling ( ) ; wid ! = NULL ; wid = getPrevSibling ( wid ) )
{
if ( wid - > getName ( ) = = name )
return wid ;
}
return NULL ;
}
void UIWidget : : Enable
(
void
)
{
int n ;
int i ;
setShow ( true ) ;
m_enabled = true ;
n = m_children . NumObjects ( ) ;
for ( i = 1 ; i < = n ; i + + )
{
m_children . ObjectAt ( i ) - > Enable ( ) ;
}
}
void UIWidget : : Disable
(
void
)
{
int n ;
int i ;
PostEvent ( EV_Widget_Hide , 0 ) ;
m_enabled = false ;
n = m_children . NumObjects ( ) ;
for ( i = 1 ; i < = n ; i + + )
{
m_children . ObjectAt ( i ) - > Disable ( ) ;
}
}
bool UIWidget : : isEnabled
(
void
)
{
2024-07-17 23:55:11 +02:00
if ( ! strcmp ( m_enabledCvar . c_str ( ) , " " ) ) {
2016-03-27 11:49:47 +02:00
return m_enabled ;
}
2024-07-17 23:55:11 +02:00
if ( m_enabledCvar [ 0 ] = = ' ! ' ) {
//
// Added in 2.30
// True if the cvar is 0
if ( m_enabled ) {
return ! UI_GetCvarInt ( m_enabledCvar . c_str ( ) + 1 , 0 ) ;
}
} else {
if ( m_enabled ) {
return UI_GetCvarInt ( m_enabledCvar . c_str ( ) , 0 ) ! = 0 ;
}
}
2016-03-27 11:49:47 +02:00
return false ;
}
bool UIWidget : : IsDying
(
void
)
{
return m_dying ;
}
UIWidget * UIWidget : : FindResponder
(
const UIPoint2D & pos
)
{
UIWidget * subview ;
UIWidget * responder ;
int i ;
if ( ! m_visible | | ! m_clippedframe . contains ( pos ) )
{
return NULL ;
}
2023-05-16 19:02:46 +02:00
for ( i = m_children . NumObjects ( ) ; i > = 1 ; i - - )
2016-03-27 11:49:47 +02:00
{
subview = m_children . ObjectAt ( i ) ;
responder = subview - > FindResponder ( pos ) ;
if ( responder )
{
return responder ;
}
}
return this ;
}
void UIWidget : : setFont
(
const char * name
)
{
if ( m_font )
delete m_font ;
m_font = new UIFont ( name ) ;
}
void UIWidget : : setFontHorizontalAlignment
(
fonthorzjustify_t alignment
)
{
m_iFontAlignmentHorizontal = alignment ;
}
void UIWidget : : setFontVerticalAlignment
(
fontvertjustify_t alignment
)
{
m_iFontAlignmentVertical = alignment ;
}
void UIWidget : : setShow
(
bool visible
)
{
m_visible = visible ;
if ( ! visible )
{
if ( IsThisOrChildActive ( ) )
uWinMan . DeactivateCurrentSmart ( ) ;
}
}
bool UIWidget : : getShow
(
void
)
{
return m_visible ;
}
UColor UIWidget : : getBackgroundColor
(
void
)
{
return m_background_color ;
}
void UIWidget : : setBackgroundColor
(
const UColor & color ,
bool setbordercolor
)
{
m_background_color = color ;
if ( setbordercolor )
{
setBorderColor ( color ) ;
}
}
UBorderColor UIWidget : : getBorderColor
(
void
)
{
return m_border_color ;
}
void UIWidget : : setBorderColor
(
const UBorderColor & color
)
{
m_border_color = color ;
}
UColor UIWidget : : getForegroundColor
(
void
)
{
return m_foreground_color ;
}
void UIWidget : : setForegroundColor
(
const UColor & color
)
{
m_foreground_color = color ;
}
borderstyle_t UIWidget : : getBorderStyle
(
void
)
{
return m_borderStyle ;
}
void UIWidget : : setBorderStyle
(
borderstyle_t style
)
{
m_borderStyle = style ;
}
UISize2D UIWidget : : getSize
(
void
)
{
return m_frame . size ;
}
void UIWidget : : setSize
(
const UISize2D & newsize
)
{
if ( newsize . width ! = m_frame . size . width
| | newsize . height ! = m_frame . size . height )
{
m_frame . size = newsize ;
PropogateCoordinateSystem ( ) ;
SendSignal ( W_SizeChanged ) ;
}
}
UIRect2D UIWidget : : getFrame
(
void
)
{
return m_frame ;
}
void UIWidget : : setFrame
(
const UIRect2D & newframe
)
{
bool bNewSize ;
bNewSize = newframe . size ! = m_frame . size ;
m_frame = newframe ;
PropogateCoordinateSystem ( ) ;
SendSignal ( W_FrameChanged ) ;
if ( bNewSize )
{
SendSignal ( W_SizeChanged ) ;
}
}
UIPoint2D UIWidget : : getOrigin
(
void
)
{
return m_origin ;
}
void UIWidget : : setOrigin
(
const UIPoint2D & neworigin
)
{
if ( neworigin ! = m_origin )
{
m_origin = neworigin ;
PropogateCoordinateSystem ( ) ;
}
}
void UIWidget : : setName
(
str name
)
{
m_name = name ;
}
const char * UIWidget : : getName
(
void
)
{
return m_name ;
}
void UIWidget : : setTitle
(
str title
)
{
m_title = title ;
}
const char * UIWidget : : getTitle
(
void
)
{
return m_title ;
}
void UIWidget : : setDirection
(
direction_t dir
)
{
m_direction = dir ;
m_direction_orig = dir ;
}
direction_t UIWidget : : getDirection
(
void
)
{
return m_direction ;
}
void UIWidget : : setMotionType
(
motion_t type
)
{
m_motiontype = type ;
}
motion_t UIWidget : : getMotionType
(
void
)
{
return m_motiontype ;
}
void UIWidget : : setMotionTime
(
float time
)
{
m_motiontime = time ;
}
float UIWidget : : getMotionTime
(
void
)
{
return m_motiontime ;
}
void UIWidget : : setAlign
(
int align
)
{
m_align = align ;
}
int UIWidget : : getAlign
(
void
)
{
return m_align ;
}
void UIWidget : : setMaterial
(
UIReggedMaterial * mat
)
{
m_material = mat ;
}
void UIWidget : : setHoverMaterial
(
UIReggedMaterial * mat
)
{
m_hovermaterial = mat ;
}
void UIWidget : : setPressedMaterial
(
UIReggedMaterial * mat
)
{
m_pressedmaterial = mat ;
}
UIPoint2D UIWidget : : getLocalPoint
(
const UIPoint2D & pos
)
{
if ( m_parent )
{
return UIPoint2D ( pos . x - m_screenframe . pos . x , pos . y - m_screenframe . pos . y ) ;
}
else
{
return pos ;
}
}
UIPoint2D UIWidget : : getGlobalPoint
(
const UIPoint2D & pos
)
{
if ( m_parent )
{
return UIPoint2D ( pos . x + m_screenframe . pos . x , pos . y + m_screenframe . pos . y ) ;
}
else
{
return pos ;
}
}
void UIWidget : : setBackgroundAlpha
(
float f
)
{
m_alpha = f ;
}
float UIWidget : : getBackgroundAlpha
(
void
)
{
return m_alpha ;
}
void UIWidget : : Display
(
const UIRect2D & drawframe ,
float parent_alpha
)
{
int i ;
int n ;
2024-07-17 23:55:11 +02:00
vec4_t col = { 1 , 1 , 1 , 1 } ;
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( ! isEnabled ( ) ) {
return ;
}
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( ! m_enabledCvar . length ( ) & & ! IsVisible ( ) ) {
return ;
}
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( m_direction | | m_fadetime | | m_fadeSequenceState ! = fadesequence_t : : SEQUENCE_NONE ) {
Motion ( ) ;
}
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
m_local_alpha = m_alpha * parent_alpha ;
set2D ( ) ;
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
col [ 3 ] = m_local_alpha ;
uii . Rend_SetColor ( col ) ;
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( m_background_color . a ! = 0.0 )
{
DrawBox ( 0 , 0 , m_frame . size . width , m_frame . size . height , m_background_color , m_background_color . a * m_local_alpha ) ;
}
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( m_borderStyle = = border_outline )
{
DrawBoxWithSolidBorder ( UIRect2D ( 0 , 0 , m_frame . size . width , m_frame . size . height ) , UWhite , m_border_color . original , 2 , 2 , m_local_alpha ) ;
}
else if ( m_borderStyle )
{
Draw3DBox ( 0 , 0 , m_frame . size . width , m_frame . size . height , m_borderStyle = = border_indent , m_border_color , m_local_alpha ) ;
}
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( m_material )
{
col [ 0 ] = m_foreground_color . r ;
col [ 1 ] = m_foreground_color . g ;
col [ 2 ] = m_foreground_color . b ;
col [ 3 ] = m_foreground_color . a * m_local_alpha ;
uii . Rend_SetColor ( col ) ;
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
m_material - > ReregisterMaterial ( ) ;
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
if ( m_flags & WF_TILESHADER )
2016-03-27 11:49:47 +02:00
{
2024-07-17 23:55:11 +02:00
if ( m_bVirtual ) {
float fvWidth = m_frame . size . width / m_vVirtualScale [ 0 ] / uii . Rend_GetShaderWidth ( m_material - > GetMaterial ( ) ) ;
float fvHeight = m_frame . size . height / m_vVirtualScale [ 1 ] / uii . Rend_GetShaderHeight ( m_material - > GetMaterial ( ) ) ;
uii . Rend_DrawPicStretched ( 0 , 0 , m_frame . size . width , m_frame . size . height , 0 , 0 , fvWidth , fvHeight , m_material - > GetMaterial ( ) ) ;
} else {
uii . Rend_DrawPicTiled ( 0 , 0 , m_frame . size . width , m_frame . size . height , m_material - > GetMaterial ( ) ) ;
}
2016-03-27 11:49:47 +02:00
}
2024-07-17 23:55:11 +02:00
else
2016-03-27 11:49:47 +02:00
{
2024-07-17 23:55:11 +02:00
uii . Rend_DrawPicStretched ( 0 , 0 , m_frame . size . width , m_frame . size . height , 0 , 0 , 1 , 1 , m_material - > GetMaterial ( ) ) ;
2016-03-27 11:49:47 +02:00
}
2024-07-17 23:55:11 +02:00
}
if ( m_pressedmaterial_active & & m_pressedmaterial ! = NULL )
{
m_pressedmaterial - > ReregisterMaterial ( ) ;
uii . Rend_DrawPicStretched ( 0 , 0 , m_frame . size . width , m_frame . size . height , 0 , 0 , 1 , 1 , m_pressedmaterial - > GetMaterial ( ) ) ;
}
else if ( m_hovermaterial_active & & m_hovermaterial ! = NULL )
{
m_hovermaterial - > ReregisterMaterial ( ) ;
uii . Rend_DrawPicStretched ( 0 , 0 , m_frame . size . width , m_frame . size . height , 0 , 0 , 1 , 1 , m_hovermaterial - > GetMaterial ( ) ) ;
}
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
Draw ( ) ;
2016-03-27 11:49:47 +02:00
2024-07-17 23:55:11 +02:00
n = m_children . NumObjects ( ) ;
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
m_children . ObjectAt ( i ) - > Display ( m_frame , m_local_alpha ) ;
2016-03-27 11:49:47 +02:00
}
}
qboolean UIWidget : : KeyEvent
(
int key ,
unsigned int time
)
{
return qfalse ;
}
void UIWidget : : CharEvent
(
int ch
)
{
}
void UIWidget : : UpdateData
(
void
)
{
}
void UIWidget : : UpdateUIElement
(
void
)
{
}
float UIWidget : : getTitleWidth
(
void
)
{
return m_font - > getWidth ( getTitle ( ) , - 1 ) ;
}
float UIWidget : : getTitleHeight
(
void
)
{
return m_font - > getHeight ( m_bVirtual ) ;
}
bool UIWidget : : CanActivate
(
void
)
{
if ( ! m_canactivate | | m_dying )
return false ;
for ( UIWidget * wid = this ; wid ! = NULL ; wid = wid - > getParent ( ) )
{
if ( ! wid - > getShow ( ) )
{
return false ;
}
}
return true ;
}
void UIWidget : : AllowActivate
(
bool canactivate
)
{
m_canactivate = canactivate ;
}
bool UIWidget : : IsActive
(
void
)
{
return uWinMan . ActiveControl ( ) = = this ;
}
bool UIWidget : : IsVisible
(
void
)
{
return m_visible ;
}
void UIWidget : : LinkCvar
(
str cvarname
)
{
m_cvarname = cvarname ;
}
void UIWidget : : LinkCommand
(
str cmd
)
{
m_command = cmd ;
}
void UIWidget : : ExecuteShowCommands
(
void
)
{
for ( int i = 1 ; i < = m_showcommands . NumObjects ( ) ; i + + )
{
2023-12-30 01:09:11 +01:00
//uii.Cmd_Stuff( m_showcommands.ObjectAt( i )->c_str() );
// Fixed in 2.0
Event event ( m_showcommands . ObjectAt ( i ) - > c_str ( ) ) ;
ProcessEvent ( event ) ;
2016-03-27 11:49:47 +02:00
}
}
void UIWidget : : ExecuteHideCommands
(
void
)
{
for ( int i = 1 ; i < = m_hidecommands . NumObjects ( ) ; i + + )
{
2023-12-30 01:09:11 +01:00
//uii.Cmd_Stuff( m_hidecommands.ObjectAt( i )->c_str() );
// Fixed in 2.0
Event event ( m_hidecommands . ObjectAt ( i ) - > c_str ( ) ) ;
ProcessEvent ( event ) ;
2016-03-27 11:49:47 +02:00
}
}
void UIWidget : : InitializeCommandHandler
(
void ( * fcn ) ( const char * , void * )
)
{
m_commandhandler = fcn ;
}
UIWidget * UIWidget : : FindWidget
(
str name
)
{
int i ;
int n ;
n = m_children . NumObjects ( ) ;
for ( i = 1 ; i < = n ; i + + )
{
UIWidget * wid = m_children . ObjectAt ( i ) ;
if ( wid - > getName ( ) = = name )
{
return wid ;
}
UIWidget * w = wid - > FindWidget ( name ) ;
if ( w )
{
return w ;
}
}
return NULL ;
}
void UIWidget : : ResetMotion
(
motion_t type
)
{
AlignPosition ( ) ;
m_direction = m_direction_orig ;
m_motiontype = type ;
if ( type = = MOTION_IN )
{
if ( m_direction = = D_FROM_BOTTOM )
{
2023-05-16 00:07:36 +02:00
UIPoint2D point ( m_frame . pos . x , uid . vidHeight ) ;
setFrame ( UIRect2D ( point , m_frame . size ) ) ;
2016-03-27 11:49:47 +02:00
}
else if ( m_direction = = D_FROM_TOP )
{
2023-05-16 00:07:36 +02:00
UIPoint2D point ( m_frame . pos . x , - m_frame . size . height - m_parent - > m_screenorigin . y ) ;
setFrame ( UIRect2D ( point , m_frame . size ) ) ;
2016-03-27 11:49:47 +02:00
}
else if ( m_direction = = D_FROM_LEFT )
{
2023-05-16 00:07:36 +02:00
UIPoint2D point ( - m_frame . size . width - m_parent - > m_screenorigin . x , m_frame . pos . y ) ;
setFrame ( UIRect2D ( point , m_frame . size ) ) ;
2016-03-27 11:49:47 +02:00
}
else if ( m_direction = = D_FROM_RIGHT )
{
2023-05-16 00:07:36 +02:00
UIPoint2D point ( uid . vidWidth , m_frame . pos . y ) ;
setFrame ( UIRect2D ( point , m_frame . size ) ) ;
2016-03-27 11:49:47 +02:00
}
else
{
2023-05-16 00:07:36 +02:00
setFrame ( m_frame ) ;
FrameInitialized ( ) ;
2016-03-27 11:49:47 +02:00
}
}
m_starttime = uid . time / 1000.0 ;
}
void UIWidget : : Realign
(
void
)
{
2023-05-16 16:23:13 +02:00
if ( m_bVirtual )
2016-03-27 11:49:47 +02:00
{
vec2_t vNewVirtualScale ;
2023-05-29 20:32:22 +02:00
SetVirtualScale ( vNewVirtualScale ) ;
2016-03-27 11:49:47 +02:00
2023-05-16 16:23:13 +02:00
if ( ! VectorCompare2D ( m_vVirtualScale , vNewVirtualScale ) )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . x = m_frame . pos . x / m_vVirtualScale [ 0 ] * vNewVirtualScale [ 0 ] ;
m_frame . pos . y = m_frame . pos . y / m_vVirtualScale [ 1 ] * vNewVirtualScale [ 1 ] ;
m_frame . size . width = m_frame . size . width / m_vVirtualScale [ 0 ] * vNewVirtualScale [ 0 ] ;
m_frame . size . height = m_frame . size . height / m_vVirtualScale [ 1 ] * vNewVirtualScale [ 1 ] ;
m_vVirtualScale [ 0 ] = vNewVirtualScale [ 0 ] ;
m_vVirtualScale [ 1 ] = vNewVirtualScale [ 1 ] ;
2016-03-27 11:49:47 +02:00
}
}
2023-05-16 16:23:13 +02:00
if ( m_flags & WF_STRETCH_VERTICAL )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = 0 ;
m_frame . size . height = uid . vidHeight ;
}
2023-05-16 16:23:13 +02:00
if ( m_flags & WF_STRETCH_HORIZONTAL )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = 0 ;
2023-05-16 16:23:13 +02:00
m_frame . size . width = uid . vidWidth ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_CENTERX )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . x = uid . vidWidth * 0.5 - m_frame . size . width * 0.5 ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_RIGHT )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = uid . vidWidth - m_frame . size . width ;
}
2023-05-16 16:23:13 +02:00
else if ( m_align & WA_LEFT )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = 0 ;
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_CENTERY )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = uid . vidHeight - m_frame . size . height ;
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_BOTTOM )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = uid . vidHeight - m_frame . size . height ;
}
2023-05-16 16:23:13 +02:00
else if ( m_align & WA_TOP )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = 0 ;
}
2023-05-16 16:23:13 +02:00
if ( ( m_align & WA_FULL ) | | ( m_flags & ( WF_STRETCH_HORIZONTAL | WF_STRETCH_VERTICAL ) ) | | ( m_bVirtual ) )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
setFrame ( m_frame ) ;
2016-03-27 11:49:47 +02:00
m_startingpos = m_frame . pos ;
}
}
void UIWidget : : BringToFrontPropogated
(
void
)
{
for ( UIWidget * at = this ; at - > getParent ( ) ! = NULL ; at = at - > getParent ( ) )
{
at - > BringToFront ( ) ;
}
}
UIWidget * UIWidget : : IsThisOrChildActive
(
void
)
{
2023-05-16 16:23:13 +02:00
UIWidget * child = this ;
if ( child - > IsActive ( ) ) {
return child ;
}
2016-03-27 11:49:47 +02:00
for ( int i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
2023-05-16 16:23:13 +02:00
child = m_children . ObjectAt ( i ) ;
if ( child - > IsThisOrChildActive ( ) )
2016-03-27 11:49:47 +02:00
{
return child ;
}
}
return NULL ;
}
UIPoint2D UIWidget : : MouseEventToClientPoint
(
Event * ev
)
{
UIPoint2D p ;
p . x = ev - > GetFloat ( 1 ) - m_screenframe . pos . x ;
p . y = ev - > GetFloat ( 2 ) - m_screenframe . pos . y ;
return p ;
}
UIRect2D UIWidget : : getClientFrame
(
void
)
{
2023-05-15 21:25:27 +02:00
// don't return the position
return UIRect2D ( UIPoint2D ( 0 , 0 ) , m_frame . size ) ;
2016-03-27 11:49:47 +02:00
}
void UIWidget : : setAlwaysOnBottom
(
bool b
)
{
if ( getAlwaysOnBottom ( ) ! = b )
{
if ( b )
{
m_flags & = ~ WF_ALWAYS_TOP ;
m_flags | = WF_ALWAYS_BOTTOM ;
}
else
{
m_flags & = ~ WF_ALWAYS_BOTTOM ;
}
if ( m_parent )
ArrangeWidgetList ( m_parent - > m_children ) ;
}
}
void UIWidget : : setAlwaysOnTop
(
bool b
)
{
if ( getAlwaysOnTop ( ) ! = b )
{
if ( b )
{
m_flags & = ~ WF_ALWAYS_BOTTOM ;
m_flags | = WF_ALWAYS_TOP ;
}
else
{
m_flags & = ~ WF_ALWAYS_TOP ;
}
if ( m_parent )
ArrangeWidgetList ( m_parent - > m_children ) ;
}
}
bool UIWidget : : getAlwaysOnBottom
(
void
)
{
return ( m_flags & WF_ALWAYS_BOTTOM ) ? true : false ;
}
bool UIWidget : : getAlwaysOnTop
(
void
)
{
return ( m_flags & WF_ALWAYS_TOP ) ? true : false ;
}
bool UIWidget : : SendSignal
(
Event & event
)
{
2023-05-17 21:50:50 +02:00
if ( uWinMan . IsDead ( ) )
2016-03-27 11:49:47 +02:00
{
return false ;
}
else
{
return USignal : : SendSignal ( event ) ;
}
}
void UIWidget : : ShowCommand
(
Event * ev
)
{
int i ;
str * command = new str ;
for ( i = 1 ; i < = ev - > NumArgs ( ) ; i + + )
{
* command + = ev - > GetToken ( i ) ;
}
m_showcommands . AddObject ( command ) ;
}
void UIWidget : : HideCommand
(
Event * ev
)
{
int i ;
str * command = new str ;
for ( i = 1 ; i < = ev - > NumArgs ( ) ; i + + )
{
* command + = ev - > GetToken ( i ) ;
}
m_hidecommands . AddObject ( command ) ;
}
void UIWidget : : AddFlag
(
int flag
)
{
m_flags | = flag ;
}
void UIWidget : : SetHovermaterialActive
(
bool a
)
{
m_hovermaterial_active = a ;
}
void UIWidget : : SetPressedmaterialActive
(
bool a
)
{
m_pressedmaterial_active = a ;
}
int UIWidget : : getOrderNum
(
void
)
{
return m_ordernum ;
}
str UIWidget : : getCommand
(
void
)
{
return m_command ;
}
void UIWidget : : ActivateOrder
(
void
)
{
UIWidget * selwidget ;
for ( selwidget = this ; selwidget ! = NULL ; selwidget = selwidget - > getParent ( ) )
{
if ( selwidget - > getParent ( ) = = & uWinMan )
{
if ( selwidget - > isSubclassOf ( UIWidgetContainer ) )
{
UIWidgetContainer * widcon = ( UIWidgetContainer * ) selwidget ;
widcon - > SetActiveWidgetOrderNum ( this ) ;
}
return ;
}
}
}
void UIWidget : : EnableEvent
(
Event * ev
)
{
Enable ( ) ;
}
void UIWidget : : DisableEvent
(
Event * ev
)
{
Disable ( ) ;
}
void UIWidget : : setConfigstringIndex
(
int cs
)
{
m_configstring_index = cs ;
}
int UIWidget : : getConfigstringIndex
(
void
)
{
return m_configstring_index ;
}
bool UIWidget : : PassEventToWidget
(
str name ,
Event * ev
)
{
int i ;
int n ;
2023-12-30 17:11:12 +01:00
if ( ! isEnabled ( ) ) {
return false ;
}
if ( ! str : : cmp ( name , m_name ) ) {
ProcessEvent ( ev ) ;
return true ;
2016-03-27 11:49:47 +02:00
}
2023-12-30 17:11:12 +01:00
n = m_children . NumObjects ( ) ;
for ( i = 1 ; i < = n ; i + + )
2016-03-27 11:49:47 +02:00
{
2023-12-30 17:11:12 +01:00
if ( m_children . ObjectAt ( i ) - > PassEventToWidget ( name , ev ) ) {
return true ;
2016-03-27 11:49:47 +02:00
}
}
2023-12-30 17:11:12 +01:00
return false ;
2016-03-27 11:49:47 +02:00
}
2023-12-31 23:12:40 +01:00
bool UIWidget : : isVirtual ( ) const
{
return m_bVirtual ;
}
const vec2_t & UIWidget : : getVirtualScale ( ) const
{
return m_vVirtualScale ;
}
2023-07-30 00:56:54 +02:00
void UIWidget : : SetEnabledCvar
(
Event * ev
)
{
m_enabledCvar = ev - > GetString ( 1 ) ;
}
void UIWidget : : SetScaleCvar
(
Event * ev
)
{
m_scaleCvar = uii . Cvar_Find ( ev - > GetString ( 1 ) . c_str ( ) ) ;
}
void UIWidget : : SetVirtualScale ( vec2_t out )
{
out [ 0 ] = uid . vidWidth / 640.0 ;
out [ 1 ] = uid . vidHeight / 480.0 ;
if ( m_scaleCvar )
{
out [ 0 ] * = m_scaleCvar - > value ;
out [ 1 ] * = m_scaleCvar - > value ;
}
}
void UIWidget : : SetDontLocalize ( Event * ev )
{
SetDontLocalize ( ) ;
}
void UIWidget : : EventFadeSequence ( Event * ev )
{
m_fadeSequenceDelayStart = ev - > GetFloat ( 1 ) ;
m_fadeSequenceFadeIn = ev - > GetFloat ( 2 ) ;
m_fadeSequenceHold = ev - > GetFloat ( 3 ) ;
m_fadeSequenceFadeOut = ev - > GetFloat ( 4 ) ;
m_fadeSequenceDelayEnd = m_fadeSequenceDelayStart ;
m_fadeSequenceState = fadesequence_t : : SEQUENCE_FADEIN ;
}
void UIWidget : : SetDontLocalize ( )
{
m_flags | = WF_DONTLOCALIZE ;
}
2016-03-27 11:49:47 +02:00
CLASS_DECLARATION ( UIWidget , UIWidgetContainer , NULL )
{
{ & EV_Layout_BGFill , & UIWidgetContainer : : SetBGFill } ,
{ & EV_Layout_Fullscreen , & UIWidgetContainer : : SetFullscreen } ,
{ & EV_Layout_VidMode , & UIWidgetContainer : : SetVidMode } ,
{ NULL , NULL }
} ;
UIWidgetContainer : : UIWidgetContainer ( )
{
2023-05-15 20:13:04 +02:00
m_bgfill = UColor ( 0 , 0 , 0 , 0 ) ;
2016-03-27 11:49:47 +02:00
m_fullscreen = false ;
m_vidmode = - 1 ;
m_currentwidnum = 0 ;
m_maxordernum = 0 ;
m_layout = NULL ;
AllowActivate ( false ) ;
}
void UIWidgetContainer : : AlignPosition
(
void
)
{
2023-05-16 16:23:13 +02:00
if ( m_bVirtual )
2016-03-27 11:49:47 +02:00
{
vec2_t vNewVirtualScale ;
2023-05-29 20:32:22 +02:00
SetVirtualScale ( vNewVirtualScale ) ;
2016-03-27 11:49:47 +02:00
2023-05-16 16:23:13 +02:00
if ( ! VectorCompare2D ( m_vVirtualScale , vNewVirtualScale ) )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . x = m_frame . pos . x / m_vVirtualScale [ 0 ] * vNewVirtualScale [ 0 ] ;
m_frame . pos . y = m_frame . pos . y / m_vVirtualScale [ 1 ] * vNewVirtualScale [ 1 ] ;
m_frame . size . width = m_frame . size . width / m_vVirtualScale [ 0 ] * vNewVirtualScale [ 0 ] ;
m_frame . size . height = m_frame . size . height / m_vVirtualScale [ 1 ] * vNewVirtualScale [ 1 ] ;
m_vVirtualScale [ 0 ] = vNewVirtualScale [ 0 ] ;
m_vVirtualScale [ 1 ] = vNewVirtualScale [ 1 ] ;
2016-03-27 11:49:47 +02:00
}
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_LEFT )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = 0 ;
}
2023-05-16 16:23:13 +02:00
else if ( m_align & WA_RIGHT )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . x = uid . vidWidth - m_frame . size . width ;
}
2023-05-16 16:23:13 +02:00
else
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
// default to center
m_frame . pos . x = ( uid . vidWidth - m_frame . size . width ) * 0.5 ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
if ( m_align & WA_BOTTOM )
2016-03-27 11:49:47 +02:00
{
m_frame . pos . y = uid . vidHeight - m_frame . size . height ;
}
2023-05-16 16:23:13 +02:00
else if ( m_align & WA_TOP )
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
m_frame . pos . y = 0 ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
else
2016-03-27 11:49:47 +02:00
{
2023-05-16 16:23:13 +02:00
// default to center
m_frame . pos . y = ( uid . vidHeight - m_frame . size . height ) * 0.5 ;
2016-03-27 11:49:47 +02:00
}
2023-05-16 16:23:13 +02:00
setFrame ( m_frame ) ;
2016-03-27 11:49:47 +02:00
m_startingpos = m_frame . pos ;
}
void UIWidgetContainer : : Draw
(
void
)
{
uii . Rend_Set2D ( 0 , 0 , uid . vidWidth , uid . vidHeight , 0 , uid . vidWidth , uid . vidHeight , 0 , - 1.0 , 1.0 ) ;
uii . Rend_Scissor ( 0 , 0 , uid . vidWidth , uid . vidHeight ) ;
if ( m_bgfill . a ! = 0.0 )
DrawBox ( 0 , 0 , uid . vidWidth , uid . vidHeight , m_bgfill , m_local_alpha ) ;
set2D ( ) ;
}
void UIWidgetContainer : : Realign
(
void
)
{
AlignPosition ( ) ;
}
void UIWidgetContainer : : SetBGFill
(
Event * ev
)
{
m_bgfill . r = ev - > GetFloat ( 1 ) ;
m_bgfill . b = ev - > GetFloat ( 2 ) ;
m_bgfill . g = ev - > GetFloat ( 3 ) ;
m_bgfill . a = ev - > GetFloat ( 4 ) ;
}
void UIWidgetContainer : : SetFullscreen
(
Event * ev
)
{
m_fullscreen = ev - > GetBoolean ( 1 ) ;
}
void UIWidgetContainer : : SetVidMode
(
Event * ev
)
{
m_vidmode = ev - > GetInteger ( 1 ) ;
}
int UIWidgetContainer : : getVidMode
(
void
)
{
return m_vidmode ;
}
qboolean UIWidgetContainer : : isFullscreen
(
void
)
{
return m_fullscreen ;
}
UIWidget * UIWidgetContainer : : GetNextWidgetInOrder
(
void
)
{
int i ;
if ( ! m_maxordernum )
{
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
if ( m_children . ObjectAt ( i ) - > getOrderNum ( ) )
m_maxordernum + + ;
}
}
m_currentwidnum + + ;
if ( m_currentwidnum > m_maxordernum )
m_currentwidnum = m_maxordernum ;
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
UIWidget * wid = m_children . ObjectAt ( i ) ;
if ( wid - > getOrderNum ( ) = = m_currentwidnum )
return wid ;
}
return NULL ;
}
UIWidget * UIWidgetContainer : : GetPrevWidgetInOrder
(
void
)
{
int i ;
if ( ! m_maxordernum )
{
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
if ( m_children . ObjectAt ( i ) - > getOrderNum ( ) )
m_maxordernum + + ;
}
}
m_currentwidnum - - ;
if ( m_currentwidnum < = 0 )
m_currentwidnum = m_maxordernum ;
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
UIWidget * wid = m_children . ObjectAt ( i ) ;
if ( wid - > getOrderNum ( ) = = m_currentwidnum )
return wid ;
}
return NULL ;
}
void UIWidgetContainer : : SetActiveWidgetOrderNum
(
UIWidget * wid
)
{
int i ;
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
if ( wid = = m_children . ObjectAt ( i ) )
m_currentwidnum = wid - > getOrderNum ( ) ;
}
}
void UIWidgetContainer : : SetActiveWidgetOrderNum
(
int num
)
{
UIWidget * wid ;
int i ;
for ( i = 1 ; i < = m_children . NumObjects ( ) ; i + + )
{
wid = m_children . ObjectAt ( i ) ;
if ( wid - > getOrderNum ( ) = = num )
{
uWinMan . ActivateControl ( wid ) ;
}
else
{
wid - > SetHovermaterialActive ( false ) ;
wid - > SetPressedmaterialActive ( false ) ;
}
}
}
void UIWidgetContainer : : SetLastActiveWidgetOrderNum
(
void
)
{
if ( ! m_currentwidnum )
m_currentwidnum = 1 ;
SetActiveWidgetOrderNum ( m_currentwidnum ) ;
}