diff options
Diffstat (limited to 'mp/src/vgui2')
| -rw-r--r-- | mp/src/vgui2/vgui_controls/AnimationController.cpp | 122 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/ComboBox.cpp | 2 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/HTML.cpp | 281 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/Label.cpp | 10 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/Menu.cpp | 32 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/Panel.cpp | 170 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/PanelListPanel.cpp | 3 | ||||
| -rw-r--r-- | mp/src/vgui2/vgui_controls/ScrollBar.cpp | 8 |
8 files changed, 344 insertions, 284 deletions
diff --git a/mp/src/vgui2/vgui_controls/AnimationController.cpp b/mp/src/vgui2/vgui_controls/AnimationController.cpp index 6da33a38..b8780a89 100644 --- a/mp/src/vgui2/vgui_controls/AnimationController.cpp +++ b/mp/src/vgui2/vgui_controls/AnimationController.cpp @@ -68,6 +68,8 @@ AnimationController::AnimationController(Panel *parent) : BaseClass(parent, NULL m_sWide = g_ScriptSymbols.AddString("wide"); m_sTall = g_ScriptSymbols.AddString("tall"); + m_sModelPos = g_ScriptSymbols.AddString( "model_pos" ); + m_flCurrentTime = 0.0f; } @@ -508,6 +510,34 @@ bool AnimationController::ParseScriptFile(char *pMem, int length) pMem = ParseFile(pMem, token, NULL); animCmd.cmdData.runEvent.timeDelay = (float)atof(token); } + else if (!stricmp(token, "runeventchild")) + { + animCmd.commandType = CMD_RUNEVENTCHILD; + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.event = g_ScriptSymbols.AddString(token); + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.timeDelay = (float)atof(token); + } + else if (!stricmp(token, "firecommand")) + { + animCmd.commandType = CMD_FIRECOMMAND; + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.timeDelay = (float)atof(token); + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); + } + else if (!stricmp(token, "setvisible")) + { + animCmd.commandType = CMD_SETVISIBLE; + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.variable = g_ScriptSymbols.AddString(token); + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.variable2 = atoi(token); + pMem = ParseFile(pMem, token, NULL); + animCmd.cmdData.runEvent.timeDelay = (float)atof(token); + } else if (!stricmp(token, "stopevent")) { animCmd.commandType = CMD_STOPEVENT; @@ -659,9 +689,11 @@ void AnimationController::UpdatePostedMessages(bool bRunToCompletion) case CMD_RUNEVENT: { RanEvent_t curEvent; + curEvent.pParent = NULL; curEvent.event = msg.event; - curEvent.pParent = msg.parent.Get(); + curEvent.pParent = msg.parent.Get(); + // run the event, but only if we haven't already run it this frame, for this parent if (!eventsRanThisFrame.HasElement(curEvent)) { @@ -670,6 +702,37 @@ void AnimationController::UpdatePostedMessages(bool bRunToCompletion) } } break; + case CMD_RUNEVENTCHILD: + { + RanEvent_t curEvent; + curEvent.pParent = NULL; + curEvent.event = msg.event; + + curEvent.pParent = msg.parent.Get()->FindChildByName( g_ScriptSymbols.String(msg.variable) ); + msg.parent = curEvent.pParent; + + // run the event, but only if we haven't already run it this frame, for this parent + if (!eventsRanThisFrame.HasElement(curEvent)) + { + eventsRanThisFrame.AddToTail(curEvent); + RunCmd_RunEvent(msg); + } + } + break; + case CMD_FIRECOMMAND: + { + msg.parent->OnCommand( g_ScriptSymbols.String(msg.variable) ); + } + break; + case CMD_SETVISIBLE: + { + Panel* pPanel = msg.parent.Get()->FindChildByName( g_ScriptSymbols.String(msg.variable) ); + if ( pPanel ) + { + pPanel->SetVisible( msg.variable2 == 1 ); + } + } + break; case CMD_STOPEVENT: RunCmd_StopEvent(msg); break; @@ -947,6 +1010,63 @@ bool AnimationController::StartAnimationSequence(Panel *pWithinParent, const cha } //----------------------------------------------------------------------------- +// Purpose: stops an animation sequence script +//----------------------------------------------------------------------------- +bool AnimationController::StopAnimationSequence( Panel *pWithinParent, const char *sequenceName ) +{ + Assert( pWithinParent ); + + // lookup the symbol for the name + UtlSymId_t seqName = g_ScriptSymbols.Find( sequenceName ); + if (seqName == UTL_INVAL_SYMBOL) + return false; + + // remove the existing command from the queue + RemoveQueuedAnimationCommands( seqName, pWithinParent ); + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: Runs a custom command from code, not from a script file +//----------------------------------------------------------------------------- +void AnimationController::CancelAnimationsForPanel( Panel *pWithinParent ) +{ + // Msg("Removing queued anims for sequence %s\n", g_ScriptSymbols.String(seqName)); + + // remove messages posted by this sequence + // if pWithinParent is specified, remove only messages under that parent + { + for (int i = 0; i < m_PostedMessages.Count(); i++) + { + if ( m_PostedMessages[i].parent == pWithinParent ) + { + m_PostedMessages.Remove(i); + --i; + } + } + } + + // remove all animations + // if pWithinParent is specified, remove only animations under that parent + for (int i = 0; i < m_ActiveAnimations.Count(); i++) + { + Panel *animPanel = m_ActiveAnimations[i].panel; + + if ( !animPanel ) + continue; + + Panel *foundPanel = pWithinParent->FindChildByName(animPanel->GetName(),true); + + if ( foundPanel != animPanel ) + continue; + + m_ActiveAnimations.Remove(i); + --i; + } +} + +//----------------------------------------------------------------------------- // Purpose: Runs a custom command from code, not from a script file //----------------------------------------------------------------------------- void AnimationController::RunAnimationCommand(vgui::Panel *panel, const char *variable, float targetValue, float startDelaySeconds, float duration, Interpolators_e interpolator, float animParameter /* = 0 */ ) diff --git a/mp/src/vgui2/vgui_controls/ComboBox.cpp b/mp/src/vgui2/vgui_controls/ComboBox.cpp index f8be274b..e7d0f86f 100644 --- a/mp/src/vgui2/vgui_controls/ComboBox.cpp +++ b/mp/src/vgui2/vgui_controls/ComboBox.cpp @@ -234,7 +234,7 @@ void ComboBox::RemoveAll() //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- -int ComboBox::GetItemCount() +int ComboBox::GetItemCount() const { return m_pDropDown->GetItemCount(); } diff --git a/mp/src/vgui2/vgui_controls/HTML.cpp b/mp/src/vgui2/vgui_controls/HTML.cpp index a35ef1b7..1a1ca440 100644 --- a/mp/src/vgui2/vgui_controls/HTML.cpp +++ b/mp/src/vgui2/vgui_controls/HTML.cpp @@ -26,9 +26,6 @@ using namespace vgui; - -const int k_nMaxCustomCursors = 2; // the max number of custom cursors we keep cached PER html control - //----------------------------------------------------------------------------- // Purpose: A simple passthrough panel to render the border onto the HTML widget //----------------------------------------------------------------------------- @@ -48,54 +45,6 @@ private: HTML *m_pHTML; }; - -//----------------------------------------------------------------------------- -// Purpose: a vgui container for popup menus displayed by a control, only 1 menu for any control can be visible at a time -//----------------------------------------------------------------------------- -class HTMLComboBoxHost : public vgui::EditablePanel -{ - DECLARE_CLASS_SIMPLE( HTMLComboBoxHost, EditablePanel ); -public: - HTMLComboBoxHost( HTML *parent, const char *panelName ) : EditablePanel( parent, panelName ) - { - m_pParent = parent; - MakePopup(false); - } - ~HTMLComboBoxHost() {} - - virtual void PaintBackground(); - - virtual void OnMousePressed(MouseCode code); - virtual void OnMouseReleased(MouseCode code); - virtual void OnCursorMoved(int x,int y); - virtual void OnMouseDoublePressed(MouseCode code); - virtual void OnKeyTyped(wchar_t unichar); - virtual void OnKeyCodeTyped(KeyCode code); - virtual void OnKeyCodeReleased(KeyCode code); - virtual void OnMouseWheeled(int delta); - - virtual void OnKillFocus() - { - if ( vgui::input()->GetFocus() != m_pParent->GetVPanel() ) // if its not our parent trying to steal focus - { - BaseClass::OnKillFocus(); - if ( m_pParent ) - m_pParent->HidePopup(); - } - } - - virtual void PerformLayout() - { - // no op the perform layout as we just render the html controls popup texture into it - // we don't want the menu logic trying to play with its size - } - - -private: - HTML *m_pParent; -}; - - //----------------------------------------------------------------------------- // Purpose: container class for any external popup windows the browser requests //----------------------------------------------------------------------------- @@ -163,15 +112,12 @@ private: //----------------------------------------------------------------------------- HTML::HTML(Panel *parent, const char *name, bool allowJavaScript, bool bPopupWindow) : Panel(parent, name), m_NeedsPaint( this, &HTML::BrowserNeedsPaint ), -m_ComboNeedsPaint( this, &HTML::BrowserComboNeedsPaint ), m_StartRequest( this, &HTML::BrowserStartRequest ), m_URLChanged( this, &HTML::BrowserURLChanged ), m_FinishedRequest( this, &HTML::BrowserFinishedRequest ), -m_ShowPopup( this, &HTML::BrowserShowPopup ), -m_HidePopup( this, &HTML::BrowserHidePopup ), -m_SizePopup( this, &HTML::BrowserSizePopup ), m_LinkInNewTab( this, &HTML::BrowserOpenNewTab ), m_ChangeTitle( this, &HTML::BrowserSetHTMLTitle ), +m_NewWindow( this, &HTML::BrowserPopupHTMLWindow ), m_FileLoadDialog( this, &HTML::BrowserFileLoadDialog ), m_SearchResults( this, &HTML::BrowserSearchResults ), m_CloseBrowser( this, &HTML::BrowserClose ), @@ -181,7 +127,6 @@ m_LinkAtPosResp( this, &HTML::BrowserLinkAtPositionResponse ), m_JSAlert( this, &HTML::BrowserJSAlert ), m_JSConfirm( this, &HTML::BrowserJSConfirm ), m_CanGoBackForward( this, &HTML::BrowserCanGoBackandForward ), -m_NewWindow( this, &HTML::BrowserPopupHTMLWindow ), m_SetCursor( this, &HTML::BrowserSetCursor ), m_StatusText( this, &HTML::BrowserStatusText ), m_ShowTooltip( this, &HTML::BrowserShowToolTip ), @@ -189,7 +134,6 @@ m_UpdateTooltip( this, &HTML::BrowserUpdateToolTip ), m_HideTooltip( this, &HTML::BrowserHideToolTip ) { m_iHTMLTextureID = 0; - m_iComboBoxTextureID = 0; m_bCanGoBack = false; m_bCanGoForward = false; m_bInFind = false; @@ -201,7 +145,7 @@ m_HideTooltip( this, &HTML::BrowserHideToolTip ) m_pInteriorPanel = new HTMLInterior( this ); SetPostChildPaintEnabled( true ); - m_unBrowserHandle = INVALID_HTTMLBROWSER; + m_unBrowserHandle = INVALID_HTMLBROWSER; m_SteamAPIContext.Init(); if ( m_SteamAPIContext.SteamHTMLSurface() ) { @@ -233,10 +177,6 @@ m_HideTooltip( this, &HTML::BrowserHideToolTip ) m_pFindBar = new HTML::CHTMLFindBar( this ); m_pFindBar->SetZPos( 2 ); m_pFindBar->SetVisible( false ); - - m_pComboBoxHost = new HTMLComboBoxHost( this, "ComboBoxHost" ); - m_pComboBoxHost->SetPaintBackgroundEnabled( true ); - m_pComboBoxHost->SetVisible( false ); m_pContextMenu = new Menu( this, "contextmenu" ); m_pContextMenu->AddMenuItem( "#vgui_HTMLBack", new KeyValues( "Command", "command", "back" ), this ); @@ -349,36 +289,6 @@ void HTML::Paint() } } - -//----------------------------------------------------------------------------- -// Purpose: paint the combo box texture if we have one -//----------------------------------------------------------------------------- -void HTML::PaintComboBox() -{ - BaseClass::Paint(); - if ( m_iComboBoxTextureID != 0 ) - { - surface()->DrawSetTexture( m_iComboBoxTextureID ); - surface()->DrawSetColor( Color( 255, 255, 255, 255 ) ); - int tw = m_allocedComboBoxWidth; - int tt = m_allocedComboBoxHeight; - surface()->DrawTexturedRect( 0, 0, tw, tt ); - } - -} - - -//----------------------------------------------------------------------------- -// Purpose: overrides panel class, paints a texture of the HTML window as a background -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::PaintBackground() -{ - BaseClass::PaintBackground(); - - m_pParent->PaintComboBox(); -} - - //----------------------------------------------------------------------------- // Purpose: causes a repaint when the layout changes //----------------------------------------------------------------------------- @@ -431,11 +341,6 @@ void HTML::OnMove() // tell cef where we are on the screen so plugins can correctly render int nPanelAbsX, nPanelAbsY; ipanel()->GetAbsPos( GetVPanel(), nPanelAbsX, nPanelAbsY ); - - if ( m_pComboBoxHost && m_pComboBoxHost->IsVisible() ) - { - m_pComboBoxHost->SetVisible( false ); - } } @@ -452,7 +357,7 @@ void HTML::OpenURL(const char *URL, const char *postData, bool force) //----------------------------------------------------------------------------- void HTML::PostURL(const char *URL, const char *pchPostData, bool force) { - if ( m_unBrowserHandle == INVALID_HTTMLBROWSER ) + if ( m_unBrowserHandle == INVALID_HTMLBROWSER ) { m_sPendingURLLoad = URL; m_sPendingPostData = pchPostData; @@ -674,7 +579,7 @@ void HTML::OnMouseReleased(MouseCode code) input()->SetMouseCapture( NULL ); input()->SetCursorOveride( 0 ); - if ( !m_sDragURL.IsEmpty() && input()->GetMouseOver() != GetVPanel() && input()->GetMouseOver() != NULL ) + if ( !m_sDragURL.IsEmpty() && input()->GetMouseOver() != GetVPanel() && input()->GetMouseOver() ) { // post the text as a drag drop to the target panel KeyValuesAD kv( "DragDrop" ); @@ -709,7 +614,7 @@ void HTML::OnCursorMoved(int x,int y) } else if ( !m_sDragURL.IsEmpty() ) { - if ( input()->GetMouseOver() == NULL ) + if ( !input()->GetMouseOver() ) { // we're not over any vgui window, switch to the OS implementation of drag/drop // BR FIXME @@ -749,18 +654,18 @@ int GetKeyModifiers() // Any time a key is pressed reset modifier list as well int nModifierCodes = 0; if (vgui::input()->IsKeyDown( KEY_LCONTROL ) || vgui::input()->IsKeyDown( KEY_RCONTROL )) - nModifierCodes |= ISteamHTMLSurface::eHTMLKeyModifier_CrtlDown; + nModifierCodes |= ISteamHTMLSurface::k_eHTMLKeyModifier_CtrlDown; if (vgui::input()->IsKeyDown( KEY_LALT ) || vgui::input()->IsKeyDown( KEY_RALT )) - nModifierCodes |= ISteamHTMLSurface::eHTMLKeyModifier_AltDown; + nModifierCodes |= ISteamHTMLSurface::k_eHTMLKeyModifier_AltDown; if (vgui::input()->IsKeyDown( KEY_LSHIFT ) || vgui::input()->IsKeyDown( KEY_RSHIFT )) - nModifierCodes |= ISteamHTMLSurface::eHTMLKeyModifier_ShiftDown; + nModifierCodes |= ISteamHTMLSurface::k_eHTMLKeyModifier_ShiftDown; #ifdef OSX // for now pipe through the cmd-key to be like the control key so we get copy/paste if (vgui::input()->IsKeyDown( KEY_LWIN ) || vgui::input()->IsKeyDown( KEY_RWIN )) - nModifierCodes |= ISteamHTMLSurface::eHTMLKeyModifier_CrtlDown; + nModifierCodes |= ISteamHTMLSurface::k_eHTMLKeyModifier_CtrlDown; #endif return nModifierCodes; @@ -925,8 +830,8 @@ void HTML::OnKeyCodeReleased(KeyCode code) // Purpose: scrolls the vertical scroll bar on a web page //----------------------------------------------------------------------------- void HTML::OnMouseWheeled(int delta) -{ - if (_vbar && ( ( m_pComboBoxHost && !m_pComboBoxHost->IsVisible() ) ) ) +{ + if (_vbar ) { int val = _vbar->GetValue(); val -= (delta * 100.0/3.0 ); // 100 for every 3 lines matches chromes code @@ -954,7 +859,7 @@ void HTML::AddCustomURLHandler(const char *customProtocolName, vgui::Panel *targ //----------------------------------------------------------------------------- void HTML::BrowserResize() { - if (m_unBrowserHandle == INVALID_HTTMLBROWSER) + if (m_unBrowserHandle == INVALID_HTMLBROWSER) return; int w,h; @@ -1120,16 +1025,12 @@ void HTML::OnSetFocus() //----------------------------------------------------------------------------- void HTML::OnKillFocus() { - if ( vgui::input()->GetFocus() != m_pComboBoxHost->GetVPanel() ) // if its not the menu stealing our focus - BaseClass::OnKillFocus(); + BaseClass::OnKillFocus(); // Don't clear the actual html focus if a context menu is what took focus if ( m_pContextMenu->HasFocus() ) return; - if ( m_pComboBoxHost->HasFocus() ) - return; - if (m_SteamAPIContext.SteamHTMLSurface()) m_SteamAPIContext.SteamHTMLSurface()->SetKeyFocus( m_unBrowserHandle, false ); } @@ -1279,83 +1180,6 @@ void HTML::OnTextChanged( Panel *pPanel ) Find( rgchText ); } - -//----------------------------------------------------------------------------- -// Purpose: passes mouse clicks to the control -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnMousePressed(MouseCode code) -{ - m_pParent->OnMousePressed(code); -} - - -//----------------------------------------------------------------------------- -// Purpose: passes mouse up events -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnMouseReleased(MouseCode code) -{ - m_pParent->OnMouseReleased(code); -} - - -//----------------------------------------------------------------------------- -// Purpose: keeps track of where the cursor is -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnCursorMoved(int x,int y) -{ - // Only do this when we are over the current panel - if ( vgui::input()->GetMouseOver() == GetVPanel() ) - { - m_pParent->OnHTMLMouseMoved( x, y ); - } -} - - -//----------------------------------------------------------------------------- -// Purpose: passes double click events to the browser -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnMouseDoublePressed(MouseCode code) -{ - m_pParent->OnMouseDoublePressed(code); -} - - -//----------------------------------------------------------------------------- -// Purpose: passes key presses to the browser (we don't current do this) -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnKeyTyped(wchar_t unichar) -{ - m_pParent->OnKeyTyped(unichar); -} - - -//----------------------------------------------------------------------------- -// Purpose: passes key presses to the browser -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnKeyCodeTyped(KeyCode code) -{ - m_pParent->OnKeyCodeTyped(code); -} - - -//----------------------------------------------------------------------------- -// Purpose: -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnKeyCodeReleased(KeyCode code) -{ - m_pParent->OnKeyCodeReleased(code); -} - - -//----------------------------------------------------------------------------- -// Purpose: scrolls the vertical scroll bar on a web page -//----------------------------------------------------------------------------- -void HTMLComboBoxHost::OnMouseWheeled(int delta) -{ - m_pParent->OnMouseWheeled( delta ); -} - - //----------------------------------------------------------------------------- // Purpose: helper class for the find bar //----------------------------------------------------------------------------- @@ -1441,43 +1265,6 @@ void HTML::BrowserNeedsPaint( HTML_NeedsPaint_t *pCallback ) Repaint(); } - -//----------------------------------------------------------------------------- -// Purpose: we have a new texture to update -//----------------------------------------------------------------------------- -void HTML::BrowserComboNeedsPaint( HTML_ComboNeedsPaint_t *pCallback ) -{ - if ( m_pComboBoxHost->IsVisible() ) - { - int tw = 0, tt = 0; - // update the combo box texture also - if ( m_iComboBoxTextureID != 0 ) - { - tw = m_allocedComboBoxWidth; - tt = m_allocedComboBoxHeight; - } - - if ( m_iComboBoxTextureID == 0 || tw != (int)pCallback->unWide || tt != (int)pCallback->unTall ) - { - if ( m_iComboBoxTextureID != 0 ) - surface()->DeleteTextureByID( m_iComboBoxTextureID ); - - // if the dimensions changed we also need to re-create the texture ID to support the overlay properly (it won't resize a texture on the fly, this is the only control that needs - // to so lets have a tiny bit more code here to support that) - m_iComboBoxTextureID = surface()->CreateNewTextureID( true ); - surface()->DrawSetTextureRGBAEx( m_iComboBoxTextureID, (const unsigned char *)pCallback->pBGRA, pCallback->unWide, pCallback->unTall, IMAGE_FORMAT_BGRA8888 ); - m_allocedComboBoxWidth = (int)pCallback->unWide; - m_allocedComboBoxHeight = (int)pCallback->unTall; - } - else - { - // same size texture, just bits changing in it, lets twiddle - surface()->DrawUpdateRegionTextureRGBA( m_iComboBoxTextureID, 0, 0, (const unsigned char *)pCallback->pBGRA, pCallback->unWide, pCallback->unTall, IMAGE_FORMAT_BGRA8888 ); - } - } -} - - //----------------------------------------------------------------------------- // Purpose: browser wants to start loading this url, do we let it? //----------------------------------------------------------------------------- @@ -1579,45 +1366,6 @@ void HTML::BrowserFinishedRequest( HTML_FinishedRequest_t *pCmd ) OnFinishRequest( pCmd->pchURL, pCmd->pchPageTitle, mapHeaders ); } - -//----------------------------------------------------------------------------- -// Purpose: show a popup dialog -//----------------------------------------------------------------------------- -void HTML::BrowserShowPopup( HTML_ShowPopup_t *pCmd ) -{ - m_pComboBoxHost->SetVisible( true ); -} - - -//----------------------------------------------------------------------------- -// Purpose: hide the popup -//----------------------------------------------------------------------------- -void HTML::HidePopup() -{ - m_pComboBoxHost->SetVisible( false ); -} - - -//----------------------------------------------------------------------------- -// Purpose: browser wants us to hide a popup -//----------------------------------------------------------------------------- -void HTML::BrowserHidePopup( HTML_HidePopup_t *pCmd ) -{ - HidePopup(); -} - - -//----------------------------------------------------------------------------- -// Purpose: browser wants us to position a popup -//----------------------------------------------------------------------------- -void HTML::BrowserSizePopup( HTML_SizePopup_t *pCmd ) -{ - int nAbsX, nAbsY; - ipanel()->GetAbsPos( GetVPanel(), nAbsX, nAbsY ); - m_pComboBoxHost->SetBounds( pCmd->unX + 1 + nAbsX, pCmd->unY+ nAbsY, pCmd->unWide, pCmd->unTall ); -} - - //----------------------------------------------------------------------------- // Purpose: browser wants to open a new tab //----------------------------------------------------------------------------- @@ -1627,9 +1375,8 @@ void HTML::BrowserOpenNewTab( HTML_OpenLinkInNewTab_t *pCmd ) // Not suppored by default, if a child class overrides us and knows how to handle tabs, then it can do this. } - //----------------------------------------------------------------------------- -// Purpose: display a new html window +// Purpose: display a new html window //----------------------------------------------------------------------------- void HTML::BrowserPopupHTMLWindow( HTML_NewWindow_t *pCmd ) { diff --git a/mp/src/vgui2/vgui_controls/Label.cpp b/mp/src/vgui2/vgui_controls/Label.cpp index 776c8c6e..2178f390 100644 --- a/mp/src/vgui2/vgui_controls/Label.cpp +++ b/mp/src/vgui2/vgui_controls/Label.cpp @@ -361,8 +361,14 @@ void Label::SetTextInset(int xInset, int yInset) //----------------------------------------------------------------------------- void Label::GetTextInset(int *xInset, int *yInset ) { - *xInset = _textInset[0]; - *yInset = _textInset[1]; + if ( xInset ) + { + *xInset = _textInset[0]; + } + if ( yInset ) + { + *yInset = _textInset[1]; + } } //----------------------------------------------------------------------------- diff --git a/mp/src/vgui2/vgui_controls/Menu.cpp b/mp/src/vgui2/vgui_controls/Menu.cpp index 695d3523..9978824e 100644 --- a/mp/src/vgui2/vgui_controls/Menu.cpp +++ b/mp/src/vgui2/vgui_controls/Menu.cpp @@ -2107,7 +2107,7 @@ void Menu::ActivateItemByRow(int row) //----------------------------------------------------------------------------- // Purpose: Return the number of items currently in the menu list //----------------------------------------------------------------------------- -int Menu::GetItemCount() +int Menu::GetItemCount() const { return m_MenuItems.Count(); } @@ -2701,3 +2701,33 @@ void Menu::Validate( CValidator &validator, char *pchName ) validator.Pop(); } #endif // DBGFLAG_VALIDATE + + +MenuBuilder::MenuBuilder( Menu *pMenu, Panel *pActionTarget ) + : m_pMenu( pMenu ) + , m_pActionTarget( pActionTarget ) + , m_pszLastCategory( NULL ) +{} + +MenuItem* MenuBuilder::AddMenuItem( const char *pszButtonText, const char *pszCommand, const char *pszCategoryName ) +{ + AddSepratorIfNeeded( pszCategoryName ); + return m_pMenu->GetMenuItem( m_pMenu->AddMenuItem( pszButtonText, new KeyValues( pszCommand ), m_pActionTarget ) ); +} + +MenuItem* MenuBuilder::AddCascadingMenuItem( const char *pszButtonText, Menu *pSubMenu, const char *pszCategoryName ) +{ + AddSepratorIfNeeded( pszCategoryName ); + return m_pMenu->GetMenuItem( m_pMenu->AddCascadingMenuItem( pszButtonText, m_pActionTarget, pSubMenu ) ); +} + +void MenuBuilder::AddSepratorIfNeeded( const char *pszCategoryName ) +{ + // Add a separator if the categories are different + if ( m_pszLastCategory && V_stricmp( pszCategoryName, m_pszLastCategory ) != 0 ) + { + m_pMenu->AddSeparator(); + } + + m_pszLastCategory = pszCategoryName; +} diff --git a/mp/src/vgui2/vgui_controls/Panel.cpp b/mp/src/vgui2/vgui_controls/Panel.cpp index 499296d9..5291c437 100644 --- a/mp/src/vgui2/vgui_controls/Panel.cpp +++ b/mp/src/vgui2/vgui_controls/Panel.cpp @@ -40,6 +40,7 @@ #include "mempool.h" #include "filesystem.h" #include "tier0/icommandline.h" +#include "tier0/minidump.h" #include "tier0/vprof.h" @@ -50,7 +51,38 @@ using namespace vgui; #define TRIPLE_PRESS_MSEC 300 +const char *g_PinCornerStrings [] = +{ + "PIN_TOPLEFT", + "PIN_TOPRIGHT", + "PIN_BOTTOMLEFT", + "PIN_BOTTOMRIGHT", + + "PIN_CENTER_TOP", + "PIN_CENTER_RIGHT", + "PIN_CENTER_BOTTOM", + "PIN_CENTER_LEFT", +}; +COMPILE_TIME_ASSERT( Panel::PIN_LAST == ARRAYSIZE( g_PinCornerStrings ) ); + +static const char *COM_GetModDirectory() +{ + static char modDir[MAX_PATH]; + if ( Q_strlen( modDir ) == 0 ) + { + const char *gamedir = CommandLine()->ParmValue("-game", CommandLine()->ParmValue( "-defaultgamedir", "hl2" ) ); + Q_strncpy( modDir, gamedir, sizeof(modDir) ); + if ( strchr( modDir, '/' ) || strchr( modDir, '\\' ) ) + { + Q_StripLastDir( modDir, sizeof(modDir) ); + int dirlen = Q_strlen( modDir ); + Q_strncpy( modDir, gamedir + dirlen, sizeof(modDir) - dirlen ); + } + } + + return modDir; +} extern int GetBuildModeDialogCount(); static char *CopyString( const char *in ) @@ -64,6 +96,13 @@ static char *CopyString( const char *in ) return n; } +#ifdef STAGING_ONLY +ConVar tf_strict_mouse_up_events( "tf_strict_mouse_up_events", "0", FCVAR_ARCHIVE, "Only allow Mouse-Release events to happens on panels we also Mouse-Downed in" ); +#endif + +// Temporary convar to help debug why the MvMVictoryMannUpPanel TabContainer is sometimes way off to the left. +ConVar tf_debug_tabcontainer( "tf_debug_tabcontainer", "0", FCVAR_HIDDEN, "Spew TabContainer dimensions." ); + #if defined( VGUI_USEDRAGDROP ) //----------------------------------------------------------------------------- // Purpose: @@ -370,6 +409,8 @@ KeyBindingContextHandle_t Panel::CreateKeyBindingsContext( char const *filename, return g_KBMgr.CreateContext( filename, pathID ); } +COMPILE_TIME_ASSERT( ( MOUSE_MIDDLE - MOUSE_LEFT ) == 2 ); +Panel* Panel::m_sMousePressedPanels[] = { NULL, NULL, NULL }; //----------------------------------------------------------------------------- // Purpose: static method @@ -722,7 +763,6 @@ void Panel::Init( int x, int y, int wide, int tall ) m_bForceStereoRenderToFrameBuffer = false; } - //----------------------------------------------------------------------------- // Purpose: Destructor //----------------------------------------------------------------------------- @@ -732,7 +772,7 @@ Panel::~Panel() if ( !m_bToolTipOverridden ) { if ( m_pTooltips ) - { + { delete m_pTooltips; } } @@ -785,6 +825,13 @@ Panel::~Panel() #if defined( VGUI_USEDRAGDROP ) delete m_pDragDrop; #endif // VGUI_USEDRAGDROP + +#if defined( VGUI_PANEL_VERIFY_DELETES ) + // Zero out our vtbl pointer. This should hopefully help us catch bad guys using + // this panel after it has been deleted. + uintp *panel_vtbl = (uintp *)this; + *panel_vtbl = NULL; +#endif } //----------------------------------------------------------------------------- @@ -864,7 +911,7 @@ const char *Panel::GetClassName() //----------------------------------------------------------------------------- void Panel::SetPos(int x, int y) { - if (!CommandLine()->FindParm("-hushasserts")) + if ( !HushAsserts() ) { Assert( abs(x) < 32768 && abs(y) < 32768 ); } @@ -882,6 +929,26 @@ void Panel::GetPos(int &x, int &y) //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- +int Panel::GetXPos() +{ + int x,y; + GetPos( x, y ); + return x; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +int Panel::GetYPos() +{ + int x,y; + GetPos( x, y ); + return y; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- void Panel::SetSize(int wide, int tall) { Assert( abs(wide) < 32768 && abs(tall) < 32768 ); @@ -1063,6 +1130,15 @@ void Panel::Think() OnThink(); } +void Panel::OnChildSettingsApplied( KeyValues *pInResourceData, Panel *pChild ) +{ + Panel* pParent = GetParent(); + if( pParent ) + { + pParent->OnChildSettingsApplied( pInResourceData, pChild ); + } +} + //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- @@ -1577,7 +1653,6 @@ void Panel::CallParentFunction(KeyValues *message) } } - //----------------------------------------------------------------------------- // Purpose: if set to true, panel automatically frees itself when parent is deleted //----------------------------------------------------------------------------- @@ -1867,6 +1942,17 @@ void Panel::InternalMousePressed(int code) } #endif +#ifdef STAGING_ONLY + const char *pGameDir = COM_GetModDirectory(); + if ( Q_stristr( pGameDir, "tf" ) ) + { + if ( code >= MOUSE_LEFT && code <= MOUSE_MIDDLE ) + { + m_sMousePressedPanels[ code - MOUSE_LEFT ] = this; + } + } +#endif + Panel *pMouseHandler = m_hMouseEventHandler.Get(); if ( pMouseHandler ) { @@ -2001,6 +2087,26 @@ void Panel::InternalMouseReleased(int code) } } +#ifdef STAGING_ONLY + const char *pGameDir = COM_GetModDirectory(); + if ( Q_stristr( pGameDir, "tf" ) && tf_strict_mouse_up_events.GetBool() ) + { + // Only allow mouse release events to go to panels that we also + // first clicked into + if ( code >= MOUSE_LEFT && code <= MOUSE_MIDDLE ) + { + const int nIndex = code - MOUSE_LEFT; + Panel* pPressedPanel = m_sMousePressedPanels[ nIndex ]; + m_sMousePressedPanels[ nIndex ] = NULL; // Clear out pressed panel + if ( pPressedPanel != this ) + { + OnMouseMismatchedRelease( (MouseCode)code, pPressedPanel ); + return; + } + } + } +#endif + OnMouseReleased((MouseCode)code); } @@ -2951,6 +3057,10 @@ void Panel::OnMouseReleased(MouseCode code) { } +void Panel::OnMouseMismatchedRelease( MouseCode code, Panel* pPressedPanel ) +{ +} + void Panel::OnMouseWheeled(int delta) { CallParentFunction(new KeyValues("MouseWheeled", "delta", delta)); @@ -4281,6 +4391,7 @@ int Panel::ComputePos( const char *pszInput, int &nPos, const int& nSize, const const int nFlagProportionalParent = bX ? BUILDMODE_SAVE_XPOS_PROPORTIONAL_PARENT : BUILDMODE_SAVE_YPOS_PROPORTIONAL_PARENT; int nFlags = 0; + int nPosDelta = 0; if ( pszInput ) { // look for alignment flags @@ -4319,7 +4430,6 @@ int Panel::ComputePos( const char *pszInput, int &nPos, const int& nSize, const flProportion = (float)nPos / (float)nOldPos; } - int nPosDelta = 0; if ( nFlags & nFlagProportionalSlef ) { nPosDelta = nSize * flPos; @@ -4348,9 +4458,40 @@ int Panel::ComputePos( const char *pszInput, int &nPos, const int& nSize, const } } + if ( tf_debug_tabcontainer.GetBool() && !Q_stricmp( "TabContainer", GetName() ) ) + { + Msg( "TabContainer nFlags:%x nPos:%d nParentSize:%d nPosDelta:%d nSize:%d GetParent:%p (%s) pszInput:'%s'\n", + nFlags, nPos, nParentSize, nPosDelta, nSize, GetParent(), GetParent() ? GetParent()->GetName() : "??", + pszInput ? pszInput : "??" ); + } + return nFlags; } +Panel::PinCorner_e GetPinCornerFromString( const char* pszCornerName ) +{ + if ( pszCornerName == NULL ) + { + return Panel::PIN_TOPLEFT; + } + + // Optimize for all the old entries of a single digit + if ( strlen( pszCornerName ) == 1 ) + { + return (Panel::PinCorner_e)atoi( pszCornerName ); + } + + for( int i=0; i<ARRAYSIZE( g_PinCornerStrings ); ++i ) + { + if ( !Q_stricmp( g_PinCornerStrings[i], pszCornerName ) ) + { + return (Panel::PinCorner_e)i; + } + } + + return Panel::PIN_TOPLEFT; +} + //----------------------------------------------------------------------------- // Purpose: Loads panel details from the resource info //----------------------------------------------------------------------------- @@ -4622,6 +4763,19 @@ void Panel::ApplySettings(KeyValues *inResourceData) SetName(newName); } + // Automatically add an action signal target if one is specified. This allows for + // nested child buttons to add their distant parents as action signal targets. + int nActionSignalLevel = inResourceData->GetInt( "actionsignallevel", -1 ); + if ( nActionSignalLevel != -1 ) + { + Panel *pActionSignalTarget = this; + while( nActionSignalLevel-- ) + { + pActionSignalTarget = pActionSignalTarget->GetParent(); + } + AddActionSignalTarget( pActionSignalTarget ); + } + // check to see if we need to render to the frame buffer even if // stereo mode is trying to render all of the ui to a render target m_bForceStereoRenderToFrameBuffer = inResourceData->GetBool( "ForceStereoRenderToFrameBuffer", false ); @@ -4640,8 +4794,8 @@ void Panel::ApplySettings(KeyValues *inResourceData) //============================================================================= const char *pszSiblingName = inResourceData->GetString("pin_to_sibling", NULL); - PinCorner_e pinOurCornerToSibling = (PinCorner_e)inResourceData->GetInt( "pin_corner_to_sibling", PIN_TOPLEFT ); - PinCorner_e pinSiblingCorner = (PinCorner_e)inResourceData->GetInt( "pin_to_sibling_corner", PIN_TOPLEFT ); + PinCorner_e pinOurCornerToSibling = GetPinCornerFromString( inResourceData->GetString( "pin_corner_to_sibling", NULL ) ); + PinCorner_e pinSiblingCorner = GetPinCornerFromString( inResourceData->GetString( "pin_to_sibling_corner", NULL ) ); PinToSibling( pszSiblingName, pinOurCornerToSibling, pinSiblingCorner ); @@ -4680,6 +4834,8 @@ void Panel::ApplySettings(KeyValues *inResourceData) { SetKeyBoardInputEnabled( atoi( pKeyboardInputEnabled ) ); } + + OnChildSettingsApplied( inResourceData, this ); } //----------------------------------------------------------------------------- diff --git a/mp/src/vgui2/vgui_controls/PanelListPanel.cpp b/mp/src/vgui2/vgui_controls/PanelListPanel.cpp index 355ac08f..995ce460 100644 --- a/mp/src/vgui2/vgui_controls/PanelListPanel.cpp +++ b/mp/src/vgui2/vgui_controls/PanelListPanel.cpp @@ -248,7 +248,8 @@ void PanelListPanel::DeleteAllItems() { if ( m_DataItems[i].panel ) { - delete m_DataItems[i].panel; + m_DataItems[i].panel->MarkForDeletion(); + m_DataItems[i].panel = NULL; } } diff --git a/mp/src/vgui2/vgui_controls/ScrollBar.cpp b/mp/src/vgui2/vgui_controls/ScrollBar.cpp index d4e8a9b4..94d76088 100644 --- a/mp/src/vgui2/vgui_controls/ScrollBar.cpp +++ b/mp/src/vgui2/vgui_controls/ScrollBar.cpp @@ -625,7 +625,7 @@ void ScrollBar::UseImages( const char *pszUpArrow, const char *pszDownArrow, con } else if ( m_pUpArrow ) { - m_pUpArrow->DeletePanel(); + m_pUpArrow->MarkForDeletion(); m_pUpArrow = NULL; } @@ -648,7 +648,7 @@ void ScrollBar::UseImages( const char *pszUpArrow, const char *pszDownArrow, con } else if ( m_pDownArrow ) { - m_pDownArrow->DeletePanel(); + m_pDownArrow->MarkForDeletion(); m_pDownArrow = NULL; } @@ -669,7 +669,7 @@ void ScrollBar::UseImages( const char *pszUpArrow, const char *pszDownArrow, con } else if ( m_pLine ) { - m_pLine->DeletePanel(); + m_pLine->MarkForDeletion(); m_pLine = NULL; } @@ -690,7 +690,7 @@ void ScrollBar::UseImages( const char *pszUpArrow, const char *pszDownArrow, con } else if ( m_pBox ) { - m_pBox->DeletePanel(); + m_pBox->MarkForDeletion(); m_pBox = NULL; } |