mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-03-13 06:01:53 +00:00
184 lines
5.1 KiB
C++
184 lines
5.1 KiB
C++
#include "cbase.h"
|
|
#include "asw_vgui_frame.h"
|
|
#include "vgui/ISurface.h"
|
|
#include "c_asw_hack_computer.h"
|
|
#include "c_asw_computer_area.h"
|
|
#include <vgui/IInput.h>
|
|
#include <vgui_controls/AnimationController.h>
|
|
#include <vgui_controls/ImagePanel.h>
|
|
#include "vgui_controls/TextImage.h"
|
|
#include "vgui/ILocalize.h"
|
|
#include "WrappedLabel.h"
|
|
#include <vgui_controls/ImagePanel.h>
|
|
#include <filesystem.h>
|
|
#include <keyvalues.h>
|
|
#include "c_asw_player.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
CASW_VGUI_Frame::CASW_VGUI_Frame( vgui::Panel *pParent, const char *pElementName, const char *szTitle )
|
|
: vgui::Panel( pParent, pElementName ),
|
|
CASW_VGUI_Ingame_Panel()
|
|
{
|
|
m_bMouseOverTitleBar = false;
|
|
|
|
m_pTitleLabel = new vgui::Label(this, "FrameTitleLabel", szTitle);
|
|
m_pTitleLabel->SetContentAlignment(vgui::Label::a_west);
|
|
m_pCloseImage = new vgui::ImagePanel(this, "FrameCloseImage");
|
|
m_pMiniImage = new vgui::ImagePanel(this, "MiniImage");
|
|
m_iTitleBarHeight = 0;
|
|
m_bDragging = false;
|
|
m_bFrameMinimized = false;
|
|
m_pNotifyHackOnClose = NULL;
|
|
m_bMouseOverCloseIcon = false;
|
|
m_bMouseOverMiniIcon = false;
|
|
}
|
|
|
|
CASW_VGUI_Frame::~CASW_VGUI_Frame()
|
|
{
|
|
if (m_pNotifyHackOnClose)
|
|
m_pNotifyHackOnClose->FrameDeleted(this);
|
|
}
|
|
|
|
void CASW_VGUI_Frame::PerformLayout()
|
|
{
|
|
m_fScale = ScreenHeight() / 768.0f;
|
|
|
|
// allow creator to size and position us?
|
|
int w = GetWide();
|
|
|
|
vgui::HFont title_font = m_pTitleLabel->GetFont();
|
|
int title_tall = vgui::surface()->GetFontTall(title_font);
|
|
int title_bar_left_offset = 15.0f * m_fScale;
|
|
m_iTitleBarHeight = title_tall * 1.2f;
|
|
m_pCloseImage->SetShouldScaleImage(true);
|
|
m_pCloseImage->SetSize(m_iTitleBarHeight, m_iTitleBarHeight);
|
|
m_pCloseImage->SetPos(w - m_iTitleBarHeight, 0);
|
|
m_pMiniImage->SetShouldScaleImage(true);
|
|
m_pMiniImage->SetSize(m_iTitleBarHeight, m_iTitleBarHeight);
|
|
m_pMiniImage->SetPos(w - (m_iTitleBarHeight * 2.1f), 0);
|
|
|
|
int label_width = w - (title_bar_left_offset + title_tall);
|
|
m_pTitleLabel->SetSize(label_width, title_tall); // todo: width should size to contents to barright can be correct
|
|
m_pTitleLabel->SetPos(title_bar_left_offset, 0);
|
|
}
|
|
|
|
void CASW_VGUI_Frame::ApplySchemeSettings(vgui::IScheme *pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
|
|
SetPaintBackgroundType(0);
|
|
SetPaintBackgroundEnabled(true);
|
|
SetBgColor( Color(0,0,0,153) );
|
|
SetMouseInputEnabled(true);
|
|
|
|
vgui::HFont DefaultFont = pScheme->GetFont( "Default", IsProportional() );
|
|
|
|
m_pTitleLabel->SetFgColor(Color(255,255,255,255));
|
|
m_pTitleLabel->SetFont(DefaultFont);
|
|
m_pTitleLabel->SetContentAlignment(vgui::Label::a_west);
|
|
|
|
m_pCloseImage->SetDrawColor( Color(255,255,255,255) );
|
|
m_pCloseImage->SetImage("swarm/Computer/WindowClose");
|
|
m_bMouseOverCloseIcon = false;
|
|
|
|
m_pMiniImage->SetDrawColor( Color(255,255,255,255) );
|
|
m_pMiniImage->SetImage("swarm/Computer/WindowMinimise");
|
|
m_bMouseOverMiniIcon = false;
|
|
}
|
|
|
|
|
|
|
|
void CASW_VGUI_Frame::OnThink()
|
|
{
|
|
int x,y,w,t;
|
|
GetBounds(x,y,w,t);
|
|
|
|
if (m_pCloseImage->IsCursorOver() != m_bMouseOverCloseIcon)
|
|
{
|
|
m_bMouseOverCloseIcon = m_pCloseImage->IsCursorOver();
|
|
if (m_bMouseOverCloseIcon)
|
|
{
|
|
m_pCloseImage->SetImage("swarm/Computer/WindowCloseLit");
|
|
}
|
|
else
|
|
{
|
|
m_pCloseImage->SetImage("swarm/Computer/WindowClose");
|
|
}
|
|
}
|
|
if (m_pMiniImage->IsCursorOver() != m_bMouseOverMiniIcon)
|
|
{
|
|
m_bMouseOverMiniIcon = m_pMiniImage->IsCursorOver();
|
|
if (m_bMouseOverMiniIcon)
|
|
{
|
|
m_pMiniImage->SetImage("swarm/Computer/WindowMinimiseLit");
|
|
}
|
|
else
|
|
{
|
|
m_pMiniImage->SetImage("swarm/Computer/WindowMinimise");
|
|
}
|
|
}
|
|
|
|
if (!m_pCloseImage->IsCursorOver())
|
|
{
|
|
m_bMouseOverTitleBar = true; // todo: grab the cursor x y relative to our window top and see if it's less than the title bar height?
|
|
}
|
|
else
|
|
{
|
|
m_bMouseOverTitleBar = false;
|
|
}
|
|
if (m_bDragging && !vgui::input()->IsMouseDown( MOUSE_LEFT ))
|
|
{
|
|
m_bDragging = false;
|
|
}
|
|
if (m_bDragging)
|
|
{
|
|
// set pos to x/y of cursor minus drag offset
|
|
int current_posx, current_posy;
|
|
vgui::input()->GetCursorPos(current_posx, current_posy);
|
|
current_posx -= m_iDragOffsetX;
|
|
current_posy -= m_iDragOffsetY;
|
|
GetParent()->ScreenToLocal(current_posx, current_posy);
|
|
SetPos(current_posx, current_posy);
|
|
}
|
|
}
|
|
|
|
bool CASW_VGUI_Frame::MouseClick(int x, int y, bool bRightClick, bool bDown)
|
|
{
|
|
//Msg("CASW_VGUI_Frame::MouseClick x=%d y=%d closeover=%d miniover=%d down=%d\n", x, y, m_pCloseImage->IsCursorOver(), m_pMiniImage->IsCursorOver(), bDown);
|
|
if (m_pCloseImage->IsCursorOver() && !bDown)
|
|
{
|
|
// close it all down
|
|
C_ASW_Player *pPlayer = C_ASW_Player::GetLocalASWPlayer();
|
|
if (pPlayer)
|
|
pPlayer->StopUsing();
|
|
return true;
|
|
}
|
|
if (m_pMiniImage->IsCursorOver() && !bDown)
|
|
{
|
|
// toggle minimized state
|
|
m_bFrameMinimized = !m_bFrameMinimized;
|
|
InvalidateLayout(true);
|
|
return true;
|
|
}
|
|
if (!bDown && m_bDragging)
|
|
{
|
|
m_bDragging = false; // stop dragging the window around
|
|
}
|
|
if (m_bMouseOverTitleBar)
|
|
{
|
|
if (bDown && !m_bDragging)
|
|
{
|
|
m_bDragging = true; // start dragging the window around
|
|
// set drag offset (cursor x/y minus top left of frame)
|
|
int wx, wy;
|
|
wx = wy = 0;
|
|
LocalToScreen(wx, wy);
|
|
m_iDragOffsetX = x - wx;
|
|
m_iDragOffsetY = y - wy;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
} |