//-----------------------------------------------------------------------------
// Purpose: called every frame to get ammo info from the weapon
//-----------------------------------------------------------------------------
void CDoDHudAmmo::OnThink()
{
    C_BaseCombatWeapon *wpn = GetActiveWeapon();
    C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();

    hudlcd->SetGlobalStat( "(weapon_print_name)", wpn ? wpn->GetPrintName() : " " );
    hudlcd->SetGlobalStat( "(weapon_name)", wpn ? wpn->GetName() : " " );

    if ( !wpn || !player || !wpn->UsesPrimaryAmmo() )
    {
        hudlcd->SetGlobalStat( "(ammo_primary)", "n/a" );
        hudlcd->SetGlobalStat( "(ammo_secondary)", "n/a" );

        SetPaintEnabled( false );
        SetPaintBackgroundEnabled( false );
        return;
    }
    else
    {
        SetPaintEnabled( true );
        SetPaintBackgroundEnabled( true );
    }

    // get the ammo in our clip
    int ammo1 = wpn->Clip1();
    int ammo2;
    if ( ammo1 < 0 )
    {
        // we don't use clip ammo, just use the total ammo count
        ammo1 = player->GetAmmoCount( wpn->GetPrimaryAmmoType() );
        ammo2 = 0;
    }
    else
    {
        // we use clip ammo, so the second ammo is the total ammo
        ammo2 = player->GetAmmoCount( wpn->GetPrimaryAmmoType() );
    }

    hudlcd->SetGlobalStat( "(ammo_primary)", VarArgs( "%d", ammo1 ) );
    hudlcd->SetGlobalStat( "(ammo_secondary)", VarArgs( "%d", ammo2 ) );

    if ( wpn == m_hCurrentActiveWeapon )
    {
        // same weapon, just update counts
        SetAmmo( ammo1, true );
        SetAmmo2( ammo2, true );
    }
    else
    {
        // diferent weapon, change without triggering
        SetAmmo( ammo1, false );
        SetAmmo2( ammo2, false );

        // update whether or not we show the total ammo display
        m_bUsesClips = wpn->UsesClipsForAmmo1();
        m_hCurrentActiveWeapon = wpn;
    }
}
    virtual void OnThink()
    {
        // set whether or not the panel draws based on if we have a weapon that supports secondary ammo
        C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
        C_BaseCombatWeapon *wpn = player ? player->GetActiveWeapon() : NULL;
        IClientVehicle *pVehicle = player ? player->GetVehicle() : NULL;
        if (!wpn || !player || pVehicle)
        {
            m_hCurrentActiveWeapon = NULL;
            SetPaintEnabled(false);
            SetPaintBackgroundEnabled(false);
            return;
        }
        else
        {
            SetPaintEnabled(true);
            SetPaintBackgroundEnabled(true);
        }

        UpdateAmmoState();
    }
