mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-15 21:26:57 +00:00
1
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
//========= 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
|
||||
Reference in New Issue
Block a user