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.
186 lines
4.2 KiB
186 lines
4.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef MOUSEOVERPANELBUTTON_H |
|
#define MOUSEOVERPANELBUTTON_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include <vgui/IScheme.h> |
|
#include <vgui_controls/Button.h> |
|
#include <vgui/KeyCode.h> |
|
#include <filesystem.h> |
|
|
|
extern vgui::Panel *g_lastPanel; |
|
extern vgui::Button *g_lastButton; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Triggers a new panel when the mouse goes over the button |
|
// |
|
// the new panel has the same dimensions as the passed templatePanel and is of |
|
// the same class. |
|
// |
|
// must at least inherit from vgui::EditablePanel to support LoadControlSettings |
|
//----------------------------------------------------------------------------- |
|
template <class T> |
|
class MouseOverButton : public vgui::Button |
|
{ |
|
private: |
|
DECLARE_CLASS_SIMPLE( MouseOverButton, vgui::Button ); |
|
|
|
public: |
|
MouseOverButton(vgui::Panel *parent, const char *panelName, T *templatePanel ) : |
|
Button( parent, panelName, "MouseOverButton") |
|
{ |
|
m_pPanel = new T( parent, NULL ); |
|
m_pPanel ->SetVisible( false ); |
|
|
|
// copy size&pos from template panel |
|
int x,y,wide,tall; |
|
templatePanel->GetBounds( x, y, wide, tall ); |
|
m_pPanel->SetBounds( x, y, wide, tall ); |
|
int px, py; |
|
templatePanel->GetPinOffset( px, py ); |
|
int rx, ry; |
|
templatePanel->GetResizeOffset( rx, ry ); |
|
// Apply pin settings from template, too |
|
m_pPanel->SetAutoResize( templatePanel->GetPinCorner(), templatePanel->GetAutoResize(), px, py, rx, ry ); |
|
|
|
m_bPreserveArmedButtons = false; |
|
m_bUpdateDefaultButtons = false; |
|
} |
|
|
|
virtual void SetPreserveArmedButtons( bool bPreserve ){ m_bPreserveArmedButtons = bPreserve; } |
|
virtual void SetUpdateDefaultButtons( bool bUpdate ){ m_bUpdateDefaultButtons = bUpdate; } |
|
|
|
virtual void ShowPage() |
|
{ |
|
if( m_pPanel ) |
|
{ |
|
m_pPanel->SetVisible( true ); |
|
m_pPanel->MoveToFront(); |
|
g_lastPanel = m_pPanel; |
|
} |
|
} |
|
|
|
virtual void HidePage() |
|
{ |
|
if ( m_pPanel ) |
|
{ |
|
m_pPanel->SetVisible( false ); |
|
} |
|
} |
|
|
|
const char *GetClassPage( const char *className ) |
|
{ |
|
static char classPanel[ _MAX_PATH ]; |
|
Q_snprintf( classPanel, sizeof( classPanel ), "classes/%s.res", className); |
|
|
|
if ( g_pFullFileSystem->FileExists( classPanel, IsX360() ? "MOD" : "GAME" ) ) |
|
{ |
|
} |
|
else if (g_pFullFileSystem->FileExists( "classes/default.res", IsX360() ? "MOD" : "GAME" ) ) |
|
{ |
|
Q_snprintf ( classPanel, sizeof( classPanel ), "classes/default.res" ); |
|
} |
|
else |
|
{ |
|
return NULL; |
|
} |
|
|
|
return classPanel; |
|
} |
|
|
|
#ifdef REFRESH_CLASSMENU_TOOL |
|
|
|
void RefreshClassPage( void ) |
|
{ |
|
m_pPanel->LoadControlSettings( GetClassPage( GetName() ) ); |
|
} |
|
|
|
#endif |
|
|
|
virtual void ApplySettings( KeyValues *resourceData ) |
|
{ |
|
BaseClass::ApplySettings( resourceData ); |
|
|
|
// name, position etc of button is set, now load matching |
|
// resource file for associated info panel: |
|
m_pPanel->LoadControlSettings( GetClassPage( GetName() ) ); |
|
} |
|
|
|
T *GetClassPanel( void ) { return m_pPanel; } |
|
|
|
virtual void OnCursorExited() |
|
{ |
|
if ( !m_bPreserveArmedButtons ) |
|
{ |
|
BaseClass::OnCursorExited(); |
|
} |
|
} |
|
|
|
virtual void OnCursorEntered() |
|
{ |
|
BaseClass::OnCursorEntered(); |
|
|
|
if ( !IsEnabled() ) |
|
return; |
|
|
|
// are we updating the default buttons? |
|
if ( m_bUpdateDefaultButtons ) |
|
{ |
|
SetAsDefaultButton( 1 ); |
|
} |
|
|
|
// are we preserving the armed state (and need to turn off the old button)? |
|
if ( m_bPreserveArmedButtons ) |
|
{ |
|
if ( g_lastButton && g_lastButton != this ) |
|
{ |
|
g_lastButton->SetArmed( false ); |
|
} |
|
|
|
g_lastButton = this; |
|
} |
|
|
|
// turn on our panel (if it isn't already) |
|
if ( m_pPanel && ( !m_pPanel->IsVisible() ) ) |
|
{ |
|
// turn off the previous panel |
|
if ( g_lastPanel && g_lastPanel->IsVisible() ) |
|
{ |
|
g_lastPanel->SetVisible( false ); |
|
} |
|
|
|
ShowPage(); |
|
} |
|
} |
|
|
|
virtual void OnKeyCodeReleased( vgui::KeyCode code ) |
|
{ |
|
BaseClass::OnKeyCodeReleased( code ); |
|
|
|
if ( m_bPreserveArmedButtons ) |
|
{ |
|
if ( g_lastButton ) |
|
{ |
|
g_lastButton->SetArmed( true ); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
|
|
T *m_pPanel; |
|
bool m_bPreserveArmedButtons; |
|
bool m_bUpdateDefaultButtons; |
|
}; |
|
|
|
#define MouseOverPanelButton MouseOverButton<vgui::EditablePanel> |
|
|
|
#endif // MOUSEOVERPANELBUTTON_H
|
|
|