halflife-photomode/cl_dll/vgui_MOTDWindow.cpp

145 lines
5.6 KiB
C++

//=========== (C) Copyright 1996-2002 Valve, L.L.C. All rights reserved. ===========
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: $
// $Date: $
//
//-----------------------------------------------------------------------------
// $Log: $
//
// $NoKeywords: $
//=============================================================================
#include "VGUI_Font.h"
#include "VGUI_ScrollPanel.h"
#include "VGUI_TextImage.h"
#include <VGUI_StackLayout.h>
#include "hud.h"
#include "cl_util.h"
#include "camera.h"
#include "kbutton.h"
#include "const.h"
#include "vgui_int.h"
#include "vgui_TeamFortressViewport.h"
#define MOTD_TITLE_X XRES(16)
#define MOTD_TITLE_Y YRES(16)
#define MOTD_WINDOW_X XRES(112)
#define MOTD_WINDOW_Y YRES(80)
#define MOTD_WINDOW_SIZE_X XRES(424)
#define MOTD_WINDOW_SIZE_Y YRES(312)
//-----------------------------------------------------------------------------
// Purpose: Displays the MOTD and basic server information
//-----------------------------------------------------------------------------
class CMessageWindowPanel : public CMenuPanel
{
public:
CMessageWindowPanel(const char* szMOTD, const char* szTitle, bool iShadeFullScreen, bool iRemoveMe, int x, int y, int wide, int tall);
private:
CTransparentPanel* m_pBackgroundPanel;
};
//-----------------------------------------------------------------------------
// Purpose: Creates a new CMessageWindowPanel
// Output : CMenuPanel - interface to the panel
//-----------------------------------------------------------------------------
CMenuPanel* CMessageWindowPanel_Create(const char* szMOTD, const char* szTitle, bool iShadeFullscreen, bool iRemoveMe, int x, int y, int wide, int tall)
{
return new CMessageWindowPanel(szMOTD, szTitle, iShadeFullscreen, iRemoveMe, x, y, wide, tall);
}
//-----------------------------------------------------------------------------
// Purpose: Constructs a message panel
//-----------------------------------------------------------------------------
CMessageWindowPanel::CMessageWindowPanel(const char* szMOTD, const char* szTitle, bool iShadeFullscreen, bool iRemoveMe, int x, int y, int wide, int tall) : CMenuPanel(iShadeFullscreen ? 100 : 255, iRemoveMe, x, y, wide, tall)
{
// Get the scheme used for the Titles
CSchemeManager* pSchemes = gViewPort->GetSchemeManager();
// schemes
SchemeHandle_t hTitleScheme = pSchemes->getSchemeHandle("Title Font");
SchemeHandle_t hMOTDText = pSchemes->getSchemeHandle("Briefing Text");
// color schemes
int r, g, b, a;
// Create the window
m_pBackgroundPanel = new CTransparentPanel(iShadeFullscreen ? 255 : 100, MOTD_WINDOW_X, MOTD_WINDOW_Y, MOTD_WINDOW_SIZE_X, MOTD_WINDOW_SIZE_Y);
m_pBackgroundPanel->setParent(this);
m_pBackgroundPanel->setBorder(new LineBorder(Color(255 * 0.7, 170 * 0.7, 0, 0)));
m_pBackgroundPanel->setVisible(true);
int iXSize, iYSize, iXPos, iYPos;
m_pBackgroundPanel->getPos(iXPos, iYPos);
m_pBackgroundPanel->getSize(iXSize, iYSize);
// Create the title
Label* pLabel = new Label("", iXPos + MOTD_TITLE_X, iYPos + MOTD_TITLE_Y);
pLabel->setParent(this);
pLabel->setFont(pSchemes->getFont(hTitleScheme));
pLabel->setFont(Scheme::sf_primary1);
pSchemes->getFgColor(hTitleScheme, r, g, b, a);
pLabel->setFgColor(r, g, b, a);
pLabel->setFgColor(Scheme::sc_primary1);
pSchemes->getBgColor(hTitleScheme, r, g, b, a);
pLabel->setBgColor(r, g, b, a);
pLabel->setContentAlignment(vgui::Label::a_west);
pLabel->setText("%s", szTitle);
// Create the Scroll panel
ScrollPanel* pScrollPanel = new CTFScrollPanel(iXPos + XRES(16), iYPos + MOTD_TITLE_Y * 2 + YRES(16), iXSize - XRES(32), iYSize - (YRES(48) + BUTTON_SIZE_Y * 2));
pScrollPanel->setParent(this);
//force the scrollbars on so clientClip will take them in account after the validate
pScrollPanel->setScrollBarAutoVisible(false, false);
pScrollPanel->setScrollBarVisible(true, true);
pScrollPanel->validate();
// Create the text panel
TextPanel* pText = new TextPanel("", 0, 0, 64, 64);
pText->setParent(pScrollPanel->getClient());
// get the font and colors from the scheme
pText->setFont(pSchemes->getFont(hMOTDText));
pSchemes->getFgColor(hMOTDText, r, g, b, a);
pText->setFgColor(r, g, b, a);
pSchemes->getBgColor(hMOTDText, r, g, b, a);
pText->setBgColor(r, g, b, a);
pText->setText(szMOTD);
// Get the total size of the MOTD text and resize the text panel
int iScrollSizeX, iScrollSizeY;
// First, set the size so that the client's wdith is correct at least because the
// width is critical for getting the "wrapped" size right.
// You'll see a horizontal scroll bar if there is a single word that won't wrap in the
// specified width.
pText->getTextImage()->setSize(pScrollPanel->getClientClip()->getWide(), pScrollPanel->getClientClip()->getTall());
pText->getTextImage()->getTextSizeWrapped(iScrollSizeX, iScrollSizeY);
// Now resize the textpanel to fit the scrolled size
pText->setSize(iScrollSizeX, iScrollSizeY);
//turn the scrollbars back into automode
pScrollPanel->setScrollBarAutoVisible(true, true);
pScrollPanel->setScrollBarVisible(false, false);
pScrollPanel->validate();
CommandButton* pButton = new CommandButton(CHudTextMessage::BufferedLocaliseTextString("#Menu_OK"), iXPos + XRES(16), iYPos + iYSize - YRES(16) - BUTTON_SIZE_Y, CMENU_SIZE_X, BUTTON_SIZE_Y);
pButton->addActionSignal(new CMenuHandler_TextWindow(HIDE_TEXTWINDOW));
pButton->setParent(this);
}