You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
336 lines
11 KiB
336 lines
11 KiB
//===== Copyright © 1996-2009, Valve Corporation, All rights reserved. ========
|
|
//
|
|
// Purpose: Implementation of the CScriptEditorPanel class and associated helper
|
|
// classes. The ScriptEditorPanel class represents a vgui panel which contains
|
|
// a text editing panel which may be used to edit a script and text panel which
|
|
// displays output from the script.
|
|
//
|
|
//=============================================================================
|
|
|
|
#include "toolutils/scripteditorpanel.h"
|
|
#include "vgui/iinput.h"
|
|
#include "vgui/ischeme.h"
|
|
#include "vgui/ivgui.h"
|
|
#include "vgui/isurface.h"
|
|
#include "vgui_controls/button.h"
|
|
#include "vgui_controls/textentry.h"
|
|
#include "vgui_controls/richtext.h"
|
|
#include "tier1/utlbuffer.h"
|
|
#include "vgui/ilocalize.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
using namespace vgui;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Constructor
|
|
//-----------------------------------------------------------------------------
|
|
CLineNumberPanel::CLineNumberPanel( vgui::Panel *pParent, vgui::TextEntry *pTextEntry, const char *pchName )
|
|
: BaseClass( pParent, pchName )
|
|
, m_pTextEntry( pTextEntry )
|
|
, m_hFont( NULL )
|
|
{
|
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Paint the background of the panel, including the line numbers
|
|
//-----------------------------------------------------------------------------
|
|
void CLineNumberPanel::PaintBackground()
|
|
{
|
|
BaseClass::PaintBackground();
|
|
|
|
Panel *pParent = GetParent();
|
|
if ( pParent )
|
|
{
|
|
if ( pParent->IsVisible() == false )
|
|
return;
|
|
}
|
|
|
|
int width, height;
|
|
GetSize( width, height );
|
|
|
|
int fontHeight = surface()->GetFontTall( m_hFont );
|
|
int yPos = 1;
|
|
int line = m_pTextEntry->GetCurrentStartLine() + 1;
|
|
|
|
surface()->DrawSetTextFont( m_hFont );
|
|
surface()->DrawSetTextColor( m_Color );
|
|
|
|
while ( (yPos + fontHeight) < height )
|
|
{
|
|
wchar_t sz[ 32 ];
|
|
_snwprintf( sz, sizeof( sz ), L"%4i", line );
|
|
|
|
surface()->DrawSetTextPos( 0, yPos );
|
|
surface()->DrawPrintText( sz, wcslen( sz ) );
|
|
|
|
yPos += fontHeight + 1;
|
|
++line;
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Apply the settings from the provided scheme, and save the font to
|
|
// display line numbers.
|
|
//-----------------------------------------------------------------------------
|
|
void CLineNumberPanel::ApplySchemeSettings(IScheme *pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
|
|
m_hFont = pScheme->GetFont( "ConsoleText", IsProportional() );
|
|
m_Color = GetSchemeColor( "Console.TextColor", pScheme );
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Constructor, creates all of the controls owned by the panel.
|
|
//-----------------------------------------------------------------------------
|
|
CScriptEditorPanel::CScriptEditorPanel( vgui::Panel *pParent, const char *pName )
|
|
: BaseClass( pParent, pName )
|
|
{
|
|
SetKeyBoardInputEnabled( true );
|
|
|
|
SetMinimumSize(300,200);
|
|
|
|
// Create the output panel
|
|
m_pOutput = new RichText(this, "ConsoleHistory");
|
|
m_pOutput->SetAllowKeyBindingChainToParent( false );
|
|
SETUP_PANEL( m_pOutput );
|
|
m_pOutput->SetVerticalScrollbar( true );
|
|
m_pOutput->GotoTextEnd();
|
|
|
|
// Create the submit button
|
|
m_pSubmit = new Button(this, "ConsoleSubmit", "#Console_Submit");
|
|
m_pSubmit->SetCommand("submit");
|
|
m_pSubmit->SetVisible( true );
|
|
|
|
// Create the script entry panel
|
|
m_pScriptEntry = new TextEntry(this, "ScriptEntry" );
|
|
m_pScriptEntry->AddActionSignalTarget(this);
|
|
m_pScriptEntry->SetMultiline( true );
|
|
m_pScriptEntry->SetVerticalScrollbar( true );
|
|
m_pScriptEntry->SetCatchEnterKey( true );
|
|
m_pScriptEntry->SetCatchTabKey( true );
|
|
m_pScriptEntry->SendNewLine( true );
|
|
m_pScriptEntry->SetTabPosition(1);
|
|
|
|
// Create the line number display panel
|
|
m_pLineNumberPanel = new CLineNumberPanel( this, m_pScriptEntry, "ScriptLineNumbers" );
|
|
|
|
// Set the default text colors, these will be overridden by ApplySchemeSettings
|
|
m_PrintColor = Color(216, 222, 211, 255);
|
|
m_DPrintColor = Color(196, 181, 80, 255);
|
|
|
|
// Add to global console list so the the console
|
|
// output will be displayed in the output panel.
|
|
g_pCVar->InstallConsoleDisplayFunc( this );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Destructor, removes the output from the global console list and
|
|
// destroys the controls.
|
|
//-----------------------------------------------------------------------------
|
|
CScriptEditorPanel::~CScriptEditorPanel()
|
|
{
|
|
// Remove from the global console list
|
|
g_pCVar->RemoveConsoleDisplayFunc( this );
|
|
|
|
// Destroy the controls
|
|
delete m_pOutput;
|
|
m_pOutput = NULL;
|
|
|
|
delete m_pSubmit;
|
|
m_pSubmit = NULL;
|
|
|
|
delete m_pScriptEntry;
|
|
m_pScriptEntry = NULL;
|
|
|
|
delete m_pLineNumberPanel;
|
|
m_pLineNumberPanel = NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Clears the output console
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::Clear()
|
|
{
|
|
m_pOutput->SetText("");
|
|
m_pOutput->GotoTextEnd();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: color text print
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::ColorPrint( const Color& clr, const char *msg )
|
|
{
|
|
m_pOutput->InsertColorChange( clr );
|
|
m_pOutput->InsertString( msg );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: normal text print
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::Print(const char *msg)
|
|
{
|
|
ColorPrint( m_PrintColor, msg );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: debug text print
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::DPrint( const char *msg )
|
|
{
|
|
ColorPrint( m_DPrintColor, msg );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Returns the console text
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::GetConsoleText( char *pchText, size_t bufSize ) const
|
|
{
|
|
wchar_t *temp = new wchar_t[ bufSize ];
|
|
m_pScriptEntry->GetText( temp, bufSize * sizeof( wchar_t ) );
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( temp, pchText, bufSize );
|
|
delete[] temp;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Called whenever the user types text
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::OnTextChanged(Panel *panel)
|
|
{
|
|
if (panel != m_pScriptEntry)
|
|
return;
|
|
|
|
RequestFocus();
|
|
m_pScriptEntry->RequestFocus();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: generic vgui command handler
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::OnCommand(const char *command)
|
|
{
|
|
if ( !Q_stricmp( command, "Submit" ) )
|
|
{
|
|
// always go the end of the buffer when the user has typed something
|
|
m_pOutput->GotoTextEnd();
|
|
|
|
// Get the text from the script entry and store in a single string.
|
|
int textLength = m_pScriptEntry->GetTextLength() + 2;
|
|
CUtlBuffer scriptBuffer( 0, textLength, CUtlBuffer::TEXT_BUFFER );
|
|
m_pScriptEntry->GetText( (char*)scriptBuffer.Base(), scriptBuffer.Size() );
|
|
|
|
// Run the script
|
|
RunScript( scriptBuffer );
|
|
}
|
|
else
|
|
{
|
|
BaseClass::OnCommand(command);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Run the specified script
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::RunScript( const CUtlBuffer& scriptBuffer )
|
|
{
|
|
// No script execution exists at this level, derived classes should
|
|
// override this function to execute scripts.
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Determine of the script entry panel has the current focus
|
|
//-----------------------------------------------------------------------------
|
|
bool CScriptEditorPanel::TextEntryHasFocus() const
|
|
{
|
|
return ( input()->GetFocus() == m_pScriptEntry->GetVPanel() );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Request that the script entry panel receive the input focus
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::TextEntryRequestFocus()
|
|
{
|
|
m_pScriptEntry->RequestFocus();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Lays out the controls within the panel
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::PerformLayout()
|
|
{
|
|
BaseClass::PerformLayout();
|
|
|
|
// setup tab ordering
|
|
GetFocusNavGroup().SetDefaultButton(m_pSubmit);
|
|
|
|
IScheme *pScheme = scheme()->GetIScheme( GetScheme() );
|
|
m_pScriptEntry->SetBorder(pScheme->GetBorder("DepressedButtonBorder"));
|
|
m_pOutput->SetBorder(pScheme->GetBorder("DepressedButtonBorder"));
|
|
|
|
// layout controls
|
|
int wide, tall;
|
|
GetSize(wide, tall);
|
|
|
|
const int lineNumberWidth = 24;
|
|
const int inset = 8;
|
|
const int topHeight = 4;
|
|
const int entryInset = 4;
|
|
const int submitWide = 64;
|
|
const int submitHeight = 20;
|
|
const int submitInset = 7; // x inset to pull the submit button away from the frame grab
|
|
|
|
const int editHeight = ( tall - ( submitHeight + topHeight + (inset * 4 ) ) ) / 2;
|
|
|
|
m_pOutput->SetPos(inset, inset + topHeight);
|
|
m_pOutput->SetSize(wide - (inset * 2), editHeight );
|
|
m_pOutput->InvalidateLayout();
|
|
|
|
int nSubmitXPos = wide - ( inset + submitWide + submitInset );
|
|
m_pSubmit->SetPos( nSubmitXPos, tall - (entryInset * 2 + submitHeight ));
|
|
m_pSubmit->SetSize( submitWide, submitHeight );
|
|
|
|
int nScriptEntryYPos = topHeight + ( inset * 2 ) + editHeight;
|
|
m_pScriptEntry->SetPos( ( inset * 2 ) + lineNumberWidth, nScriptEntryYPos );
|
|
m_pScriptEntry->SetSize( wide - ( (inset * 3) + lineNumberWidth ), editHeight );
|
|
|
|
m_pLineNumberPanel->SetPos( inset, nScriptEntryYPos );
|
|
m_pLineNumberPanel->SetSize( lineNumberWidth, editHeight );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Apply the color, font, and size settings from the specified scheme
|
|
//-----------------------------------------------------------------------------
|
|
void CScriptEditorPanel::ApplySchemeSettings( IScheme *pScheme )
|
|
{
|
|
BaseClass::ApplySchemeSettings( pScheme );
|
|
|
|
m_PrintColor = GetSchemeColor( "Console.TextColor", pScheme );
|
|
m_DPrintColor = GetSchemeColor( "Console.DevTextColor", pScheme );
|
|
m_pOutput->SetFont( pScheme->GetFont( "ConsoleText", IsProportional() ) );
|
|
m_pScriptEntry->SetFont( pScheme->GetFont( "ConsoleText", IsProportional() ) );
|
|
|
|
InvalidateLayout();
|
|
}
|
|
|