VGUI: Stability improvements, start allowing overrides for VGUIButton and VGUIWindow based classes.

This commit is contained in:
Marco Cawthorne 2023-04-03 11:13:55 -07:00
parent 41c20663a8
commit 8c58d635d3
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
14 changed files with 340 additions and 69 deletions

View File

@ -355,3 +355,22 @@ dirname(string input)
return newpath;
}
string
textfile_to_string(string filename)
{
string fileContents = __NULL__;
filestream fileHandle = fopen(filename, FILE_READ);
string temp;
if (fileHandle != -1) {
while ((temp = fgets(fileHandle))) {
fileContents = strcat(fileContents, temp, "\n");
}
} else {
fileContents = __NULL__;
}
return fileContents;
}

View File

@ -1,10 +1,12 @@
#includelist
../vgui/ui.qc
../vgui/ui_control.qc
../vgui/ui_button.qc
../vgui/ui_menubutton.qc
../vgui/ui_radio.qc
../vgui/ui_checkbox.qc
../vgui/ui_window.qc
../vgui/ui_frame.qc
../vgui/ui_label.qc
../vgui/ui_pic.qc
../vgui/ui_3dview.qc

View File

@ -36,7 +36,7 @@ var int g_vguiWidgetCount;
#ifdef CLASSIC_VGUI
#ifndef UI_MAINCOLOR
#define UI_MAINCOLOR [255,200,0] / 255
#define UI_MAINCOLOR [255,170,0] / 255
#endif
#ifndef UI_MAINALPHA
#define UI_MAINALPHA 255
@ -79,6 +79,9 @@ public:
nonvirtual void FlagAdd(int);
/** Remove a flag from the widget. */
nonvirtual void FlagRemove(int);
/** Check if the VGUIWidget has a flag attached. */
nonvirtual bool HasFlag(int);
/** Set the position within its context. */
nonvirtual void SetPos(vector);
/** Return the position of the widget within its context. */
@ -277,6 +280,12 @@ VGUIWidget::FlagRemove(int iFlag)
m_iFlags -= (m_iFlags & iFlag);
}
bool
VGUIWidget::HasFlag(int flag)
{
return (m_iFlags & flag) ? true : false;
}
void
VGUIWidget::Reposition(void)
{

View File

@ -21,6 +21,9 @@ noref .vector maxs;
noref .string model;
noref .float frame, frame2, lerpfrac, renderflags, frame1time;
.void(void) tmpVGUI3DView1;
.float(float,float,float,float) tmpVGUI3DView2;
class VGUI3DView:VGUIWidget
{
public:
@ -48,8 +51,6 @@ private:
vector m_vec3DPos;
vector m_vec3DAngles;
float m_flFOV;
virtual void(void) m_vDrawFunc = 0;
virtual float(float, float, float, float) m_vInputFunc = 0;
};
void
@ -92,19 +93,19 @@ VGUI3DView::Get3DPos(void)
void
VGUI3DView::SetDrawFunc(void(void) vFunc)
{
m_vDrawFunc = vFunc;
tmpVGUI3DView1 = vFunc;
}
void
VGUI3DView::SetInputFunc(float(float, float, float, float) vFunc)
{
m_vInputFunc = vFunc;
tmpVGUI3DView2 = vFunc;
}
void
VGUI3DView::Draw(void)
{
if (!m_vDrawFunc) {
if (!tmpVGUI3DView1) {
return;
}
@ -113,16 +114,16 @@ VGUI3DView::Draw(void)
setproperty(VF_AFOV, 90);
setproperty(VF_ORIGIN, m_vec3DPos);
setproperty(VF_ANGLES, m_vec3DAngles);
m_vDrawFunc();
tmpVGUI3DView1();
renderscene();
}
bool
VGUI3DView::Input(float flEVType, float flKey, float flChar, float flDevID)
{
if (!m_vInputFunc) {
if (!tmpVGUI3DView2) {
return false;
}
return m_vInputFunc(flEVType, flKey, flChar, flDevID);
return tmpVGUI3DView2(flEVType, flKey, flChar, flDevID);
}

View File

@ -21,7 +21,10 @@ enumflags
BUTTON_LASTACTIVE
};
class VGUIButton:VGUIWidget
/* TODO: MOVE THESE INTO VGUIButton! COMPILER NEEDS TO BE FIXED FIRST HOWEVER. */
.void(void) tmpVGUIButton1;
class VGUIButton:VGUIControl
{
public:
void VGUIButton(void);
@ -34,8 +37,13 @@ public:
nonvirtual void SetColor(vector);
/** Sets the color of the icon on the button. */
nonvirtual void SetIconColor(vector);
/** Gets the title of the button. */
nonvirtual string GetTitle(void);
/** Sets the function to call when the button is pressed. */
nonvirtual void SetFunc(void(void));
/** Sets the command to execute when the button is pressed. */
nonvirtual void SetExec(string);
@ -43,7 +51,6 @@ public:
virtual void Draw(void);
virtual bool Input(float,float,float,float);
virtual void Spawned(void);
private:
vector m_vecIMGSize;
vector m_vecColor;
@ -53,7 +60,6 @@ private:
string m_strTitleActive;
string m_strIcon;
string m_strExec;
virtual void m_vFunc(void) = 0;
};
void
@ -89,13 +95,20 @@ VGUIButton::SetTitle(string strName)
m_strTitle = strName;
m_strTitleActive = sprintf("^3%s", m_strTitle);
m_strTitle = sprintf("%s%s", Font_RGBtoHex(UI_MAINCOLOR), strName);
//m_strTitle = sprintf("%s%s", Font_RGBtoHex(UI_MAINCOLOR), strName);
drawfont = g_fntDefault.iID;
newsize[0] = stringwidth(m_strTitle, TRUE, [g_fntDefault.iScaleX, g_fntDefault.iScaleY]) + 16;
newsize[1] = 24;
SetSize(newsize);
}
string
VGUIButton::GetTitle(void)
{
return m_strTitle;
}
void
VGUIButton::SetIcon(string strName)
{
@ -107,9 +120,11 @@ VGUIButton::SetIcon(string strName)
}
}
void
VGUIButton::SetFunc(void(void) vFunc)
VGUIButton::SetFunc(void(void) func)
{
m_vFunc = vFunc;
//#warning "SetFunc in VGUIButton is DEPRECATED. Compiler IS generating JUNK in the old way. Please override VGUIButton and define a OnMouseDown/Up method instead"
//m_vFunc = vFunc;
tmpVGUIButton1 = func;
}
void
VGUIButton::SetExec(string exe)
@ -117,6 +132,7 @@ VGUIButton::SetExec(string exe)
m_strExec = exe;
}
void
VGUIButton::Draw(void)
{
@ -134,6 +150,21 @@ VGUIButton::Draw(void)
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [0, 1], [1, m_vecSize[1] - 2], [1,1,1], 0.5f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [m_vecSize[0] - 1, 1], [1, m_vecSize[1] - 2], [0,0,0], 0.5f);
}
if (m_strTitle) {
if (m_iFlags & BUTTON_HOVER) {
Font_DrawText(m_parent.m_vecOrigin + m_vecOrigin + [8, 8], m_strTitle, g_fntDefault);
} else {
Font_DrawText(m_parent.m_vecOrigin + m_vecOrigin + [8, 8], m_strTitle, g_fntDefault);
}
}
if (m_strIcon) {
if (m_iFlags & BUTTON_DOWN)
drawpic(m_parent.m_vecOrigin + m_vecOrigin + [2,2], m_strIcon, m_vecIMGSize, m_vecIconColor * 0.25, 1.0f, 0);
else
drawpic(m_parent.m_vecOrigin + m_vecOrigin + [2,2], m_strIcon, m_vecIMGSize, m_vecIconColor, 1.0f, 0);
}
#else
if (m_iFlags & BUTTON_DOWN) {
drawfill(m_parent.m_vecOrigin + m_vecOrigin, m_vecSize, m_vecColor, 0.25f);
@ -142,7 +173,7 @@ VGUIButton::Draw(void)
drawfill(m_parent.m_vecOrigin + m_vecOrigin, [m_vecSize[0], 1], m_vecColor, 1.0f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [0, 1], [1, m_vecSize[1] - 2], m_vecColor, 1.0f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [m_vecSize[0] - 1, 1], [1, m_vecSize[1] - 2], m_vecColor, 1.0f);
#endif
if (m_strTitle) {
if (m_iFlags & BUTTON_LASTACTIVE) {
@ -157,6 +188,7 @@ VGUIButton::Draw(void)
else
drawpic(m_parent.m_vecOrigin + m_vecOrigin + [2,2], m_strIcon, m_vecIMGSize, m_vecIconColor, 1.0f, 0);
}
#endif
}
bool
@ -164,10 +196,29 @@ VGUIButton::Input(float flEVType, float flKey, float flChar, float flDevID)
{
bool ret = false;
bool mouseHover = false;
if (Util_MouseAbove(g_vecMousePos, m_parent.m_vecOrigin + m_vecOrigin, m_vecSize)) {
mouseHover = true;
}
if (mouseHover == true && HasFlag(BUTTON_HOVER) == false) {
FlagAdd(BUTTON_HOVER);
OnMouseEntered();
} else if (HasFlag(BUTTON_HOVER)) {
FlagRemove(BUTTON_HOVER);
OnMouseExited();
}
if (flEVType == IE_KEYDOWN) {
if (flKey == K_MOUSE1) {
FlagRemove(BUTTON_LASTACTIVE);
if (Util_MouseAbove(g_vecMousePos, m_parent.m_vecOrigin + m_vecOrigin, m_vecSize)) {
if (mouseHover) {
if (tmpVGUIButton1)
tmpVGUIButton1();
OnMouseDown();
FlagAdd(BUTTON_DOWN);
FlagAdd(BUTTON_LASTACTIVE);
ret = true;
@ -175,9 +226,9 @@ VGUIButton::Input(float flEVType, float flKey, float flChar, float flDevID)
}
} else if (flEVType == IE_KEYUP) {
if (flKey == K_MOUSE1) {
if (m_iFlags & BUTTON_DOWN && Util_MouseAbove(g_vecMousePos, m_parent.m_vecOrigin + m_vecOrigin, m_vecSize)) {
if (m_vFunc)
m_vFunc();
if (m_iFlags & BUTTON_DOWN && mouseHover) {
OnMouseUp();
if (m_strExec)
localcmd(sprintf("%s\n", m_strExec));

63
src/vgui/ui_control.qc Normal file
View File

@ -0,0 +1,63 @@
/** An abstract control class for various VGUI related widgets. */
class
VGUIControl:VGUIWidget
{
public:
virtual void VGUIControl(void);
/** Set the control tag. Used for identification purposes. */
nonvirtual void SetTag(int);
/** Returns the control tag. Used for identification purposes. */
nonvirtual int GetTag(void);
/* overridable */
/** Called when the mouse starts hovering over this element. */
virtual void OnMouseEntered(void);
/** Called when the mouse stops hovering over this element. */
virtual void OnMouseExited(void);
/** Called when the mouse starts klicking down on this element. */
virtual void OnMouseDown(void);
/** Called when the mouse stops klicking down on this element. This is when actions usually need to be triggered. */
virtual void OnMouseUp(void);
private:
int m_iTag;
};
void
VGUIControl::VGUIControl(void)
{
m_iTag = 0i;
}
void
VGUIControl::SetTag(int val)
{
m_iTag = val;
}
int
VGUIControl::GetTag(void)
{
return m_iTag;
}
void
VGUIControl::OnMouseEntered(void)
{
}
void
VGUIControl::OnMouseExited(void)
{
}
void
VGUIControl::OnMouseDown(void)
{
}
void
VGUIControl::OnMouseUp(void)
{
}

73
src/vgui/ui_frame.qc Normal file
View File

@ -0,0 +1,73 @@
/*
* Copyright (c) 2016-2022 Vera Visions LLC.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
enumflags
{
WINDOW_DRAGGING,
WINDOW_RESIZING,
};
typedef enumflags
{
VGUIFrameBorderless,
VGUIFrameTitled,
VGUIFrameClosable,
VGUIFrameMiniaturizable,
VGUIFrameResizeable,
VGUIFrameMovable,
} VGUIFrameStyle_t;
#define VGUIFrameStyleDefault VGUIFrameMovable | \
VGUIFrameTitled | \
VGUIFrameClosable | \
VGUIFrameMiniaturizable
/** Top-most window class in VGUILib */
class VGUIFrame:VGUIWidget
{
public:
void VGUIFrame(void);
/* overrides */
virtual void Draw(void);
private:
vector m_vecColor;
float m_flAlpha;
};
void
VGUIFrame::VGUIFrame(void)
{
m_vecColor = UI_MAINCOLOR;
m_flAlpha = 1.0f;
}
void VGUIFrame::Draw(void)
{
#ifdef CLASSIC_VGUI
drawfill(m_parent.m_vecOrigin + m_vecOrigin, [m_vecSize[0], 1], m_vecColor, 1.0f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [0, m_vecSize[1] - 1], [m_vecSize[0], 1], m_vecColor, 1.0f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [0, 1], [1, m_vecSize[1] - 2], m_vecColor, 1.0f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [m_vecSize[0] - 1, 1], [1, m_vecSize[1] - 2], m_vecColor, 1.0f);
#else
drawfill(m_parent.m_vecOrigin + m_vecOrigin, [m_vecSize[0], 1], [1,1,1], 0.5f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [0, m_vecSize[1] - 1], [m_vecSize[0], 1], [0,0,0], 0.5f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [0, 1], [1, m_vecSize[1] - 2], [1,1,1], 0.5f);
drawfill(m_parent.m_vecOrigin + m_vecOrigin + [m_vecSize[0] - 1, 1], [1, m_vecSize[1] - 2], [0,0,0], 0.5f);
#endif
}

View File

@ -43,7 +43,7 @@ VGUILabel::VGUILabel(void)
void
VGUILabel::Spawned(void)
{
SetSize([96,16]);
SetSize([0,0]);
}
void
@ -56,9 +56,11 @@ VGUILabel::SetTitle (string strName)
#endif
drawfont = g_fntDefault.iID;
if (GetSize() == [0,0]) {
/* hack, add 2 just to make sure it doesn't immediately wrap. bug
* in engines' textfield thing in combo with ttf. */
SetSize([2 + stringwidth(m_strTitle, TRUE, [g_fntDefault.iScaleX, g_fntDefault.iScaleY]), 16]);
}
}
void

View File

@ -14,6 +14,8 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
.void(void) tmpVGUIList1;
class VGUIList:VGUIWidget
{
public:
@ -46,7 +48,6 @@ private:
int m_iItemCount;
int m_iSelected;
int m_iDrawOffset;
virtual void(void) m_vScrollCB = 0;
};
void VGUIList::VGUIList(void)
@ -140,8 +141,8 @@ void VGUIList::SetOffset (int iOffset, int iCallBack)
int iMaxDisplay = bound(0, m_iItemCount, floor(m_vecSize[1] / 20));
m_iDrawOffset = bound(0, iOffset, m_iItemCount - iMaxDisplay);
if (m_vScrollCB && iCallBack) {
m_vScrollCB();
if (tmpVGUIList1 && iCallBack) {
tmpVGUIList1();
}
}
int VGUIList::GetOffset(void)
@ -198,5 +199,5 @@ void VGUIList::AddItem (string strItem)
void VGUIList::CallOnScroll (void(void) vFunc)
{
m_vScrollCB = vFunc;
tmpVGUIList1 = vFunc;
}

View File

@ -25,6 +25,8 @@ enumflags
MBUTTON_SHOWMP
};
.void(void) tmpVGUIMenuButton1;
class
VGUIMenuButton:VGUIWidget
{
@ -44,8 +46,6 @@ private:
float m_flAlpha;
string m_strTitle;
string m_strIcon;
virtual void(void) m_vFunc = 0;
};
void
@ -139,8 +139,8 @@ VGUIMenuButton::Input (float flEVType, float flKey, float flChar, float flDevID)
} else if (flEVType == IE_KEYUP) {
if (flKey == K_MOUSE1) {
if (m_iFlags & MBUTTON_DOWN && Util_MouseAbove(g_vecMousePos, m_parent.m_vecOrigin + m_vecOrigin, m_vecSize)) {
if (m_vFunc) {
m_vFunc();
if (tmpVGUIMenuButton1) {
tmpVGUIMenuButton1();
}
ret = true;
}
@ -165,6 +165,6 @@ VGUIMenuButton::SetIcon (string strName)
void
VGUIMenuButton::SetFunc (void(void) vFunc)
{
m_vFunc = vFunc;
tmpVGUIMenuButton1 = vFunc;
}
#endif

View File

@ -45,7 +45,7 @@ VGUIPic::VGUIPic(void)
void
VGUIPic::Spawned(void)
{
SetSize([16,16]);
SetSize([16,16, 0]);
}
void
@ -66,6 +66,7 @@ void
VGUIPic::SetImage (string strName)
{
m_strImage = strName;
SetSize(drawgetimagesize(m_strImage));
}
string

View File

@ -21,6 +21,8 @@ enumflags
RADIO_ACTIVE
};
.void(void) tmpVGUIRadio1;
class VGUIRadio:VGUIWidget
{
public:
@ -40,7 +42,6 @@ private:
float m_flAlpha;
vector m_vecSize;
string m_strTitle;
virtual void(void) m_vFunc = 0;
};
void VGUIRadio::VGUIRadio(void)
@ -78,7 +79,7 @@ void VGUIRadio::SetValue (int iValue)
}
void VGUIRadio::SetFunc (void(void) vFunc)
{
m_vFunc = vFunc;
tmpVGUIRadio1 = vFunc;
}
void VGUIRadio::Draw(void)
@ -130,8 +131,8 @@ bool VGUIRadio::Input (float flEVType, float flKey, float flChar, float flDevID)
} else if (flEVType == IE_KEYUP) {
if (flKey == K_MOUSE1) {
if (m_iFlags & RADIO_DOWN && Util_MouseAbove(g_vecMousePos, m_parent.m_vecOrigin + m_vecOrigin, m_vecSize)) {
if (m_vFunc) {
m_vFunc();
if (tmpVGUIRadio1) {
tmpVGUIRadio1();
}
SetValue(TRUE);
ret = true;

View File

@ -21,6 +21,8 @@ enumflags
SCROLLBAR_SLIDER_DOWN
};
.void(void) tmpVGUIScrollbar1;
/** This is a scollbar widget. It needs rework. */
class VGUIScrollbar:VGUIWidget
{
@ -53,8 +55,6 @@ private:
float m_flMax;
float m_flStep;
float m_flValue;
virtual void(void) m_vChangedCB = 0;
};
void VGUIScrollbar::VGUIScrollbar(void)
@ -244,8 +244,8 @@ void VGUIScrollbar::SetValue (float flVal, int iCallBack)
{
m_flValue = bound(m_flMin, flVal, m_flMax);
if (m_vChangedCB && iCallBack) {
m_vChangedCB();
if (tmpVGUIScrollbar1 && iCallBack) {
tmpVGUIScrollbar1();
}
}
float VGUIScrollbar::GetValue(void)
@ -255,5 +255,5 @@ float VGUIScrollbar::GetValue(void)
void VGUIScrollbar::CallOnChange (void(void) vFunc)
{
m_vChangedCB = vFunc;
tmpVGUIScrollbar1 = vFunc;
}

View File

@ -28,6 +28,7 @@ typedef enumflags
VGUIWindowMiniaturizable,
VGUIWindowResizeable,
VGUIWindowMovable,
VGUIWindowFullscreen
} vguiWindowStyle_t;
#define VGUIWindowStyleDefault VGUIWindowMovable | \
@ -35,6 +36,10 @@ typedef enumflags
VGUIWindowClosable | \
VGUIWindowMiniaturizable
/* TODO: MOVE THESE INTO VGUIWindow! COMPILER NEEDS TO BE FIXED FIRST HOWEVER. */
.void(void) tmpVGUIWindow1;
.void(void) tmpVGUIWindow2;
/** Top-most window class in VGUILib */
class VGUIWindow:VGUIWidget
{
@ -51,13 +56,20 @@ public:
/** Returns the icon of the window widget. */
nonvirtual string GetIcon(void);
/** Sets the style mask of the specified window. */
nonvirtual void SetStyleMask(vguiWindowStyle_t);
/** Called when the window is was resized by the user. */
nonvirtual void CallOnResize(void(void) vFunc);
/** Called when the window has been repositioned by the user. */
nonvirtual void CallOnMove(void(void) vFunc);
/** Sets the style mask of the specified window. */
nonvirtual void SetStyleMask(vguiWindowStyle_t);
/** Called when the VGUIWindow got moved successfully. */
virtual void WindowDidMove(vector, vector);
/** Called when the VGUIWindow got resized successfully. */
virtual void WindowDidResize(vector, vector);
/** Called when the VGUIWindow was successfully closed. */
virtual void WindowDidClose(void);
/* overrides */
virtual void Draw(void);
@ -74,9 +86,6 @@ private:
vguiWindowStyle_t m_styleMask;
VGUIButton m_btnClose;
virtual void(void) m_vResizeCB = 0;
virtual void(void) m_vMoveCB = 0;
};
void
@ -97,11 +106,29 @@ VGUIWindow::SetStyleMask(vguiWindowStyle_t val)
m_styleMask = val;
}
void
VGUIWindow::CallOnResize(void(void) func)
{
//#warning "SetFunc in VGUIButton is DEPRECATED. Compiler IS generating JUNK in the old way. Please override VGUIButton and define a OnMouseDown/Up method instead"
//m_vFunc = vFunc;
tmpVGUIWindow1 = func;
}
void
VGUIWindow::CallOnMove(void(void) func)
{
//#warning "SetFunc in VGUIButton is DEPRECATED. Compiler IS generating JUNK in the old way. Please override VGUIButton and define a OnMouseDown/Up method instead"
//m_vFunc = vFunc;
tmpVGUIWindow2 = func;
}
void
VGUIWindow::Spawned(void)
{
static void WindowButtonClose(void) {
m_parent.Hide();
static void VGUIWindowButtonClose(void) {
VGUIButton winSelf = (VGUIButton)self;
winSelf.m_parent.Hide();
}
SetMinSize([64,64]);
@ -119,7 +146,7 @@ VGUIWindow::Spawned(void)
m_btnClose.SetIconColor([1,1,1]);
#endif
m_btnClose.SetColor(m_vecColor);
m_btnClose.SetFunc(WindowButtonClose);
m_btnClose.SetFunc(VGUIWindowButtonClose);
m_btnClose.SetSize([20,20]);
Add(m_btnClose);
@ -144,40 +171,59 @@ string VGUIWindow::GetIcon(void)
return m_strIcon;
}
void VGUIWindow:: SizeChanged (vector vecOld, vector vecNew)
void VGUIWindow::SizeChanged (vector vecOld, vector vecNew)
{
m_btnClose.SetPos([vecNew[0] - 24, 4]);
}
void VGUIWindow::CallOnMove (void(void) vFunc)
void
VGUIWindow::WindowDidMove(vector oldPosition, vector newPosition)
{
m_vMoveCB = vFunc;
}
void VGUIWindow::CallOnResize (void(void) vFunc)
{
m_vResizeCB = vFunc;
}
void
VGUIWindow::WindowDidResize(vector oldSize, vector newSize)
{
}
void
VGUIWindow::WindowDidClose(void)
{
}
void VGUIWindow::Draw(void)
{
#ifdef CLASSIC_VGUI
drawfill(m_vecOrigin, m_vecSize, [0,0,0], 0.5);
if (m_styleMask & VGUIWindowFullscreen)
drawfill([0,0], video_res, [0,0,0], 0.5);
else
drawfill(m_vecOrigin, m_vecSize, [0,0,0], 0.5);
if (!(m_styleMask & VGUIWindowBorderless)) {
drawfill(m_vecOrigin, [m_vecSize[0], 1], m_vecColor, 1.0f);
drawfill(m_vecOrigin + [0, m_vecSize[1] - 1], [m_vecSize[0], 1], m_vecColor, 1.0f);
drawfill(m_vecOrigin + [0, 1], [1, m_vecSize[1] - 2], m_vecColor, 1.0f);
drawfill(m_vecOrigin + [m_vecSize[0] - 1, 1], [1, m_vecSize[1] - 2], m_vecColor, 1.0f);
}
if (m_styleMask & VGUIWindowResizeable) {
drawpic(m_vecOrigin + m_vecSize - [16,16], "textures/ui/steam/icon_resizer", [16,16], m_vecColor, 1.0f, 0);
}
#else
drawfill(m_vecOrigin, m_vecSize, m_vecColor, m_flAlpha);
if (m_styleMask & VGUIWindowFullscreen)
drawfill([0,0], video_res, m_vecColor, m_flAlpha);
else
drawfill(m_vecOrigin, m_vecSize, m_vecColor, m_flAlpha);
if (!(m_styleMask & VGUIWindowBorderless)) {
drawfill(m_vecOrigin, [m_vecSize[0], 1], [1,1,1], 0.5f);
drawfill(m_vecOrigin + [0, m_vecSize[1] - 1], [m_vecSize[0], 1], [0,0,0], 0.5f);
drawfill(m_vecOrigin + [0, 1], [1, m_vecSize[1] - 2], [1,1,1], 0.5f);
drawfill(m_vecOrigin + [m_vecSize[0] - 1, 1], [1, m_vecSize[1] - 2], [0,0,0], 0.5f);
}
if (m_styleMask & VGUIWindowResizeable) {
drawpic(m_vecOrigin + m_vecSize - [16,16], "textures/ui/steam/icon_resizer", [16,16], m_vecColor, 1.0f, 0);
@ -226,22 +272,24 @@ bool VGUIWindow::Input (float flEVType, float flKey, float flChar, float flDevID
if (m_iFlags & WINDOW_RESIZING) {
if (flEVType == IE_MOUSEABS) {
vector vNewScale = [flKey, flChar] - m_vecOrigin - m_vecSize;
SetSize(GetSize() + vNewScale);
if (m_vResizeCB) {
m_vResizeCB();
}
vector oldSize = m_vecSize;
vector newSize = GetSize() + ([flKey, flChar] - m_vecOrigin - m_vecSize);
SetSize(newSize);
WindowDidResize(oldSize, newSize);
if (tmpVGUIWindow1)
tmpVGUIWindow1();
}
ret = true;
} else if (m_iFlags & WINDOW_DRAGGING) {
if (flEVType == IE_MOUSEABS) {
vector vNewPos = [flKey, flChar] - m_vecOrigin;
SetPos(GetPos() + vNewPos + m_vecDragOffset);
if (m_vMoveCB) {
m_vMoveCB();
}
vector oldPos = m_vecOrigin;
vector newPos = GetPos() + ([flKey, flChar] - m_vecOrigin) + m_vecDragOffset;
SetPos(newPos);
WindowDidMove(oldPos, newPos);
if (tmpVGUIWindow2)
tmpVGUIWindow2();
}
ret = true;
}