//-----------------------------------------------------------------------------
// C_SDKRootPanel implementation.
//-----------------------------------------------------------------------------
C_SDKRootPanel::C_SDKRootPanel( vgui::VPANEL parent )
	: BaseClass( NULL, "SDK Root Panel" )
{
	SetParent( parent );
	SetPaintEnabled( false );
	SetPaintBorderEnabled( false );
	SetPaintBackgroundEnabled( false );

	// This panel does post child painting
	SetPostChildPaintEnabled( true );

	// Make it screen sized
	SetBounds( 0, 0, ScreenWidth(), ScreenHeight() );

	// Ask for OnTick messages
	vgui::ivgui()->AddTickSignal( GetVPanel() );
}
void CEditorRoot::ApplySchemeSettings(vgui::IScheme *pScheme)
{
	BaseClass::ApplySchemeSettings(pScheme);

	SetPaintBackgroundEnabled(true);
	SetPaintBorderEnabled(false);
	SetPaintEnabled(true);
	SetCloseButtonVisible(false);
	SetSizeable(false);
	SetMoveable(false);

	InitColors();

	SetTitle( "", true );
	SetTitleBarVisible( false );
	m_pLabelTitle->SetText( GetEditorTitle() );
	m_pLabelTitle->SetFont( pScheme->GetFont( "UiBold", false ) );

	SetPaintBackgroundType( 0 );
	OnShaderNameChanged();
	GenerateFonts(pScheme);
}
//-----------------------------------------------------------------------------
// Constructor
//-----------------------------------------------------------------------------
CToolUI::CToolUI( vgui::Panel *pParent, const char *panelName, CBaseToolSystem *pBaseToolSystem ) :
	BaseClass( pParent, panelName ), m_pClientArea( 0 ), m_pBaseToolSystem( pBaseToolSystem )
{
	SetPaintEnabled(false);
	SetPaintBackgroundEnabled(false);
	SetPaintBorderEnabled(false);

	int w, h;
	pParent->GetSize( w, h );
	SetBounds( 0, 0, w, h );

	m_pMenuBar = m_pBaseToolSystem->CreateMenuBar( m_pBaseToolSystem );
	m_pMenuBar->SetParent( this );
	m_pMenuBar->SetSize( w, MENU_HEIGHT );
	// This can be NULL if no status bar should be included
	m_pStatusBar = m_pBaseToolSystem->CreateStatusBar( this );
	m_pStatusBar->SetParent( this );

	m_pClientArea = new vgui::Panel( this, "ClientArea" );
	m_pClientArea->SetMouseInputEnabled( false );
	m_pClientArea->SetCursor( vgui::dc_none );
	m_pClientArea->SetBounds( 0, MENU_HEIGHT, w, h - MENU_HEIGHT );
}
CCode_Editor::CCode_Editor( CSheet_Base *parent, const char *pName, CSmartText::CodeEditMode_t mode ) : BaseClass( parent, pName )
{
	m_iMode = mode;

	Activate();
	SetVisible( true );

	SetPaintBackgroundEnabled(true);
	SetPaintEnabled(true);

	SetSizeable(true);
	SetMoveable(true);
	SetMinimumSize( 500, 400 );

	SetDeleteSelfOnClose( true );

	m_iLastAppliedCodeIndex = 0;

	m_pCodeWindow = new CSmartText( this, "codewindow", mode );
	m_pCodeWindow->AddActionSignalTarget( this );

	/*
	TextEntry *pT = new TextEntry( this, "codewindow" );
	pT->SetMultiline( true );
	pT->SetEditable( true );
	pT->SetCatchEnterKey( true );
	pT->SetVerticalScrollbar( true );
	*/

	LoadControlSettings( "shadereditorui/vgui/code_editor_Window.res" );

	UpdateButtonEnabled( true, true );
	SetCloseButtonVisible(false);

	int w,t;
	surface()->GetScreenSize( w, t );
	w *= 0.75f;
	t *= 0.75f;
	SetSize( max( w, 500 ), max( t, 400 ) );
	
	//SetKeyBoardInputEnabled( false );
	//SetMouseInputEnabled( true );

	//SetTitle( "Editor", true );
	SetTitle( "", false );

	Panel *pButton = FindChildByName( "button_save" );
	if ( pButton )
		pButton->SetKeyBoardInputEnabled( false );

	pButton = FindChildByName( "button_apply" );
	if ( pButton )
		pButton->SetKeyBoardInputEnabled( false );
	pButton = FindChildByName( "button_cancel" );
	if ( pButton )
		pButton->SetKeyBoardInputEnabled( false );

	DoModal();

	int rx, ry, rsx, rsy;
	if ( pEditorRoot->GetCodeEditorBounds( rx, ry, rsx, rsy ) )
		SetBounds( rx, ry, rsx, rsy );
	else
		MoveToCenterOfScreen();
}
CEditorRoot::CEditorRoot( const char *pElementName ) : BaseClass( NULL, "editor" )
{
	pEditorRoot = this;
	Q_memset( hFonts, 0, sizeof(hFonts) );
	Q_memset( hFonts2, 0, sizeof(hFonts2) );
//	m_pKV_MainPreviewMat = NULL;
	//m_pMat_MainPreview = NULL;
//	m_pKV_BGPreviewMat = NULL;
	//m_pMat_BGPreview = NULL;
	m_bPainting = false;
	m_bAutoCompile = true;
	m_bAutoFullcompile = false;
	m_bAutoShaderPublish = true;
	m_bAutoPrecacheUpdate = true;
	m_bWarnOnClose = true;

	InitColors();

	pPreview = NULL;
	m_pKV_NodeHelp = NULL;

	m_iNumMaterials = 0;
	m_pszMaterialList = NULL;

	m_pLastFullCompiledShader = NULL;

	//vgui::VPANEL GameUIRoot = enginevgui->GetPanel( PANEL_GAMEUIDLL );
	vgui::VPANEL EngineRoot = enginevgui->GetPanel( PANEL_ROOT );
	//vgui::VPANEL DLLRoot = VGui_GetClientDLLRootPanel();

	vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "SourceScheme");
	SetScheme( scheme );

	m_pLabelTitle = new Label( this, "title_label", "" );

	pNodeSheet = new CFlowGraphSheet( this, "flowgraphsheets", true, true );
	pNodeSheet->AddActionSignalTarget( this );
	pNodeSheet->SetAddTabButtonEnabled( true );
	//pNodeSheet->ShowContextButtons(true);
	/*pNodeView =*/
	AddNewTab();

	//CFlowGraphPage *page = new CFlowGraphPage( this );
	//m_hFlowGraphPages.AddToTail( page );
	//CNodeView *view = new CNodeView( page, this, "main_nodeview" );
	//m_hNodeViews.AddToTail( pNodeView );
	//page->SetFlowGraph( pNodeView );
	//pNodeSheet->AddPage( page, GetDefaultTabName() );

	m_pLabel_Coords = new Label( this, "mouse_node_coords", "" );
	m_pLabel_FrameTime = new Label( this, "framespeed", "" );


	m_pMenuBar = new MenuBar( this, "menu_bar" );
	m_pMBut_File = new MenuButton( this, "mbut_file", "File" );
	m_pMBut_File->AddActionSignalTarget( this );
	Menu *pMenu_File = new Menu( m_pMBut_File, "" );
	pMenu_File->AddMenuItem( "New", new KeyValues("onmenufile","entry",ER_FMENU_NEW), this );
	pMenu_File->AddSeparator();
	pMenu_File->AddMenuItem( "Open", new KeyValues("onmenufile","entry",ER_FMENU_OPEN), this );
	pMenu_File->AddSeparator();
	pMenu_File->AddMenuItem( "Save", new KeyValues("onmenufile","entry",ER_FMENU_SAVE), this );
	pMenu_File->AddMenuItem( "Save as", new KeyValues("onmenufile","entry",ER_FMENU_SAVE_AS), this );
	pMenu_File->AddMenuItem( "Save all", new KeyValues("onmenufile","entry",ER_FMENU_SAVE_ALL), this );
	pMenu_File->AddSeparator();
	pMenu_File->AddMenuItem( "Undo", new KeyValues("onmenufile","entry",ER_FMENU_UNDO), this );
	pMenu_File->AddMenuItem( "Redo", new KeyValues("onmenufile","entry",ER_FMENU_REDO), this );
	pMenu_File->AddSeparator();
	pMenu_File->AddMenuItem( "Take screenshot", new KeyValues("onmenufile","entry",ER_FMENU_SCREENSHOT), this );
	pMenu_File->AddMenuItem( "Editor config", new KeyValues("onmenufile","entry",ER_FMENU_ECONFIG), this );
	m_pMBut_File->SetMenu( pMenu_File );
	m_pMenuBar->AddButton( m_pMBut_File );

	m_pMBut_Shader = new MenuButton( this, "mbut_shader", "Shader" );
	Menu *pMenu_Shader = new Menu( m_pMBut_Shader, "" );
	pMenu_Shader->AddMenuItem( "Shader settings", new KeyValues("onmenushader","entry",ER_SMENU_SCONFIG), this );
	pMenu_Shader->AddMenuItem( "Shader precache", new KeyValues("onmenushader","entry",ER_SMENU_SPRECACHE), this );
	pMenu_Shader->AddSeparator();
	pMenu_Shader->AddMenuItem( "Full compile", new KeyValues("onmenushader","entry",ER_SMENU_FULLCOMPILE), this );
	pMenu_Shader->AddMenuItem( "Compile all precached", new KeyValues("onmenushader","entry",ER_SMENU_ALLCOMPILE), this );
	pMenu_Shader->AddMenuItem( "Terminate compilers", new KeyValues("onmenushader","entry",ER_SMENU_KILLCOMPILER), this );
	pMenu_Shader->AddSeparator();
	pMenu_Shader->AddMenuItem( "Inject shader into world", new KeyValues("onmenushader","entry",ER_SMENU_INJECT), this );
	pMenu_Shader->AddMenuItem( "Paint world", new KeyValues("onmenushader","entry",ER_SMENU_PAINT), this );
	m_pMBut_Shader->SetMenu( pMenu_Shader );
	m_pMenuBar->AddButton( m_pMBut_Shader );

	m_pMBut_PostProc = new MenuButton( this, "mbut_postproc", "Post processing" );
	Menu *pMenu_PostProc = new Menu( m_pMBut_PostProc, "" );
	pMenu_PostProc->AddMenuItem( "Effect settings", new KeyValues("onmenupostprocessing","entry",ER_PMENU_PCONFIG), this );
	pMenu_PostProc->AddMenuItem( "Effect precache", new KeyValues("onmenupostprocessing","entry",ER_PMENU_PPRECACHE), this );
	pMenu_PostProc->AddMenuItem( "Manage rendertargets", new KeyValues("onmenupostprocessing","entry",ER_PMENU_RTS), this );
	m_pMBut_PostProc->SetMenu( pMenu_PostProc );
	m_pMenuBar->AddButton( m_pMBut_PostProc );

	//m_pLabel_CurrentFileName = new Label( this, "filename", "-" );

	LoadControlSettings("shadereditorui/vgui/shadereditor_root.res");
	OnShaderNameChanged();

	Activate();
	SetVisible( true );
	SetPaintBorderEnabled( false );
	SetPaintBackgroundEnabled( true );
	SetPaintEnabled( true );
	SetParent( EngineRoot );

	m_pKV_SelectionCopy = NULL;
	bFontsLoaded = false;

	m_bHalfView = false;
	m_bHasInput = true;
	//m_bNeedsButtonPush = false;

	m_bDraw_Datatypes = true;
	m_bDraw_Shadows = true;
	m_bDraw_AllLimits = true;
	m_bDoTooltips = true;

	//m_szShaderName[0] = '\0';
	px = py = psx = psy = 0;
	cedit_x = cedit_y = cedit_sx = cedit_sy = -1;
	//m_flErrorTime = 0;

	AllocProceduralMaterials();
	UpdateVariablePointer();

	//m_iLastCompileIndex = GetSafeFlowgraph()->GetStackIndex();
}
//-----------------------------------------------------------------------------
// Purpose: called every frame to get ammo info from the weapon
//-----------------------------------------------------------------------------
void CHudAmmo::UpdatePlayerAmmo( C_BasePlayer *player )
{
    // Clear out the vehicle entity
    m_hCurrentVehicle = NULL;

    C_BaseCombatWeapon *wpn = player ? player->GetActiveWeapon() : NULL;

    hudlcd->SetGlobalStat( "(weapon_print_name)", wpn ? wpn->GetPrintName() : " " );
    hudlcd->SetGlobalStat( "(weapon_name)", wpn ? wpn->GetName() : " " );

    if ( !wpn || !player || !wpn->UsesPrimaryAmmo() )
    {
        hudlcd->SetGlobalStat( "(ammo_primary)", "n/a" );
        hudlcd->SetGlobalStat( "(ammo_secondary)", "n/a" );

        SetPaintEnabled(false);
        SetPaintBackgroundEnabled(false);
        return;
    }

    SetPaintEnabled(true);
    SetPaintBackgroundEnabled(true);

    // get the ammo in our clip
    int ammo1 = wpn->Clip1();
    int ammo2;
    if (ammo1 < 0)
    {
        // we don't use clip ammo, just use the total ammo count
        ammo1 = player->GetAmmoCount(wpn->GetPrimaryAmmoType());
        ammo2 = 0;
    }
    else
    {
        // we use clip ammo, so the second ammo is the total ammo
        ammo2 = player->GetAmmoCount(wpn->GetPrimaryAmmoType());
    }

    hudlcd->SetGlobalStat( "(ammo_primary)", VarArgs( "%d", ammo1 ) );
    hudlcd->SetGlobalStat( "(ammo_secondary)", VarArgs( "%d", ammo2 ) );

    if (wpn == m_hCurrentActiveWeapon)
    {
        // same weapon, just update counts
        SetAmmo(ammo1, true);
        SetAmmo2(ammo2, true);
    }
    else
    {
        // diferent weapon, change without triggering
        SetAmmo(ammo1, false);
        SetAmmo2(ammo2, false);

        // update whether or not we show the total ammo display
        if (wpn->UsesClipsForAmmo1())
        {
            SetShouldDisplaySecondaryValue(true);
            GetClientMode()->GetViewportAnimationController()->StartAnimationSequence("WeaponUsesClips");
        }
        else
        {
            GetClientMode()->GetViewportAnimationController()->StartAnimationSequence("WeaponDoesNotUseClips");
            SetShouldDisplaySecondaryValue(false);
        }

        GetClientMode()->GetViewportAnimationController()->StartAnimationSequence("WeaponChanged");
        m_hCurrentActiveWeapon = wpn;
    }
}