source-engine/game/client/swarm/vgui/asw_vgui_frame.cpp
2023-10-03 17:23:56 +03:00

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;
}