diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/vgui2/vgui_controls/FocusNavGroup.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/vgui2/vgui_controls/FocusNavGroup.cpp')
| -rw-r--r-- | mp/src/vgui2/vgui_controls/FocusNavGroup.cpp | 864 |
1 files changed, 432 insertions, 432 deletions
diff --git a/mp/src/vgui2/vgui_controls/FocusNavGroup.cpp b/mp/src/vgui2/vgui_controls/FocusNavGroup.cpp index 10fc88ad..8bfb807d 100644 --- a/mp/src/vgui2/vgui_controls/FocusNavGroup.cpp +++ b/mp/src/vgui2/vgui_controls/FocusNavGroup.cpp @@ -1,433 +1,433 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-
-#include <assert.h>
-
-#include <vgui/ISurface.h>
-#include <vgui/IVGui.h>
-#include <vgui/IPanel.h>
-#include <vgui/VGUI.h>
-#include <KeyValues.h>
-#include <tier0/dbg.h>
-
-#include <vgui_controls/Controls.h>
-#include <vgui_controls/FocusNavGroup.h>
-#include <vgui_controls/Panel.h>
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include <tier0/memdbgon.h>
-
-using namespace vgui;
-
-//-----------------------------------------------------------------------------
-// Purpose: Constructor
-// Input : *panel - parent panel
-//-----------------------------------------------------------------------------
-FocusNavGroup::FocusNavGroup(Panel *panel) : _mainPanel(panel)
-{
- _currentFocus = NULL;
- _topLevelFocus = false;
- _defaultButton = NULL;
- _currentDefaultButton = NULL;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Destructor
-//-----------------------------------------------------------------------------
-FocusNavGroup::~FocusNavGroup()
-{
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Sets the focus to the previous panel in the tab order
-// Input : *panel - panel currently with focus
-//-----------------------------------------------------------------------------
-bool FocusNavGroup::RequestFocusPrev(VPANEL panel)
-{
- if(panel==0)
- return false;
-
- _currentFocus = NULL;
- int newPosition = 9999999;
- if (panel)
- {
- newPosition = ipanel()->GetTabPosition(panel);
- }
-
- bool bFound = false;
- bool bRepeat = true;
- Panel *best = NULL;
- while (1)
- {
- newPosition--;
- if (newPosition > 0)
- {
- int bestPosition = 0;
-
- // look for the next tab position
- for (int i = 0; i < _mainPanel->GetChildCount(); i++)
- {
- Panel *child = _mainPanel->GetChild(i);
- if (child && child->IsVisible() && child->IsEnabled() && child->GetTabPosition())
- {
- int tabPosition = child->GetTabPosition();
- if (tabPosition == newPosition)
- {
- // we've found the right tab
- best = child;
- bestPosition = newPosition;
-
- // don't loop anymore since we've found the correct panel
- break;
- }
- else if (tabPosition < newPosition && tabPosition > bestPosition)
- {
- // record the match since this is the closest so far
- bestPosition = tabPosition;
- best = child;
- }
- }
- }
-
- if (!bRepeat)
- break;
-
- if (best)
- break;
- }
- else
- {
- // reset new position for next loop
- newPosition = 9999999;
- }
-
- // haven't found an item
-
- if (!_topLevelFocus)
- {
- // check to see if we should push the focus request up
- if (_mainPanel->GetVParent() && _mainPanel->GetVParent() != surface()->GetEmbeddedPanel())
- {
- // we're not a top level panel, so forward up the request instead of looping
- if (ipanel()->RequestFocusPrev(_mainPanel->GetVParent(), _mainPanel->GetVPanel()))
- {
- bFound = true;
- SetCurrentDefaultButton(NULL);
- break;
- }
- }
- }
-
- // not found an item, loop back
- newPosition = 9999999;
- bRepeat = false;
- }
-
- if (best)
- {
- _currentFocus = best->GetVPanel();
- best->RequestFocus(-1);
- bFound = true;
-
- if (!CanButtonBeDefault(best->GetVPanel()))
- {
- if (_defaultButton)
- {
- SetCurrentDefaultButton(_defaultButton);
- }
- else
- {
- SetCurrentDefaultButton(NULL);
-
- // we need to ask the parent to set its default button
- if (_mainPanel->GetVParent())
- {
- ivgui()->PostMessage(_mainPanel->GetVParent(), new KeyValues("FindDefaultButton"), NULL);
- }
- }
- }
- else
- {
- SetCurrentDefaultButton(best->GetVPanel());
- }
- }
- return bFound;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Sets the focus to the previous panel in the tab order
-// Input : *panel - panel currently with focus
-//-----------------------------------------------------------------------------
-bool FocusNavGroup::RequestFocusNext(VPANEL panel)
-{
- // basic recursion guard, in case user has set up a bad focus hierarchy
- static int stack_depth = 0;
- stack_depth++;
-
- _currentFocus = NULL;
- int newPosition = 0;
- if (panel)
- {
- newPosition = ipanel()->GetTabPosition(panel);
- }
-
- bool bFound = false;
- bool bRepeat = true;
- Panel *best = NULL;
- while (1)
- {
- newPosition++;
- int bestPosition = 999999;
-
- // look for the next tab position
- for (int i = 0; i < _mainPanel->GetChildCount(); i++)
- {
- Panel *child = _mainPanel->GetChild(i);
- if ( !child )
- continue;
-
- if (child && child->IsVisible() && child->IsEnabled() && child->GetTabPosition())
- {
- int tabPosition = child->GetTabPosition();
- if (tabPosition == newPosition)
- {
- // we've found the right tab
- best = child;
- bestPosition = newPosition;
-
- // don't loop anymore since we've found the correct panel
- break;
- }
- else if (tabPosition > newPosition && tabPosition < bestPosition)
- {
- // record the match since this is the closest so far
- bestPosition = tabPosition;
- best = child;
- }
- }
- }
-
- if (!bRepeat)
- break;
-
- if (best)
- break;
-
- // haven't found an item
-
- // check to see if we should push the focus request up
- if (!_topLevelFocus)
- {
- if (_mainPanel->GetVParent() && _mainPanel->GetVParent() != surface()->GetEmbeddedPanel())
- {
- // we're not a top level panel, so forward up the request instead of looping
- if (stack_depth < 15)
- {
- if (ipanel()->RequestFocusNext(_mainPanel->GetVParent(), _mainPanel->GetVPanel()))
- {
- bFound = true;
- SetCurrentDefaultButton(NULL);
- break;
- }
-
- // if we find one then we break, otherwise we loop
- }
- }
- }
-
- // loop back
- newPosition = 0;
- bRepeat = false;
- }
-
- if (best)
- {
- _currentFocus = best->GetVPanel();
- best->RequestFocus(1);
- bFound = true;
-
- if (!CanButtonBeDefault(best->GetVPanel()))
- {
- if (_defaultButton)
- {
- SetCurrentDefaultButton(_defaultButton);
- }
- else
- {
- SetCurrentDefaultButton(NULL);
-
- // we need to ask the parent to set its default button
- if (_mainPanel->GetVParent())
- {
- ivgui()->PostMessage(_mainPanel->GetVParent(), new KeyValues("FindDefaultButton"), NULL);
- }
- }
- }
- else
- {
- SetCurrentDefaultButton(best->GetVPanel());
- }
- }
-
- stack_depth--;
- return bFound;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: sets the panel that owns this FocusNavGroup to be the root in the focus traversal heirarchy
-//-----------------------------------------------------------------------------
-void FocusNavGroup::SetFocusTopLevel(bool state)
-{
- _topLevelFocus = state;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: sets panel which receives input when ENTER is hit
-//-----------------------------------------------------------------------------
-void FocusNavGroup::SetDefaultButton(Panel *panel)
-{
- VPANEL vpanel = panel ? panel->GetVPanel() : NULL;
- if ( vpanel == _defaultButton.Get() )
- return;
-
-// Assert(CanButtonBeDefault(vpanel));
-
- _defaultButton = vpanel;
- SetCurrentDefaultButton(_defaultButton);
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: sets panel which receives input when ENTER is hit
-//-----------------------------------------------------------------------------
-void FocusNavGroup::SetCurrentDefaultButton(VPANEL panel, bool sendCurrentDefaultButtonMessage)
-{
- if (panel == _currentDefaultButton.Get())
- return;
-
- if ( sendCurrentDefaultButtonMessage && _currentDefaultButton.Get() != 0)
- {
- ivgui()->PostMessage(_currentDefaultButton, new KeyValues("SetAsCurrentDefaultButton", "state", 0), NULL);
- }
-
- _currentDefaultButton = panel;
-
- if ( sendCurrentDefaultButtonMessage && _currentDefaultButton.Get() != 0)
- {
- ivgui()->PostMessage(_currentDefaultButton, new KeyValues("SetAsCurrentDefaultButton", "state", 1), NULL);
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: sets panel which receives input when ENTER is hit
-//-----------------------------------------------------------------------------
-VPANEL FocusNavGroup::GetCurrentDefaultButton()
-{
- return _currentDefaultButton;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: sets panel which receives input when ENTER is hit
-//-----------------------------------------------------------------------------
-VPANEL FocusNavGroup::GetDefaultButton()
-{
- return _defaultButton;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: finds the panel which is activated by the specified key
-// Input : code - the keycode of the hotkey
-// Output : Panel * - NULL if no panel found
-//-----------------------------------------------------------------------------
-Panel *FocusNavGroup::FindPanelByHotkey(wchar_t key)
-{
- for (int i = 0; i < _mainPanel->GetChildCount(); i++)
- {
- Panel *child = _mainPanel->GetChild(i);
- if ( !child )
- continue;
-
- Panel *hot = child->HasHotkey(key);
- if (hot && hot->IsVisible() && hot->IsEnabled())
- {
- return hot;
- }
- }
-
- return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-Panel *FocusNavGroup::GetDefaultPanel()
-{
- for (int i = 0; i < _mainPanel->GetChildCount(); i++)
- {
- Panel *child = _mainPanel->GetChild(i);
- if ( !child )
- continue;
-
- if (child->GetTabPosition() == 1)
- {
- return child;
- }
- }
-
- return NULL; // no specific panel set
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-Panel *FocusNavGroup::GetCurrentFocus()
-{
- return _currentFocus ? ipanel()->GetPanel(_currentFocus, vgui::GetControlsModuleName()) : NULL;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Sets the current focus
-//-----------------------------------------------------------------------------
-VPANEL FocusNavGroup::SetCurrentFocus(VPANEL focus, VPANEL defaultPanel)
-{
- _currentFocus = focus;
-
- // if we haven't found a default panel yet, let's see if we know of one
- if (defaultPanel == 0)
- {
- // can this focus itself by the default
- if (CanButtonBeDefault(focus))
- {
- defaultPanel = focus;
- }
- else if (_defaultButton) // do we know of a default button
- {
- defaultPanel = _defaultButton;
- }
- }
-
- SetCurrentDefaultButton(defaultPanel);
- return defaultPanel;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Returns true if the specified panel can be the default
-//-----------------------------------------------------------------------------
-bool FocusNavGroup::CanButtonBeDefault(VPANEL panel)
-{
- if( panel == 0 )
- return false;
-
- KeyValues *data = new KeyValues("CanBeDefaultButton");
-
- bool bResult = false;
- if (ipanel()->RequestInfo(panel, data))
- {
- bResult = (data->GetInt("result") == 1);
- }
- data->deleteThis();
- return bResult;
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include <assert.h> + +#include <vgui/ISurface.h> +#include <vgui/IVGui.h> +#include <vgui/IPanel.h> +#include <vgui/VGUI.h> +#include <KeyValues.h> +#include <tier0/dbg.h> + +#include <vgui_controls/Controls.h> +#include <vgui_controls/FocusNavGroup.h> +#include <vgui_controls/Panel.h> + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +using namespace vgui; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +// Input : *panel - parent panel +//----------------------------------------------------------------------------- +FocusNavGroup::FocusNavGroup(Panel *panel) : _mainPanel(panel) +{ + _currentFocus = NULL; + _topLevelFocus = false; + _defaultButton = NULL; + _currentDefaultButton = NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor +//----------------------------------------------------------------------------- +FocusNavGroup::~FocusNavGroup() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: Sets the focus to the previous panel in the tab order +// Input : *panel - panel currently with focus +//----------------------------------------------------------------------------- +bool FocusNavGroup::RequestFocusPrev(VPANEL panel) +{ + if(panel==0) + return false; + + _currentFocus = NULL; + int newPosition = 9999999; + if (panel) + { + newPosition = ipanel()->GetTabPosition(panel); + } + + bool bFound = false; + bool bRepeat = true; + Panel *best = NULL; + while (1) + { + newPosition--; + if (newPosition > 0) + { + int bestPosition = 0; + + // look for the next tab position + for (int i = 0; i < _mainPanel->GetChildCount(); i++) + { + Panel *child = _mainPanel->GetChild(i); + if (child && child->IsVisible() && child->IsEnabled() && child->GetTabPosition()) + { + int tabPosition = child->GetTabPosition(); + if (tabPosition == newPosition) + { + // we've found the right tab + best = child; + bestPosition = newPosition; + + // don't loop anymore since we've found the correct panel + break; + } + else if (tabPosition < newPosition && tabPosition > bestPosition) + { + // record the match since this is the closest so far + bestPosition = tabPosition; + best = child; + } + } + } + + if (!bRepeat) + break; + + if (best) + break; + } + else + { + // reset new position for next loop + newPosition = 9999999; + } + + // haven't found an item + + if (!_topLevelFocus) + { + // check to see if we should push the focus request up + if (_mainPanel->GetVParent() && _mainPanel->GetVParent() != surface()->GetEmbeddedPanel()) + { + // we're not a top level panel, so forward up the request instead of looping + if (ipanel()->RequestFocusPrev(_mainPanel->GetVParent(), _mainPanel->GetVPanel())) + { + bFound = true; + SetCurrentDefaultButton(NULL); + break; + } + } + } + + // not found an item, loop back + newPosition = 9999999; + bRepeat = false; + } + + if (best) + { + _currentFocus = best->GetVPanel(); + best->RequestFocus(-1); + bFound = true; + + if (!CanButtonBeDefault(best->GetVPanel())) + { + if (_defaultButton) + { + SetCurrentDefaultButton(_defaultButton); + } + else + { + SetCurrentDefaultButton(NULL); + + // we need to ask the parent to set its default button + if (_mainPanel->GetVParent()) + { + ivgui()->PostMessage(_mainPanel->GetVParent(), new KeyValues("FindDefaultButton"), NULL); + } + } + } + else + { + SetCurrentDefaultButton(best->GetVPanel()); + } + } + return bFound; +} + +//----------------------------------------------------------------------------- +// Purpose: Sets the focus to the previous panel in the tab order +// Input : *panel - panel currently with focus +//----------------------------------------------------------------------------- +bool FocusNavGroup::RequestFocusNext(VPANEL panel) +{ + // basic recursion guard, in case user has set up a bad focus hierarchy + static int stack_depth = 0; + stack_depth++; + + _currentFocus = NULL; + int newPosition = 0; + if (panel) + { + newPosition = ipanel()->GetTabPosition(panel); + } + + bool bFound = false; + bool bRepeat = true; + Panel *best = NULL; + while (1) + { + newPosition++; + int bestPosition = 999999; + + // look for the next tab position + for (int i = 0; i < _mainPanel->GetChildCount(); i++) + { + Panel *child = _mainPanel->GetChild(i); + if ( !child ) + continue; + + if (child && child->IsVisible() && child->IsEnabled() && child->GetTabPosition()) + { + int tabPosition = child->GetTabPosition(); + if (tabPosition == newPosition) + { + // we've found the right tab + best = child; + bestPosition = newPosition; + + // don't loop anymore since we've found the correct panel + break; + } + else if (tabPosition > newPosition && tabPosition < bestPosition) + { + // record the match since this is the closest so far + bestPosition = tabPosition; + best = child; + } + } + } + + if (!bRepeat) + break; + + if (best) + break; + + // haven't found an item + + // check to see if we should push the focus request up + if (!_topLevelFocus) + { + if (_mainPanel->GetVParent() && _mainPanel->GetVParent() != surface()->GetEmbeddedPanel()) + { + // we're not a top level panel, so forward up the request instead of looping + if (stack_depth < 15) + { + if (ipanel()->RequestFocusNext(_mainPanel->GetVParent(), _mainPanel->GetVPanel())) + { + bFound = true; + SetCurrentDefaultButton(NULL); + break; + } + + // if we find one then we break, otherwise we loop + } + } + } + + // loop back + newPosition = 0; + bRepeat = false; + } + + if (best) + { + _currentFocus = best->GetVPanel(); + best->RequestFocus(1); + bFound = true; + + if (!CanButtonBeDefault(best->GetVPanel())) + { + if (_defaultButton) + { + SetCurrentDefaultButton(_defaultButton); + } + else + { + SetCurrentDefaultButton(NULL); + + // we need to ask the parent to set its default button + if (_mainPanel->GetVParent()) + { + ivgui()->PostMessage(_mainPanel->GetVParent(), new KeyValues("FindDefaultButton"), NULL); + } + } + } + else + { + SetCurrentDefaultButton(best->GetVPanel()); + } + } + + stack_depth--; + return bFound; +} + +//----------------------------------------------------------------------------- +// Purpose: sets the panel that owns this FocusNavGroup to be the root in the focus traversal heirarchy +//----------------------------------------------------------------------------- +void FocusNavGroup::SetFocusTopLevel(bool state) +{ + _topLevelFocus = state; +} + +//----------------------------------------------------------------------------- +// Purpose: sets panel which receives input when ENTER is hit +//----------------------------------------------------------------------------- +void FocusNavGroup::SetDefaultButton(Panel *panel) +{ + VPANEL vpanel = panel ? panel->GetVPanel() : NULL; + if ( vpanel == _defaultButton.Get() ) + return; + +// Assert(CanButtonBeDefault(vpanel)); + + _defaultButton = vpanel; + SetCurrentDefaultButton(_defaultButton); +} + +//----------------------------------------------------------------------------- +// Purpose: sets panel which receives input when ENTER is hit +//----------------------------------------------------------------------------- +void FocusNavGroup::SetCurrentDefaultButton(VPANEL panel, bool sendCurrentDefaultButtonMessage) +{ + if (panel == _currentDefaultButton.Get()) + return; + + if ( sendCurrentDefaultButtonMessage && _currentDefaultButton.Get() != 0) + { + ivgui()->PostMessage(_currentDefaultButton, new KeyValues("SetAsCurrentDefaultButton", "state", 0), NULL); + } + + _currentDefaultButton = panel; + + if ( sendCurrentDefaultButtonMessage && _currentDefaultButton.Get() != 0) + { + ivgui()->PostMessage(_currentDefaultButton, new KeyValues("SetAsCurrentDefaultButton", "state", 1), NULL); + } +} + +//----------------------------------------------------------------------------- +// Purpose: sets panel which receives input when ENTER is hit +//----------------------------------------------------------------------------- +VPANEL FocusNavGroup::GetCurrentDefaultButton() +{ + return _currentDefaultButton; +} + +//----------------------------------------------------------------------------- +// Purpose: sets panel which receives input when ENTER is hit +//----------------------------------------------------------------------------- +VPANEL FocusNavGroup::GetDefaultButton() +{ + return _defaultButton; +} + +//----------------------------------------------------------------------------- +// Purpose: finds the panel which is activated by the specified key +// Input : code - the keycode of the hotkey +// Output : Panel * - NULL if no panel found +//----------------------------------------------------------------------------- +Panel *FocusNavGroup::FindPanelByHotkey(wchar_t key) +{ + for (int i = 0; i < _mainPanel->GetChildCount(); i++) + { + Panel *child = _mainPanel->GetChild(i); + if ( !child ) + continue; + + Panel *hot = child->HasHotkey(key); + if (hot && hot->IsVisible() && hot->IsEnabled()) + { + return hot; + } + } + + return NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +Panel *FocusNavGroup::GetDefaultPanel() +{ + for (int i = 0; i < _mainPanel->GetChildCount(); i++) + { + Panel *child = _mainPanel->GetChild(i); + if ( !child ) + continue; + + if (child->GetTabPosition() == 1) + { + return child; + } + } + + return NULL; // no specific panel set +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +Panel *FocusNavGroup::GetCurrentFocus() +{ + return _currentFocus ? ipanel()->GetPanel(_currentFocus, vgui::GetControlsModuleName()) : NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Sets the current focus +//----------------------------------------------------------------------------- +VPANEL FocusNavGroup::SetCurrentFocus(VPANEL focus, VPANEL defaultPanel) +{ + _currentFocus = focus; + + // if we haven't found a default panel yet, let's see if we know of one + if (defaultPanel == 0) + { + // can this focus itself by the default + if (CanButtonBeDefault(focus)) + { + defaultPanel = focus; + } + else if (_defaultButton) // do we know of a default button + { + defaultPanel = _defaultButton; + } + } + + SetCurrentDefaultButton(defaultPanel); + return defaultPanel; +} + +//----------------------------------------------------------------------------- +// Purpose: Returns true if the specified panel can be the default +//----------------------------------------------------------------------------- +bool FocusNavGroup::CanButtonBeDefault(VPANEL panel) +{ + if( panel == 0 ) + return false; + + KeyValues *data = new KeyValues("CanBeDefaultButton"); + + bool bResult = false; + if (ipanel()->RequestInfo(panel, data)) + { + bResult = (data->GetInt("result") == 1); + } + data->deleteThis(); + return bResult; }
\ No newline at end of file |